/******************************************************************************
 * kaKeymap - a simple query tool class
 *
 * copyright DM Solutions Group Inc.
 *
 * $Id: kaKeymap.js,v 1.8 2005/09/14 12:55:41 pspencer Exp $
 *
 ******************************************************************************
 *
 * kaKeymap provides an overview or reference for navigational aid to the user.
 * It works by displaying an image and overlaying a rectangular box that
 * indicates the current extents of the main kaMap view.  To accomplish this,
 * the image is associated with a set of geographic extents that it represents.
 * A keymap image is normally a small image that is representative of the full
 * area of the application's data, but with reduced detail (typically just
 * polygons and lines for countries and political boundaries).
 *
 * The default mode of operation uses MapServer only to get the reference
 * object image and extents from the map file.  Tracking of extents is done
 * purely on the client side.
 *
 * The original kaKeymap code was written by DM Solutions Group.  Lorenzo
 * Becchi contributed the code to make the keymap clickable and draggable.
 * 
 *****************************************************************************/

/******************************************************************************
 * kaKeymap
 *
 * class to handle the keymap
 *
 * oKaMap - the ka-Map instance to draw the keymap for
 * szID - string, the id of a div that will contain the keymap
 *
 *****************************************************************************/
function kaKeymap(oKaMap, szID )
{
    this.domObj = getRawObject(szID);
    this.domObj.kaKeymap=this;
    
    this.kaMap = oKaMap;

    this.domExtents = null;
    this.domEvent = null;
    this.aExtents = null;
    this.domImg = null;
    this.imgSrc = null;
    this.imgWidth = null;
    this.imgHeight = null;
    
    this.cellWidth = null;
    this.cellHeight = null;
    this.initialExtents = null;
   
    //prototypes
    this.initialize = kaKeymap_initialize;
    this.draw = kaKeymap_draw;
    this.update = kaKeymap_update;
    
    this.aPixPos = kaKeymap_aPixPos;
    this.centerMap = kaKeymap_centerMap;
    this.onclick = kaKeymap_onclick;
    this.mouseup = kaKeymap_mouseup ;
    
    this.domObj.ondblclick= this.onclick;
    if ( this.domObj.captureEvents)  
        this.domObj.captureEvents(Event.DBLCLICK);
   
    this.kaMap.registerForEvent( KAMAP_EXTENTS_CHANGED, this, this.update );
    this.kaMap.registerForEvent( KAMAP_MAP_INITIALIZED, this, this.initialize );
}

function kaKeymap_initialize()
{

  /*chi la inizializza? bo*/
    call(this.kaMap.server+'/keymap.php?map='+this.kaMap.currentMap,this,this.draw);
}

function kaKeymap_draw( szResult )
{
    eval( szResult );
    
    this.cellWidth = (this.aExtents[2] - this.aExtents[0]) / 181; // this.imgWidth;
    this.cellHeight = (this.aExtents[3] - this.aExtents[1]) / 131; // this.imgHeight;
    
    //create an image to hold the keymap
    this.domImg = document.createElement( 'img' );
    this.domImg.src = this.imgSrc;
    // cpurvis -- I don't know why it's not pulling these correctly.
    this.domImg.width = 181; // this.imgWidth;
    this.domImg.height = 131; // this.imgHeight;
    this.domObj.appendChild( this.domImg );
    
    //create a div to track the current extents
    this.domExtents = document.createElement( 'div' );
    this.domExtents.style.position = 'absolute';
    this.domExtents.style.border = '1px solid red';
    this.domExtents.style.top = "1px";
    this.domExtents.style.left = "1px";
    this.domExtents.style.width = "1px";
    this.domExtents.style.height = "1px";
    this.domExtents.style.backgroundColor = 'transparent';
    this.domExtents.style.visibility = 'hidden';
    this.domObj.appendChild(this.domExtents);

    //create a div to allow click/drag of extents for nav
    this.domEvent = document.createElement( 'div' );
    this.domEvent.kaKeymap=this;
    
    this.domEvent.onmousedown= kaKeymap_mousedown;
    this.domEvent.onmouseup= this.mouseup;
    this.domEvent.onmousemove= kaKeymap_mousemove;
    this.domEvent.onmouseout= kaKeymap_mouseup;
    
    if (this.domEvent.captureEvents)
    {
        this.domEvent.captureEvents(Event.MOUSEDOWN);
        this.domEvent.captureEvents(Event.MOUSEUP);
        this.domEvent.captureEvents(Event.MOUSEMOVE);
        this.domEvent.captureEvents(Event.MOUSEOUT);
    }
    
    this.domEvent.style.position = 'absolute';
    this.domEvent.style.border = '1px solid red';
    this.domEvent.style.top = "1px";
    this.domEvent.style.left = "1px";
    this.domEvent.style.width = "1px";
    this.domEvent.style.height = "1px";
    this.domEvent.style.backgroundColor = 'pink';
    this.domEvent.style.visibility = 'visible';
    this.domEvent.style.opacity=0.01;
    this.domEvent.style.mozOpacity=0.01;
    this.domEvent.style.filter = "Alpha(opacity=1)";
    
    this.domObj.appendChild(this.domEvent);
      
    //crosshairs as an alternate to the box when it becomes very small
    var d = document.createElement( 'div' );
    d.style.position = 'absolute';
    d.style.height = "10px";
    d.style.width = "1px";
    d.style.backgroundColor = "red";
    d.style.left = "0px";
    d.style.top = "0px";
    d.style.zIndex = 2;
    d.style.visibility = 'hidden';
    this.domExtents.appendChild(d);
    
    d = document.createElement( 'div' );
    d.style.position = 'absolute';
    d.style.height = "1px";
    d.style.width = "11px";
    d.style.backgroundColor = "red";
    d.style.left = "0px";
    d.style.top = "0px";
    d.style.zIndex = 2;
    d.style.visibility = 'hidden';
    this.domExtents.appendChild(d);
    
    d = document.createElement( 'div' );
    d.style.position = 'absolute';
    d.style.height = "10px";
    d.style.width = "11px";
    d.style.backgroundColor = "white";
    d.style.opacity = 0.5;
    d.style.mozOpacity = 0.5;
    d.style.filter = 'Alpha(opacity=50)';
    d.style.left = "0px";
    d.style.top = "0px";
    d.style.zIndex = 1;
    d.style.visibility = 'hidden';
    this.domExtents.appendChild(d);
    if (this.initialExtents != null)
    {
        this.update( null, this.initialExtents);
    }   
}

function kaKeymap_update( eventID, extents )
{
    if (!this.aExtents || !this.domExtents)
    {
        this.initialExtents = extents;
        return;
    }

    var left = parseInt((extents[0] - this.aExtents[0]) / this.cellWidth);
    var width = parseInt((extents[2] - extents[0]) / this.cellWidth);
    var top = parseInt(-1 * (extents[3] - this.aExtents[3]) / this.cellHeight);
    var height = parseInt((extents[3] - extents[1]) / this.cellHeight);
    
    this.domExtents.style.top = top + "px";
    this.domExtents.style.left = left + "px";
    this.domExtents.style.width = width + "px";
    this.domExtents.style.height = height + "px";
    
    this.domEvent.style.top = top + "px";
    this.domEvent.style.left = left + "px";
    this.domEvent.style.width = width + "px";
    this.domEvent.style.height = height + "px";
    
    if (width < parseInt(this.domExtents.childNodes[1].style.width) ||
        height < parseInt(this.domExtents.childNodes[0].style.height) )
    {
        this.domExtents.style.visibility = 'hidden';
        this.domEvent.style.visibility = 'hidden';
        var d = this.domExtents.childNodes[0];
        d.style.left = ((width/2) - parseInt(d.style.width)/2) + "px";
        d.style.top = ((height/2) - parseInt(d.style.height)/2) + "px";
        d.style.visibility = 'visible';
        
        d = this.domExtents.childNodes[1];
        d.style.left = ((width/2) -parseInt(d.style.width)/2) + "px";
        d.style.top = ((height/2) - parseInt(d.style.height)/2) + "px";
        d.style.visibility = 'visible';
        
        d = this.domExtents.childNodes[2];
        d.style.left = ((width/2) -parseInt(d.style.width)/2) + "px";
        d.style.top = ((height/2) - parseInt(d.style.height)/2) + "px";
        d.style.visibility = 'visible';
        
    }
    else
    {
        this.domEvent.style.visibility = 'visible';
        this.domExtents.style.visibility = 'visible';
        this.domExtents.childNodes[0].style.visibility = 'hidden';
        this.domExtents.childNodes[1].style.visibility = 'hidden';
        this.domExtents.childNodes[2].style.visibility = 'hidden';
    }
}
/*click event on div kaKeymap*/
function kaKeymap_onclick(e)
{
    e = (e)?e:((event)?event:null); 
    this.kaKeymap.centerMap(e);
}
/*call aPixPos to calculate geografic position of click and recenter kamap map*/
function kaKeymap_centerMap(e)
{
    /*funzione per centrare la mappa dalla keymap*/
    var pos= this.aPixPos( e.clientX, e.clientY );
    this.kaMap.zoomTo(pos[0],pos[1]);
}
/**
 * kaKeymap_aPixPos( x, y )
 *
 * try to calculate geoposition in kaKeymap
 *
 * x - int, the x page coord
 * y - int, the y page coord
 *
 * returns an array with geo positions
 */
function kaKeymap_aPixPos( x, y )
{
    var obj = this.domObj.offsetParent;
    var offsetLeft = 0;
    var offsetTop = 0;
    while (obj)
    {
        offsetLeft += parseInt(obj.offsetLeft);
        offsetTop += parseInt(obj.offsetTop);
        obj = obj.offsetParent;
    }
    var pX = x  - offsetLeft  ;
    var pY = y  -  offsetTop  ;
    pX = parseFloat(this.aExtents[0] + (this.cellWidth *pX)+0.5); 
    pY = parseFloat(this.aExtents[3] - (this.cellHeight *pY)+0.5);
    return [pX,pY];
}

function kaKeymap_mousedown(e)
{
    //alert(this.kaKeymap);
    e = (e)?e:((event)?event:null); 
    this.kaKeymap.domExtents.init=1;
    this.kaKeymap.domExtents.oX=e.clientX;
    this.kaKeymap.domExtents.oY=e.clientY;
    var amount= 50;
    this.kaKeymap.domExtents.style.backgroundColor = 'pink';
    this.kaKeymap.domExtents.style.opacity=amount/100;

    //this.kaKeymap.domObj.style.mozOpacity = amount/100;
    //Nasty IE effect (or bug?) when you apply a filter
    //to a layer, it clips the layer and we rely on the
    //contents being visible outside the layer bounds
    //for 'railroading' the tiles
    if (isIE4)
        this.kaKeymap.domExtents.style.filter = "Alpha(opacity="+amount+")";
}
function kaKeymap_mouseup(e)
{
    // alert(this.kaKeymap);

    if(this.kaKeymap.domExtents.init)
    {
        e = (e)?e:((event)?event:null); 
        this.kaKeymap.domExtents.style.backgroundColor = 'transparent';
        this.kaKeymap.domExtents.style.opacity=1;
        if (isIE4) 
            this.kaKeymap.domExtents.style.filter = "Alpha(opacity=100)";
   
        this.kaKeymap.domExtents.init=0;
        
        var cpX = parseInt(this.kaKeymap.domExtents.style.left) + 
                 parseInt(this.kaKeymap.domExtents.style.width)/2;
                 
        var cpY = parseInt(this.kaKeymap.domExtents.style.top) + 
                 parseInt(this.kaKeymap.domExtents.style.height)/2;
       
        var cgX = parseFloat(this.kaKeymap.aExtents[0] + 
                            (this.kaKeymap.cellWidth *cpX)+0.5); 
        var cgY = parseFloat(this.kaKeymap.aExtents[3] - (this.kaKeymap.cellHeight *cpY)+0.5); 
        
        this.kaKeymap.kaMap.zoomTo(cgX,cgY);
    }
}


function kaKeymap_mousemove(e)
{
    e = (e)?e:((event)?event:null); 
    if(this.kaKeymap.domExtents.init)
    {
        var xMov=(this.kaKeymap.domExtents.oX-e.clientX);
        var yMov=(this.kaKeymap.domExtents.oY-e.clientY);
        var oX=parseInt(this.kaKeymap.domExtents.style.left);
        var oY=parseInt(this.kaKeymap.domExtents.style.top);
        var nX = oX-xMov;
        var nY = oY-yMov;
        // document.getElementById('altro').innerHTML=  xMov+" "+yMov;
        this.kaKeymap.domEvent.oX= e.clientX;
        this.kaKeymap.domEvent.oY= e.clientY;
        this.kaKeymap.domEvent.style.top = nY + "px";
        this.kaKeymap.domEvent.style.left = nX + "px";
      
        this.kaKeymap.domExtents.oX= e.clientX;
        this.kaKeymap.domExtents.oY= e.clientY;
        this.kaKeymap.domExtents.style.top = nY + "px";
        this.kaKeymap.domExtents.style.left = nX + "px";
    }
}
