// navigation.js
// Funktionen für Mausaktionen in der Karte und Navigation

var mapx, mapy;		// aktuelle geodät. Koo unter Cursor
var maptipx, maptipy;	// maptip-Koo
var boxMode=false;
var plineMode=false;
var plineNodesX=new Array(); //Array für Polylinien-X (px)
var plineNodesY=new Array(); //Array für Polylinien-Y (px)
var isMousedown=false;
var maptipTimer; //Timer für Maptip
var wheelZoomFactor=1; //Wheelzoom
var wheelTimeout;

function handleMapOnMousedown(x, y)
{
   isMousedown=true; 
   imgx = x;
   imgy = y;
   mapx = getMapX(x);
   mapy = getMapY(y);
   switch(maptoolMode) {
	   case 'ZOOMIN':
	   	  startBoxtool();
	      break;
	   case 'ZOOMOUT': 
	   	  startBoxtool();   
	      break;
	   case 'PAN':
	      break;
	   case 'IDENTIFY':
	      break;	      
	   case 'MEASURELIN':
	   	  if (!plineMode) {
	   	  	startPlinetool();
	   	  } else {
	   	    plineSegmentAdd();
	   	  }
	      break;
	   default:
		  //alert('kein gültiges tool');
   }
   //requestMap('');
   // alert(mapx + ' / ' + mapy);	
}

function handleMapOnMousemove(x, y)
{
   if (maptipTimeout!=-1) {
   		//maptip-countdown stoppen
   		if (!maptipIsAdhesive) {
   			hideMaptip();
   			//maptip-countdown zurücksetzen und starten
   			resetMaptipTimer(x,y);
   		}
   }
   //aktion durchführen
   mapx = getMapX(x);
   mapy = getMapY(y);
   window.status = 'Rechtswert: ' + mapx + ' / Hochwert: ' + mapy;
   if (boxMode) {
	  resizeBox(Math.abs(x-imgx), Math.abs(y-imgy));
      moveBox(Math.min(imgx,x), Math.min(imgy,y));
   }
   if (plineMode) {
   	  plineSegmentUpdate(x,y);
   }
}

function handleMapOnMouseup(x, y)
{
	isMousedown=false;
	imgx2 = x;
	imgy2 = y;
   	mapx = getMapX(x);
   	mapy = getMapY(y);	
	if (boxMode) {
		execBoxtoolAction() //Box-Maptools
	} else {
		execMaptoolAction() //OneClick-Maptools
	}
}

function handleMapOnDblclick(x, y) {
   isMousedown=false;
   imgx = x;
   imgy = y;
   mapx = getMapX(x);
   mapy = getMapY(y);   
   switch(maptoolMode) {
	   case 'MEASURELIN':
	   	  plineMode=false;
	   	  plineSegmentAdd();
	      break;
	   default:
		  //alert('kein gültiges tool');
   }	
}

function handleMapOnMouseout() {
	window.status = maptoolMode;
	//maptip-countdown stoppen
   	window.clearTimeout(maptipTimer);
}

function handleReferenceOnMousedown(refx, refy) {
   showProcessBar('loadMap');	   
   ms_panByReference(refx,refy);
}

function handleClientOnMouseup(x,y) {
	if 	(isMousedown) {
		handleMapOnMouseup(x,y);
	}
}

function handleOnMouseWheel(delta) {
	window.clearTimeout(wheelTimeout);
	var f = 1.2;
	msRequestOverriding=true;
	if (delta>0) {
		f = 1/f
	}
	pseudoZoom(f);
	//xMoveTo('elMap', ix, iy);
	wheelZoomFactor=wheelZoomFactor*f;
	wheelTimeout=window.setTimeout("ms_zoomByFactor(minx+xdist/2, miny+ydist/2, wheelZoomFactor)",500);
}

//Box-Tool
function startBoxtool()
{
	boxMode=true;
	showBox(imgx, imgy);
}

function execBoxtoolAction() {
	//Box-Maptools  
	boxMode=false;
	var x0=Math.min(imgx, imgx2);
	var x1=Math.max(imgx, imgx2);
	var y0=Math.min(imgy, imgy2);
	var y1=Math.max(imgy, imgy2);	
	switch(maptoolMode) {
		case 'ZOOMIN':
			if ( ((x1-x0)<3)||((y1-y0)<3) ) {
				ms_zoomByFactor(getMapX(x0+1), getMapY(y0+1), 2);
			} else {
				ms_zoomToExtent(getMapX(x0), getMapY(y1), getMapX(x1), getMapY(y0));
			}
	      	break;
		case 'ZOOMOUT':
			//box-mp berechnen;
			var centerx = getMapX(x0 + (x1-x0)/2);
			var centery = getMapY(y0 + (y1-y0)/2);
			if ( ((x1-x0)<3)||((y1-y0)<3) ) {
				var factor = 0.5;
			} else {
				var factor = Math.max((x1-x0)/mapwidth, (y1-y0)/mapheight);
			}
			ms_zoomByFactor(centerx, centery, factor);
			break;
		default:
			alert('kein gültiges BoxTool');
	}
	hideBox();
}

//Line-Tool
function startPlinetool() {
	//Polylinien-Maptool
	plineMode=true;
	//Koordinaten zurücksetzen
	plineNodesX.length=1;
	plineNodesY.length=1;
	plineNodesX[0]=imgx;
	plineNodesY[0]=imgy;
	//vorherige Zeichnungen löschen
	clearDrawing();
}

function stopPlineTool() {
	plineMode=false;
	clearDrawing();
	ibSetContent("");
}

function plineSegmentAdd() {
	//if (imgx>2) {
  		//alert(imgx + ' : ' + imgy);
		drawSegment(plineNodesX[plineNodesX.length-1],plineNodesY[plineNodesY.length-1],imgx, imgy, false);
		//neuen Knoten hinzufügen
		plineNodesX[plineNodesX.length]=imgx;
		plineNodesY[plineNodesY.length]=imgy;		
   		//doMeasureLengthInfo(x,y);    		
	//}
}

function plineSegmentUpdate(x,y) {
    drawSegment(plineNodesX[plineNodesX.length-1],plineNodesY[plineNodesY.length-1], x, y, true);
   	doMeasureLengthInfo(x,y);    
}

function execMaptoolAction() {
	//OneClick-Maptools
	switch(maptoolMode) {
		case 'PAN':
			var centerx = minx + xdist/2 - (getMapX(imgx2)-getMapX(imgx));
			var centery = miny + ydist/2 - (getMapY(imgy2)-getMapY(imgy));
			ms_zoomByFactor(centerx, centery, 1);
			clearMap();
			break;
		case 'IDENTIFY':
			//dbRequestMode="_identify";
			db_identify(getMapX(imgx),getMapY(imgy),'_identify');
			break;
		default:
			//keine Aktion
	}
}

function resetMaptipTimer(x,y){
	window.clearTimeout(maptipTimer);
	maptipTimer = window.setTimeout("getMaptip(" + x + "," + y + ");", maptipTimeout);
}

function getMaptip(x, y) {
	maptipx=x;
	maptipy=y;
	//dbRequestMode='_maptip';	
	db_identify(getMapX(x), getMapY(y), '_maptip');
}

function ms_refreshMap() {
	requestMap('');
}

function ms_zoomToExtent(xmin, ymin, xmax, ymax) {
	mapext = xmin + ' ' + ymin + ' ' + xmax + ' ' + ymax;
	requestMap('');
}

function ms_zoomByFactor(centerx, centery, factor) {
	if (factor<0.1) factor=0.1;
	var xmin = Math.max(centerx - (xdist/factor)/2, themeMinX);
	var xmax = Math.min(centerx + (xdist/factor)/2, themeMaxX);
	var ymin = Math.max(centery - (ydist/factor)/2, themeMinY);
	var ymax = Math.min(centery + (ydist/factor)/2, themeMaxY);
	mapext = xmin + ' ' + ymin + ' ' + xmax + ' ' + ymax;
	requestMap('');
}

function ms_zoomToFeature(aQLayer, aQString, buffer, dsnType) {
	var query = 'http://' + server + mapservExe + '?';
	query += 'MAP=' + mapfile;
	query += '&MAPSIZE=' + mapwidth + '+' + mapheight;
//	if ((dsnType=='SHAPEFILE')&&(aQString.substr(0,6)=='[GID]=')) {
	if ((dsnType=='SHAPEFILE' || dsnType=='OGR')&&(aQString.indexOf('[GID]=')!=-1)) {
		query += '&MODE=INDEXQUERY';
		query += '&SHAPEINDEX=' + parseInt(aQString.substring(aQString.indexOf('[GID]=')+6, aQString.indexOf(')'))-1);
	} else { //z.B. POSTGIS
		query += '&MODE=ITEMNQUERY';
		query += '&QSTRING=(' + aQString + ')';		
	}
	query += '&QLAYER=' + aQLayer;
	query += '&MAPEXT=shapes';	
	if (buffer>-1) {
		query += '&BUFFER=' + buffer;
	}
	//query += '&sql=select * from adresse where ' + aQString;
	//query += '&SAVEQUERY';	
	query += '&_REQUESTMODE=_search';
	//query = encodeURI(query);	
	if (debug) alert(query);	
	sendMSRequest(query);
}

function ms_panByReference (refx, refy) {
	if (!imgext) imgext=mapext;
	var query = 'http://' + server + mapservExe + '?';
	query += 'MAP=' + mapfile;
	query += '&MODE=browse';
	query += '&MAPSIZE=' + mapwidth + '+' + mapheight;
	query += '&MAPEXT=' + mapext;	
	query += '&IMGEXT=' + imgext;
	//query += '&MAP_'; + GWMLayer + '_CLASS_0_EXPRESSION=("[bezei]"=' + "'" + selectedGWMid  + "'" + ')';	
	query += '&REF.X=' + refx;
	query += '&REF.Y=' + refy;
	query += '&_REQUESTMODE=_getMap';	
	//query = encodeURI(query);	
	sendMSRequest(query);
}
