var g_zoom=13;
var g_xcenter=1059*256*2;//center of screen expressed in zoom coordinates (if centered on tile 3,4 then xcenter=3*256+128)
var g_ycenter=1574*256*2;
var g_homeZoom;
var g_homeX;
var g_homeY;
var g_tileWindowX=0;
var g_tileWindowY=0;
var g_layers;
var g_uc=1;				//unique counter
var g_tileWindowWx;//wx,wy of top left corner of tile window.  In zoom coordinates
var g_tileWindowWy;
var g_overlays=[20];//xml doc
var g_overlayCount=0;
var g_overlayIndex=-1;
var g_menuHeight=32;
var g_proc=null;
var g_prevZoom=null;
var g_prevXCenter=null;
var g_prevYCenter=null;
var g_mouseX;
var g_mouseY;
var g_menuOpen=0;
var g_mapName="";
var g_mapId="";
var g_dynamicRefs=null;//array
var g_pendingOvrFct=null;
var g_osp=null;//on screen points
var g_urlPrefix="";
var g_baseUrl="";
//var g_urlPrefix="http://tgisserver.wthgis.com/";
var g_beProc=null;
var g_infoWidth;
var g_defaultInfoWidth=350;
var g_defaultBirdseyeOpen=1;
var g_autoSizeApp;
var g_overlayOnDraw=null;
var g_overlayOnMouseMove=null;
var g_showTiles=0;
var g_savedSettings;
var g_isTouchDevice;
var g_isIpad;
var g_isAndroid;
var g_isIphone;
var g_loggedInUser="";
var g_tickCount=0;

function doTick()
{
    g_tickCount++;
    //if(g_tickCount%5)==1)
        refreshDynamicTiles();
    setTimeout("doTick()",5000);
}
function refreshDynamicTiles()
{
    
    if(!g_layers)
        return;
	for(var n=0;n<g_layers.length;n++)
	{
		if(g_layers[n].layerVis==1 && g_layers[n].refreshPeriod>0)
		{
		    queryForNewTiles(n);//must seperate this into own function
		}		
	}            
}
function queryForNewTiles(layerIndex)
{
    var str,len,url,k;
		    //calculate the tile extents of current view
        	var holder=document.getElementById('mapWindow');
	        var screenWidth=parseInt(holder.style.width);
	        var screenHeight=parseInt(holder.style.height);
	        var tx0=((g_xcenter-screenWidth/2)/256)|0;
	        var ty0=((g_ycenter-screenHeight/2)/256)|0;
	        var tx1=((g_xcenter+screenWidth/2)/256)|0;
	        var ty1=((g_ycenter+screenHeight/2)/256)|0;	
	                
		    var url="tgis/tilesvc.ashx?A=qc&L="+g_layers[layerIndex].layerId+"&Z="+g_zoom+"&TX0="+tx0+"&TY0="+ty0+"&TX1="+tx1+"&TY1="+ty1;
		    var xmlhttp=createXMLHTTPObject();
		    xmlhttp.onreadystatechange=function()
		    {
		        if(xmlhttp.readyState!=4 || xmlhttp.status!=200)
		            return;
		        var resp=xmlhttp.responseText;
		        if(resp!=g_layers[layerIndex].lastRefresh)
		        {
		            g_layers[layerIndex].lastRefresh=resp;
		            str=g_layers[layerIndex].layerId+"_";
		            len=str.length;
		            var win=document.getElementById('tileWindow');			
		            var eles=win.childNodes;	
		            g_uc++;
        	        for(var i=0;i<eles.length;i++)
	                {		
                        if(eles[i].id.substr(0,len)==str)
                        {
                            url=eles[i].src;    					        
					        k=url.indexOf("&U");
					        if(k<0)					            
					            url=url+"&U="+g_uc;
					        else
					            url=url.substr(0,k)+"&U="+g_uc;
                            eles[i].src=url;
                        }
	                }
		        }
		    }
		    xmlhttp.open("GET",url,true);
		    xmlhttp.send();
}
function getLoginForm()
{   
    fetchOverlay('tgis/login.aspx?action=getform');
}
function processLogout()
{
    callUrlNoReturn('tgis/login.aspx?action=logout');
    window.location.reload();
}
function processLogin(feedback)
{
    var email=loginform.email.value;
    if(email.length<3 || email.indexOf('@')<1 || email.indexOf('.')<1 || email.indexOf('\'')>=0 || email.indexOf(',')>=0 || email.indexOf('|')>=0 || email.indexOf(' ')>=0 || email.indexOf('&')>=0 || email.indexOf('=')>=0)
    {
        document.getElementById(feedback).innerHTML="Invalid Email Address";
        return;
    }
    var pwd=loginform.pwd.value;
    if(pwd.length<4 || pwd.indexOf('\'')>=0 || pwd.indexOf(',')>=0 || pwd.indexOf('|')>=0 || pwd.indexOf(' ')>=0 || pwd.indexOf('&')>=0 || pwd.indexOf('=')>=0)
    {
        document.getElementById(feedback).innerHTML="Invalid Password.  must be at least 4 characters and cannot contain ',| &=\"";
        return;
    }
    var s="tgis/login.aspx?action=login&u="+email+"&p="+pwd;
    var xml=fetchXml(s);
    var success=xml.getElementsByTagName("success")[0].firstChild.nodeValue;
    if(success=="1")
    {
        window.location.reload();
    }
    else
    {
        var err=xml.getElementsByTagName("error")[0].firstChild.nodeValue;
        document.getElementById(feedback).innerHTML=err;
    }
}
function processResetPwd(feedback)
{
    var email=loginform.email.value;
    if(email.indexOf('\'')>=0   || email.indexOf(' ')>=0 || email.indexOf('&')>=0 || email.indexOf('=')>=0)
    {
        document.getElementById(feedback).innerHTML="Invalid Email Address";
        return;
    }
    var s="tgis/login.aspx?action=reqpwdreset&u="+email;
    fetchOverlay(s);
}
function processChgPwd(feedback)
{
    var email=loginform.email.value;
    if(email.indexOf('\'')>=0   || email.indexOf(' ')>=0 || email.indexOf('&')>=0 || email.indexOf('=')>=0)
    {
        document.getElementById(feedback).innerHTML="Invalid Email Address";
        return;
    }
    var oldpwd=loginform.oldpwd.value;
    if(oldpwd.indexOf('\'')>=0 || oldpwd.indexOf(' ')>=0 || oldpwd.indexOf('&')>=0 || oldpwd.indexOf('=')>=0)
    {
        document.getElementById(feedback).innerHTML="Invalid Password.  must be at least 4 characters and cannot contain ',| &=\"";
        return;
    }
    var pwd=loginform.newpwd.value;
    if(pwd.length<4 || pwd.indexOf('\'')>=0 || pwd.indexOf(',')>=0 || pwd.indexOf('|')>=0 || pwd.indexOf(' ')>=0 || pwd.indexOf('&')>=0 || pwd.indexOf('=')>=0)
    {
        document.getElementById(feedback).innerHTML="Invalid Password.  must be at least 4 characters and cannot contain ',| &=\"";
        return;
    }
    var s="tgis/login.aspx?action=chgpwd&u="+email+"&p1="+oldpwd+"&p2="+pwd;
    fetchOverlay(s);
}
function updateLoginState()
{
        var ele=document.getElementById('loginState');
        if(ele==null)
        {
            var menu=document.getElementById('menuRow');
    		ele=document.createElement("td");
		    ele.style.verticalAlign='middle';
		    ele.id='loginState';
		    ele.innerHTML=" ";
		    var beforeElem=document.getElementById('searchTd');
		    if(beforeElem==null)
    		    menu.appendChild(ele); 
    		else
		        menu.insertBefore(ele,beforeElem);

        }
        if(g_loggedInUser!=null && g_loggedInUser.length>0)
		    ele.innerHTML="<center>"+g_loggedInUser+"<br><small><a href=\"javascript:processLogout()\">logout</a></small></center>";
		else
		    ele.innerHTML="<center><small><a href=\"javascript:getLoginForm()\">login</a></small></center>";
		
}
function cleanForUrl(text)
{
    var str;
    str = text.replace(" ", "%20");
    str = str.replace("&", "%26");
    str = str.replace("=", "%3D");
    return str;
}

function touchHandler(event)
{
    var touches = event.changedTouches,
        first = touches[0],
        type = "";
    var simulatedEvent;
    

    event.preventDefault();
	if(event.type=="touchstart")
	{
	    if(event.touches.length==1)//a single finger just touched the screen
	    {
	        simulatedEvent = document.createEvent("MouseEvent");	        
            simulatedEvent.initMouseEvent("mousedown", true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY, false, false, false, false, 0/*left*/, null);
	        first.target.dispatchEvent(simulatedEvent);	        
	    }
	}
	else if(event.type=="touchmove")
	{
	    if(event.touches.length==2)
	    {
	        
	        var x1=event.touches[0].pageX-1;
	        var y1=event.touches[0].pageY-1;
	        var x2=event.touches[1].pageX-1;
	        var y2=event.touches[1].pageY-1;
            if(g_proc && g_proc.name=="pinch")	        
            {
	            g_proc.dualMove(x1,y1,x2,y2);
	        }
	        else
	        {
	            doPinch(x1,y1,x2,y2);
	        }
	    }
	    else if(event.touches.length==1 && (g_proc==null || g_proc.name!="pinch"))//only one finger is touching the screen and it just moved 
	    {
	        simulatedEvent = document.createEvent("MouseEvent");
            simulatedEvent.initMouseEvent("mousemove", true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY, false, false, false, false, 0/*left*/, null);
	        first.target.dispatchEvent(simulatedEvent);	        
	    }

	}
	else if(event.type=="touchend")
	{    
	    if(event.touches.length==0)//first or second finger was just lifted off screen
	    {
	        simulatedEvent = document.createEvent("MouseEvent");
            simulatedEvent.initMouseEvent("mouseup", true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY, false, false, false, false, 0/*left*/, null);
	        first.target.dispatchEvent(simulatedEvent);
	        
	    }
	    
	}
	

}



function savedSettingsClass()
{
    this.prjName="";
    this.prjUnits="ft";
}

function SPoint(x,y)
{
	this.x=x;
	this.y=y;
}

function getScreenPoint(e)
{	
	var evt=window.event || e;
	if (evt.pageX || evt.pageY) 	{
		g_mouseX = evt.pageX-1;
		g_mouseY = evt.pageY-1;
	}
	else if (evt.clientX || evt.clientY) 	{
		g_mouseX = evt.clientX + document.body.scrollLeft
			+ document.documentElement.scrollLeft-1;
		g_mouseY = evt.clientY + document.body.scrollTop
			+ document.documentElement.scrollTop-1;
	}
}

function z19Pt(mousex,mousey)
{
    var map=document.getElementById('mapWindow');	
	var x=mousex-parseInt(map.style.left);
	var y=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.x19=(wx*mult)|0;
	this.y19=(wy*mult)|0;
}

function getDistancePerZ19(x1,y1,x2,y2)
{
    var p1=z192LL(x1,y1);
    var p2=z192LL(x2,y2);
    
    var lat=degreesToRadians((p1.m_lat+p2.m_lat)/2);
    var coslat=Math.cos(lat);
    var dyMeters=111321.54*Math.abs(p1.m_lat-p2.m_lat);
    var dxMeters=111321.54*Math.abs(p1.m_lon-p2.m_lon)*coslat;
    return Math.sqrt(dxMeters*dxMeters + dyMeters*dyMeters);    
}
function m2ft(meters)
{
    return meters/0.3048;
}
function ll2z19(lat,lon)
{    
    var originX = 128.0, originY = 128.0;
    var pixelsPerLon = 256.0 / 360.0;
    var pixelsPerLonRadian = 256.0 / (2 * Math.PI);
    var siny;
    var wx,wy;
    var pt;
	var z19PerWorld = 524288;
	
    wx = originX + lon * pixelsPerLon;
    if (lat > 85.0) lat = 85.0;
    if (lat < -85.0) lat = -85.0;
    siny = Math.sin(degreesToRadians(lat));
    wy = originY + 0.5 * Math.log((1 + siny) / (1 - siny)) * -pixelsPerLonRadian;
    
    pt=new z19Pt(0,0);
    pt.x19=(wx*z19PerWorld)|0;
    pt.y19=(wy*z19PerWorld)|0;
    return pt;
}


function LLPoint(lon,lat)
{
    this.m_lon=lon;
    this.m_lat=lat;    
}
function ztp2LL(zoom,tilex,tiley,px,py)
{
    var x=((tilex*256)+px)/Math.pow(2,zoom);
    var y=((tiley*256)+py)/Math.pow(2,zoom);
            var originX = 128.0;
            var originY = 128.0;
            var pixelsPerLon = 256.0 / 360.0;
            var pixelsPerLonRadian = 256.0 / (2 * Math.PI);
            var lon = (x - originX) / pixelsPerLon;
            var latRadians = (y - originY) / (-pixelsPerLonRadian);
            var lat = radiansToDegrees(2 * Math.atan(Math.exp(latRadians)) - Math.PI / 2);
            return new LLPoint(lon,lat);
}
function z192LL(x19,y19)
{
    var x=x19/Math.pow(2,19);
    var y=y19/Math.pow(2,19);
            var originX = 128.0;
            var originY = 128.0;
            var pixelsPerLon = 256.0 / 360.0;
            var pixelsPerLonRadian = 256.0 / (2 * Math.PI);
            var lon = (x - originX) / pixelsPerLon;
            var latRadians = (y - originY) / (-pixelsPerLonRadian);
            var lat = radiansToDegrees(2 * Math.atan(Math.exp(latRadians)) - Math.PI / 2);
            return new LLPoint(lon,lat);
}
function radiansToDegrees(rad) 
{
  return rad / (Math.PI / 180);
}
function degreesToRadians(deg) 
{
  return deg*(Math.PI/180.0);
}

//====================end measDist proc class===================================


//=======================================================
//  Menu Functions
//=======================================================
function changeMenuImage(id,newImage)
{
    var parent=document.getElementById(id);
    if(parent)
    {
        var eles=parent.getElementsByTagName("img");
        if(eles.length>=1)
        {
            var ele=eles[0];
            ele.src=newImage;
        }
    }
}
function addMenuItem(imgFile,title,action,id)
{
    var menu,ss,newCount,s;
    var beforeElem,td,img;
    
    beforeElem=document.getElementById('searchTd');
    menu=document.getElementById('menuRow');
    //insert items
    
    
		td=document.createElement("td");
		td.style.verticalAlign='middle';
		s="<img ";
		//if(id)
		//    s=s+"id="+id+" ";
		s=s+"src=\""+imgFile+"\" style=cursor:pointer title=\""+title+"\" onmouseup=\""+action+"\">";
		td.innerHTML=s;
		if(id)
		    td.id=id;
		menu.insertBefore(td,beforeElem);
    
    
}
function showToolsMenu2(parentId)
{
    showMenu2(parentId,"Measure Distance|doMeasDist|Measure Area|doMeasArea|Get Coordinates|doGetCoord|Find Coordinates|doFindCoord|Identify Areas|doGetAreas|Compare Photography|doSideMap|Get Elevation|doGetElev|Google Street View|doGSV");
}
function showMenu2(parentId,menuitems)
{
    closeDdMenu();

	var list=menuitems.split("|");
	var divH=(list.length/2)*36+2;
    var s;
    var i;
    var y,x,parent;
    
    parent=document.getElementById(parentId);
    x=parseInt(parent.offsetLeft);
    mm=document.getElementById('menuWindow');
    var xoffset=parseInt(mm.style.left);
    var yoffset=parseInt(mm.style.top);	
    ddMenu=document.createElement('div');
	ddMenu.id='ddMenu';
	ddMenu.style.position='absolute';
	ddMenu.style.left=xoffset+x;
	ddMenu.style.top=yoffset+30;
	ddMenu.style.width=175;
	ddMenu.style.height=divH;
	ddMenu.style.border='1px black solid';
	//ddMenu.style.padding=5;
	ddMenu.style.background='#97C3F5';
	ddMenu.style.overflow='hidden';
	ddMenu.style.zIndex=1000;				
	s="";
	for(i=0;i<list.length;i=i+2)
	{
	    y=(i/2)*34+1
	    s=s+"<div id=\"mi"+i+"\"style=\"cursor:pointer;position:absolute;left:1;width:172;height:34;top:"+y+"\" onmouseover=\"menuItemOver("+i+");\" onmouseout=\"menuItemOut("+i+");\" onmouseup=\"closeDdMenu(); "+list[i+1]+"(); cancelEvent(event);\">";
	    s=s+"<img src=\"tgis\\"+list[i+1]+".png\" style=\"position:absolute;left:1;top:1\">";
	    s=s+"<span style=\"position:absolute;left:35;top:8\">"+list[i]+"</span></div>";	    
	    //s=s+"<span id=\"mi"+i+"\" style=\"cursor:pointer\" onmouseover=\"menuItemOver("+i+");\" onmouseout=\"menuItemOut("+i+");\" onmouseup=\"closeDdMenu(); "+list[i+1]+"(); cancelEvent(event);\">"+list[i]+"</span><br>";
	}
	//if(g_isTouchDevice)
	{
	    ddMenu.style.height=divH+20;  
	    y=(list.length/2)*34+1
	    s=s+"<div id=\"mi"+i+"\"style=\"cursor:pointer;position:absolute;left:1;width:172;height:34;top:"+y+"\" onmouseover=\"menuItemOver("+i+");\" onmouseout=\"menuItemOut("+i+");\" onmouseup=\"closeDdMenu(); cancelEvent(event);\">";
	    s=s+"<span style=\"position:absolute;left:70;top:8\">Close</span></div>";	  
	}
	ddMenu.innerHTML=s;
	//var parent=document.getElementById('appWindow');
	//parent.appendChild(ddMenu);
	document.body.appendChild(ddMenu);
	g_menuOpen=1;
}
function showMenu(x,menuitems)
{
    closeDdMenu();

	var list=menuitems.split("|");
	var divH=(list.length/2)*36+17;
    var s;
    var i;
    var y;
    
    mm=document.getElementById('menuWindow');
    var xoffset=parseInt(mm.style.left);
    var yoffset=parseInt(mm.style.top);	
    ddMenu=document.createElement('div');
	ddMenu.id='ddMenu';
	ddMenu.style.position='absolute';
	ddMenu.style.left=xoffset+x+350;
	ddMenu.style.top=yoffset+30;
	ddMenu.style.width=175;
	ddMenu.style.height=divH;
	ddMenu.style.border='1px black solid';
	//ddMenu.style.padding=5;
	ddMenu.style.background='#97C3F5';
	ddMenu.style.overflow='auto';
	ddMenu.style.zIndex=1000;				
	s="";
	s=s+"<img src=\"tgis\\close.png\" style=cursor:pointer;position:absolute;left:162;top:1 onmouseup=\"closeDdMenu();\">";
	for(i=0;i<list.length;i=i+2)
	{
	    y=(i/2)*34+15
	    s=s+"<div id=\"mi"+i+"\"style=\"cursor:pointer;position:absolute;left:1;width:172;height:34;top:"+y+"\" onmouseover=\"menuItemOver("+i+");\" onmouseout=\"menuItemOut("+i+");\" onmouseup=\"closeDdMenu(); "+list[i+1]+"(); cancelEvent(event);\">";
	    s=s+"<img src=\"tgis\\"+list[i+1]+".png\" style=\"position:absolute;left:1;top:1\">";
	    s=s+"<span style=\"position:absolute;left:35;top:8\">"+list[i]+"</span></div>";	    
	    //s=s+"<span id=\"mi"+i+"\" style=\"cursor:pointer\" onmouseover=\"menuItemOver("+i+");\" onmouseout=\"menuItemOut("+i+");\" onmouseup=\"closeDdMenu(); "+list[i+1]+"(); cancelEvent(event);\">"+list[i]+"</span><br>";
	}
	ddMenu.innerHTML=s;
	//var parent=document.getElementById('appWindow');
	//parent.appendChild(ddMenu);
	document.body.appendChild(ddMenu);
	g_menuOpen=1;
}

function cancelEvent(ev)
{
	if(!ev)
		ev=windows.event;
	ev.cancelBubble = true;
	if (ev.stopPropagation) ev.stopPropagation();		
}
function menuItemOver(id)
{
    var menuItem=document.getElementById("mi"+id);
    menuItem.style.backgroundColor="#000088";
    menuItem.style.color="#FFFFFF";    
}
function menuItemOut(id)
{
    var menuItem=document.getElementById("mi"+id);
    menuItem.style.backgroundColor="#97C3F5";
    menuItem.style.color="#000000";    
}
function changeImage(id,imgName)
{
    var img=document.getElementById(id);
    img.src=imgName;
}


function layerClass(Name,Vis,lid,Alt,IsOpaque,IsBase,RefreshPeriod)
{
	this.layerId=lid;
	this.layerName=Name;
	this.layerVis=Vis;
	this.altLayerId=Alt;//layerId if layer[0] is on
	this.isopaque=IsOpaque;
	this.isbase=IsBase;	
	this.refreshPeriod=RefreshPeriod;
	this.lastRefresh="0";
	this.legendFlags=0;
}
function redraw(stop)
{
	
	var win=document.getElementById('tileWindow');		
	win.innerHTML="";
	if(stop)
	{
	    if(window.stop !== undefined) 
    	    window.stop(); 
	    else if(document.execCommand !== undefined) 
    	    document.execCommand("Stop", false); 
    }
	g_tileWindowX=0;
	g_tileWindowY=0;
	win.style.left=0;
	win.style.top=0;
	updateTiles();		
	win=document.getElementById('overlayWindow');		
	win.style.left=0;
	win.style.top=0;
	drawOverlay('r');
	g_showTiles=0;
}
/*function addLayer(name,visible,lid,altlid)
{
	if(g_layers==null)
	{
		g_layers=[1];
		g_layers[0]=new layerClass(name,visible,lid,altlid);
	}
	else
		g_layers.push(new layerClass(name,visible,lid,altlid));
}*/

function tgisClientInit(mapName,autoSizeApp)
{
    var map=null;
    try
    {
    getBaseUrl();
    var now=new Date();
    //g_uc=now.getHours()*3600+now.getMinutes()*60+now.getSeconds();
    var ua=navigator.userAgent.toLowerCase();   
    if(ua.indexOf("android")>-1)
        g_isAndroid=true;
    if(ua.indexOf("ipad")>-1)
        g_isIpad=true;
    if(ua.indexOf("iphone")>-1)
        g_isIphone=true;
    if(g_isIpad || g_isIphone || g_isAndroid)
        g_isTouchDevice=true;        
//document.getElementById('infoWindow').innerHTML="2";
    g_savedSettings=new savedSettingsClass();
    if(autoSizeApp!=null)
        g_autoSizeApp=autoSizeApp;
    else
        g_autoSizeApp=true;
    g_infoWidth=g_defaultInfoWidth;
    g_defaultProc=new defaultProc();
    g_proc=g_defaultProc;
	g_mapName=mapName;
//document.getElementById('infoWindow').innerHTML="3";
	if(mapName.length>0)
	{
//document.getElementById('infoWindow').innerHTML="4";
	    var xmlhttp=createXMLHTTPObject();
	    var success=0;	
	    var d=new Date();
		var ms=d.getMilliseconds();
	    xmlhttp.open("GET",g_urlPrefix+"/tgis/openMap.aspx?name="+mapName+"&u="+ms,false);
        if (xmlhttp.overrideMimeType)   
            xmlhttp.overrideMimeType('text/xml');	    
	    xmlhttp.send(null);

	    var xmlDoc=xmlhttp.responseXML;
	    
	    map=xmlDoc.getElementsByTagName("map")[0];
//document.getElementById('infoWindow').innerHTML="5";
	}	
	if(map)
	{
	    var n;
	    n=map.getElementsByTagName("user")[0].firstChild;
	    if(n)
	        g_loggedInUser=n.nodeValue;
	    else
	        g_loggedInUser=""; 	   
	    updateLoginState();
		var layers=map.getElementsByTagName("layer");
		g_layers=[layers.length];
		var nodes;
		for(var i=0;i<layers.length;i++)
		{
			var layer=layers[i];
			var name=layer.getElementsByTagName("name")[0].firstChild.nodeValue;
			var lid=layer.getElementsByTagName("lid")[0].firstChild.nodeValue;
			var alt=layer.getElementsByTagName("alt")[0].firstChild.nodeValue;
			var vis=layer.getElementsByTagName("vis")[0].firstChild.nodeValue;
			var isopaque=layer.getElementsByTagName("isopaque")[0].firstChild.nodeValue;
			nodes=layer.getElementsByTagName("refresh");
			var refreshPeriod=0;
			if(nodes && nodes.length>0)
			    refreshPeriod=parseInt(nodes[0].firstChild.nodeValue);
			var isbase="0";
			if(name.toLowerCase().substr(0,4)=="base")
			    isbase="1";					
			g_layers[i]=new layerClass(name,parseInt(vis),lid,alt,isopaque,isbase,refreshPeriod);
			nodes=layer.getElementsByTagName("legend");
			if(nodes && nodes.length>0)
			    g_layers[i].legendFlags=parseInt(nodes[0].firstChild.nodeValue);			
		}
		g_mapId=map.getElementsByTagName("mid")[0].firstChild.nodeValue;
		g_homeZoom=parseInt(map.getElementsByTagName("zoom")[0].firstChild.nodeValue);
		g_homeX=parseInt(map.getElementsByTagName("xcenter")[0].firstChild.nodeValue);
		g_homeY=parseInt(map.getElementsByTagName("ycenter")[0].firstChild.nodeValue);
//document.getElementById('infoWindow').innerHTML="7";
		resizeApp();
		showBirdseye(g_defaultBirdseyeOpen); 
		zoomHome();
		//showHelp();		
	}
//document.getElementById('infoWindow').innerHTML="8";
	var mapEle=document.getElementById('mapWindow');	
	if(mapEle.addEventListener !== undefined) 
	{
        mapEle.addEventListener("touchstart", touchHandler, true);
    	mapEle.addEventListener("touchmove", touchHandler, true);
    	mapEle.addEventListener("touchend", touchHandler, true);
    	mapEle.addEventListener("touchcancel", touchHandler, true);
	}	
//document.getElementById('infoWindow').innerHTML="9";
    }
    catch(err)
    {
        document.getElementById('infoWindow').innerHTML="Client Init Error:<br>"+err;
        alert(err);    
    }
    doTick();
}
function getBaseUrl()
{
    var url=window.location.href;
    url=url.toLowerCase();
    var offset=url.indexOf(".com",0);
    if(offset>0)
        g_baseUrl=url.substring(0,offset+4);
}
function processStartupCmdFromUrl()
{
    var url=window.location.href;
    var offset=url.indexOf("overlay=",0);
    if(offset>0)
    {
        var overlay=window.location.href.substr(offset+8);
        fetchOverlay(overlay);
    }
    var offset=url.indexOf("soid=",0);
    if(offset>0)
    {
        var overlay=window.location.href.substr(offset+5);
        fetchOverlay("tgis/util.aspx?action=getoverlayfile&file=tgis/temp/"+overlay+".so");
    }
}
function tgisClientInitialize(zoom,xcenter,ycenter)
{
    //obsolete
    
    g_defaultProc=new defaultProc();
    g_proc=g_defaultProc;
	//g_layers=[2];
	//g_layers[0]=new layerClass("Aerial Photos",0,"2",null);
	//g_layers[1]=new layerClass("Base Map",1,"3","6");
	//g_layers[2]=new layerClass("Parcels",0,"1",null);
	//g_layers[2]=new layerClass("Tiles",0,"t",null);
	g_homeZoom=zoom;
    g_homeX=xcenter;
    g_homeY=ycenter;    
	resizeApp();
	showBirdseye(g_defaultBirdseyeOpen); 
	//redraw();
	zoomHome();	
	showHelp();	
}
function saveZoom()
{
    if(g_prevZoom==null)
    {
        g_prevZoom=[1];
        g_prevXCenter=[1];
        g_prevYCenter=[1];
        g_prevZoom[0]=g_zoom;
        g_prevXCenter[0]=g_xcenter;
        g_prevYCenter[0]=g_ycenter;
        return;
    }
    g_prevZoom.push(g_zoom);
    g_prevXCenter.push(g_xcenter);
    g_prevYCenter.push(g_ycenter);
    if(g_prevZoom.length>20)
    {
        g_prevZoom.shift();
        g_prevXCenter.shift();
        g_prevYCenter.shift();
    }
}
function zoomHome()
{
    g_zoom=g_homeZoom;
    g_xcenter=g_homeX;
    g_ycenter=g_homeY;
    redraw(true);
    saveZoom();
}
function zoomPrev()
{
    if(g_prevZoom.length>1)
    {
        g_prevZoom.pop();
        g_prevXCenter.pop();
        g_prevYCenter.pop();
        var index=g_prevZoom.length-1;
        g_zoom=g_prevZoom[index];
        g_xcenter=g_prevXCenter[index];
        g_ycenter=g_prevYCenter[index];
        redraw(true);
    }
}
function getAppWidth()
{
    var myWidth = 100;
 
 
  if( typeof( window.innerWidth ) == 'number' ) 
  {
    //Non-IE (FF uses this one)
    myWidth = window.innerWidth-4;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myWidth = document.documentElement.clientWidth;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myWidth = document.body.clientWidth;
  }  
    return myWidth;
}
function getAppHeight()
{
    var myWidth = 0, myHeight = 0;
 
 
  if( typeof( window.innerWidth ) == 'number' ) 
  {
    //Non-IE (FF uses this one)
    myHeight = window.innerHeight-8;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myHeight = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myHeight = document.body.clientHeight;
  }  
    return myHeight;
}
function resizeApp()
{
    var menuWin=document.getElementById('menuWindow');  
    var im=document.getElementById('infoMenu');
    var iw=document.getElementById('infoWindow');  
    var mw=document.getElementById('mapWindow');  
    
    if(g_autoSizeApp)
    {    
        var myWidth=getAppWidth();
        var myHeight=getAppHeight();
        iw.style.width=g_infoWidth;//var infoWidth=parseInt(iw.style.width);
        var menuHeight=parseInt(menuWin.style.height);
        var infoTop=menuHeight;
        if(im)
        {
            infoTop=infoTop+parseInt(im.style.height);   
            im.style.width=iw.style.width;     
        }
        iw.style.top=infoTop;

        var iwHeight=myHeight-infoTop;
        if(iwHeight<50)
            iwHeight=50;
        var mwWidth=myWidth-g_infoWidth;
        if(mwWidth<50)
            mwWidth=50;
        var mwHeight=myHeight-menuHeight;
        if(mwHeight<50)
            mwHeight=50;
        
        iw.style.height=iwHeight;
        menuWin.style.width=myWidth;
        mw.style.left=g_infoWidth;
        mw.style.width=mwWidth;
        mw.style.height=mwHeight;
    }  
    var aw=document.getElementById('appWindow');
    aw.style.width=mw.style.width;
    aw.style.height=mw.style.height;
    aw.style.zIndex=997;
  
  redraw(false);//redundant but required
  showBirdseye(g_defaultBirdseyeOpen);
  
}
function showBirdseye(isOpen)
{
  	var be1=document.getElementById('birdseyeout');
  	var mw=document.getElementById('mapWindow');  
  	var w;
  	
  	if(isOpen==1)
  		w=150;
  	else
  		w=16;
  	be1.style.width=w;
  	be1.style.height=w;
  	be1.style.top=parseInt(mw.style.height)-w+2;
	var be2=document.getElementById('birdseyein');
	be2.style.width=w-6;
	be2.style.height=w-4;		
	var img=document.getElementById('birdseyebtn');
	if(isOpen==0)
	{
		be2.innerHTML="";		
		img.style.left=3;
		img.src="tgis/openbe.png";
	}
	else
	{
		img.style.left=w-13;
		img.src="tgis/closebe.png";		
	}
	g_beProc=new BirdseyeProc();
	g_beProc.draw();
	
}
function updateTiles()
{
	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=10;//how far beyond view to request tiles
	
//document.getElementById('infoWindow').innerHTML="step0";	

    if(g_layers==null)
        return;
	//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;
	
	if(g_overlayOnDraw)
	    eval(g_overlayOnDraw+"()");
//    var win=document.getElementById('sideMapRect');
//    if(win)
//        win.parentNode.removeChild(win);	
//    var win=document.getElementById('sideMap');
//    if(win)
//    {
//        drawSideMap(win,vx1,vy1,vx2,vy2,tx1,ty1,tx2,ty2);
//    }	
//document.getElementById('infoWindow').innerHTML="step1";	
    var s="";    
    var str;
	win=document.getElementById('tileWindow');			
	
	vx1=vx1-g_tileWindowX;//convert vx1 from mapWindow to tileWindow coordinates
	vy1=vy1-g_tileWindowY;	
	vx2=vx2-g_tileWindowX;//convert vx1 from mapWindow to tileWindow coordinates
	vy2=vy2-g_tileWindowY;	
	var tx,ty;
	var gx,gy;//group

	vx=vx1;
	for(tx=tx1;tx<=tx2;tx++)
	{
		//if(tx>tx1 && tx<tx2)
		{
			gx=(tx/100)|0;
			vy=vy1;
			for(ty=ty1;ty<=ty2;ty++)
			{
				//if(ty>ty1 && ty<ty2)
				{
					gy=(ty/100)|0;
					addTiles(win,vx,vy,tx,ty,gx,gy);
				}
				vy+=256;
			}
		}
		vx+=256;
	}
//	vx=vx1;
//	for(tx=tx1;tx<=tx2;tx++)
//	{
//		
//		
//			gx=(tx/100)|0;
//			vy=vy1;
//			for(ty=ty1;ty<=ty2;ty++)
//			{
//				if(ty==ty1 || ty==ty2 || tx==tx1 || tx==tx2)
//				{
//					gy=(ty/100)|0;
//					addTiles(win,vx,vy,tx,ty,gx,gy);					
//				}
//				vy+=256;
//			}
//		
//		vx+=256;
//	}
	var eles=win.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)
		{
			//s=s+"<br>"+eles[i].id;
			win.removeChild(eles[i]);	
		}
	}
	if(g_beProc)
		g_beProc.draw();
    updateLegend();
}
function updateLegend()
{
    var legendImg="";
    var opaqueVisible=0;
    var lid;
    var ele,app,be;
    
	if(g_layers==null)
	    return;
	for(var n=0;n<g_layers.length;n++)
	{
		if(g_layers[n].layerVis==1) 
		{
		    if(g_layers[n].legendFlags>0)
		    {
			    if(g_layers[n].altLayerId!=null && g_layers[n].altLayerId>0 && opaqueVisible==1)
				    lid=g_layers[n].altLayerId;
			    else
				    lid=g_layers[n].layerId;
		        legendImg="tgis/tilesvc.ashx?L="+lid+"&Z="+g_zoom+"&A=legend&Name="+cleanForUrl(g_layers[n].layerName);
		        break;
		    }
            //if(g_layers[n].isopaque=="1")//use alt if ANY prev layer is on
			    opaqueVisible=1;		    
		}
	}
	if(legendImg.length>0)//a legend is visible
	{
	    ele=document.getElementById("legend");
	    if(ele==null)
	    {
	        app=document.getElementById("appWindow");
			ele=document.createElement("img");
			ele.id="legend";			
			ele.src="tgis/minlegend.png";
			ele.style.position="absolute";
			ele.style.left=0;
			ele.style.top=0;
			//ele.style.zIndex=999;
			be=document.getElementById("birdseyeout");
			app.insertBefore(ele,be);
			openLegend(legendImg);
	    }
	    else if(ele.src=="tgis/minlegend.png")
	    {
	        ele.onclick="openLegend('"+legendImg+"');";
	    }
	    else if(ele.src!=legendImg)
	    {
	        ele.src=legendImg;
	    }
	}
	else//if no legends visible
	{
	    ele=document.getElementById("legend");
	    if(ele!=null)
	    {
	        ele.parentNode.removeChild(ele); 
	    }
	    ele=document.getElementById("closeleg");
	    if(ele!=null)
	    {
	        ele.parentNode.removeChild(ele); 
	    }	
	}
}
function closeLegend()
{
    var ele;
    
    ele=document.getElementById('legend');
    if(ele==null)
        return;
    var src=ele.src;
    ele.src="tgis/minlegend.png";
    ele.onclick="openLegend('"+src+"');";
    ele.style.cursor="pointer";
    ele=document.getElementById('closeleg');
    if(ele!=null)
        ele.parentNode.removeChild(ele);
}
function openLegend(img)
{
    var ele,app,be;
    
    ele=document.getElementById('legend');
    if(ele==null)
        return;
    ele.src=img;
    ele.onclick="";
    ele.style.cursor="default";

	ele=document.createElement("img");
	ele.id="closeleg";			
	ele.src="tgis/closeLegend.png";
	ele.style.position="absolute";
	ele.style.left=150-12;
	ele.style.top=3;
	ele.style.cursor="pointer";
	ele.onclick="closeLegend();";
	app=document.getElementById("appWindow");
	be=document.getElementById("birdseyeout");
	app.insertBefore(ele,be);

}
function addTiles(win,vx,vy,tx,ty,gx,gy)
{
	var imgId,lid;
	var imgEle;
	var opaqueVisible=0;
	var url;
	var u;
	
	if(g_layers==null)
	    return;
	for(var n=0;n<g_layers.length;n++)
	{
			if(g_layers[n].layerVis==1)
			{
				imgId=g_layers[n].layerId+"_"+tx+"_"+ty;
				if(document.getElementById(imgId)==null)
				{										
						if(g_layers[n].altLayerId!=null && g_layers[n].altLayerId>0 && opaqueVisible==1)
							lid=g_layers[n].altLayerId;
						else
							lid=g_layers[n].layerId;
					imgEle=document.createElement("img");
					imgEle.id=imgId;
					url=g_urlPrefix+"tgis/tilesvc.ashx?L="+lid+"&Z="+g_zoom+"&X="+tx+"&Y="+ty;
					if(g_layers[n].refreshPeriod>0)
					{
					    url=url+"&U="+g_uc++;
					}
					imgEle.src=url;
					imgEle.style.position="absolute";
					imgEle.style.left=vx;
					imgEle.style.top=vy;
					imgEle.width=256;
					imgEle.height=256;
					imgEle.style.zIndex=n;
					win.appendChild(imgEle);					
				}
			    //if(g_layers[n].isopaque=="1")
			        opaqueVisible=1;
				
			}
	}
	if(g_showTiles==1)
	{
	    
					var div=document.createElement("div");
					div.style.position="absolute";
					div.style.left=vx;
					div.style.top=vy;
					div.style.width=250;
					div.style.height=250;
					div.style.border="1px black solid";
					div.style.zIndex=97;
					div.innerHTML="zoom="+g_zoom+"<br>tile="+tx+","+ty+"<br>group="+gx+","+gy;
					win.appendChild(div);
	}
			
}
function repairTiles()
{
	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 layerIndex=-1;
    var mes="The following repair requests were sent. You may have to refresh your browser to see the newly drawn tiles";
    
	for(var n=0;n<g_layers.length;n++)
	{
			if(g_layers[n].layerVis==1)
            {
                if(layerIndex>=0)
                {
                    debugMes("There must be only one visible layer before running Repair");
                    return;
                }
                layerIndex=n;
            }
    }
    if(layerIndex<0)
    {
        debugMes("There must be exactly one layer visible when running Repair");
        return;
    }
	//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;
	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;
	
	
//document.getElementById('infoWindow').innerHTML="step1";	
    var s="";    
    var str;
	var win=document.getElementById('tileWindow');			
	
	vx1=vx1-g_tileWindowX;//convert vx1 from mapWindow to tileWindow coordinates
	vy1=vy1-g_tileWindowY;	
	vx2=vx2-g_tileWindowX;//convert vx1 from mapWindow to tileWindow coordinates
	vy2=vy2-g_tileWindowY;	
	var tx,ty;
	var gx,gy;//group

	
	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=g_layers[layerIndex].layerId+"_"+tx+"_"+ty;
														
						if(g_layers[layerIndex].altLayerId!=null && g_layers[layerIndex].altLayerId>0 && layerIndex>0 && g_layers[0].layerVis==1)
							lid=g_layers[layerIndex].altLayerId;
						else
							lid=g_layers[layerIndex].layerId;
						var url=g_urlPrefix+"tgis/tilesvc.ashx?L="+lid+"&Z="+g_zoom+"&X="+tx+"&Y="+ty+"&Repair=1";
						callUrlNoReturn(url);
						mes=mes+"<br>"+url;
				vy+=256;
			}
		
		vx+=256;
	}
		
	debugMes(mes);
}

function mouseDown(e)
{
	getScreenPoint(e);
	//document.getElementById('infoWindow').innerHTML="x="+g_mouseX+"<br>y="+g_mouseY;
	if(isMenuAction())
		return false;
	if(g_beProc && g_beProc.isIn('down'))
		g_beProc.mouseUp();
	else
		g_proc.mouseDown();
	return true;
}
function mouseUp(e)
{
	getScreenPoint(e);
	if(isMenuAction())
		return false;
	if(g_beProc && g_beProc.isIn('up'))
		g_beProc.mouseUp();
	else		
    	g_proc.mouseUp();
    return false;
}
function singleClick()
{
	var x,y,vx,vy,screenWidth,screenHeight,wx,wy,tx,ty;
	var map=document.getElementById('mapWindow');
	var layers;
	var lid;
	
	vx=g_mouseX-parseInt(map.style.left);
	vy=g_mouseY-parseInt(map.style.top);
//document.getElementById('infoWindow').innerHTML="x="+x+" y="+y;	
	screenWidth=parseInt(map.style.width);
	screenHeight=parseInt(map.style.height);
	wx=(g_xcenter-screenWidth/2)|0;
	wx=wx+vx;
	wy=(g_ycenter-screenHeight/2)|0;
	wy=wy+vy;
	tx=((wx)/256)|0;
	ty=((wy)/256)|0;
	x=wx%256;
	y=wy%256;
	//document.getElementById('infoWindow').innerHTML="tx="+tx+"<br>ty="+ty+"<br>x="+x+"<br>y="+y+"<br>wx="+wx+"<br>cx="+g_xcenter+"<br>w="+screenWidth;
	var bestd=9999999.9;
	var besti=-1;
	var d=0.0;
	var dx,dy;
	var opaqueVisible=0;
	
	var ele=document.getElementById('legend');
	if(ele!=null)
	{
	    var n=parseInt(ele.width)
	    if(n>50 && vx<150 && vx>138 && vy>3 && vy<15)
	    {
	        closeLegend();
	        return;
	    }
	    else if(n<50 && vx<n && vy<n)
	    {
	        eval(ele.onclick);
	        return;
	    }
	}
	if(g_osp)
	{
		for(var i=1;i<g_osp.length;i++)
		{
			dx=wx-g_osp[i].wx;
			dy=wy-g_osp[i].wy;
			d=Math.sqrt(dx*dx+dy*dy);
			if(d<8 && d<bestd)
			{
				bestd=d;
				besti=i;
			}
		}	
		if(besti>=0)
		{
			eval(g_osp[besti].fct);
			return;	
		}
	}
	layers="";
		for(var i=0;i<g_layers.length;i++)
		{
			if(g_layers[i].layerVis==1)
			{
				if(g_layers[i].altLayerId!=null && g_layers[i].altLayerId>0 && opaqueVisible==1)
					lid=g_layers[i].altLayerId;
				else
					lid=g_layers[i].layerId;
				layers=layers+lid+",";
    			//if(g_layers[i].isopaque=="1")
			        opaqueVisible=1;
			}
		}		
	var url=g_urlPrefix+"tgis/idftr.aspx?Z="+g_zoom+"&X="+tx+"&Y="+ty+"&PX="+x+"&PY="+y+"&L="+layers;
	fetchOverlay(url);
}
function callUrlNoReturn(url)
{
    var xmlhttp=createXMLHTTPObject();
	var success=0;
	
	xmlhttp.open("GET",url,false);
	xmlhttp.send(null);
}
function fetchHtml(url,id)
{    
	var xmlhttp=createXMLHTTPObject();
	var success=0;
	
	xmlhttp.open("GET",url,false);
	xmlhttp.send(null);
	var s=xmlhttp.responseText;
	document.getElementById(id).innerHTML=s;
	
}
function fetchXmlPost(url,data)
{
	var xmlhttp=createXMLHTTPObject();
	var success=0;
	
	xmlhttp.open("POST",url,false);
	xmlhttp.send(data);
	var xmlDoc=xmlhttp.responseXML;
	return xmlDoc;	
}
function fetchXml(url)
{
	var xmlhttp=createXMLHTTPObject();
	var success=0;
	
	xmlhttp.open("GET",url,false);
	xmlhttp.send(null);
	var xmlDoc=xmlhttp.responseXML;
	return xmlDoc;
}

function fetchOverlayPost(url,data)
{
	var xmlhttp=createXMLHTTPObject();
	var success=0;
	
	xmlhttp.open("POST",url,false);
	xmlhttp.send(data);
	var xmlDoc=xmlhttp.responseXML;

	var info=xmlDoc.getElementsByTagName("info")[0];
	
	if(info)
	{
		addOverlay(xmlDoc);
	}
	else
	{
	}
}
function fetchOverlay(url)
{
	//var xmlhttp=new XMLHttpRequest();
	var xmlhttp=createXMLHTTPObject();
	var success=0;
	
	xmlhttp.open("GET",url,false);
	xmlhttp.send(null);
	var xmlDoc=xmlhttp.responseXML;

	var info=xmlDoc.getElementsByTagName("info")[0];
	
	if(info)
	{
		addOverlay(xmlDoc);
	}
	else
	{
	}
}
var XMLHttpFactories = [
	function () {return new XMLHttpRequest()},
	function () {return new ActiveXObject("Msxml2.XMLHTTP")},
	function () {return new ActiveXObject("Msxml3.XMLHTTP")},
	function () {return new ActiveXObject("Microsoft.XMLHTTP")}
];

function createXMLHTTPObject() {
	var xmlhttp = false;
	for (var i=0;i<XMLHttpFactories.length;i++) {
		try {
			xmlhttp = XMLHttpFactories[i]();
		}
		catch (e) {
			continue;
		}
		break;
	}
	return xmlhttp;
}
function getStringFromXml(elem){
	
	var serialized;
	
	try {
		// XMLSerializer exists in current Mozilla browsers
		serializer = new XMLSerializer();
		serialized = serializer.serializeToString(elem);
	} 
	catch (e) {
		// Internet Explorer has a different approach to serializing XML
		serialized = elem.xml;
	}
	
	return serialized;
}

function getXmlFromString(xmlData) 
{
    var xmlDoc;
    try 
    { //Internet Explorer
        xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async = "false";
        xmlDoc.loadXML(xmlData);
    }
    catch(e)
    { //Firefox et. all
        parser = new DOMParser();
        xmlDoc = parser.parseFromString(xmlData, "text/xml");
    }
    return xmlDoc;
}


function addOverlay(xmldoc)
{
    abortProcs();
		if(g_overlayIndex>0)
		{
			for(var i=g_overlayIndex;i<20;i++)
			{
				g_overlays[i-g_overlayIndex]=g_overlays[i];
			}
			g_overlayCount-=g_overlayIndex;
		}
		for(var i=19;i>0;i--)
		{
			g_overlays[i]=g_overlays[i-1];
		}
		g_overlays[0]=xmldoc;
		g_overlayCount++;
		g_overlayIndex=0;
		if(g_overlayCount>20)
			g_overlayCount=20;
		drawOverlay('a');		
		
		document.getElementById('infoWindow').style.background="#FFFFFF";		
}
function updateOverlay(xmldoc)
{
		g_overlays[0]=xmldoc;
		drawOverlay('u');
}
//function appendOverlayGeom(geomXml)
//{
//    var ovr=g_overlays[g_overlayIndex].getElementsByTagName("overlay");
//    ovr[0].appendChild(geomXml);
//    drawOverlay('g');	
//}
function drawOverlay(source)
{
    var newWidth=g_defaultInfoWidth;    
	g_pendingOvrCmd=null;
	clearGeometry();
	g_overlayOnDraw=null;
	g_overlayOnMouseMove=null;
	g_osp=[0];
	if(g_overlayIndex>=0 && g_overlayIndex<g_overlayCount)
	{
	document.getElementById('infoWindow').style.background="#FFFFFF";
	var ovr=g_overlays[g_overlayIndex].getElementsByTagName("overlay")[0];		
	var nodes=ovr.childNodes;
	var geomOnly=false;
	if(source=='r' || source=='g')
	    geomOnly=true;
	for(var i=0;i<nodes.length;i++)
	{
		if(!geomOnly && nodes[i].nodeName=="info")//not to be processed on redraws
		{
			document.getElementById('infoWindow').innerHTML=nodes[i].childNodes[0].nodeValue;
			continue;
		}
		if(!geomOnly && nodes[i].nodeName=="lids")//not to be processed on redraws
		{
			showLids(nodes[i].childNodes[0].nodeValue);
			continue;
		}		
		if(!geomOnly && nodes[i].nodeName=="zoomto")//not to be processed on redraws
		{
			zoomToOverlay(nodes[i].childNodes[0].nodeValue);
			continue;
		}		
		if(!geomOnly && nodes[i].nodeName=="centeron")//not to be processed on redraws
		{
			centerOn(nodes[i].childNodes[0].nodeValue);
			continue;
		}		
		if(source=='a' && nodes[i].nodeName=="addlayer")
		{
			addlayer(nodes[i].childNodes[0].nodeValue);
			continue;	
		}
		if(!geomOnly && nodes[i].nodeName=="js")
		{
			loadJsRef(nodes[i].childNodes[0].nodeValue);
			continue;	
		}
		if(!geomOnly && nodes[i].nodeName=="onload")
		{
			g_pendingOvrFct=nodes[i].childNodes[0].nodeValue;
			continue;	
		}
		if(nodes[i].nodeName=="onRedraw")
		{
			g_overlayOnDraw=nodes[i].childNodes[0].nodeValue;
			continue;	
		}
		if(nodes[i].nodeName=="onMouseMove")
		{
			g_overlayOnMouseMove=nodes[i].childNodes[0].nodeValue;
			continue;	
		}
		if(!geomOnly && nodes[i].nodeName=="css")
		{
			loadCssRef(nodes[i].childNodes[0].nodeValue);
			continue;	
		}
		if(nodes[i].nodeName=="poly")
		{
			drawPoly(nodes[i].childNodes[0].nodeValue);
			continue;
		}
		if(nodes[i].nodeName=="numpts")
		{
			drawNumPts(nodes[i].childNodes[0].nodeValue,1);
			continue;
		}
		if(nodes[i].nodeName=="numpts2")
		{
			drawNumPts(nodes[i].childNodes[0].nodeValue,2);
			continue;
		}
		if(nodes[i].nodeName=="x")
		{
			drawX(nodes[i].childNodes[0].nodeValue);
			continue;
		}
		if(nodes[i].nodeName=="ghtml")
		{
		    drawGhtml(nodes[i].childNodes[0].nodeValue);
		    continue;
		}
		if(nodes[i].nodeName=="sym")
		{
			drawSym(nodes[i].childNodes[0].nodeValue);
			continue;
		}
		if(nodes[i].nodeName=="infoWidth")
		{
		    var s=nodes[i].childNodes[0].nodeValue;
		    var n=s.indexOf("%");
		    if(n>=0)
		    {
	            s=s.substr(0,n);
	            newWidth=parseInt(s);
	            newWidth=getAppWidth()*newWidth/100;    
		    }
		    else		    
    		    newWidth=parseInt(s);
		}
	}
	}
	if(newWidth!=g_infoWidth)
	{
		    g_infoWidth=newWidth;
		    resizeApp();
		    redraw(false);
	}
	processOvrFct();
	
}
function jsLoadComplete()
{
	processOvrFct();
}
function processOvrFct()
{
	if(g_pendingOvrFct==null)
		return;
	if (eval("typeof " + g_pendingOvrFct + " == 'function'")) 
	{
		eval(g_pendingOvrFct+"()");
		g_pendingOvrFct=null;
	}
	else
	{
	    eval(g_pendingOvrFct);//not sure why i previously required a function name (above) rather than just putting the code here
	}
}
function clearGeometry()
{
	var jg=new jsGraphics("overlayWindow");
	jg.clear();
	document.getElementById('overlayWindow').innerHTML="";
			
}
function loadJsRef(jsRef)
{
	if(g_dynamicRefs==null)
		g_dynamicRefs=[0];
	for(var i=0;i<g_dynamicRefs.length;i++)
	{
		if(g_dynamicRefs[i]==jsRef)
			return;	
	}
	g_dynamicRefs.push(jsRef);
	var headID = document.getElementsByTagName("head")[0];
	var newScript = document.createElement("script");
	newScript.type = "text/javascript";
	newScript.src = jsRef;
	headID.appendChild(newScript);
}
function loadCssRef(cssRef)
{
	if(g_dynamicRefs==null)
		g_dynamicRefs=[0];
	for(var i=0;i<g_dynamicRefs.length;i++)
	{
		if(g_dynamicRefs[i]==cssRef)
			return;	
	}
	g_dynamicRefs.push(cssRef);
	var headID = document.getElementsByTagName("head")[0];
	var cssNode = document.createElement("link");
	cssNode.type = "text/css";
	cssNode.rel = "stylesheet";
	cssNode.href = cssRef;
	headID.appendChild(cssNode);
}
function showLids(geom)
{
	var g=geom.split("|");
	for(var i=0;i<g_layers.length;i++)
	{
	    g_layers[i].layerVis=0;
	    for(var k=0;k<g.length;k++)
	    {
	        if(g_layers[i].layerId==g[k] || g_layers[i].altLayerId==g[k])
	        {
	            g_layers[i].layerVis=1;
	            break;
	        }
		}
		
    }
	redraw(false);

}
function centerOn(geom)
{
	var g=geom.split("|");
	if(g.length<3)
		return;	
	var z=parseInt(g[0]);
	var x=parseInt(g[1]);
	var y=parseInt(g[2]);
	g_zoom=z;
	g_xcenter=x;
	g_ycenter=y;
	saveZoom();
	redraw(false);
	return;
}
function zoomToOverlay(geom)
{
	var g=geom.split(",");
	if(g.length<4)
		return;	
	var xmin,ymin,xmax,ymax,extWidth,extHeight,zMax=17;
	xmin=parseInt(g[0]);
	ymin=parseInt(g[1]);
	xmax=parseInt(g[2]);
	ymax=parseInt(g[3]);
	if(g.length>=5)
		zMax=parseInt(g[4]);	
	var mw=document.getElementById('mapWindow');  	
	var mwWidth=parseInt(mw.style.width);
	var mwHeight=parseInt(mw.style.height);
	//first find highest zoom that shows entire window
	var zoom;
	for(zoom=19;zoom>=0;zoom--)
	{
		extWidth=xmax-xmin;
		extHeight=ymax-ymin;
		if(zoom==0 || (extWidth<mwWidth && extHeight<mwHeight))
		{
		   if(zoom<=zMax)
		   {
			g_zoom=zoom;
			g_xcenter=((xmin+xmax)/2)|0;
			g_ycenter=((ymin+ymax)/2)|0;
			saveZoom();
			redraw(false);
			return;
		   }
		}
		xmin=(xmin/2)|0;
		ymin=(ymin/2)|0;
		xmax=(xmax/2)|0;
		ymax=(ymax/2)|0;		
			
	}
}
function drawX(geom)
{
	var g=geom.split(",");
	if(g.length<2)
		return;
	var x,y;
	var imgEle;
	
	x=parseInt(g[0]);
	y=parseInt(g[1]);
	var mult=Math.pow(2,19-g_zoom);
	x=(x/mult-g_tileWindowWx)|0;
	y=(y/mult-g_tileWindowWy)|0;
    var win=document.getElementById("overlayWindow");
					imgEle=document.createElement("img");
					imgEle.id="x";
					imgEle.src="tgis/x.png";
					imgEle.style.position="absolute";
					imgEle.style.left=x-13;
					imgEle.style.top=y-13;	
					imgEle.style.zIndex=998;				
					win.appendChild(imgEle);					
    
}
function addlayer(geom)
{
	var g=geom.split(",");
	if(g.length<6)
		return;
	for(var i=0;i<g_layers.length;i++)
	{
	    if(g_layers[i].layerName==g[0])
	    {
	        g_layers[i].layerId=g[2];
	        g_layers[i].layerVis=g[1];
	        g_layers[i].altLayerId=g[3];
	        g_layers[i].isopaque=g[4];
	        g_layers[i].isbase=g[5];
	        redraw(false);
	        return;
	    }
	}	
    g_layers.push(new layerClass(g[0],g[1],g[2],g[3],g[4],g[5]));    
    redraw(false);
}
function drawSym(geom)
{//x,y,size,img,linkFct,html,title
	var g=geom.split(",");
	if(g.length<4)
		return;
	var x,y,size;
	var imgEle;
	var url;
	
	x=parseInt(g[0]);
	y=parseInt(g[1]);
	size=parseInt(g[2]);
	url=g[3];
	var mult=Math.pow(2,19-g_zoom);
	x=(x/mult-g_tileWindowWx)|0;
	y=(y/mult-g_tileWindowWy)|0;
    var win=document.getElementById("overlayWindow");
	imgEle=document.createElement("img");
	imgEle.id="x";
	imgEle.src=url;
	imgEle.style.position="absolute";
	imgEle.style.left=(x-size/2)|0;
	imgEle.style.top=(y-size/2)|0;					
	imgEle.style.zIndex=998;
	if(g.length>=5 && g[4].length>0)
	{
		g_osp.push(new onScreenPoint(x+g_tileWindowWx,y+g_tileWindowWy,g[4]));
		imgEle.style.cursor="pointer";
	}
	if(g.length>=7 && g[6].length>0)
	{
		imgEle.style.title=g[6];
	}
	win.appendChild(imgEle);
	if(g.length>=6)
	{
	    var div=document.createElement("div");	
	    div.style.position="absolute";
	    div.style.left=x;
	    div.style.top=y;					
	    div.style.backgroundColor="yellow";
	    div.innerHTML=g[5];
	    win.appendChild(div);	
	}					
    
}

function drawGhtml(geom)//x,y,html
{
	var g=geom.split("|");
	if(g.length<3)
		return;
	var x,y;    
    var div;
    	
	x=parseInt(g[0]);
	y=parseInt(g[1]);	
	var mult=Math.pow(2,19-g_zoom);
	x=(x/mult-g_tileWindowWx)|0;
	y=(y/mult-g_tileWindowWy)|0;
    var win=document.getElementById("overlayWindow");
	div=document.createElement("div");	
	div.style.position="absolute";
	div.style.left=x;
	div.style.top=y;					
	div.innerHTML=g[2];
	win.appendChild(div);					
    
}

function drawPoly(geom)
{

	var g=geom.split(",");
	if(g.length<6)
		return;
	var ptCount=(g.length-2)/2;
	var xpts=[ptCount];
	var ypts=[ptCount];
	if(g[0].length<1)
	    g[0]="#FFFF00";
	var width=3;
	if(g[1].length>0)
	    width=parseInt(g[1]);
	xpts[0]=parseInt(g[2]);
	ypts[0]=parseInt(g[3]);

	//var s="test";
	//s=s+"<br>x[0]="+xpts[0];
	for(var i=1;i<ptCount;i++)
	{
		xpts[i]=xpts[i-1]+parseInt(g[2+i*2]);
		ypts[i]=ypts[i-1]+parseInt(g[2+i*2+1]);
		//s=s+"<br>x["+i+"]="+xpts[i];
	}
	//s=s+"<br>g_tileWindowWx="+g_tileWindowWx;
	var mult=Math.pow(2,19-g_zoom);
	//s=s+"<br>mult="+mult;
	for(var i=0;i<ptCount;i++)
	{
		xpts[i]=(xpts[i]/mult-g_tileWindowWx)|0;
		ypts[i]=(ypts[i]/mult-g_tileWindowWy)|0;
		//s=s+"<br>x["+i+"]="+xpts[i];
	}
	//document.getElementById('infoWindow').innerHTML=s;
	var jg=new jsGraphics("overlayWindow");
	jg.setPrintable(true);
	jg.setColor(g[0]);
	jg.setStroke(width);
	jg.drawPolyline(xpts,ypts);
	jg.paint();

}
function drawNumPts(geom,version)
{
    var paramcount=2;
    if(version==2)
        paramcount=3;
	var g=geom.split(",");
	if(g.length<5)
		return;
	var ptCount=(g.length-3)/paramcount;
	var xpts=[ptCount];
	var ypts=[ptCount];
	xpts[0]=parseInt(g[3]);
	ypts[0]=parseInt(g[4]);

	for(var i=1;i<ptCount;i++)
	{
		xpts[i]=xpts[i-1]+parseInt(g[3+i*paramcount]);
		ypts[i]=ypts[i-1]+parseInt(g[3+i*paramcount+1]);
	}
	var mult=Math.pow(2,19-g_zoom);
	var win=document.getElementById('overlayWindow');
	
	/*var jg=new jsGraphics("overlayWindow");
	jg.setPrintable(true);
	jg.setColor("#FFFF00");
	jg.setStroke(3);
	for(var i=0;i<ptCount;i++)
	{
		xpts[i]=(xpts[i]/mult-g_tileWindowWx)|0;
		ypts[i]=(ypts[i]/mult-g_tileWindowWy)|0;
		jg.drawRect(xpts[i]-2,ypts[i]-2,4,4);		
//document.getElementById('infoWindow').innerHTML="x="+xpts[i]+" y="+ypts[i];
//break;
		
	}
	jg.paint();*/
	var imgEle;
	for(var i=0;i<ptCount;i++)
	{
		//xpts[i]=(xpts[i]/mult-g_tileWindowWx)|0;
		//ypts[i]=(ypts[i]/mult-g_tileWindowWy)|0;
		xpts[i]=(xpts[i]/mult)|0;
		ypts[i]=(ypts[i]/mult)|0;
		
		imgEle=document.createElement("img");
		imgEle.id="olp"+i;
		imgEle.src="tgis/bball.png";
		imgEle.style.position="absolute";
		imgEle.style.left=xpts[i]-5-g_tileWindowWx;
		imgEle.style.top=ypts[i]-5-g_tileWindowWy;					
		imgEle.style.cursor="pointer";
		imgEle.style.zIndex=998;
		if(version==2)
		{
		    imgEle.title=g[3+i*paramcount+2];
		    imgEle.alt=g[3+i*paramcount+2];
		}
		var osp=new onScreenPoint(xpts[i],ypts[i],"doLink("+i+")");
		g_osp.push(osp);
		win.appendChild(imgEle);						
	}
	

}
function highlightNumPt(index,OnOff)
{
    var ele=document.getElementById('olp'+index);
    if(OnOff==1)
    {
        ele.style.zIndex=999;
        ele.src="tgis/yball.png";
    }
    else
    {
        ele.style.zIndex=998;
        ele.src="tgis/bball.png";
    }
}
function isMenuAction()
{
	if(g_menuOpen==false)
		return false;	
	var mx,my,left,top,right,bottom
	var mw;

	mw=document.getElementById('mapWindow');
	left=parseInt(mw.style.left);
	top=parseInt(mw.style.top);
	mx=g_mouseX-left;
	my=g_mouseY-top;
    ddMenu=document.getElementById('ddMenu');
    if(ddMenu!=null)
    {  
		left=parseInt(ddMenu.style.left);
		//top=parseInt(ddMenu.style.top);
		right=left+parseInt(ddMenu.style.width);
		bottom=top+parseInt(ddMenu.style.height);
		if(mx>=left && mx<=right && my<=bottom)
			return true;	
	}
	return false;
}
function closeDdMenu()
{
    removeElement('ddMenu');
	g_menuOpen=0;
}
function removeElement(eleName)
{
    var ele=document.getElementById(eleName);
    if(ele!=null)
    {
		ele.parentNode.removeChild(ele);	
	}
}
function mouseMove(e)
{
	getScreenPoint(e);
	if(isMenuAction())
		return false;
    closeDdMenu();    
    if(g_proc!=null)
        g_proc.mouseMove();
    return false;
}
function zoomIn()
{
	if(g_zoom<19)
	{
		g_zoom+=1;
		g_xcenter*=2;
		g_ycenter*=2;	
		redraw(true);
	}
	document.getElementById('infoWindow').innerHTML="Zoom="+g_zoom;
}
function zoomOut()
{
	if(g_zoom>0)
	{
		g_zoom-=1;	
		g_xcenter=(g_xcenter/2)|0;
		g_ycenter=(g_ycenter/2)|0;
		redraw(true);
		saveZoom();
	}
}
function wheel(event)
{
	var dx,dy,mapLeft,mapTop;
	var map;
        var delta = 0;
        if (!event) event = window.event;
	getScreenPoint(event);
        map=document.getElementById('mapWindow');
	mapLeft=parseInt(map.style.left);
	mapTop=parseInt(map.style.top);

	if(g_mouseX<mapLeft)
		return true;	
        if (event.wheelDelta) {
                delta = event.wheelDelta/120; 
                if (window.opera) delta = -delta;
        } else if (event.detail) {
                delta = -event.detail/3;
        }        
        if (delta>0 && g_zoom<19)
        {        	
        	dx=(parseInt(map.style.width)/2+mapLeft)|0;
        	dx-=g_mouseX;
        	dx=(dx/2)|0;
        	g_xcenter-=dx;
        	dy=(parseInt(map.style.height)/2+mapTop)|0;
        	dy-=g_mouseY;
        	dy=(dy/2)|0;
        	g_ycenter-=dy;
        	g_zoom+=1;
        	g_xcenter*=2;
        	g_ycenter*=2;
        	saveZoom();
        	redraw(true);
        }
        if(delta<0 && g_zoom>0)
        {
        	dx=(parseInt(map.style.width)/2+mapLeft)|0;
        	dx-=g_mouseX;
        	g_xcenter+=dx;
        	dy=(parseInt(map.style.height)/2+mapTop)|0;
        	dy-=g_mouseY;
        	g_ycenter+=dy;
			g_zoom-=1;	
			g_xcenter=(g_xcenter/2)|0;
			g_ycenter=(g_ycenter/2)|0;
			saveZoom();
			redraw(true);        	       
        }
}
if (window.addEventListener)
	window.addEventListener('DOMMouseScroll', wheel, false);
window.onmousewheel = document.onmousewheel = wheel;
function showLayerList()
{
    closeDdMenu();
        mm=document.getElementById('menuWindow');
        var xoffset=parseInt(mm.style.left);
        var yoffset=parseInt(mm.style.top);
		ddMenu=document.createElement('div');
		ddMenu.id='ddMenu';
		ddMenu.style.position='absolute';
		ddMenu.style.left=xoffset+350+5;
		ddMenu.style.top=yoffset+30;
		ddMenu.style.width=200;
		var h=g_layers.length*25;
		if(h<100)
		    h=100;
		if(h>500)
		    h=500;
		ddMenu.style.height=h;
		ddMenu.style.overflow='auto';
		ddMenu.style.border='1px black solid';
		ddMenu.style.background='#97C3F5';	
		ddMenu.style.zIndex=1000;				
		var s="";
		for(var i=0;i<g_layers.length;i++)
		{
			s=s+"<input type=checkbox name=laychk"+i+" id=laychk"+i;
			if(g_layers[i].layerVis==1)
				s=s+" checked";
			s=s+" onclick=\"layerChecked("+i+"); cancelEvent(event);\">"+g_layers[i].layerName+"<br>";
		}		
		//if(g_isTouchDevice)
	    {
	        s=s+"&nbsp;&nbsp;&nbsp;<span onclick=closeDdMenu();>Close</span><br>";
	        ddMenu.style.height=h+25;
	    }

		ddMenu.innerHTML=s;
		//var parent=document.getElementById('appWindow');
		//parent.appendChild(ddMenu);
		document.body.appendChild(ddMenu);
		g_menuOpen=1;
	
}
function showLayerList2(parentId)
{
    closeDdMenu();
    var parent=document.getElementById(parentId);
    var x=parseInt(parent.offsetLeft);
        mm=document.getElementById('menuWindow');
        var xoffset=parseInt(mm.style.left);
        var yoffset=parseInt(mm.style.top);
		ddMenu=document.createElement('div');
		ddMenu.id='ddMenu';
		ddMenu.style.position='absolute';
		ddMenu.style.left=xoffset+x;
		ddMenu.style.top=yoffset+30;
		ddMenu.style.width=200;
		var h=g_layers.length*25;
		if(h<100)
		    h=100;
		if(h>500)
		    h=500;
		ddMenu.style.height=h;
		ddMenu.style.overflow='auto';
		ddMenu.style.border='1px black solid';
		ddMenu.style.background='#97C3F5';	
		ddMenu.style.zIndex=1000;				
		var s="";
		for(var i=0;i<g_layers.length;i++)
		{
			s=s+"<input type=checkbox name=laychk"+i+" id=laychk"+i;
			if(g_layers[i].layerVis==1)
				s=s+" checked";
			s=s+" onclick=\"layerChecked("+i+"); cancelEvent(event);\">"+g_layers[i].layerName+"<br>";
		}		
		//if(g_isTouchDevice)
	    {
	        s=s+"<p><center><span style=cursor:pointer onclick=\"closeDdMenu(); cancelEvent(event);\">Close</span></center></p>";
	        ddMenu.style.height=h+25;
	    }
		
		ddMenu.innerHTML=s;
		//var parent=document.getElementById('appWindow');
		//parent.appendChild(ddMenu);
		document.body.appendChild(ddMenu);
		g_menuOpen=1;
	
}
function layerChecked(index)
{
	g_layers[index].layerVis=document.getElementById("laychk"+index).checked;
	redraw(true);
}
function ClearButton()
{
    abortProcs();
	g_overlayIndex=-1;
	document.getElementById('infoWindow').innerHTML="";
	redraw(false);
}
function BackButton()
{   
	if(g_overlayIndex<(g_overlayCount-1))
	{
	    abortProcs();
		g_overlayIndex=g_overlayIndex+1;
		//debug("c="+g_overlayCount+" i="+g_overlayIndex);
		drawOverlay('b');
		//drawOverlayText();
		//drawOverlayGeom();
	}
	return false;
}
function debugMes(mes)
{
	document.getElementById('infoWindow').innerHTML=mes;
}
function ForwardButton()
{
	if(g_overlayIndex>0)
	{
	    abortProcs();
		g_overlayIndex--;
		drawOverlay('f');
		//drawOverlayText();
		//drawOverlayGeom();
	}
	return false;
}
function ProcessSearchKeyUp(event)
{
	
	var box=document.getElementById('searchBox');
	var searchText;
	
    if (!event) event = window.event;
	if(event.keyCode==13)
	{
	    if(box.value=="_repair")
	    {
	        repairTiles();
	        return false;
	    }
	    if(box.value=="_showtiles")
	    {
	        g_showTiles=1;
	        redraw(true);
	        return false;
	    }
	    if(box.value=="_showloginstatus")
	    {
	        fetchOverlay('tgis/login.aspx?action=getstatus');
	        return false;
	    }
		document.getElementById('infoWindow').innerHTML="Searching...";			
		searchText=box.value;		
		box.value="";
		var d=new Date();
		ms=d.getMilliseconds();
		//fetchOverlay("http://tgisserver.wthgis.com/search.aspx?S="+searchText+"&L="+layers+"&U="+ms);
		fetchOverlay(g_urlPrefix+"tgis/search.aspx?S="+searchText+"&M="+g_mapId+"&U="+ms);
		box.blur();
		return false;
	}
}
function showx(z19x,z19y,html,zoomto)
{
	var s="<overlay><info><![CDATA[<img src=tgis/x.png> "+html+"]]></info><sym>"+z19x+","+z19y+",24,tgis/x.png</sym>";
	if(zoomto==1)
		s=s+"<zoomto>"+z19x+","+z19y+","+z19x+","+z19y+",16</zoomto>";
	s=s+"</overlay>";
    var xml=getXmlFromString(s);
    addOverlay(xml);
	
}
function doLink(oli)
{	
	var ele=document.getElementById('oli'+oli);
	if(ele)
	{
		if(ele.href)
		{
			eval(ele.href);	
		}
	}
}
function showf(dsid,ftrid,zoomTo)
{
    var z="1";
    
    if(zoomTo=="0")
        z="0";
	fetchOverlay(g_urlPrefix+"tgis/getftr.aspx?D="+dsid+"&F="+ftrid+"&Z="+z);
}
function showHelp()
{
	var s="<h3>Quick Start Guide<\h3>\
<p><table><tr><td colspan=2><b>Map Navigation</b></td></tr>\
<tr><td><img src=tgis/btnZoom.png></td><td>Draw zoom window (or use mouse wheel)</td></tr>\
<tr><td><img src=tgis/btnZoomOut.png></td><td>Zoom out (or use mouse wheel)</td></tr>\
<tr><td><img src=tgis/btnZoomPrev.png></td><td>Recall previous map view</td></tr>\
<tr><td><img src=tgis/btnZoomHome.png></td><td>Return to initial-home map view</td></tr>\
<tr><td><img src=tgis/btnArrow.png></td><td>Click and drag mouse to pan</td></tr>\
<tr><td><img src=tgis/btnArrow.png></td><td>Click on anything displayed in map window to see details</td></tr>\
<tr><td><img src=tgis/btnBack.png></td><td>Recall previous information page</td></tr>\
<tr><td><img src=tgis/btnForward.png></td><td>Recall next information page</td></tr>\
<tr><td><img src=tgis/btnClear.png></td><td>Clear information window and associated map highlighting</td></tr>\
</table></p>\
<p id=\"info\"><b>Search For</b><br>\
Type an address, parcel number, owner name, or name of any feature on the map and press enter.</p>\
<p><a href=\"tgis/help.html\" target=\"_blank\">User's Guide</a></p>\
</font></span></body>";
document.getElementById('infoWindow').innerHTML=s;
document.getElementById('infoWindow').style.background="#97C3F5";

}
function showHideTable(id)
{
	var t=document.getElementById("tid"+id);
	var img=document.getElementById("iid"+id);
	if(t.style.display=="none")
	{
		t.style.display="";
		img.src="tgis/minus.png";
	}
	else
	{
		t.style.display="none";
		img.src="tgis/plus.png";
	}
}
function onScreenPoint(Wx,Wy,Fct)
{
	this.wx=Wx;
	this.wy=Wy;
	this.fct=Fct;	
}
function saveOverlay()
{
    var ovr;
    var n1;
    var ovrStr;
    if(g_overlayIndex>=0 && g_overlayIndex<g_overlayCount)
    {
        ovrStr=getStringFromXml(g_overlays[g_overlayIndex]);
        n1=ovrStr.indexOf("</overlay>");
        ovrStr=ovrStr.substring(0,n1);
        //ovr=g_overlays[g_overlayIndex];
    }
    else
    {
        //ovr=getXmlFromString("<overlay></overlay>");
        ovrStr="<overlay>";
    }
    //remove zoom from overlay
    n1=ovrStr.indexOf("<zoomto>");
    var n2=ovrStr.indexOf("</zoomto>");
    if(n1>0 && n2>0)
    {
        ovrStr=ovrStr.substring(0,n1)+ovrStr.substring(n2+9);
    }
//    var list=ovr.getElementsByTagName("zoomto");
//    var node;
//    if(list && list.length>0)
//    {
//        node=list[0];
//        node.parentNode.removeChild(node);
//    }
    
    //add new zoom
    ovrStr=ovrStr+"<centeron>"+g_zoom+"|"+g_xcenter+"|"+g_ycenter+"</centeron>";
//    var top=ovr.getElementsByTagName("overlay")[0];
//    node=ovr.createElement("centeron");
//    var text=ovr.createTextNode(g_zoom+"|"+g_xcenter+"|"+g_ycenter);    
//    node.appendChild(text);
//    top.appendChild(node);
    
    //add mapsize
    var map=document.getElementById('mapWindow');
    var w=parseInt(map.style.width);
    var h=parseInt(map.style.height);
    ovrStr=ovrStr+"<mapsize>"+w+"|"+h+"</mapsize>";
//    node=ovr.createElement("mapsize");
//    var text=ovr.createTextNode(w+"|"+h);    
//    node.appendChild(text);
//    top.appendChild(node);            
    
    //add lids    
 	//var data="";
    ovrStr=ovrStr+"<lids>";
 	var hasLayers=false;
 	var opaqueVisible=0;
		for(var i=0;i<g_layers.length;i++)
		{
			if(g_layers[i].layerVis==1)
			{
				if(g_layers[i].altLayerId!=null && g_layers[i].altLayerId>0 && opaqueVisible==1)
					lid=g_layers[i].altLayerId;
				else
					lid=g_layers[i].layerId;				
				if(hasLayers)
				    ovrStr=ovrStr+"|";
				ovrStr=ovrStr+lid;
				hasLayers=true;
    			//if(g_layers[i].isopaque=="1")
			        opaqueVisible=1;
			}
		}
	ovrStr=ovrStr+"</lids>";
//    node=ovr.createElement("lids");
//    text=ovr.createTextNode(data);
//    node.appendChild(text);
//    top.appendChild(node);
//	data=getStringFromXml(ovr);
    ovrStr=ovrStr+"</overlay>";
    var result=fetchXmlPost("tgis/util.aspx?action=saveoverlay",ovrStr);
    var soid=result.getElementsByTagName("soid")[0].firstChild.nodeValue;
    return soid;

}
function print1()
{
    var soid=saveOverlay();
    window.open("tgis/printpreview1.ashx?soid="+soid);
}
function createEmailLink()
{
    var soid=saveOverlay();
    var base=window.location.href;
    var offset=base.indexOf("?",0);
    if(offset>0)
    {
        base=base.substr(0,offset);
    }
    base=base+"?soid="+soid;
    
    
    var info=document.getElementById('infoWindow');
	var win=document.createElement('div');
		win.id='linkWindow';
		win.style.position='absolute';
		win.style.left=10;
		win.style.top=10;
		var w=parseInt(info.style.width)-40
		win.style.width=w;
		win.style.height=150		
		win.style.border='1px black solid';
		win.style.background='#97C3F5';	
		win.style.padding=10;
		win.style.zIndex=1000;	
		win.onclick="return true;";	
		var taw=w-40;
		var s="";
		s=s+"<img style=float:right;cursor:pointer src=tgis/btnX.png onclick=\"removeElement('linkWindow');\">";
		s=s+"<img src=tgis/btnEmail.png> <b>Link</b><p><textarea style=width:"+taw+";height:60 id=linkText onclick=\"win=document.getElementById('linkText');win.focus();win.select(); return true;\">"+base+"</textarea>";
		s=s+"<br>Copy and paste the above link into an email to share what your looking at with someone else</p><center><img src=tgis/btnClose.png style=cursor:pointer onclick=\"removeElement('linkWindow');\"></center>";
		taw=taw+10;
		win.innerHTML=s;
		info.appendChild(win);   
	    win=document.getElementById('linkText');win.focus();win.select();
}

