
var debug = "True"; // set to "" for no debugging
// Debug statement: (debug) ? alert('DEBUG Got here ' + this.pts.length) : "";

function abortProcs()
{
    if(g_proc && g_proc.name!="defaultProc")
        g_proc.abort();
    g_proc=g_defaultProc;
    var map=document.getElementById('mapWindow');	
    map.style.cursor="default";      
}
//=======================================================
//  Zoom Procedure Class
//=======================================================
function zoomProc()
{
    this.name="zoom";
    this.mouseDown=zoomProcMouseDown;
    this.mouseUp=zoomProcMouseUp;
    this.mouseMove=zoomProcMouseMove;    
    this.start=zoomProcStart;
    this.abort=zoomProcAbort;
    this.xDown=-1;//map window coordinate where mouse was pressed down
    this.yDown=-1;
    this.saveProc=null;
}
function zoomProcAbort()
{
    changeMenuImage("btnZoom","tgis/btnZoom.png");
}
function zoomProcStart()
{
    var win=document.getElementById('mapWindow');	
    win.style.cursor="url(tgis/zoom.cur),auto";
    changeMenuImage("btnZoom","tgis/btnZoom2.png");
    return false;
}
function zoomProcMouseDown()
{
    var map=document.getElementById('mapWindow');	
	this.xDown=g_mouseX-parseInt(map.style.left);
	this.yDown=g_mouseY-parseInt(map.style.top);    
	
    return false;
}
function zoomProcMouseUp()
{
    //end the procedure
    var map=document.getElementById('mapWindow');	
    map.style.cursor="default";    
    g_proc=this.saveProc;
    g_proc.resume();

    changeMenuImage("btnZoom","tgis/btnZoom.png");


    var zdiv=document.getElementById("zoomdiv");   
    var extWidth;
    var extHeight;
    if(zdiv!=null)
    {
        zdiv.parentNode.removeChild(zdiv);	
        var x1=this.xDown;
        var y1=this.yDown; 
	    var x2=g_mouseX-parseInt(map.style.left);
	    var y2=g_mouseY-parseInt(map.style.top);    
	    var swap;
	    if(x2<x1)
	    {
	        swap=x1;
	        x1=x2;
	        x2=swap;
	    }
	    if(y2<y1)
	    {
	        swap=y1;
	        y1=y2;
	        y2=swap;
	    }
	    var mw=document.getElementById('mapWindow');  	
	    var mwWidth=parseInt(mw.style.width);
	    var mwHeight=parseInt(mw.style.height);
	var wx=(g_xcenter-mwWidth/2)|0;
	var wy=(g_ycenter-mwHeight/2)|0;
	var mult=Math.pow(2,19-g_zoom);
	x1=((wx+x1)*mult)|0;
	y1=((wy+y1)*mult)|0;
	x2=((wx+x2)*mult)|0;
	y2=((wy+y2)*mult)|0;
	    //first find highest zoom that shows entire window
	    var zoom;
	    for(zoom=19;zoom>=(g_zoom+1);zoom--)
	    {
		    extWidth=x2-x1;
		    extHeight=y2-y1;
		    if(zoom==(g_zoom+1) || (extWidth<mwWidth && extHeight<mwHeight))
		    {
			    g_zoom=zoom;
			    g_xcenter=((x1+x2)/2)|0;
			    g_ycenter=((y1+y2)/2)|0;
			    redraw(false);
			    saveZoom();
			    return false;
		    }
		    x1=(x1/2)|0;
		    y1=(y1/2)|0;
		    x2=(x2/2)|0;
		    y2=(y2/2)|0;		
    			
	    }
    }
    return false;
}
function zoomProcMouseMove()
{
    if(this.xDown<0)
        return;
    var map=document.getElementById('mapWindow');	
    var x1=this.xDown;
    var y1=this.yDown; 
	var x2=g_mouseX-parseInt(map.style.left);
	var y2=g_mouseY-parseInt(map.style.top);    
	var swap;
	if(x2<x1)
	{
	    swap=x1;
	    x1=x2;
	    x2=swap;
	}
	if(y2<y1)
	{
	    swap=y1;
	    y1=y2;
	    y2=swap;
	}
    var zdiv=document.getElementById("zoomdiv");    
    if(zdiv==null)
    {    	
	    zdiv=document.createElement('div');
	    zdiv.id='zoomdiv';
	    zdiv.style.position='absolute';
	    zdiv.style.left=x1;
	    zdiv.style.top=y1;
	    zdiv.style.width=x2-x1;
	    zdiv.style.height=y2-y1;	    
	    zdiv.style.border='2px yellow solid';	    
	    zdiv.zindex=1;
	    //map.appendChild(zdiv);    //doesn't work in FF with overflow:hidden	    	    
	    var app=document.getElementById('appWindow');	
	    app.appendChild(zdiv);
    }
    else
    {    	
	    zdiv.style.left=x1;
	    zdiv.style.top=y1;
	    zdiv.style.width=x2-x1;
	    zdiv.style.height=y2-y1;
    }
    return false;
}
function doZoom()
{
    //if(g_proc.name=="zoom")
    g_proc.abort();
    var saveProc=g_proc;    
    g_proc=new zoomProc();
    g_proc.saveProc=saveProc;
    g_proc.start();
}
//====================end zoom proc class===================================


//=======================================================
//  Get Coordinates Procedure Class
//=======================================================

function getCoordProc()
{
    this.name="getCoord";
    this.mouseDown=getCoordProcMouseDown;
    this.mouseUp=getCoordProcMouseUp;
    this.mouseMove=getCoordProcMouseMove;    
    this.start=getCoordProcStart;
    this.getLatLonAtMouse=getCoordProc_GetLatLonAtMouse;
    this.abort=getCoordAbort;
    this.resume=getCoordResume;
    this.m_lat=0.0;
    this.m_lon=0.0;
    this.m_z19x=0;
    this.m_z19y=0;
}
function getCoordAbort()
{
}
function getCoordResume()
{
    var win=document.getElementById('mapWindow');	
    win.style.cursor="help";
}
function getCoordProcStart()
{
    var win=document.getElementById('mapWindow');	
    win.style.cursor="help";
    return false;
}
function getCoordProcMouseDown()
{
    return false;
}
function getCoordProcMouseUp()
{
	this.getLatLonAtMouse();

	var ns = "";
	var ew = "";
	var degLat;
	var degLon;
	var minLon;
	var minLat;
	var secLat;
	var secLon;
	var degMinLon;
	var degMinLat;
		
	if (this.m_lat<0)
	{
		ns = "S";
		degLat = Math.ceil(this.m_lat);
		minLat = this.m_lat - degLat;
		degMinLat = (minLat * 60);
		minLat = Math.ceil(degMinLat);
		secLat = (degMinLat - minLat)*60;

	}
	else
	{
		ns = "N";
		degLat = Math.floor(this.m_lat);
		minLat = this.m_lat - degLat;
		degMinLat = (minLat * 60);
		minLat = Math.floor(degMinLat);
		secLat = (degMinLat - minLat)*60;
	}
		
	if (this.m_lon<0)
	{
		ew = "W";
		degLon = Math.ceil(this.m_lon);
		minLon = this.m_lon - degLon;
		degMinLon = (minLon *60);
		minLon = Math.ceil(degMinLon);
		secLon = (degMinLon - minLon)*60;

	}	
	else
	{
		ew = "E";
		degLon = Math.floor(this.m_lon);
		minLon = this.m_lon - degLon;
		degMinLon = (minLon *60);
		minLon = Math.floor(degMinLon);
		secLon = (degMinLon - minLon)*60;
    }

	
	
	var s="<overlay><info><![CDATA[";

			s=s+"<table style=\"width:100%\">";
			s=s+"<tr><td style=background-color:#97C3F5 height=18><center><p class=tgTitle>Get Coordinates</p></center></td></tr>";
			s=s+"<tr><td valign=top style=background-color:#97C3F5>";
			s=s+"<img src=tgis/x.png><br><table border=1 cellspacing=0>";
            s=s+"<tr><td class=\"ftrfld\" align=left valign=top><b>Deg-Min-Sec:</b></td><td class=\"ftrval\">"+ns+"   "+Math.abs(degLat)+" deg "+Math.abs(minLat)+" min "+Math.abs(secLat).toFixed(3) + " sec<br>"+ew+" "+Math.abs(degLon)+" deg "+Math.abs(minLon)+" min " +Math.abs(secLon).toFixed(5) + " sec</td></tr>";
            s=s+"<tr><td class=\"ftrfld\"align=left valign=top><b>Deg-Min:</b></td><td class=\"ftrval\">"+ns+"   "+Math.abs(degLat)+" deg "+Math.abs(degMinLat).toFixed(5)+" min<br>"+ew+" "+Math.abs(degLon)+" deg "+Math.abs(degMinLon).toFixed(5)+" min</td></tr>";
            s=s+"<tr><td class=\"ftrfld\" align=left valign=top><b>Deg:</b></td><td class=\"ftrval\">"+ns+"   "+Math.abs(this.m_lat.toFixed(7))+" deg<br>"+ew+" "+ Math.abs(this.m_lon.toFixed(7))+" deg</td></tr>";
            s=s+"</table></p>";
			s=s+"</td></tr></table>";
			s=s+"]]></info>";
			s=s+"<sym>"+this.m_z19x+","+this.m_z19y+",24,tgis/x.png</sym>";
			s=s+"</overlay>";
    xml=getXmlFromString(s);
	updateOverlay(xml);

    var map=document.getElementById('mapWindow');	
    map.style.cursor="default";    
    g_proc=g_defaultProc;
    return false;
}

function getCoordProc_GetLatLonAtMouse()
{
    var z19pt=new z19Pt(g_mouseX,g_mouseY);
    this.m_z19x=z19pt.x19;
    this.m_z19y=z19pt.y19;
    var llpt=z192LL(this.m_z19x,this.m_z19y);
    this.m_lat=llpt.m_lat;
    this.m_lon=llpt.m_lon;

//    var map=document.getElementById('mapWindow');	
//	var x=g_mouseX-parseInt(map.style.left);
//	var y=g_mouseY-parseInt(map.style.top);
//	var screenWidth=parseInt(map.style.width);
//	var screenHeight=parseInt(map.style.height);
//	var wx=(g_xcenter-screenWidth/2)|0;
//	wx=wx+x;
//	var wy=(g_ycenter-screenHeight/2)|0;
//	wy=wy+y;
//	var mult=Math.pow(2,19-g_zoom);
//	this.m_z19x=(wx*mult)|0;
//	this.m_z19y=(wy*mult)|0;
//	var tx=((wx)/256)|0;
//	var ty=((wy)/256)|0;
//	var x=wx%256;
//	var y=wy%256;
//    var llpt=ztp2LL(g_zoom,tx,ty,x,y);
//    this.m_lat=llpt.m_lat;
//    this.m_lon=llpt.m_lon;
}
function getCoordProcMouseMove()
{
    this.getLatLonAtMouse();
	document.getElementById('getCoordLat').innerHTML=this.m_lat.toFixed(6);
	document.getElementById('getCoordLon').innerHTML=this.m_lon.toFixed(6);
    return false;
}
function doGetCoord()
{
    if(g_proc.name!="defaultProc")
        g_proc.abort();
	var s="<overlay><info><![CDATA[<table style=\"width:100%\">";
	s=s+"<tr><td style=background-color:#97C3F5 height=18><center><p class=tgTitle>Get Coordinates</p></center></td></tr>";
	s=s+"<tr><td style=background-color:#97C3F5 valign=top>";
	s=s+"<table valign=top><tr><td style=background-color:#97C3F5 class=\"tgSection\">Lat:</td><td id=\"getCoordLat\" style=background-color:#97C3F5>&nbsp;</td></tr>";
	s=s+"<tr><td style=background-color:#97C3F5 class=\"tgSection\">Lon:</td><td  id=\"getCoordLon\" style=background-color:#97C3F5>&nbsp;</td></tr>";	
	s=s+"</table>";
	s=s+"</td></tr></table>";
	s=s+"]]></info></overlay>";
	
	xml=getXmlFromString(s);
	addOverlay(xml);//adding an overlay aborts all procs so add it before starting proc
    g_proc=new getCoordProc();
    g_proc.start();
}

//=======================================================
//  Birdseye Procedure Class
//=======================================================

function BirdseyeProc()
{    
	var be1=document.getElementById('birdseyeout');
	var map=document.getElementById('mapWindow');
	var w=parseInt(be1.style.width);
	
	this.x1=parseInt(map.style.left);
	this.y1=parseInt(map.style.top)+parseInt(be1.style.top);
	this.x2=this.x1+w;
	this.y2=this.y1+w;
	this.xdown=-1;
	this.ydown=-1;
    this.mouseDown=BirdseyeMouseDown;
    this.mouseUp=BirdseyeMouseUp;
    this.mouseMove=BirdseyeMouseMove; 
    this.isIn=BirdseyeIsIn;
    this.draw=BirdseyeDraw;

	
}

function BirdseyeIsIn(act)
{
	if(act=="up" && this.xdown==-1)
		return false;
	if(g_mouseX>this.x1 && g_mouseX<this.x2 && g_mouseY>this.y1 && g_mouseY<this.y2)
	{		
		return true;		
	}
	return false;	
}
function BirdseyeMouseDown()
{
	return false;
}
function BirdseyeMouseUp()
{
	if(g_mouseX>(this.x2-12) && g_mouseY<(this.y1+12))
	{
		if((this.x2-this.x1)>20)
			showBirdseye(0);
		else
			showBirdseye(1);	
	}
	return false;
}
function BirdseyeMouseMove()
{
	return false;	
}
function BirdseyeDraw()
{
	var screenWidth,screenHeight;
	var wx,wy;
	var tx1,ty1,tx2,ty2;//min and max tile numbers at this zoom
	var vx1,vy1,vx2,vy2,vx,vy;//location of upper left image relative to tileWindow.  
	var extra=0;//how far beyond view to request tiles
	var zoom,xcenter,ycenter;
	
	if(g_layers==null)
	    return;
	zoom=g_zoom-4;
	if(zoom<0)
		zoom=0;
	if(zoom>11)
		zoom=11;
	var mult=Math.pow(2,g_zoom-zoom);		
	xcenter=(g_xcenter/mult)|0;
	ycenter=(g_ycenter/mult)|0;
	//calculate which tiles are needed 
	var holder=document.getElementById('birdseyein');
	holder.innerHTML="";
	screenWidth=parseInt(holder.style.width);
	if(screenWidth<20)
		return;
	screenHeight=parseInt(holder.style.height);
	wx=(xcenter-screenWidth/2)|0;
	wy=(ycenter-screenHeight/2)|0;
	tx1=((wx-extra)/256)|0;
	ty1=((wy-extra)/256)|0;
	
	vx1=(tx1*256-wx);
	vy1=(ty1*256-wy)|0;
	wx=(xcenter+screenWidth/2)|0;
	wy=(ycenter+screenHeight/2)|0;
	tx2=((wx+extra)/256)|0;
	ty2=((wy+extra)/256)|0;	
	vx2=vx1+(tx2-tx1)*256;
	vy2=vy1+(ty2-ty1)*256;
	
    var s="";    
    var str;
	
	var tx,ty;
	var gx,gy;//group
	var imgId,lid=g_layers[0].layerId;
	var tile;

    for(var n=0;n<g_layers.length;n++)
    {
        if(g_layers[n].isbase=="1")
        {
            lid=g_layers[n].layerId;
            break;
        }
    }
	vx=vx1;
	for(tx=tx1;tx<=tx2;tx++)
	{				
			gx=(tx/100)|0;
			vy=vy1;
			for(ty=ty1;ty<=ty2;ty++)
			{
					gy=(ty/100)|0;
				imgId="bet_"+tx+"_"+ty;
				tile=document.getElementById(imgId);
				if(tile==null)
				{										
					imgEle=document.createElement("img");
					imgEle.id=imgId;
					imgEle.src=g_urlPrefix+"tgis/tilesvc.ashx?L="+lid+"&Z="+zoom+"&X="+tx+"&Y="+ty;
					imgEle.style.position="absolute";
					imgEle.style.left=vx;
					imgEle.style.top=vy;
					imgEle.width=256;
					imgEle.height=256;
					holder.appendChild(imgEle);										
				}
				//else
				//{
				//	tile.style.left=vx;
				//	tile.style.top=vy;	
				//}					
				vy+=256;
			}					
		vx+=256;
	}
	//var eles=holder.childNodes;	
	//for(var i=0;i<eles.length;i++)
	//{		
	//	vx=parseInt(eles[i].style.left);
	//	vy=parseInt(eles[i].style.top);
	//	if(vx<vx1 || vy<vy1 || vx>vx2 || vy>vy2)
	//	{
	//		holder.removeChild(eles[i]);	
	//	}
	//}
	
	//draw view rect
	var map=document.getElementById('mapWindow');
	wx=((g_xcenter-parseInt(map.style.width)/2)/mult)|0;
	wy=((g_ycenter-parseInt(map.style.height)/2)/mult)|0;
	vx=(xcenter-screenWidth/2)|0;
	vy=(ycenter-screenHeight/2)|0;
	vx1=wx-vx;
	vy1=wy-vy;
	wx=((g_xcenter+parseInt(map.style.width)/2)/mult)|0;
	wy=((g_ycenter+parseInt(map.style.height)/2)/mult)|0;
	vx2=wx-vx;
	vy2=wy-vy;
	var div=document.createElement("div");
	div.style.position="absolute";
	div.style.left=vx1;
	div.style.top=vy1;
	var w=vx2-vx1;
	//if(w<20) w=20;//because IE doesn't let div heights get any smaller than this
	div.style.width=w;
	div.style.height=vy2-vy1;
	div.style.border="3px yellow solid"
	holder.appendChild(div);										
	
}

//=======================================================
//  Default Procedure Class
//=======================================================
function defaultProc()
{
    this.m_downX=-1;
    this.m_downY=-1;
    this.m_tileWindowXDown=0;
    this.m_tileWindowYDown=0;
    this.name="defaultProc";
    this.mouseDown=defaultProcMouseDown;
    this.mouseUp=defaultProcMouseUp;
    this.mouseMove=defaultProcMouseMove; 
    this.abort=defaultProcAbort;
    this.resume=defaultProcResume; 
    this.start=defaultProcResume;    
}
function defaultProcAbort()
{
    changeMenuImage("btnArrow","tgis/btnArrow.png");
}
function defaultProcResume()
{
    changeMenuImage("btnArrow","tgis/btnArrow2.png");
    var win=document.getElementById('mapWindow');	
    win.style.cursor="default";      
}
function defaultProcMouseDown()
{       

	this.m_downX=g_mouseX;
	this.m_downY=g_mouseY;
	this.m_tileWindowXDown=g_tileWindowX;
	this.m_tileWindowYDown=g_tileWindowY;
	return false;
}
function defaultProcMouseUp()
{   

	if(this.m_downX>(g_mouseX-2) && this.m_downX<(g_mouseX+2) && this.m_downY>(g_mouseY-2) && this.m_downY<(g_mouseY+2))
	{
		this.m_downX=-1;
		singleClick();
		return false;
	}
	if(this.m_downX<0)
		return false;
	var dx=g_mouseX-this.m_downX;
	var dy=g_mouseY-this.m_downY;
	g_xcenter=g_xcenter-dx;
	g_ycenter=g_ycenter-dy;
	updateTiles();
	this.m_downX=-1;
	saveZoom();
	return false;
}
function defaultProcMouseMove()
{   
  
	if(this.m_downX<0)
	{
        if(g_overlayOnMouseMove)
	        eval(g_overlayOnMouseMove+"()");
		return false;
	}
	var canvas=document.getElementById('tileWindow');
	g_tileWindowX=this.m_tileWindowXDown+(g_mouseX-this.m_downX);
	g_tileWindowY=this.m_tileWindowYDown+(g_mouseY-this.m_downY);
	canvas.style.left=g_tileWindowX;
	canvas.style.top=g_tileWindowY;
	canvas=document.getElementById('overlayWindow');
	canvas.style.left=g_tileWindowX;
	canvas.style.top=g_tileWindowY;
	return false;		
}
function doDefaultProc()
{
    g_proc.abort();
    g_proc=g_defaultProc;
    g_proc.start();
}
//=======================================================
//  measure distance Procedure Class
//=======================================================
function measDistProc()
{
    this.name="measDist";
    this.mouseDown=measDistProcMouseDown;
    this.mouseUp=measDistProcMouseUp;
	this.update=measDistUpdateOverlay;
    this.mouseMove=measDistProcMouseMove;
    this.start=measDistProcStart;    
    this.abort=measDistAbort;
    this.resume=measDistResume;
    this.pts=null;
    
}
function measDistAbort()
{
    measDistDone();
}
function measDistResume()
{
    var win=document.getElementById('mapWindow');	
    win.style.cursor="url(tgis/measDist.cur),auto";
}
function measDistProcStart()
{
    var win=document.getElementById('mapWindow');	
    win.style.cursor="url(tgis/measDist.cur),auto";
    this.update(0);
    return false;
}
function measDistDone()
{
    g_proc.update(1);
    var map=document.getElementById('mapWindow');	
    map.style.cursor="default";    
    g_proc=g_defaultProc;
}
function measDistProcMouseDown()
{
	return false;
	
}
function measDistProcMouseUp()
{
    var xml;
    var i,dx,dy;
    var pt=new z19Pt(g_mouseX,g_mouseY);
	//g_clicked=1;
	g_pt=pt;
    if(this.pts==null)
    {
        this.pts=[1];
        this.pts[0]=pt;
		
    }
    else
    {
        this.pts.push(pt);
    }
    this.update(0)
    return false;
}
function measDistUpdateOverlay(isDone)
{
       // var s="<overlay><info><![CDATA[<p class=\"tgTitle\" >Measure Distance</p>";
	   var s="<overlay><info><![CDATA[<table style=\"width:100%\">";
		   s=s+"<tr><td style=background-color:#97C3F5 align=center height=18><p class=tgTitle>Measure Distance</p></td></tr>";
		   s=s+"<tr><td style='background-color:#97C3F5' valign=top>";

        var i;
        if(isDone==0)
        {	
            if(this.pts==null)
			   {
                s=s+"<span class=\"tgBody\">Click on first point</span>";
			    }
            else
			   {
                s=s+"<span class=\"tgBody\">Click on next point</span>";
			   }
        }
        if(this.pts!=null)
        {
            var dist=0;
            for(i=1;i<this.pts.length;i++)
            {
                dist=dist+getDistancePerZ19(this.pts[i-1].x19,this.pts[i-1].y19,this.pts[i].x19,this.pts[i].y19);
            }
			
            s=s+"<P><span class=\"tgBody\">Distance</span><br><img src=tgis/measDist.png><P><table border=1 cellspacing=0>";
			s=s+"<tr><td class=\"ftrfld\" align=center>Distance</td><td class=\"ftrfld\" align=center>Unit</td></tr>";
            s=s+"<tr><td id='measDistMeters' class=\"ftrval\" align=right>"+dist.toFixed(1)+"</td><td class=\"ftrval\">m</td></tr>";
            var km=dist/1000.0;
            s=s+"<tr><td id='measDistKilometers' class=\"ftrval\" align=right>"+km.toFixed(2)+"</td><td class=\"ftrval\">km</td></tr>";
            var ft=m2ft(dist);
            s=s+"<tr><td id='measDistFeet'  class=\"ftrval\" align=right>"+ft.toFixed(1)+"</td><td class=\"ftrval\">ft</td></tr>";
            var yd=ft/3.0;
            s=s+"<tr><td id='measDistYards'  class=\"ftrval\" align=right>"+yd.toFixed(1)+"</td><td class=\"ftrval\">yd</td></tr>";
            var mi=ft/5280.0;
            s=s+"<tr><td id='measDistMiles' class=\"ftrval\" align=right>"+mi.toFixed(3)+"</td><td class=\"ftrval\">mi</td></tr>";
            s=s+"</table>";
            
            //zzz show distance here;
        }
        if(isDone==0)
            s=s+"<p><img style=\"cursor:pointer\" src=tgis/btnDone.png onmouseup=\"measDistDone()\"></p></td></tr></table>";
        s=s+"]]></info>";
        if(this.pts!=null)
        {
            s=s+"<sym>"+this.pts[0].x19+","+this.pts[0].y19+",8,tgis/reddot.png</sym>";        
            s=s+"<poly>#FF0000,3,"+this.pts[0].x19+","+this.pts[0].y19;        
            var count=this.pts.length;
            for(i=1;i<count;i++)
            {
                dx=this.pts[i].x19-this.pts[i-1].x19;
                dy=this.pts[i].y19-this.pts[i-1].y19;
                s=s+","+dx+","+dy;   
            }
            s=s+"</poly>";
            if(isDone==1)
                s=s+"<sym>"+this.pts[count-1].x19+","+this.pts[count-1].y19+",8,tgis/reddot.png</sym>";        
        }
        s=s+"</overlay>";
        xml=getXmlFromString(s);
        //if(this.pts==null)
        //    addOverlay(xml);
        //else
            updateOverlay(xml);

}
function measDistProcMouseMove()
{  
    var totalmeters=0;
	var totalkilometers=0;
	var totalfeet=0;
	var totalyards=0;
	var totalmiles=0;
	var dist=0;
	var p=0;
	
	if (this.pts!=null)
	{
        //Add the current mouse location to the array
         pt=new z19Pt(g_mouseX-2,g_mouseY-2);
         this.pts.push(pt);
        // Get the length of all the points so far + the mouse

		for(p=1;p<this.pts.length;p++)
		{
			dist=dist+getDistancePerZ19(this.pts[p-1].x19,this.pts[p-1].y19,this.pts[p].x19,this.pts[p].y19);
		}
	
		//  Remove the added point from the array, since it shouldn't be permanent.
        this.pts.pop();  
        document.getElementById('measDistMeters').innerHTML=dist.toFixed(1);
        totalkilometers=dist/1000.0;
        document.getElementById('measDistKilometers').innerHTML=totalkilometers.toFixed(2);
        totalfeet=m2ft(dist);
        document.getElementById('measDistFeet').innerHTML=totalfeet.toFixed(1);
        totalyards=totalfeet/3.0;
        document.getElementById('measDistYards').innerHTML=totalyards.toFixed(1);
        totalmiles=totalfeet/5280.0;
        document.getElementById('measDistMiles').innerHTML=totalmiles.toFixed(3);
	}
	
	//document.getElementById('infoWindow').innerHTML="Lat = "+this.m_lat.toFixed(6)+"<br>Lon = "+this.m_lon.toFixed(6);	

    return false;
}
function doMeasDist()
{
    if(g_proc.name!="defaultProc")
        g_proc.abort();
    addOverlay(getXmlFromString("<overlay></overlay>"));
    g_proc=new measDistProc();
    g_proc.start();
}
//=======================================================
//  measure Area Procedure Class
//=======================================================


function measAreaProc()
{
    this.name="measArea";
    this.mouseDown=measAreaProcMouseDown;
    this.mouseUp=measAreaProcMouseUp;
	this.update=measAreaUpdateOverlay;
    this.mouseMove=measAreaProcMouseMove;
    this.start=measAreaProcStart;    
    this.abort=measAreaAbort;
    this.resume=measAreaResume;
    this.pts=null;
    
}

function measAreaAbort()
{
   // measAreaDone();
    //g_proc.update(1);
    var map=document.getElementById('mapWindow');	
    map.style.cursor="default";    
    g_proc=g_defaultProc;
}
function measAreaResume()
{
    var win=document.getElementById('mapWindow');	
    win.style.cursor="url(tgis/measDist.cur),auto";
}
function measAreaProcStart()
{
    var win=document.getElementById('mapWindow');	
    win.style.cursor="url(tgis/measDist.cur),auto";
    this.update(0);
    return false;
}

function measAreaDone()
{ 

    g_proc.update(1);
    var map=document.getElementById('mapWindow');	
    map.style.cursor="default";    
    g_proc=g_defaultProc;
}
function measAreaProcMouseDown()
{
	return false;
	
}
function measAreaProcMouseUp()
{
    var xml;
    var i,dx,dy;
    var pt=new z19Pt(g_mouseX-2,g_mouseY-2);

	//g_clicked=1;
	g_pt=pt;
    if(this.pts==null)
    {
        this.pts=[1];
        this.pts[0]=pt;
		
    }
    else
    {
        this.pts.push(pt);
    }
    this.update(0);
    return false;
} 


function measAreaUpdateOverlay(isDone)
{

        var s="<overlay><info><![CDATA[<table style=\"width:100%\">";
		s=s+"<tr><td style=background-color:#97C3F5 height=18><center><p class=tgTitle>Measure Area</p></center></td></tr>";
        var i;
        if(isDone==0)
        {	
        	s=s+"<tr><td style='background-color:#97C3F5' valign=top><span class=tgBody>Click on several points tracing the perimeter of the area you want to measure.</p><p>Click 'Done' when finished</span>";            
        }
		
        if(isDone==0)
            s=s+"<BR><br><img style=\"cursor:pointer\" src=tgis/btnDone.png onmouseup=\"measAreaDone()\"></td></tr>";
		// Add the first point back to the array to complete the polygon
	     else
		   {
		   // Complete the polygon by making the last point = the first point
		   if (this.pts==null)
		    {
				measAreaAbort();
			}
		   var alpha=this.pts[0];
		   this.pts.push(alpha);
		   
		   var midX=0;
		   var midY=0;
			y0 = this.pts[0].y19; 
			totalArea=0.0;
	
			for (i=1;i<this.pts.length;i++)
				{
				avgY=(this.pts[i].y19 + this.pts[i-1].y19)/2;
				area=(avgY-y0)*(this.pts[i].x19 - this.pts[i-1].x19);
				totalArea=totalArea+area;
				}
			for (i=0;i<this.pts.length;i++)
				{
				midX=midX+this.pts[i].x19;
				midY=midY+this.pts[i].y19;
				}
				
				midX=midX/this.pts.length;
				midY=midY/this.pts.length;
				
				var z19area=totalArea;
				
				var w;    //width in meters of a z19 pixel at this location in the world (aprox = .2)
				var a;    //area in square meters of a z19 pixel at this location in the world (aprox = .05)
				var sqMeters; //resulting area of your shape in square meters.
 
				w=getDistancePerZ19(midX,midY,midX+1,midY);
				a=w*w;
				sqMeters=z19area*a;
				sqMeters=Math.abs(sqMeters);
			
				s=s+"<tr><td valign=top style='background-color:#97C3F5'><BR><table  border=1 cellspacing=0>";
				s=s+"<tr><TD class=\"ftrfld\">Area</TD><TD class=\"ftrfld\">Unit</TD></TR>";
				
				//http://www.asknumbers.com/AreaConversion.aspx
				var sqKilometers=sqMeters*0.000001;
				var sqFeet=sqMeters*10.76391;
				var sqYards=sqMeters*1.19599;
				var sqMiles=sqMeters*3.8610215854E-07;
				var acres=sqMeters*0.00024;
				var hectares=sqMeters*0.0001;
				
				s=s+"<tr><td class=\"ftrval\">"+sqFeet.toFixed(1)+"</td><Td  class=\"ftrval\">Sq. Feet</Td></tr>";
				s=s+"<tr><td class=\"ftrval\">"+sqYards.toFixed(1)+"</td><Td class=\"ftrval\">Sq. Yards</Td></tr>";
				s=s+"<tr><td class=\"ftrval\">"+sqMeters.toFixed(1)+"</td><Td class=\"ftrval\">Sq. Meters</Td></tr>";
				s=s+"<tr><td class=\"ftrval\">"+sqKilometers.toFixed(2)+"</td><Td class=\"ftrval\">Sq. Kilometers</Td></tr>";
				s=s+"<tr><td class=\"ftrval\">"+sqMiles.toFixed(3)+"</td><Td class=\"ftrval\">Sq. Miles</Td></tr>";
				s=s+"<tr><td class=\"ftrval\">"+acres.toFixed(3)+"</td><Td class=\"ftrval\">Acres</Td></tr>";
				s=s+"<tr><td class=\"ftrval\">"+hectares.toFixed(3)+"</td><Td class=\"ftrval\">Hectares</Td></tr>";
				
				s=s+"</Table></center></TD></tr></table>";
				
				
			}
		 
        s=s+"]]></info>";
        if(this.pts!=null)
        {
            s=s+"<sym>"+this.pts[0].x19+","+this.pts[0].y19+",8,tgis/reddot.png</sym>";        
            s=s+"<poly>#FF0000,3,"+this.pts[0].x19+","+this.pts[0].y19;        
            var count=this.pts.length;
            for(i=1;i<count;i++)
            {
                dx=this.pts[i].x19-this.pts[i-1].x19;
                dy=this.pts[i].y19-this.pts[i-1].y19;
                s=s+","+dx+","+dy;   
            }
			s=s+"</poly>";		         
        }
        s=s+"</overlay>";
        xml=getXmlFromString(s);
        //if(this.pts==null)
        //    addOverlay(xml);
        //else
            updateOverlay(xml);
	
}

function measAreaProcMouseMove()
{  
    return false;
}
function doMeasArea()
{
    if(g_proc.name!="defaultProc")
        g_proc.abort();
    addOverlay(getXmlFromString("<overlay></overlay>"));//add before starting proc
    g_proc=new measAreaProc();
    g_proc.start();
}

//=======================================================
//  Find Coordinates Functions
//=======================================================

function doFindCoord()
{
		var s="<overlay><info><![CDATA[<table style=\"width:100%\">"
			
			s=s+"<tr><td style=background-color:#97C3F5 height=18 valign=top><center><p class=tgTitle>Find Coordinates</p></center></td></tr>";
			s=s+"<tr><td valign=top style=background-color:#97C3F5><form action=\"#\" name=\"getCoorForm\">";
			s=s+"<table>";
			s=s+"	<tr><td class=\"tgSection\">Latitude:</TD><TD><INPUT TYPE=TEXT NAME=\"lat\"></td></tr>";
			s=s+"	<tr><td class=\"tgSection\">Longitude:</td><td><INPUT TYPE=TEXT NAME=\"lon\"></td></tr>";
			s=s+"	<tr><td> </td><td align=center ><input type=\"button\" value=\" Find \"  onClick=\"findCoordResults();\"></td></tr>";
			s=s+"</table>";
			s=s+"</form>";
   			//s=s+"<tr><td valign=top style=background-color:#97C3F5 height=100%>";
			s=s+"<table ><tr><td colspan=2  height=12 valign=top>Enter coordinates above using one of these formats:</td></tr>";
			s=s+"<tr><td align=right class=\"tgSection\" height=12>-86.3957977</td><td>(Degrees)</td></tr>";
			s=s+"<tr><td align=right class=\"tgSection\" height=12>-86 23.748</td><td>(Deg Min)</td></tr>";
			s=s+"<tr><td align=right class=\"tgSection\" height=12>-86 23 44.9</td><td>(Deg Min Sec)</td></tr>";
            s=s+"<tr id=moreCoord><td colspan=2><a href=javascript:showCustCoordForm() >more options</a></td></tr>";
			s=s+"</table></td></tr>";
			s=s+"</td></tr>";

			s=s+"<tr style=display:none id=custCoordTitle><td style=background-color:#97C3F5 height=18 valign=top><center><p class=tgTitle>Find Coordinates</p></center></td></tr>";
			s=s+"<tr style=display:none id=custCoord><td valign=top style=background-color:#97C3F5><form action=\"#\" name=\"getCoorForm2\">";
			s=s+"<table>";
			s=s+"	<tr><td class=\"tgSection\">Projection:</TD><TD><select id=prjs><option value=select>Select one</option></select></td></tr>";
			s=s+"	<tr><td class=\"tgSection\">Easting:</TD><TD><INPUT TYPE=TEXT NAME=\"east\">";
			s=s+"     <select id=unitsel><option value=feet>ft</option><option value=meters>m</option></select></td></tr>";
			s=s+"	<tr><td class=\"tgSection\">Northing:</td><td><INPUT TYPE=TEXT NAME=\"north\"></td></tr>";
			s=s+"	<tr><td> </td><td align=center ><input type=\"button\" value=\" Find \"  onClick=\"findCoordResults2();\"></td></tr>";
			s=s+"</table>";
			s=s+"</form>";
			s=s+"</td></tr>";
			
			s=s+"</table>";
			s=s+"]]></info>";
			s=s+"</overlay>";
			
        xml=getXmlFromString(s);
        addOverlay(xml);
        return false;        

}
function showCustCoordForm()
{
    var ele=document.getElementById('custCoord');
    ele.style.display="";
    ele=document.getElementById('custCoordTitle');
    ele.style.display="";
    ele=document.getElementById('moreCoord');
    ele.style.display="none";
    
    var combo=document.getElementById('prjs');
    var xml=fetchXml("tgis/coordmath.aspx?action=getprjlist");
    if(xml!=null)
    {
        var list=xml.getElementsByTagName("prjlist")[0].firstChild.nodeValue;
        var names=list.split(',');
        for(var i=0;i<names.length;i++)
        {
            if(names[i]=="Lat/Lon Nad83")
                continue;
            combo.options[combo.options.length]=new Option(names[i],"0");
            if(names[i]==g_savedSettings.prjName)
            {
                combo.selectedIndex=combo.options.length-1;
            }
        }
    }
    combo=document.getElementById('unitsel');
    for(var i=0;i<combo.options.length;i++)
    {
        if(combo.options[i].value==g_savedSettings.prjUnits)
        {
            combo.selectedIndex=i;
            break;
        }
    }
    
    
}
function findCoordResults2()
{
    var combo=document.getElementById('prjs');
    var opt = combo.options[combo.selectedIndex]; 
    var prj=opt.text;
    combo=document.getElementById('unitsel');
    opt = combo.options[combo.selectedIndex]; 
    var u=opt.value;
    g_savedSettings.prjName=prj;
    g_savedSettings.prjUnits=u;
    fetchOverlay("tgis/coordmath.aspx?action=zoomtocoord&prj="+prj+"&u="+u+"&x="+getCoorForm2.east.value+"&y="+getCoorForm2.north.value);
}
function findCoordResults()
{
	
	 var lat = getCoorForm.lat.value;
	 var lon = getCoorForm.lon.value;
	 var latDeg = 0;
	 var latMin = 0;
	 var latSec = 0;
	 var lonDeg = 0;
	 var lonMin = 0;
	 var lonSec = 0;
     var latitude = lat.split(' ');
	 var longitude = lon.split(' ');

     if(latitude.length==1) 
            latDeg = lat*1;
     if(latitude.length==2)
        {
			latDeg = latitude[0]*1; 
			latMin = ((latitude[1])/60);
		}
	 if(latitude.length==3)
		{
			latDeg = latitude[0]*1;
			latMin = ((latitude[1])/60);
			latSec = ((latitude[2])/3600);
		}
		
	 // Remove - sign, if it exists.  We'll add it in later
	 // to ensure it's where we want it.
	 lon = lon.replace("-","");

	 if(longitude.length==1)
		{
			lonDeg = -Math.abs(lon);
		}
	 if(longitude.length==2)
		{
			lonDeg = -Math.abs(longitude[0]);
			lonMin = -Math.abs(((longitude[1])/60));
		}
	 if(longitude.length==3)
		{
			lonDeg = -Math.abs(longitude[0]);
			lonMin = -Math.abs(((longitude[1])/60));
			lonSec = -Math.abs(((longitude[2])/3600));
		}
		
	
	 z19lat = latDeg+latMin+latSec;
	 z19lon = lonDeg+lonMin+lonSec;

	 var pt = ll2z19(z19lat,z19lon);
	 var s = "";
	 
     //document.getElementById('infoWindow').innerHTML="Lat = "+pt.x19+"<br>Lon = "+pt.y19;
	  s=s+"<overlay><info><![CDATA[<table style=\"width:100%\">";
	  s=s+" <tr><td style=background-color:#97C3F5 height=18><center><p class=tgTitle>Find Coordinates</p></center></td></tr>";
	  s=s+"<tr><td valign=top style='background-color:#97C3F5'>";
	  s=s+"<br><img src=tgis/x.png><br>";
	  s=s+"<table>";
	  s=s+"	<tr><td>Latitude</td><td>" + lat + "</td></tr>";
	  s=s+"		<tr><td>Longatude</td><td>" + lon + "</td></tr>";
	  s=s+"</table>";
	  s=s+"</td></tr>";
	  s=s+"</table>";
	  s=s+"]]></info><sym>"+pt.x19+","+pt.y19+",8,tgis/x.png</sym><zoomto>"+pt.x19+","+pt.y19+","+pt.x19+","+pt.y19+",16</zoomto></overlay>";
     //xml=getXmlFromString("<overlay><info><![CDATA[<img src=tgis/x.png><br>Lat = "+lat+"<br>Lon = -"+lon+"]]></info><sym>"+pt.x19+","+pt.y19+",8,tgis/x.png</sym><zoomto>"+pt.x19+","+pt.y19+","+pt.x19+","+pt.y19+",16</zoomto></overlay>");
	 xml=getXmlFromString(s);
     addOverlay(xml);
	 
     return false;

}

//=======================================================
//  End Find Coordinates Functions
//=======================================================


//=======================================================
//  Pick Point Procedure Class
//=======================================================
function pickPoint(callBackFct,curName,btnName,upImage,downImage)
{
    this.name ="pickPoint";
    this.mouseDown = pickPointMouseDown;
    this.mouseUp = pickPointMouseUp;
    this.mouseMove = pickPointMouseMove;    
    this.start = pickPointStart;
    this.abort = pickPointAbort;
	this.funName = callBackFct;
	this.namedCursor=curName;
	this.resume=pickPointResume;
	if(btnName)
	{
	    this.btnName=btnName;
	    this.upImage=upImage;
	    this.downImage=downImage;
	}
	else
	    this.btnName=null;
}

function pickPointMouseDown()
{
	return false;
}

function pickPointMouseMove()
{
	return false;
}

function pickPointAbort()
{
    if(this.btnName!=null)    
        changeMenuImage(this.btnName,this.upImage);
    
}

function pickPointResume()
{
    var win=document.getElementById('mapWindow');
	win.style.cursor= this.namedCursor;
    if(this.btnName!=null)    
        changeMenuImage(this.btnName,this.downImage);
}
function pickPointStart()
{
    if(this.btnName!=null)    
        changeMenuImage(this.btnName,this.downImage);
    var win=document.getElementById('mapWindow');
	win.style.cursor= this.namedCursor;
    return false;
}


function pickPointMouseUp()
{
	var pt=new z19Pt(g_mouseX,g_mouseY);
	
	eval(this.funName + "(" + pt.x19 + "," + pt.y19 + ");");	
	g_proc=g_defaultProc;
	g_proc.resume();
	var map=document.getElementById('mapWindow');
	map.style.cursor="default"; 
	return false;
}


function doPickPoint(curName,callBackFct,btnName,upImage,downImage)
{
	
	g_proc.abort();
	g_proc= new pickPoint(callBackFct,curName,btnName,upImage,downImage);
    g_proc.start();
	return false;
}

//=======================================================
//  End Pick Point Procedure Class
//=======================================================




//=======================================================
//  Identify Areas Function Class
//=======================================================

function doIdentifyAreas(x19,y19)
{	
	var llpt=z192LL(x19,y19);
	
	fetchOverlay("tgis/idarea.aspx?Lon="+llpt.m_lon+"&Lat="+llpt.m_lat+"&M="+g_mapId);
}	

function doGetAreas()
{
	doPickPoint("url(tgis/idArea.cur),auto", "doIdentifyAreas","btnIdAreas","tgis/btnIdArea.png","tgis/btnIdArea2.png");
}
//=======================================================
//  Google Street View Class
//=======================================================

function showStreetView(x19,y19)
{	
	var llpt=z192LL(x19,y19);
    var z=g_zoom;
    
    if(z<15)
        z=15;
    var url="http://maps.google.com?layer=c&cbll="+llpt.m_lat+","+llpt.m_lon+"&cbp=11,0,0,0,5&z="+z;
    window.open(url);
	var s="<overlay><info><![CDATA[";

			s=s+"<table style=\"width:100%\">";
			s=s+"<tr><td valign=top style=background-color:#97C3F5>";
			s=s+"<img src=tgis/gsv.png> <a href=\""+url+"\" target=\"_blank\">Google Street View</a></td></tr></table>";
			s=s+"]]></info>";
			s=s+"<sym>"+x19+","+y19+",24,tgis/gsv.png</sym>";
			s=s+"</overlay>";
    var xml=getXmlFromString(s);
	addOverlay(xml);
	
	//static image api example
	//http://maps.googleapis.com/maps/api/streetview?size=400x400&location=40.720032,%20-73.988354&fov=90&heading=235&pitch=10&sensor=false
}	

function doGSV()
{
	doPickPoint("url(tgis/gsv.cur),auto", "showStreetView");
}

//=======================================================
//  Photo comparer
//=======================================================
function doSideMap()
{
    
    var s="<overlay><infoWidth>50%</infoWidth><onRedraw>drawSideMap</onRedraw><onMouseMove>trackSideMapMouse</onMouseMove><info><![CDATA[";
    var iw=document.getElementById('infoWindow');
//    var h=parseInt(iw.style.height)-160;
//    var w=parseInt(iw.style.width)-20;
//    s=s+"<br><div id=\"sideMap\" style=\"overflow:hidden;width:"+w+";height:"+h+";border:4px black solid\"></div>"
    s=s+"<div id=\"sideMap\" style=\"position:absolute;overflow:hidden;width:100%;height:100%\">"
    s=s+"<div style=\"background-color:#97C3F5;position:absolute;top:5;left:5;width:300;z-index:999\"><b>Photo Comparer</b><br>This tool makes it possible to see two opaque layers side by side.  As you zoom in and out on the main map display on the right, the display on the left will adjust to show the same area but with different layers.</div>";
    s=s+"<br><select id=sideMapList onChange=\"redraw(true)\" size=4 multiple=multiple style=\"position:absolute;top:100;left:5;width:200;z-index:999\">";
    for(var i=0;i<g_layers.length;i++)
    {
        s=s+"<option value=\""+g_layers[i].layerId+"\"";
        if(i==0)
            s=s+" selected=selected";
        s=s+">"+g_layers[i].layerName+"</option>";
    }
    s=s+"</select>";
    s=s+"</div>";
    
	s=s+"]]></info></overlay>";
	
	var xml=getXmlFromString(s);
	addOverlay(xml);
	redraw(true);
}
function trackSideMapMouse()
{
    var map=document.getElementById('mapWindow');	
	
	var x=g_mouseX-parseInt(map.style.left);
	var y=g_mouseY-parseInt(map.style.top);
	
	var sideMouse=document.getElementById('sideMouse');
	if(sideMouse)
	{
	    sideMouse.style.left=x;
	    sideMouse.style.top=y;	    
	}
	else
	{
	    sideMouse=document.createElement("img");
        sideMouse.id="sideMouse";
        sideMouse.src=g_urlPrefix+"tgis/sideMouse.png";
        sideMouse.style.position="absolute";
        sideMouse.style.left=x;
        sideMouse.style.top=y;        
        sideMouse.style.zIndex=998;
        var parent=document.getElementById('sideMap');
        parent.appendChild(sideMouse);
	}    
}
function drawSideMap()
{
	var screenWidth,screenHeight;
	var wx,wy;
	var tx1,ty1,tx2,ty2;//min and max tile numbers at this zoom
	var vx1,vy1,vx2,vy2,vx,vy;//location of upper left image relative to tileWindow.  
	var extra=0;//how far beyond view to request tiles
	
//document.getElementById('infoWindow').innerHTML="step0";	


	//calculate which tiles are needed (assumes g_xcenter,g_ycenter,g_zoom are set prior to calling draw())
	var holder=document.getElementById('mapWindow');
	screenWidth=parseInt(holder.style.width);
	screenHeight=parseInt(holder.style.height);
	wx=(g_xcenter-screenWidth/2)|0;
	wy=(g_ycenter-screenHeight/2)|0;
	if(g_tileWindowX==0 && g_tileWindowY==0)
	{
		g_tileWindowWx=wx;//can be set here because m_tileWindow is aligned with mapWindow before calling updateTiles
		g_tileWindowWy=wy;
	}
	tx1=((wx-extra)/256)|0;
	ty1=((wy-extra)/256)|0;
	
	vx1=(tx1*256-wx);//will always be less than or equal to 0.  relative to mapWindow at this point.  will be converted to tileWindow coordinates below
	vy1=(ty1*256-wy)|0;
	//document.getElementById('infoWindow').innerHTML="xc="+g_xcenter+"<br>wx="+wx+"<br>tx1="+tx1+"<br>screenWidth="+screenWidth+"<br>vx1="+vx1;
	wx=(g_xcenter+screenWidth/2)|0;
	wy=(g_ycenter+screenHeight/2)|0;
	tx2=((wx+extra)/256)|0;
	ty2=((wy+extra)/256)|0;
	
	vx2=vx1+(tx2-tx1)*256;
	vy2=vy1+(ty2-ty1)*256;
    
    var vx=vx1;
    var list,lid;
    var win=document.getElementById('sideMap');

    for(var i=1;i<500;i++)
    {
        var tile=document.getElementById("sideTile"+i);
        if(tile==null)
            break;
        win.removeChild(tile);
    }
    list=document.getElementById('sideMapList');    
    if(list==null)
        return;
    var count=1;
    for(var tx=tx1;tx<=tx2;tx++)
	{
		//if(tx>tx1 && tx<tx2)
		{
			var gx=(tx/100)|0;
			var vy=vy1;
			for(var ty=ty1;ty<=ty2;ty++)
			{
				//if(ty>ty1 && ty<ty2)
				{
					var gy=(ty/100)|0;
					for(var n=0;n<list.options.length;n++)
                    {
			                if(list.options[n].selected)
			                {
			                    if(g_layers[n].altLayerId!=null && g_layers[n].altLayerId>0)
							        lid=g_layers[n].altLayerId;
							    else
    				                lid=g_layers[n].layerId;
				                {																                
					                imgEle=document.createElement("img");
					                imgEle.id="sideTile"+count;
					                imgEle.src=g_urlPrefix+"tgis/tilesvc.ashx?L="+lid+"&Z="+g_zoom+"&X="+tx+"&Y="+ty;
					                imgEle.style.position="absolute";
					                imgEle.style.left=vx;
					                imgEle.style.top=vy;
					                imgEle.width=256;
					                imgEle.height=256;
					                imgEle.style.zIndex=n+1;
					                win.appendChild(imgEle);
					                count=count+1;
                										                
				                }			                                   				
			                }
	                }					
				}
				vy+=256;
			}
		}
		vx+=256;
	}
	
}
//================================================================================================================
function getElevProc()
{
    this.name="getElev";
    this.mouseDown=getElevProcMouseDown;
    this.mouseUp=getElevProcMouseUp;
    this.mouseMove=getElevProcMouseMove;    
    this.start=getElevProcStart;
    this.abort=getElevAbort;
    this.resume=getElevResume;
    this.update=getElevUpdateOverlay;
    this.done=false;
    this.lastPoint="";
    this.pts=null;
}
function getElevAbort()
{    
    var map=document.getElementById('mapWindow');	
    map.style.cursor="default";  
    this.done=true;
    this.update("");      
    g_proc=g_defaultProc;
}
function getElevResume()
{
    var win=document.getElementById('mapWindow');	
    win.style.cursor="help";
}
function getElevProcStart()
{
    var win=document.getElementById('mapWindow');	
    win.style.cursor="help";
    g_proc.update("start");
    return false;
}
function getElevUpdateOverlay(caller)
{
    var s="<overlay><info><![CDATA[<table id=getElevInfo style=\"width:100%\">";
	s=s+"<tr><td style=background-color:#97C3F5 height=18><center><p class=tgTitle>Elevation Points</p></center></td></tr>";
	s=s+"<tr><td style=background-color:#97C3F5 valign=top>";
	if(!this.done)//instructions
	{
	    s=s+"Click on one or more points to label their elevation.  Click Done when finished.";
	}
	s=s+"<p>"+this.lastPoint+"</p>";
	if(!this.done)
	{
	    s=s+"<p><center><img style=\"cursor:pointer\" src=tgis/btnDone.png onmouseup=\"g_proc.abort();\"></center></p>";
	}
	s=s+"<center><a href='javascript:doGetElev()'>Start over</a> &nbsp; <a href='javascript:doElevProfile()'>Switch To Elevation Profile Tool</a></center>";
	s=s+"</td></tr></table>";
	s=s+"]]></info>";
	if(this.pts!=null)
	{
	    for(var i=0;i<this.pts.length;i++)
	    {
	        s=s+"<sym>"+this.pts[i].x+","+this.pts[i].y+",7,tgis/elevTick.png,,"+this.pts[i].label+"</sym>";
	        //s=s+"<ghtml><![CDATA["+this.pts[i].x+"|"+this.pts[i].y+"|<img src=tgis/elevTick.png style=position:absolute;left:-3;top:-3><span style=background-color:yellow>"+this.pts[i].label+"</span>]]></ghtml>";
	    }
	}
	s=s+"</overlay>";
	
	xml=getXmlFromString(s);
	//if(caller=="start")
	//    addOverlay(xml);
	//else
	    updateOverlay(xml);
}
function getElevProcMouseDown()
{
    return false;
}
function getElevProcMouseUp()
{
    var z19pt=new z19Pt(g_mouseX,g_mouseY);    
    var llpt=z192LL(z19pt.x19,z19pt.y19);
    var xml=fetchXml("tgis/elevation.aspx?Lon="+llpt.m_lon+"&Lat="+llpt.m_lat+"&M="+g_mapId+"&action=getelevation");
    if(xml!=null)
    {
        var nodes=xml.getElementsByTagName("elevationResults");
        var sft=nodes[0].getElementsByTagName("feet")[0].firstChild.nodeValue;        
        var sm=nodes[0].getElementsByTagName("meters")[0].firstChild.nodeValue;        
        var s=nodes[0].getElementsByTagName("source")[0].firstChild.nodeValue;        
        //var s=n.nodeValue;
        var pt=new elevationPoint(z19pt.x19,z19pt.y19,sft+"'");
        if(this.pts==null)
        {
            this.pts=[1];
            this.pts[0]=pt;		
        }
        else
        {
            this.pts.push(pt);
        }
        this.lastPoint="Elevation: "+sft+"ft or "+sm+"m<br>Source: "+s;
        this.update("update");
    }
    return false;
}

function getElevProcMouseMove()
{
    return false;
}
function elevationPoint(X,Y,Label)
{
    this.x=X;
    this.y=Y;
    this.label=Label;
}

function doGetElev()
{    
    if(g_proc.name!="defaultProc")
        g_proc.abort();
    addOverlay(getXmlFromString("<overlay></overlay>"));//do before starting proc
    g_proc=new getElevProc();
    g_proc.start();
}
//================================================================================================================
function elevProfileProc()
{
    this.name="elevProfile";
    this.mouseDown=elevProfileProcMouseDown;
    this.mouseUp=elevProfileProcMouseUp;
    this.mouseMove=elevProfileProcMouseMove;    
    this.start=elevProfileProcStart;
    this.abort=elevProfileAbort;
    this.resume=elevProfileResume;
    this.update=elevProfileUpdateOverlay;
    this.getProfile=elevProfileGetProfile;
    this.done=false;
    this.lastPoint="";
    this.pts=null;
}
function elevProfileAbort()
{    
    var map=document.getElementById('mapWindow');	
    map.style.cursor="default";  
    this.done=true;
    this.update("");      
    g_proc=g_defaultProc;
}
function elevProfileResume()
{
    var win=document.getElementById('mapWindow');	
    win.style.cursor="help";
}
function elevProfileProcStart()
{
    var win=document.getElementById('mapWindow');	
    win.style.cursor="help";
    g_proc.update("start");
    return false;
}
function elevProfileUpdateOverlay(caller)
{
    var s="<overlay><info><![CDATA[<table id=getElevInfo style=\"width:100%\">";
	s=s+"<tr><td style=background-color:#97C3F5 height=18><center><p class=tgTitle>Elevation Profile</p></center></td></tr>";
	s=s+"<tr><td style=background-color:#97C3F5 valign=top>";
	if(!this.done)//instructions
	{
	    s=s+"Define a path by clicking two or more points on the map.  Click Done when finished to see elevation profile.";
	}
	
	if(!this.done)
	{
	    s=s+"<p><center id=epdone><img style=\"cursor:pointer\" src=tgis/btnDone.png onmouseup=\"g_proc.getProfile();\"> &nbsp; <img style=\"cursor:pointer\" src=tgis/btnCancel.png onmouseup=\"g_proc.abort();\"></center></p>";
	}
	s=s+"<center><a href='javascript:doElevProfile()'>Start over</a> &nbsp; <a href='javascript:doGetElev()'>Switch To Elevation Points Tool</a></center>";
	s=s+"</td></tr></table>";
	s=s+"]]></info>";
	if(this.pts!=null)
	{
	    for(var i=0;i<this.pts.length;i++)
	    {
	        
	        s=s+"<sym>"+this.pts[i].x+","+this.pts[i].y+",15,tgis/ydot"+i+".png</sym>";
	    }
	}
	s=s+"</overlay>";
	
	xml=getXmlFromString(s);
	//if(caller=="start")
	//    addOverlay(xml);
	//else
	    updateOverlay(xml);
}
function elevProfileProcMouseDown()
{
    return false;
}
function elevProfileProcMouseUp()
{
    var z19pt=new z19Pt(g_mouseX,g_mouseY);    
    var llpt=z192LL(z19pt.x19,z19pt.y19);
        var pt=new elevationPoint(z19pt.x19,z19pt.y19,"");
        if(this.pts==null)
        {
            this.pts=[1];
            this.pts[0]=pt;		
        }
        else
        {
            this.pts.push(pt);
        }
        this.update("update");
    
    return false;
}

function elevProfileProcMouseMove()
{
    return false;
}
function doElevProfile()
{    
    if(g_proc.name!="defaultProc")
        g_proc.abort();
    addOverlay(getXmlFromString("<overlay></overlay>"));//do before starting proc
    g_proc=new elevProfileProc();	
    g_proc.start();
}
function elevProfileGetProfile()
{
      
    if(this.pts!=null)
	{
        var s="tgis/elevation.aspx?action=getprofile"+"&M="+g_mapId+"&pts=";
	    for(var i=0;i<this.pts.length;i++)
	    {
            var llpt=z192LL(this.pts[i].x,this.pts[i].y);
	        if(i>0)
	            s=s+"|";
	        s=s+llpt.m_lon+"|"+llpt.m_lat;
	    }
        var win=document.getElementById('epdone');	
        win.innerHTML="Generating Elevation Profile...";
	    setTimeout("fetchOverlay('"+s+"')",100);//timeout allows above message to display
	}	
}
//=======================================================
//  Pinch Procedure Class
//=======================================================
function pinchProc(x1,y1,x2,y2)
{
    this.name="pinch";
    this.mouseDown=pinchProcMouseDown;
    this.mouseUp=pinchProcMouseUp;
    this.mouseMove=pinchProcMouseMove;    
    this.start=pinchProcStart;
    this.abort=pinchProcAbort;
    this.dualMove=pinchProcDualMove;
    var map=document.getElementById('mapWindow');	
    var left=parseInt(map.style.left);
    var top=parseInt(map.style.top);
    this.mapX=(x1+x2)/2-left;
    this.mapY=(y1+y2)/2-top;
    this.xDown=this.mapX-g_tileWindowX;//relative to tile canvas
    this.yDown=this.mapY-g_tileWindowY;
    var dx=x2-x1;
    var dy=y2-y1;
    this.dDown=Math.sqrt(dx*dx+dy*dy);
    this.saveProc=null;
    this.tilesx=[0];
    this.tilesy=[0];
    this.tilese=[0];
    this.tiless=[0];
    this.scale=1.0;
    this.panX=0;//number of screen pixels that pinch center has moved since starting pinch
    this.panY=0;
}
function pinchProcAbort()
{
    
}
function pinchProcStart()
{
    //turn off overlayWindow
    var win=document.getElementById('tileWindow');
    var eles=win.childNodes;	
    this.tilesx=[eles.length];
    this.tilesy=[eles.length];
    this.tilese=[eles.length];
    this.tiless=[eles.length];
    var extra=64;
	for(var i=0;i<eles.length;i++)
	{			   
	    this.tilese[i]=eles[i];
		this.tilesx[i]=parseInt(eles[i].style.left);
		this.tilesy[i]=parseInt(eles[i].style.top);
		if(this.xDown<(this.tilesx[i]-extra) || this.yDown<(this.tilesy[i]-extra) || this.xDown>(this.tilesx[i]+256+extra) || this.yDown>(this.tilesy[i]+256+extra))
		    this.tiless[i]=0;
		else
		    this.tiless[i]=1;
	}
	document.getElementById('infoWindow').style.display="none";
    return false;
}
function pinchProcMouseDown()
{    	
    return false;
}
function pinchProcMouseUp()
{
	document.getElementById('infoWindow').style.display="";
//calculate new zoom,
    var newZoom;
    var dz=Math.log(this.scale)/Math.log(2);
    if(dz>1.6)
        dz=2;
    else if(dz>0.5)
        dz=1;
    else if(dz<-1.6)
        dz=-2;
    else if(dz<-0.5)
        dz=-1;
    else
        dz=0;
    g_zoom=g_zoom+dz;
    
//calc world coord of pinch center
    g_xcenter=g_tileWindowWx+this.xDown;
    g_ycenter=g_tileWindowWy+this.yDown;
    
//scale pinch center to new scale
    g_xcenter=g_xcenter*Math.pow(2,dz);
    g_ycenter=g_ycenter*Math.pow(2,dz);
    
//calculate screen center at new scale
    var map=document.getElementById('mapWindow');
    g_xcenter=g_xcenter+(parseInt(map.style.width)/2-this.mapX)-this.panX;
    g_ycenter=g_ycenter+(parseInt(map.style.height)/2-this.mapY)-this.panY;
    saveZoom();
    redraw(false);

    g_proc=this.saveProc;
    g_proc.resume();    
    return false;
}
function pinchProcMouseMove()
{
    return false;
}
function pinchProcDualMove(x1,y1,x2,y2)
{
    var dx,dy,d1,d2,
        x0,y0;//location on tile canvas    
    var map=document.getElementById('mapWindow');	
    var left=parseInt(map.style.left);
    var top=parseInt(map.style.top);
    var save;
	x1=x1-left;
	y1=y1-top;    
    x2=x2-left;
    y2=y2-top;    
    dx=x2-x1;
    dy=y2-y1;
    d2=Math.sqrt(dx*dx+dy*dy);
    this.panX=(x1+x2)/2-this.mapX;
    this.panY=(y1+y2)/2-this.mapY;
    if(this.dDown<=0)
        return;
    this.scale=d2/this.dDown;
    var display;
    for(var i=0;i<this.tilese.length;i++)
    {
        if(this.scale>1.0 && this.tiless[i]==0)
        {            
            this.tilese[i].style.display="none";
            continue;
        }
        //this.tilese[i].style.zIndex=1000;
        dx=((this.tilesx[i]-this.xDown)*this.scale)|0;
        dy=((this.tilesy[i]-this.yDown)*this.scale)|0;
        //document.getElementById('appWindow').innerHTML=dx+","+dy;
        this.tilese[i].style.left=(this.xDown+dx+this.panX)|0;
        this.tilese[i].style.top=(this.yDown+dy+this.panY)|0;
        this.tilese[i].width=(256*this.scale)|0;  //widths appear to scale ok
        this.tilese[i].height=(256*this.scale)|0;   
    }
    
    
}
function doPinch(x1,y1,x2,y2)
{
    if(g_proc && g_proc.name!="default")
        g_proc.abort();     
    g_proc=new pinchProc(x1,y1,x2,y2);    
    g_proc.saveProc=g_defaultProc;
    g_proc.start();
}
//====================end pinch proc class===================================




