/** Flag indicating if map is in drag mode or not
 */
var mapDrag = false;

/** Find position of mouseevent, compensate for origin offset
 * @param e event
 * @return the coordinate for the event
 * @type Coordinate
 */
function getXY(e){
	var posx = 0;
	var posy = 0;
	if (!e) var e = window.event;

        // TODO ugly coord compensation

        var compx = 0;
        var compy = 0;

	if (e.pageX || e.pageY)	{
		posx = e.pageX;
		posy = e.pageY;
                
                compx = 11;
                compy = 42;
	}
	else if (e.clientX || e.clientY){
	        posx = e.clientX + document.body.scrollLeft;
		posy = e.clientY + document.body.scrollTop;
                
                compx = 13;
                compy = 43;
	}
       
        // compensate origin offset
        posx = posx - compx;
        posy = posy - compy;

        return new Coordinate(posx,posy);
}

function Map_onMouseDown(event){	
 
  if(!event) var event = window.event;
  
  switch(map.mode){
    case 4: // FeatureInfoQuery
        var pos = getXY(event);        
  	map.featureInfo(pos.x , pos.y);	
        break;
    case 3: // Pan
        
        document.getElementById('dmapimage').style.cursor='move';

        panOffset = getXY(event);

        var targ = document.getElementById('map_g0_');
        
        panCoord = new Coordinate(parseInt(targ.style.left), parseInt(targ.style.top) );
  
        mapDrag=true;

        break;
    default:      
        map.rubberbander = new RubberRectangle('red', 'solid', '1px');
        map.rubberbander.mouseDown(event);
   }  
}

function Map_onMouseMove(event){ 

    if(!event) var event = window.event;

    var currPos = getXY(event);
    window.status = i18n('js.statusprefix')+ " "+map.pixelToDD(currPos.x , currPos.y, 1000) + ' ( '+i18n('js.pixx')+': '+currPos.x+', '+i18n('js.pixy')+': '+currPos.y+')';
    
    switch(map.mode){
        case 3: // pan
            if(!mapDrag){return};

            var targ = document.getElementById('map_g0_');
            var curr = getXY(event);
            
            var newLeft = panCoord.x + curr.x - panOffset.x;
            var newTop = panCoord.y + curr.y - panOffset.y;
            targ.style.left = newLeft + 'px';
            targ.style.top = newTop + 'px'; 

            var cTop = 0;
            var cRight = 1000;
            var cBottom = 700;
            var cLeft = 0;

            if( newTop <= 0 ){
                cTop = Math.abs(newTop);
                cBottom = map.dimension.height;
            }
            else{
                cTop = 0;
                cBottom = map.dimension.height - newTop;
            }
            if( newLeft <= 0 ){
                cLeft = Math.abs(newLeft);
                cRight = map.dimension.width;
            }
            else{
                cLeft = 0;
                cRight = map.dimension.width - newLeft;
            }

            cTop = cTop == 0 ? "0" : cTop + 'px';
            cRight = cRight == 0 ? "0" : cRight + 'px';
            cBottom = cBottom == 0 ? "0" : cBottom + 'px';
            cLeft = cLeft == 0 ? "0" : cLeft + 'px';

            targ.style.clip='rect('+cTop+','+cRight+','+cBottom+','+cLeft+')';
       
            break;
        default:
            if (map.rubberbander) {
                map.rubberbander.mouseMove(event); 
            } 
            break;
    }
        
    return false;
}

function Map_onMouseUp(event){

   if(!event) var event = window.event;
   
   switch(map.mode){
    case 3: // pan
        show('pan_cover');
        map.prevPrevBounds = map.prevBounds.copy();
        map.prevBounds = map.cBounds.copy();

        var targ = document.getElementById('map_g0_');
        var deltaX = parseInt(targ.style.left);
        var deltaY = parseInt(targ.style.top);
 
        var xMin = 0 - deltaX;
        var xMax = xMin + parseInt(targ.style.width);
        var yMax = 0 - deltaY;
        var yMin = yMax + parseInt(targ.style.height);                
  
        var ul = map.pixelToDD( xMin, yMax );
        var lr = map.pixelToDD( xMax, yMin );
        
        map.cBounds.xMin = ul[0]; 
        map.cBounds.yMin = lr[1]; 
        map.cBounds.xMax = lr[0]; 
        map.cBounds.yMax = ul[1]; 

        map.redraw();        
        map.panDragReset();

        break;
    default:
        if (map.rubberbander) {   
            map.rubberbander.mouseUp(event);
        }
        break;
    }
   
    mapDrag = false;
}
