/******************************************************************************
 * kaZoomer
 *
 * class to handle the zoom overlay
 *
 * oKaMap - the ka-Map instance to draw the zoomer on
 *
 *****************************************************************************/
function kaZoomer()
{
	this.nZoomImageHeight = 8;
	this.opacity = 100;
	this.left = 7;
	this.top = 3;
	this.right = null;
	this.bottom = null;
	this.zoomControlObj = null;
	this.draw = kaZoomer_draw;
	this.update = kaZoomer_update;
	this.listeners = [];
}

kaZoomer.prototype.attach = function(oKaMap)
{
    this.kaMap = oKaMap;
    //get the viewport
    this.domObj = oKaMap.domObj;    
   
   	// don't draw until initialized
   	if (this.kaMap.initializationState < 2) {
		this.kaMap.registerForEvent( KAMAP_MAP_INITIALIZED, this, this.draw );
	} else {
		this.draw();
	}
}

kaZoomer.prototype.remove = function()
{
	if (this.zoomControlObj && this.zoomControlObj != null)
	{
		for (var i=0; i<this.listeners.length; i++)
			PEvent.removeListener(this.listeners[i]);
		this.listeners = [];
		while (this.zoomControlObj.hasChildNodes())
			this.zoomControlObj.removeChild(this.zoomControlObj.firstChild);
		if (this.kaMap && this.kaMap != null) 
			this.kaMap.domObj.removeChild(this.zoomControlObj);
	}
}

function kaZoomer_setPosition( left, top, right, bottom )
{
    this.left = left;
    this.top = top;
    this.right = right;
    this.bottom = bottom;
    
    if (this.zoomControlObj != null)
    {
        if (this.left != null)
        {
            oZoomControl.style.left = this.left + 'px';
        }
        else if (this.right != null)
        {
            oZoomControl.style.right = this.right + 'px';
        }
        if (this.top != null)
        {
            oZoomControl.style.top = this.top + 'px';
        }
        else if (this.bottom != null)
        {
            oZoomControl.style.bottom = this.bottom + 'px';
        }
    }
}

//handle a map zoom change from another tool
function kaZoomer_update()
{
    
    var nThumbHeight = dd.elements.zoomTrack.div.elementHeight;
    var nTrackTop = dd.elements.zoomTrack.y;
    
    var oKaMap = dd.elements.zoomTrack.div.kaZoomer.kaMap;
    var oMap = oKaMap.getCurrentMap();
    var nCurrentScale = parseInt(oMap.currentScale) + 1; //array is zero based
    var nScales = oMap.getScales().length;
    var nTrackHeight = this.nZoomImageHeight * nScales;
    var nPos = (nScales-nCurrentScale)*nThumbHeight;
    dd.elements.zoomThumb.moveTo(dd.elements.zoomThumb.x,nTrackTop + nPos);
}

//set up the slider UI.
function kaZoomer_draw()
{
    //get scale info for the current map.
    var oMap = this.kaMap.getCurrentMap();
    var nScales = oMap.getScales().length;
    var nCurrentScale = oMap.currentScale;
    var nTrackHeight = this.nZoomImageHeight * nScales;
    var nTrackMaxPosition = this.nZoomImageHeight * (nScales - 1);
    var nInitialPosition = dd.Int(this.nZoomImageHeight * 
                                  (nScales - nCurrentScale - 1));
    //widget images
    var szThumbImg = this.kaMap.server + 'images/control_slider.png';
    var szThumbImgOver = this.kaMap.server + 'images/control_slider_over.png';
    
    //container div
    this.zoomControlObj = document.createElement('div');
    this.zoomControlObj.id = 'zoomControl';
    this.zoomControlObj.style.position = 'absolute';
    if (this.left != null) 
    	this.zoomControlObj.style.left = this.left + 'px';
    else if (this.right != null)
        this.zoomControlObj.style.right = this.right + 'px';
    if (this.top != null)
        this.zoomControlObj.style.top = this.top + 'px';
    else if (this.bottom != null)
        this.zoomControlObj.style.bottom = this.bottom + 'px';
    
    this.zoomControlObj.style.width = 29 + "px";
	// make sure this height accounts for spacing between buttons
    this.zoomControlObj.style.height = (nTrackHeight + 2 * this.nZoomImageHeight + 30) + "px"; 
    this.zoomControlObj.style.zIndex = 300;
    this.zoomControlObj.kaZoomer = this;
    this.zoomControlObj.style.MozUserSelect = 'none';
    this.kaMap.domObj.appendChild(this.zoomControlObj);
    
    //draw the widget
    var oZoomTrack = document.createElement( 'div' );
    oZoomTrack.id = 'zoomTrack';
    oZoomTrack.kaZoomer = this;
    oZoomTrack.style.position = 'absolute';
    oZoomTrack.style.left = '0px';
    oZoomTrack.style.top = '28px';
    oZoomTrack.style.height = parseInt(nTrackHeight) + 'px';
    oZoomTrack.style.width = '29px';
    addPNGBackground(oZoomTrack,this.kaMap.server + "images/control_zoombar.png");
    oZoomTrack.style.backgroundRepeat = "no-repeat";
    oZoomTrack.elementHeight = this.nZoomImageHeight;
    this.listeners.push(PEvent.addListener(oZoomTrack, 'click', kaZoomer_zoomTo));
    this.zoomControlObj.appendChild(oZoomTrack);
   
	var oZoomThumb = document.createElement('div');
	oZoomThumb.id = 'zoomThumb';
	oZoomThumb.title = 'Drag to Zoom';
	oZoomThumb.style.position = 'absolute';
	oZoomThumb.style.width = "29px";
	oZoomThumb.style.height = "7px";
	this.listeners.push(PEvent.addListener(oZoomThumb, 'mouseover', function() { addPNGBackground(this,szThumbImgOver); }));
	this.listeners.push(PEvent.addListener(oZoomThumb, 'mouseout', function() { addPNGBackground(this,szThumbImg); })); 
	addPNGBackground(oZoomThumb,szThumbImg);
	this.zoomControlObj.appendChild(oZoomThumb);

	//add +/- labels
	var zoomKamap = this.kaMap;
	var oZoomIn = document.createElement('img');
	var oZoomInImg = this.kaMap.server+"images/control_zoomin.png";
	var oZoomInImgOver = this.kaMap.server+"images/control_zoomin_over.png";
	oZoomIn.title = 'Zoom In';
	oZoomIn.id = 'zoomIn';
	oZoomIn.style.position = 'absolute';
	oZoomIn.style.top = '0px';
	oZoomIn.style.left = '2px';
	oZoomIn.style.width = '25px';
	oZoomIn.style.height = '25px';
	oZoomIn.style.cursor = 'pointer';
	oZoomIn.src = oZoomInImg;
	oZoomIn.kaZoomer = this;
	this.listeners.push(PEvent.addListener(oZoomIn, 'mouseover', function() { this.src = oZoomInImgOver; }));
	this.listeners.push(PEvent.addListener(oZoomIn, 'mouseout', function() { this.src = oZoomInImg; }));
	this.listeners.push(PEvent.addListener(oZoomIn, 'click', function() { kaZoomer_zoomIn(zoomKamap); }));
	this.zoomControlObj.appendChild(oZoomIn);

	var oZoomOut = document.createElement('img');
	var oZoomOutImg = this.kaMap.server+"images/control_zoomout.png";
	var oZoomOutImgOver = this.kaMap.server+"images/control_zoomout_over.png";
	oZoomOut.id = 'zoomOut';
	oZoomOut.title = 'Zoom Out';
	oZoomOut.style.position = 'absolute';
	oZoomOut.style.top = 30 + nTrackHeight + 'px';
	oZoomOut.style.left = '2px';
	oZoomOut.style.width = '25px';
	oZoomOut.style.height = '25px';
	oZoomOut.style.cursor = 'pointer';
	oZoomOut.src = oZoomOutImg;
	oZoomOut.kaZoomer = this;
	this.listeners.push(PEvent.addListener(oZoomOut, 'mouseover', function() { this.src = oZoomOutImgOver; }));
	this.listeners.push(PEvent.addListener(oZoomOut, 'mouseout', function() { this.src = oZoomOutImg; }));
	this.listeners.push(PEvent.addListener(oZoomOut, 'click', function() { kaZoomer_zoomOut(zoomKamap) }));
	this.zoomControlObj.appendChild(oZoomOut);

    //set up drag and drop
    ADD_DHTML('zoomThumb'+MAXOFFTOP+0+MAXOFFBOTTOM+nTrackMaxPosition+VERTICAL);
    //document.title = ('zoomThumb'+MAXOFFTOP+0+MAXOFFBOTTOM+nTrackMaxPosition+VERTICAL);
    ADD_DHTML('zoomTrack'+NO_DRAG);
    //document.title = ('zoomTrack'+NO_DRAG);

    dd.elements.zoomThumb.moveTo(dd.elements.zoomTrack.x, dd.elements.zoomTrack.y + nInitialPosition);
    dd.elements.zoomThumb.css.cursor = 'pointer';
    dd.elements.zoomThumb.setZ(dd.elements.zoomTrack.z+1);

    dd.elements.zoomTrack.addChild('zoomThumb');
    dd.elements.zoomTrack.css.cursor = 'pointer';

    dd.elements.zoomThumb.defx = dd.elements.zoomTrack.x;
    dd.elements.zoomThumb.defy = dd.elements.zoomTrack.y;
    
    dd.elements.zoomThumb.my_DropFunc = kaZoomer_DropFunc;
    
    this.kaMap.registerForEvent( KAMAP_SCALE_CHANGED, this, this.update );
}

//wz_dragdrop.js overriden function for responding to a release of the slider
function kaZoomer_DropFunc()
{
    //move thumb to closest scale marker
    var nTrackTop = dd.elements.zoomTrack.y;
    
    var nThumbTop = dd.elements.zoomThumb.y - nTrackTop;
    var nThumbHeight = dd.elements.zoomTrack.div.elementHeight;
    
    var nNearestIndex = Math.round(nThumbTop / nThumbHeight);
    dd.elements.zoomThumb.moveTo(dd.elements.zoomThumb.x,nTrackTop +(nNearestIndex*nThumbHeight));
    dd.elements.zoomThumb.css.cursor = 'pointer';
    
    //perform zoom
    var oKaMap = dd.elements.zoomTrack.div.kaZoomer.kaMap;
    var oMap = oKaMap.getCurrentMap();
    var nCurrentScale = oMap.getScales()[oMap.aScales.length - nNearestIndex - 1];
    oKaMap.zoomToScale(nCurrentScale);
}

//zoom to the level clicked in the track
function kaZoomer_zoomTo( e )
{
    e = (e)?e:((event)?event:null);
    var nClickTop = (e.layerY)?e.layerY:e.offsetY;
    //find current track height
    var oKaZoomer = dd.elements.zoomTrack.div.kaZoomer;
    var oKaMap = oKaZoomer.kaMap;
    var oMap = oKaMap.getCurrentMap();
    var nScales = oMap.getScales().length;
    var nTrackHeight = dd.Int(oKaZoomer.nZoomImageHeight) * nScales;
    
    //zoome to closest scale
    var nNearestIndex = Math.floor(nClickTop / nTrackHeight * nScales);
    var nNewScale = oMap.getScales()[oMap.aScales.length - nNearestIndex - 1];
    oKaMap.zoomToScale(nNewScale);
}

function kaZoomer_onmouseover( e )
{
    this.style.opacity = 1;
    this.style.mozOpacity = 1;
    this.style.filter = "Alpha(opacity=100)";
}

function kaZoomer_onmouseout( e )
{
    this.style.opacity = this.kaZoomer.opacity/100;
    this.style.mozOpacity = this.kaZoomer.opacity/100;
    this.style.filter = "Alpha(opacity="+this.kaZoomer.opacity+")";
}

function kaZoomer_zoomIn(kaMap)
{
    kaMap.zoomIn();
}

function kaZoomer_zoomOut(kaMap)
{
    kaMap.zoomOut();
}

function kaZoomer_alert()
{
    alert('here');
}
