
var queries;
var map; 
var smallMapView; 
var myTileLayer; 
var tilelayer;
var selectedMLayer;
var defaultTransValue = 8;

var DSITileLayer; 
var MilliParkTileLayer; 

var mapExtension = null;

var measureButtonPressed = 0;
var measureEventHandler;

var scaleControl;

var centerx = 38.88; 
var centery = 35.45; 
var firstZoom = 6; 
var lastZoom = 15; 

var dontZoom = false;
var measurePlacemark;
var activatedTool = "";
////var allowedBounds = new GLatLngBounds(new GLatLng(35.70,25.92), new GLatLng(42.58,44.86));
//String.prototype.trim = function(){return 
//(this.replace(/^[\s\xA0]+/, "").replace(/[\s\xA0]+$/, ""))}

String.prototype.startsWith = function(str) 
{return (this.match("^"+str)==str)}

String.prototype.endsWith = function(str) 
{return (this.match(str+"$")==str)}

String.prototype.replaceAll = function(stringToFind,stringToReplace){
    var temp = this;
    var index = temp.indexOf(stringToFind);
        while(index != -1){
            temp = temp.replace(stringToFind,stringToReplace);
            index = temp.indexOf(stringToFind);
        }
        return temp;
    }

var boxStyleOpts = {
  opacity: .2,
  border: "2px solid red"
}

var otherOpts = {
  buttonHTML: "",
  buttonZoomingHTML: "",
  buttonStartingStyle: {width: '1px', height: '1px'}
};

var callbacks = {
  buttonclick: function(){},
  dragstart: function(){},
  dragging: function(x1,y1,x2,y2){ 
   	//GLog.write("Dragging, currently x="+x2+",y="+y2)
	},
  dragend: function(nw,ne,se,sw,nwpx,nepx,sepx,swpx){
	  	//GLog.write("Zoom! NE="+ne+";SW="+sw)
	}
};

function roundNumber(rnum, rlength) { 
    var newnumber;
    try
    {
        newnumber = Math.round(rnum*Math.pow(10,rlength))/Math.pow(10,rlength);
    }
    catch (ex)
    {
        alert(ex);
    }
  return newnumber; 
}

function loadingData() {
    document.getElementById('results_panel').innerHTML = "Executing Query<br /><img src='" + geeEarthImage('loading.gif') + "' /> ";
}

function querySt(ji) {
    hu = window.location.search.substring(1);
    var gy = hu.split("&");
    for (i=0;i<gy.length;i++) 
    {
        var ft = gy[i].split("=");
        if (ft[0] == ji) 
        {
            return ft[1];
        }
    }
}
//"true";
var geOn = true;//querySt("geOn");
//if (geOn == "true")
//    geOn = true;
//else
//    geOn = false;
    
var geTour2 = querySt("geTour");
if (geTour2 == "true")
    geTour = true;
else
    geTour = false;

var myDragZoomIn = new DragZoomInControl(boxStyleOpts, otherOpts, callbacks);
var myDragZoomOut = new DragZoomOutControl(boxStyleOpts, otherOpts, callbacks);
var myDragMeasure = new DragMeasureControl(boxStyleOpts, otherOpts, callbacks);
var myDragIdentify = new DragIdentifyControl(boxStyleOpts, otherOpts, callbacks);

var polyShape = new GOverlay();
var polygonMode;
var polyPoints = [];
var marker = new GOverlay();

var fillColor = "#0000FF"; 
var lineColor = "#000000"; 
var opacity = .5;
var lineWeight = 2;
var breakResize;
var myHeight = 460;
var myWidth = 760;
var resizeRan = false;

function initialize() {
    InitBaseIcon();
    queries = [];
    document.getElementById('downloadGE').innerHTML = '<table height="100%"><tr><td colspan="2" valign="middle">Get Google Earth Plugin</td></tr><tr><td valign="middle">&nbsp;&nbsp;<a href="' + FUSION_MAP_SERVER + '/earth/plugin/GoogleEarth-Windows-Plugin-Latest.msi">Windows</a>&nbsp;&nbsp;</td><td valign="middle">&nbsp;&nbsp;<a href="' + FUSION_MAP_SERVER + '/earth/plugin/GoogleEarth-Mac-Plugin-Latest.dmg">Mac</a>&nbsp;&nbsp;</td></tr></table>';
    if (geOn)
    {
        resizeMap();
        document.getElementById("mouseCoords").innerHTML = "";
        geeInit();
    }
    else
    {
        document.getElementById('downloadGE').style.visibility = "visible";
        map = new GFusionMap(document.getElementById("map_canvas"));

        map.setCenter(new GLatLng(initY, initX), initLevel);
        extents[0] = initY + "," + initX + "," + initLevel;
        //map.showInitialFusionLayers();
        resizeMap();
//      map.enableDoubleClickZoom();
//		map.enableScrollWheelZoom();
//		smallMapView = new GOverviewMapControl();
//		map.addControl(smallMapView);
//		scaleControl = new GScaleControl();
//		map.addControl(scaleControl);		
//		options = new GMapUIOptions(new GSize(500,500));
//		options.controls.scalecontrol = true;
//		map.setUI(options);
		map.addControl(myDragZoomIn);	
		map.addControl(myDragZoomOut);	
		map.addControl(myDragMeasure);	
		map.addControl(myDragIdentify);
		
		//map.addControl(new GLargeMapControl());
        map.addControl(new GMapTypeControl());
        map.addControl(new GOverviewMapControl());
        scale_control = new GScaleControl();
        map.addControl(scale_control);
        new GKeyboardHandler(map);
        map.enableDoubleClickZoom();
        map.enableScrollWheelZoom();
		map.enableContinuousZoom();	
		
//        map.addOverlay(new GMarker(new GLatLng(39.124717712, -76.76954269)));
//        map.addOverlay(new GMarker(new GLatLng(39.114418029, -76.76954269)));
//        map.addOverlay(new GMarker(new GLatLng(39.114418029, -76.78482055)));
//        map.addOverlay(new GMarker(new GLatLng(39.124717712, -76.78482055)));
//        var latlngs = [];
//        latlngs.push(new GLatLng(39.124717712, -76.76954269));
//        latlngs.push(new GLatLng(39.114418029, -76.76954269));
//        latlngs.push(new GLatLng(39.114418029, -76.78482055));
//        latlngs.push(new GLatLng(39.124717712, -76.78482055));
//        latlngs.push(new GLatLng(39.124717712, -76.76954269));
//        map.addOverlay(new GPolyline(latlngs, "#00FFFF", 6, .7));
//        map.addOverlay(new GPolygon(latlngs, "#000000", 3, 0.7, "#00FFFF", 0.5));
//        var geoXml = new FGeoXml("http://localhost/GoogleMapTest/KML_Samples.kml");
//        map.addOverlay(geoXml);
		GEvent.addListener(map,"mousemove", function(point) {
		    try{
			    deneme = document.getElementById("mouseCoords");
			    deneme.innerHTML = "X: " + point.x.toFixed(4) + ", Y: " + point.y.toFixed(4);
			    deneme.innerHTML = "<table height='100%'><tr><td valign='middle'><b>X: " + point.x.toFixed(4) + ", Y: " + point.y.toFixed(4) + "</b></td></tr></table>";
			}catch(e){ alert(e); }
		});

		GEvent.addListener(map,"moveend", function() 
        {
            if (!skipExtentStore)
            {
                currExtent++;
                var maxExtents = 200;
                if (currExtent > maxExtents)
                {
                    currExtent = maxExtents;
                    for (var i = 1; i <= maxExtents; i++)
                    {
                        extents[i-1] = extents[i];
                    }
                }
                extents[currExtent] = map.getCenter().lat() + "," + map.getCenter().lng() + "," + map.getBoundsZoomLevel(map.getBounds());
                extents.splice(currExtent+1, extents.length - currExtent-1);
                
            }
            skipExtentStore = false;
        }); 
        
//        ?q=http://econym.googlepages.com/example1.kml
//        var geoXml = new FGeoXml("http://localhost/GoogleMapTest/KML_Samples.kml");
//        map.addOverlay(geoXml);
//        
        
        fillMeasureOptions(selectedTool);
              DebugMsg = function() {}

        var fusionmap_elem = document.getElementById('map_canvas');
        var searchresults_elem = FindElement("search_panel");
        if (searchresults_elem)
          searchresults_docker = new SidePanel(searchresults_elem);
        var myplaces_elem = FindElement("myplaces_panel");
        if (myplaces_elem)
            myplaces_docker = new SidePanel(myplaces_elem);
        var layers_elem = FindElement("layers_panel");
        if (layers_elem)
            layers_docker = new SidePanel(layers_elem);
        InitializeLayers(fusionmap_elem);
        //placemark_manager = new PlacemarkManager(fusionmap_elem);
        buildBookmarks();
        InitializeSearch(fusionmap_elem);
        //document.getElementById('gContents').style.visibility = "visible";
        resizeMap();
        map.setCenter(new GLatLng(initY, initX), initLevel);
        }
      }
    var bookmark_defs = [];
    var BOOKMARKS_COOKIE = 'myplaces';
    function buildBookmarks()
    {
        document.getElementById('myplaces_panel').innerHTML = "";
        var parent = document.getElementById('myplaces_panel');
        var form = CreateElement(parent, "form", "myplaces_container");
        var table = CreateElement(form, "table");
        var main_tbody = CreateElement(table, "tbody");

        var row = CreateElement(main_tbody, "tr");
        row.style.height = "20px";
        var td = CreateElement(row, "td");
        var layerName = CreateInputElement(td, "text", "layerName");
        GEvent.bindDom(layerName, "keypress", this, function(e) {
            if (e.keyCode == 13)
            {
                newBookmark(layerName.value, main_tbody);
                layerName.value = "";
                cancelEvent(e);
            }
        });
        td = CreateElement(row, "td");
        var add_btn = CreateElement(td, 'a');
        add_btn.href = 'javascript:void(0)';
        GEvent.bindDom(add_btn, 'click', this, function(e) {
            newBookmark(layerName.value, main_tbody);
            layerName.value = "";
            cancelEvent(e);
            return false;
        });
        add_btn.appendChild(document.createTextNode("Add"));
        var placemark_cookie = GetCookieValue(MYPLACES_COOKIE);
        if (placemark_cookie) {
            var placemarks = placemark_cookie.split('|');
            for (var p = 0; p < placemarks.length; ++p) {
                var parms = placemarks[p].split(':');
                if (parms.length >= 4) {
                    var def = {
                      txt: "",
                      lat: 0,
                      lng: 0,
                      alt: 0,
                      heading: 0,
                      tilt: 0,
                      range: 0
                    };
                    def.txt = unescape(parms[0]);
                    def.lat = parseFloat(parms[1]);
                    def.lng = parseFloat(parms[2]);
                    if (parms.length > 4)
                        def.alt = parms[3];
                    else
                        def.alt = parseInt(parms[3], 10);
                    if (parms.length >= 5)
                        def.heading = parms[4];
                    else
                        def.heading = 0;
                    if (parms.length >= 6)
                        def.tilt = parms[5];
                    else
                        def.tilt = 0;
                     if (parms.length >= 7)
                        def.range = parms[6];
                    else
                        def.range = 0;   
                    try
                    {
                        addBookmark(def, main_tbody);
                    }
                    catch (ex)
                    {
                        alert(ex);
                    }
                }
            }
        }
    }
    
    function newBookmark(val, parent)
    {
        if (!val)
        {
            var count = 0;
            var tmp = "";
            for (var p = 0; p < bookmark_defs.length; ++p) {
                if (bookmark_defs[p].txt.startsWith('Bookmark '))
                {
                    tmp = bookmark_defs[p].txt.replaceAll("Bookmark ", "");
                    var tmpCount = parseInt(tmp);
                    if (tmpCount > count)
                        count = tmpCount;
                }
            }
            count++;
            for (var i = 1; i < count; i++)
            {
                var found = false;
                for (var p = 0; p < bookmark_defs.length; ++p) {
                    if (bookmark_defs[p].txt == ("Bookmark " + i))
                    {
                        found = true;
                    }
                }
                if (!found)
                {
                    count = i;
                    break;
                }
            }
            val = "Bookmark " + count;
        }
        var def = {
          txt: "",
          lat: 0,
          lng: 0,
          alt: 0,
          heading: 0,
          tilt: 0,
          range: 0
        };
        if (geOn)
        {
            var camera = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);
            def.txt = val,
            def.lat = camera.getLatitude();
            def.lng = camera.getLongitude();
            def.alt = camera.getAltitude();
            def.heading = camera.getHeading();
            def.tilt = camera.getTilt();
            def.range = camera.getRange();
        }
        else
        {
            var center = map.getCenter();
            def.txt = val,
            def.lat = center.lat();
            def.lng = center.lng();
            def.alt = map.getBoundsZoomLevel(map.getBounds());
        }
        addBookmark(def, parent);
        saveBookmarks();
    }
    
    function addBookmark(def, parent)
    {
//        if (dijit.byId('myplaces_frame'))
//        {
//            dijit.byId('myplaces_frame').open=false;
//            dijit.byId('myplaces_frame').toggle();
//        }

        var row = CreateElement(parent, "tr");
        row.style.height = "20px";
       //def.entry_elem = row;

        var td = CreateElement(row, "td");
        var a = CreateElement(td, "a");
        a.href = 'javascript:void(0)';

        GEvent.bindDom(a, 'click', this, function(e) {
            zoomToBookmark(def.lat, def.lng, def.alt, def.heading, def.tilt, def.range);
            cancelEvent(e);
            return false;
        });
        a.appendChild(document.createTextNode(def.txt));
        
        td = CreateElement(row, "td");
        var delete_btn = CreateElement(td, "a", "placemark_delete_btn");
        delete_btn.href = 'javascript:void(0)';
        delete_btn.appendChild(document.createTextNode("Delete"));
        GEvent.bindDom(delete_btn, 'click', this, function(e) {
            deleteBookmark(def);
            row.parentNode.removeChild(row);
            cancelEvent(e);
            return false;
        });
        bookmark_defs.push(def);
    }
      
    function saveBookmarks()
    {
        var me = this;
        var cookie = "";

        for (var p = 0; p < bookmark_defs.length; ++p) {
            if (cookie)
                cookie += '|';
            cookie += escape(bookmark_defs[p].txt) +
                ':' + bookmark_defs[p].lat +
                ':' + bookmark_defs[p].lng +
                ':' + bookmark_defs[p].alt +
                ':' + bookmark_defs[p].heading +
                ':' + bookmark_defs[p].tilt +
                ':' + bookmark_defs[p].range;
        }
        var date = new Date();
        date.setTime(date.getTime()+315360000000);/* expires one year from now */
        cookie += "; expires="+date.toGMTString(); 
        SetCookieValue(BOOKMARKS_COOKIE, cookie);
    }
    function deleteBookmark(def)
    {
        var me = this;
        for (var p = 0; p < bookmark_defs.length; ++p) {
            if (bookmark_defs[p] == def) {
                bookmark_defs.splice(p, 1);
                saveBookmarks();
                break;
            }
        }
    }
    
    function zoomToBookmark(lat, lng, alt, heading, tilt, range)
    {
        if (geOn)
            geePanToAltitude(lat, lng, alt, heading, tilt, range)
        else
        {
            if (parseInt(alt) > 30)
                alt = Math.round(26-(Math.log(alt)/Math.log(2)))
            map.setCenter(new GLatLng(parseFloat(lat), parseFloat(lng)), parseInt(alt)); 
        }       
    }

  function activateTool(toolName)
    {
        activatedTool = toolName;
        if (toolName == 'zoomin')
        {
            resetTools();
            if (!geOn)
            {
                myDragZoomIn.initiateZoom();
            }
            else
            {
                ge.getOptions().setMouseNavigationEnabled(false); 
                google.earth.addEventListener(ge.getGlobe(), 'mousemove', ongemousemove);
                google.earth.addEventListener(ge.getGlobe(), 'mousedown', ongemousedown); 
                google.earth.addEventListener(ge.getGlobe(), 'mouseup', ongemouseup); 
            }
        }
        else if (toolName == 'zoomout')
        {
            resetTools();
            if (!geOn)
            {
                myDragZoomOut.initiateZoom();
            }
            else
            {
                geZoomOut = true;
                ge.getOptions().setMouseNavigationEnabled(false); 
                google.earth.addEventListener(ge.getGlobe(), 'mousemove', ongemousemove);
                google.earth.addEventListener(ge.getGlobe(), 'mousedown', ongemousedown); 
                google.earth.addEventListener(ge.getGlobe(), 'mouseup', ongemouseup); 
            }
        }
        else if (toolName == 'pan')
        {
            resetTools();
        }
        else if (toolName == 'zoomfullext')
        {
            if (!geOn)
                map.setCenter(new GLatLng(0, 0), 2);
            else
                geePanTo(0, 0, 2);
        }
        else if (toolName == 'zoomprev')
        {
            prevExtent();
        }
        else if (toolName == 'zoomnext')
        {
            nextExtent();
        }
        else if (toolName == 'identify')
        {
            resetTools();
            closeQueryBuilder();
            if (!geOn)
            {
                myDragIdentify.initiateIdentify();
            }
            else
            {
                ge.getOptions().setMouseNavigationEnabled(false); 
                google.earth.addEventListener(ge.getGlobe(), 'mousemove', ongemousemove);
                google.earth.addEventListener(ge.getGlobe(), 'mousedown', ongemousedown); 
                google.earth.addEventListener(ge.getGlobe(), 'mouseup', ongemouseup); 
            }
            dijit.byId('results_frame').open=false;
            dijit.byId('results_frame').toggle();
            openIdentifyWindow();
        }
        else if (toolName == 'measure')
        {
            resetTools();
            activateMeasureTool(selectedTool);
            dijit.byId('measure_frame').open=false;
            dijit.byId('measure_frame').toggle();
        }
        else if (toolName == 'query')
        {
            resetTools();
            dijit.byId('query_frame').open=false;
            dijit.byId('query_frame').toggle();
        }
        else if (toolName == 'exportkml')
        {
            
        }
    }
      
      function openIdentifyWindow()
      {
        try
        {
            var headerDiv = findElement(geeDivIds.header);
            var headerHeight = getElementHeight(headerDiv);
            var leftPanelWidth = geeLeftPanelWidth;  // Set on startup by css.
            var newHeight = headerHeight + 30;
            if (geOn)
            {
                var shimmer;
                shimmer = document.getElementById('shimmerIdentify');
                if (!shimmer)
                {
                    shimmer = document.createElement('iframe');
                }
                shimmer.style.visibility = "visible"
                shimmer.id='shimmerIdentify';
                shimmer.style.position='absolute';
                // normally you would get the dimensions and 
                // positions of the sub div dynamically. For demo 
                // purposes this is hardcoded
                shimmer.style.width='204px';
                shimmer.style.height='25px';
                shimmer.style.top=newHeight+1 + "px";
                shimmer.style.left=(geeLeftPanelWidth + 221) + "px";
                shimmer.style.zIndex='4999';
                shimmer.style.backgroundColor='transparent';
//                shimmer.setAttribute('allowTransparency','true');
                shimmer.setAttribute('frameborder','0');
//                shimmer.setAttribute('src','javascript:false;');
                document.body.appendChild(shimmer);
            }
            // make sub div visible
            var sd = document.getElementById('identifyWindow');
            sd.style.visibility='visible';
            sd.style.left = (geeLeftPanelWidth + 220) + "px";
            sd.style.top = newHeight + "px";
        }
        catch (ex)
        {
            alert(ex);
        }
      }
      
      var highlightedMarker;
      var highlightedPolygon = [];
      var highlightedPolyLine;
      var qbtabletype = "";
    function showQueryBuilder(table, tabletype)
    {
        resetTools();
        var headerDiv = findElement(geeDivIds.header);
        var headerHeight = getElementHeight(headerDiv);
        var leftPanelWidth = geeLeftPanelWidth;  // Set on startup by css.
        var newHeight = headerHeight + 35;
        if (geOn)
        {
            var shimmer;
            shimmer = document.getElementById('shimmerQB');
            if (!shimmer)
            {
                shimmer = document.createElement('iframe');
            }
            shimmer.style.visibility = "visible"
            shimmer.id='shimmerQB';
            shimmer.style.position='absolute';

            shimmer.style.width='305px';
            shimmer.style.height='325px';
            shimmer.style.top=newHeight-1 + "px";
            shimmer.style.left=geeLeftPanelWidth+1 + "px";
            shimmer.style.zIndex='4999';
            shimmer.style.backgroundColor='transparent';
//            shimmer.setAttribute('allowTransparency','true');
            shimmer.setAttribute('frameborder','0');
//            shimmer.setAttribute('src','javascript:false;');
            document.body.appendChild(shimmer);
        }
        
        var pl = new SOAPClientParameters();
        pl.add("TableName", table);
        var url = document.location.href.substring(0, document.location.href.lastIndexOf('/')+1) + "Service.asmx";
        SOAPClient.invoke(url, "GetColumns", pl, true, GetColumns_callBack);

        document.getElementById('qbUniqueValues').options.length = 0;
        qbtabletype = tabletype;
        document.getElementById('queryBuilder').style.visibility = "visible";
        document.getElementById('queryBuilder').style.left = geeLeftPanelWidth + "px";
        document.getElementById('queryBuilder').style.top = newHeight + "px";
        document.getElementById('qbLayerName').innerHTML = table;
        document.getElementById('qbSelectDiv').innerHTML = "Select * FROM " + table + " WHERE";
        if (tabletype == "prime")
        {
            for (var j = 0; j < queries.length; j++)
            {
                var query = queries[j].split('|||');
                if (query[0] == table)
                {
                    document.getElementById('qbWhereClause').value = query[2];
                }
            }
        }
        else
        {
            document.getElementById('qbWhereClause').value = document.getElementById(tabletype).innerHTML;
        }
    }
    function AddUniqueValue()
    {
        var val = document.getElementById('qbUniqueValues').options[document.getElementById('qbUniqueValues').selectedIndex].value;
        
        var whereClause = trim(document.getElementById('qbWhereClause').value);
        if (whereClause.substring((whereClause.length - 2), whereClause.length) == "''")
        {
            document.getElementById('qbWhereClause').value = whereClause.substring(0, (whereClause.length - 2)) + "'" + val + "' ";
        }
        else if (whereClause.substring((whereClause.length - 4), whereClause.length) == "('')")
        {
            document.getElementById('qbWhereClause').value = whereClause.substring(0, (whereClause.length - 4)) + "('" + val + "') ";
        }
        else
            document.getElementById('qbWhereClause').value += val;
    }
    function AddQBValue(value)
    {
        document.getElementById('qbWhereClause').value = trim(document.getElementById('qbWhereClause').value);
        if (value == '=' || value == '<' || value == '>' || value == '<=' || value == '>=' || value == '<>')
        {
            var val = document.getElementById('qbColNames').options[document.getElementById('qbColNames').selectedIndex].value.split('|||');
            if (val[1].toLowerCase() == 'system.string' || val[1].toLowerCase() == 'system.datetime')
            {
                if (trim(document.getElementById('qbWhereClause').value) == '')
                    document.getElementById('qbWhereClause').value += val[0] + " " + value + " '' ";
                else
                    document.getElementById('qbWhereClause').value += " " + val[0] + " " + value + " '' ";
            }
            else
            {
                if (trim(document.getElementById('qbWhereClause').value) == '')
                    document.getElementById('qbWhereClause').value += val[0] + " " + value + " ";
                else
                    document.getElementById('qbWhereClause').value += " " + val[0] + " " + value + " ";
            }
        }
        else if (value.toLowerCase() == 'like')
        {
            var val = document.getElementById('qbColNames').options[document.getElementById('qbColNames').selectedIndex].value.split('|||');
            if (val[1].toLowerCase() == 'system.string' || val[1].toLowerCase() == 'system.datetime')
            {
                if (trim(document.getElementById('qbWhereClause').value) == '')
                    document.getElementById('qbWhereClause').value += val[0] + " " + value + " ('') ";
                else
                    document.getElementById('qbWhereClause').value += " " + val[0] + " " + value + " ('') ";
            }
            else
            {
                if (trim(document.getElementById('qbWhereClause').value) == '')
                    document.getElementById('qbWhereClause').value += val[0] + " " + value + " () ";
                else
                    document.getElementById('qbWhereClause').value += " " + val[0] + " " + value + " () ";
            }
        }
        else if (value.toLowerCase() == 'not')
        {
            var val = document.getElementById('qbColNames').options[document.getElementById('qbColNames').selectedIndex].value.split('|||');
            if (val[1].toLowerCase() == 'system.boolean')
            {
                if (trim(document.getElementById('qbWhereClause').value) == '')
                    document.getElementById('qbWhereClause').value += value + " " + val[0] + " ";
                else
                    document.getElementById('qbWhereClause').value += " " + value + " " + val[0] + " ";
            }
            else
            {
                if (trim(document.getElementById('qbWhereClause').value) == '')
                    document.getElementById('qbWhereClause').value += value + " ";
                else
                    document.getElementById('qbWhereClause').value += " " + value + " ";
            }
        }
        else 
        {
                if (trim(document.getElementById('qbWhereClause').value) == '')
                    document.getElementById('qbWhereClause').value += value + " ";
                else
                    document.getElementById('qbWhereClause').value += " " + value + " ";
        }
    }
    
    function GetUniqueValues()
    {
        document.getElementById('qbUniqueValues').options.length = 0;
        var tablename = document.getElementById('qbLayerName').innerHTML;
        var col = document.getElementById('qbColNames').options[document.getElementById('qbColNames').selectedIndex].value.split('|||');
        var columnname = col[0];
        
        var pl = new SOAPClientParameters();
        pl.add("TableName", tablename);
        pl.add("ColumnName", columnname);
        var url = document.location.href.substring(0, document.location.href.lastIndexOf('/')+1) + "Service.asmx";
        SOAPClient.invoke(url, "GetUniqueValues", pl, true, GetUniqueValues_callBack);
    }
    function GetUniqueValues_callBack(r)
    {
        document.getElementById('qbUniqueValues').options.length = 0;
        try
        {
            var vals = r.split('|||');
                    
            for (var i = 0; i < vals.length; i++)
            {
                try
                {
                    addLayerToAList(vals[i], vals[i], "qbUniqueValues");
                }
                catch (ex) 
                {
                }
            }
        }
        catch (ex) 
        {
            addLayerToAList("NULL", "NULL", "qbUniqueValues");
        }

    }
    function GetColumns_callBack(r)
    {
        document.getElementById('qbColNames').options.length = 0;
        try
        {
            var cols = r.split(';');
                    
            for (var i = 0; i < cols.length; i++)
            {
                var col = cols[i].split('|||');
                try
                {
                    addLayerToAList(col[0], cols[i], "qbColNames");
                }
                catch (ex) 
                {
                }
            }
        }
        catch (ex) 
        {
            addLayerToAList("NULL", "NULL", "qbColNames");
        }
    }
    function clearResults()
    {
        document.getElementById('results_panel').innerHTML = "";
        try
        {
            if (geOn)
            {
                ge.getFeatures().removeChild(highlightedMarker); 
            }
            else
            {
                map.removeOverlay(highlightedMarker)
            }
        }
        catch(e) 
        {
        }
        try{
            var poly;
            for (var i = 0; i < highlightedPolygon.length; i++)
            {
                if (geOn)
                {
                    try
                    {
                        ge.getFeatures().removeChild(highlightedPolygon[i]);
                    }
                    catch (ex)
                    {
                    }

                }
                else
                {
                    try
                    {
                        poly = highlightedPolygon[i];
                        map.removeOverlay(poly);
                    }
                    catch (ex) 
                    { 
                    }
                }
            }
        }
        catch(e) {  }
        try
        {
            if (geOn)
            {
                ge.getFeatures().removeChild(highlightedPolyLine);
            }
            else
            {
                map.removeOverlay(highlightedPolyLine)
            }
        }
        catch (ex)
        {
        }
    }
    function RunQuery()
    {
        var count = 0;
        var newQuery = "";
        for (var j = 0; j < queries.length; j++)
        {
            var query = queries[j].split('|||');
            var onoff = query[1];
            if (onoff.toLowerCase() == "on")
            {
                count++;
                try
                {
                    if (query[3] == "undefined")
                        newQuery += query[0] + "|||,";
                    else
                        newQuery += query[0] + "|||" + query[3] + ",";
                }
                catch (ex)
                {
                }
            }
        }
        
        var geomoptionstwo = "";
        var tabletwo = "";
        var buffertwo = "";
        var disttypetwo = "";
        var sqltwo = "";
        
        var geomoptionsthree = "";
        var tablethree = "";
        var bufferthree = "";
        var disttypethree = "";
        var sqlthree = "";
        
        var geomoptionsfour = "";
        var tablefour = "";
        var bufferfour = "";
        var disttypefour = "";
        var sqlfour = "";
        
        var geomoptionsfive = "";
        var tablefive = "";
        var bufferfive = "";
        var disttypefive = "";
        var sqlfive = "";

        if (count > 0)
        {
            var tabletwo = document.getElementById('TableTwoList').options[document.getElementById('TableTwoList').selectedIndex].text;
            if (tabletwo != "" && tabletwo != "Select Table")
            {
                var geomoptionstwo = document.getElementById('TableTwoGeomOptions').options[document.getElementById('TableTwoGeomOptions').selectedIndex].text;
                var buffertwo = document.getElementById('TableTwoBuffer').value;
                if (trim(buffertwo) == "")
                    buffertwo = "0.0";
                var disttypetwo = document.getElementById('TableTwoDistanceType').options[document.getElementById('TableTwoDistanceType').selectedIndex].text;
                buffertwo = convertTo(buffertwo, "Meters", disttypetwo);
                var sqltwo = document.getElementById('TableTwoSQLLabelHidden').value;
                if (document.getElementById('TableThreeFrame').style.visibility != 'hidden')
                {
                    geomoptionsthree = document.getElementById('TableThreeGeomOptions').options[document.getElementById('TableThreeGeomOptions').selectedIndex].text;
                    tablethree = document.getElementById('TableThreeList').options[document.getElementById('TableThreeList').selectedIndex].text;
                    bufferthree = document.getElementById('TableThreeBuffer').value;
                    if (trim(bufferthree) == "")
                        bufferthree = "0.0";
                    disttypethree = document.getElementById('TableThreeDistanceType').options[document.getElementById('TableThreeDistanceType').selectedIndex].text;
                    bufferthree = convertTo(bufferthree, "Meters", disttypethree);
                    sqlthree = document.getElementById('TableThreeSQLLabelHidden').value;
                    
                    if (document.getElementById('TableFourFrame').style.visibility != 'hidden')
                    {
                        geomoptionsfour = document.getElementById('TableFourGeomOptions').options[document.getElementById('TableFourGeomOptions').selectedIndex].text;
                        tablefour = document.getElementById('TableFourList').options[document.getElementById('TableFourList').selectedIndex].text;
                        bufferfour = document.getElementById('TableFourBuffer').value;
                        if (trim(bufferfour) == "")
                            bufferfour = "0.0";
                        disttypefour = document.getElementById('TableFourDistanceType').options[document.getElementById('TableFourDistanceType').selectedIndex].text;
                        bufferfour = convertTo(bufferfour, "Meters", disttypefour);
                        sqlfour = document.getElementById('TableFourSQLLabelHidden').value;
                        if (document.getElementById('TableFiveFrame').style.visibility != 'hidden')
                        {
                            geomoptionsfive = document.getElementById('TableFiveGeomOptions').options[document.getElementById('TableFiveGeomOptions').selectedIndex].text;
                            tablefive = document.getElementById('TableFiveList').options[document.getElementById('TableFiveList').selectedIndex].text;
                            bufferfive = document.getElementById('TableFiveBuffer').value;
                            if (trim(bufferfive) == "")
                                bufferfive = "0.0";
                            disttypefive = document.getElementById('TableFiveDistanceType').options[document.getElementById('TableFiveDistanceType').selectedIndex].text;
                            bufferfive = convertTo(bufferfive, "Meters", disttypefive);
                            sqlfive = document.getElementById('TableFiveSQLLabelHidden').value;
                        }
                    }
                }
            }
            else
                tabletwo = "";
            
            
            var pl = new SOAPClientParameters();
            pl.add("queries", newQuery);
            pl.add("geomoptionstwo", geomoptionstwo);
            pl.add("tabletwo", tabletwo);
            pl.add("buffertwo", buffertwo);
            pl.add("disttypetwo", disttypetwo);
            pl.add("sqltwo", sqltwo);

            pl.add("geomoptionsthree", geomoptionsthree);
            pl.add("tablethree", tablethree);
            pl.add("bufferthree", bufferthree);
            pl.add("disttypethree", disttypethree);
            pl.add("sqlthree", sqlthree);

            pl.add("geomoptionsfour", geomoptionsfour);
            pl.add("tablefour", tablefour);
            pl.add("bufferfour", bufferfour);
            pl.add("disttypefour", disttypefour);
            pl.add("sqlfour", sqlfour);

            pl.add("geomoptionsfive", geomoptionsfive);
            pl.add("tablefive", tablefive);
            pl.add("bufferfive", bufferfive);
            pl.add("disttypefive", disttypefive);
            pl.add("sqlfive", sqlfive);
            
            var url = document.location.href.substring(0, document.location.href.lastIndexOf('/')+1) + "Service.asmx";
            SOAPClient.invoke(url, "QueryData", pl, true, QueryData_callBack);
            loadingData();
        }
    }
    
    function QueryData_callBack(r)
    {
        clearResults();
        dijit.byId('results_frame').open=false;
        dijit.byId('results_frame').toggle();
        document.getElementById('results_panel').innerHTML = r.toString();
        try {
            if (GetCookieValue('ZoomChecked'))
                document.getElementById('zoomCheck').checked = true;
            else
                document.getElementById('zoomCheck').checked = false;
        } catch (ex) { 
        }
    }

    function ClearAll()
    {
        document.getElementById('TableOneList').selectedIndex = -1;
        PrimaryTablesSelected();
        document.getElementById('TableThreeFrame').style.visibility = 'hidden';
        document.getElementById('TableFourFrame').style.visibility = 'hidden';
        document.getElementById('TableFiveFrame').style.visibility = 'hidden';
        document.getElementById('TableTwoList').selectedIndex = 0;
        document.getElementById('TableThreeList').selectedIndex = 0;
        document.getElementById('TableFourList').selectedIndex = 0;
        document.getElementById('TableFiveList').selectedIndex = 0;
        
        document.getElementById('TableTwoBuffer').value = ''
        document.getElementById('TableThreeBuffer').value = ''
        document.getElementById('TableFourBuffer').value = ''
        document.getElementById('TableFiveBuffer').value = ''
    }
    
    function PrimaryTablesSelected()
    {
        var ob = document.getElementById('TableOneList');
        var unselected = new Array();
        var query = [];
        var innerhtml = "<table style=\"width:100%;\" cellpadding=\"0\" cellspacing=\"0\">";
        for (var j = 0; j < queries.length; j++)
        {
            var query = queries[j].split('|||');
            if (query[3])
                queries[j] = query[0] + "|||OFF|||" + query[2] + "|||" + query[3];
            else
                queries[j] = query[0] + "|||OFF|||" + query[2] + "|||";
        }
        var whereclause = "";
        for (var i = 0; i < ob.options.length; i++)
        {
            if (ob.options[ i ].selected)
            {
                
                whereclause = "";
                for (var j = 0; j < queries.length; j++)
                {
                    var query = queries[j].split('|||');
                    if (query[0] == ob.options[i].value)
                    {
                        queries[j] = query[0] + "|||ON|||" + query[2] + "|||" + query[3];
                        whereclause = query[2];
                    }
                }
                innerhtml += "<tr><td colspan=\"2\"><b>" + ob.options[i].value + "</b></td></tr><tr><td style=\"vertical-align:top; width:60px;\"><input id=\"SQLButton" + ob.options[i].value + "\" type=\"button\" value=\"SQL\" onclick=\"showQueryBuilder('" + ob.options[i].value + "','prime')\" />";
                innerhtml += "</td><td><div style=\"font-size:small; text-align:left\">" + whereclause + "</div></td></tr>";
            }
            else
                unselected.push(ob.options[ i ].value);
        }
        innerhtml += "</table>";
        document.getElementById('SQLButtons').innerHTML = innerhtml;
        
        document.getElementById('TableTwoList').options.length = 0;
        document.getElementById('TableThreeList').options.length = 0;
        document.getElementById('TableFourList').options.length = 0;
        document.getElementById('TableFiveList').options.length = 0;
        
        //Select Table
        addLayerToAList("Select Table", "Select Table", "TableTwoList");
        addLayerToAList("Select Table", "Select Table", "TableThreeList");
        addLayerToAList("Select Table", "Select Table", "TableFourList");
        addLayerToAList("Select Table", "Select Table", "TableFiveList");
        
        for (var i = 0; i < unselected.length; i++)
        {
            addLayerToAList(unselected[i], unselected[i], "TableTwoList");
            addLayerToAList(unselected[i], unselected[i], "TableThreeList");
            addLayerToAList(unselected[i], unselected[i], "TableFourList");
            addLayerToAList(unselected[i], unselected[i], "TableFiveList");
        }
    }
    
    function addLayerToAList(text, value, selectName)
    {
        var elOptNew = document.createElement('option');
        elOptNew.text = text;
        elOptNew.value = value;
        var elSel = document.getElementById(selectName);
        try {
            elSel.add(elOptNew, null); // standards compliant; doesn't work in IE
        }
        catch(ex) {
            elSel.add(elOptNew); // IE only
        }
    }
    function setQueryValue()
    {
        var newWhereClause = document.getElementById('qbWhereClause').value;
        if (qbtabletype == "prime")
        {
            for (var j = 0; j < document.getElementById("qbColNames").options.length; j++)
            {
                var t = document.getElementById("qbColNames").options[j].value.split('|||');
                newWhereClause = newWhereClause.replace(new RegExp(t[0], 'g'), "first." + t[0]);
            }
            var table = document.getElementById('qbLayerName').innerHTML;
            for (var j = 0; j < queries.length; j++)
            {
                var query = queries[j].split('|||');
                if (query[0] == table)
                {
                    queries[j] = query[0] + "|||" + query[1] + "|||" + document.getElementById('qbWhereClause').value + "|||" + newWhereClause;
                }
            }
            PrimaryTablesSelected();
        }
        else
        {
            document.getElementById(qbtabletype).innerHTML = document.getElementById('qbWhereClause').value;
            document.getElementById(qbtabletype + "Hidden").value = document.getElementById('qbWhereClause').value;
            for (var j = 0; j < document.getElementById("qbColNames").options.length; j++)
            {
                var t = document.getElementById("qbColNames").options[j].value.split('|||');
                if (qbtabletype == "TableTwoSQLLabel")
                    document.getElementById(qbtabletype + "Hidden").value =  document.getElementById(qbtabletype + "Hidden").value.replace(new RegExp(t[0].toLowerCase(), 'g'), "second." + t[0].toLowerCase());
                else if (qbtabletype == "TableThreeSQLLabel")
                    document.getElementById(qbtabletype + "Hidden").value =  document.getElementById(qbtabletype + "Hidden").value.replace(new RegExp(t[0].toLowerCase(), 'g'), "third." + t[0].toLowerCase());
                else if (qbtabletype == "TableFourSQLLabel")
                    document.getElementById(qbtabletype + "Hidden").value =  document.getElementById(qbtabletype + "Hidden").value.replace(new RegExp(t[0].toLowerCase(), 'g'), "fourth." + t[0].toLowerCase());
                else if (qbtabletype == "TableFiveSQLLabel")
                    document.getElementById(qbtabletype + "Hidden").value =  document.getElementById(qbtabletype + "Hidden").value.replace(new RegExp(t[0].toLowerCase(), 'g'), "fifth." + t[0].toLowerCase());
            }

        }
        if (geOn)
        {
            try 
            {
                document.getElementById('shimmerQB').style.visibility = "hidden";
            }
            catch (ex)
            {
            }
        }
        document.getElementById('queryBuilder').style.visibility = "hidden";
    }
    function closeQueryBuilder()
    {
        if (geOn)
        {
            try 
            {
                document.getElementById('shimmerQB').style.visibility = "hidden";
            }
            catch (ex)
            {
            }
        }
        document.getElementById('queryBuilder').style.visibility = "hidden";
    }
    //latlngs.push(new GLatLng(39.124717712, -76.76954269));
    //map.addOverlay(new GPolygon(latlngs, "#000000", 3, 0.5, "#00FFFF", 0.5));
    //map.addOverlay(new GPolyline(latlngs, "#00FFFF", 6, .7));
    function addTable()
    {
        if (document.getElementById('TableThreeFrame').style.visibility == 'hidden')
        {
            dijit.byId('TableThreeFrame').open=false;
            dijit.byId('TableThreeFrame').toggle();
            document.getElementById('TableThreeFrame').style.visibility = 'visible'
        }
        else if (document.getElementById('TableFourFrame').style.visibility == 'hidden')
        {
            dijit.byId('TableFourFrame').open=false;
            dijit.byId('TableFourFrame').toggle();
            document.getElementById('TableFourFrame').style.visibility = 'visible'
        }
        else if (document.getElementById('TableFiveFrame').style.visibility == 'hidden')
        {
            dijit.byId('TableFiveFrame').open=false;
            dijit.byId('TableFiveFrame').toggle();
            document.getElementById('TableFiveFrame').style.visibility = 'visible'
        }
    }
    function ZoomToGISPoint(wkt)
    {
        var maxX = -180;
        var minX = 180;
        var maxY = -90;
        var minY = 90;

        var latlng = GISPointFromInnerWKT(wkt);
        
        if (latlng.x > maxX)
            maxX = latlng.x;
        if (latlng.x < minX)
            minX = latlng.x;
        if (latlng.y > maxY)
            maxY = latlng.y;
        if (latlng.y < minY)
            minY = latlng.y;
        
        ZoomToLocation(minX, minY, maxX, maxY);
    }
    
    function ZoomToGISPolygonSet(wkt)
    {
        var maxX = -180;
        var minX = 180;
        var maxY = -90;
        var minY = 90;
        
        wkt = wkt.replaceAll("(", "<");
        wkt = wkt.replaceAll(")", ">");

        var polys = wkt.substring(1, wkt.length - 1).split(">>,<<");
        if (polys.length > 0)
        {
            for (var i = 0; i < polys.length; i++)
            {
                if (!polys[i].startsWith('<<'))
                {
                    polys[i] = "<<" + polys[i];
                }
                if (!polys[i].endsWith('>>'))
                {
                    polys[i] += ">>";
                }
                
                var poly;
                wkt = wkt.replaceAll("(", "<");
                wkt = wkt.replaceAll(")", ">");
                var pos = wkt.indexOf('>');
                var strData = wkt.substring(2, pos);
                var coordSet = strData.split(',');
                for (var i = 0; i < coordSet.length; i++)
                {
                    var coords = coordSet[i].split(' ');
                    var latlng = GISPointFromInnerWKT(coordSet[i]);
                    if (latlng.x > maxX)
                        maxX = latlng.x;
                    if (latlng.x < minX)
                        minX = latlng.x;
                    if (latlng.y > maxY)
                        maxY = latlng.y;
                    if (latlng.y < minY)
                        minY = latlng.y;
                }
                var keepGoing = false;
                if (wkt.indexOf('>',pos+1) != pos+1)
                    keepGoing = true;
                while (keepGoing)
                {

                    var startPos = wkt.indexOf('<', pos + 1);
                    pos = wkt.indexOf('>', pos + 1);
                    strData = wkt.substring(startPos + 1, pos - (startPos + 1));
                    if (wkt.indexOf('>',pos+1) != pos+1)
                        keepGoing = true;
                    else
                        keepGoing = false;

                    var coordSet = strData.split(',');
                    for (var i = 0; i < coordSet.length; i++)
                    {
                        var coords = coordSet[i].split(' ');
                        var latlng = GISPointFromInnerWKT(coordSet[i]);
                        if (latlng.x > maxX)
                            maxX = latlng.x;
                        if (latlng.x < minX)
                            minX = latlng.x;
                        if (latlng.y > maxY)
                            maxY = latlng.y;
                        if (latlng.y < minY)
                            minY = latlng.y;
                    }
                }
            }
        }
        ZoomToLocation(minX, minY, maxX, maxY);
    }
    function ZoomToGISPolygon(wkt)
    {
        var maxX = -180;
        var minX = 180;
        var maxY = -90;
        var minY = 90;

        var poly;
        wkt = wkt.replaceAll("(", "<");
        wkt = wkt.replaceAll(")", ">");
        var pos = wkt.indexOf('>');
        var strData = wkt.substring(2, pos);
        var coordSet = strData.split(',');
        for (var i = 0; i < coordSet.length; i++)
        {
            var coords = coordSet[i].split(' ');
            var latlng = GISPointFromInnerWKT(coordSet[i]);
            if (latlng.x > maxX)
                maxX = latlng.x;
            if (latlng.x < minX)
                minX = latlng.x;
            if (latlng.y > maxY)
                maxY = latlng.y;
            if (latlng.y < minY)
                minY = latlng.y;
        }
        var keepGoing = false;

        if (wkt.indexOf('>',pos+1) != pos+1)
            keepGoing = true;
        while (keepGoing)
        {
            var startPos = wkt.indexOf('<', pos + 1);
            pos = wkt.indexOf('>', pos + 1);
            strData = wkt.substring(startPos + 1, pos - (startPos + 1));
            if (wkt.indexOf('>',pos+1) != pos+1)
                keepGoing = true;
            else
                keepGoing = false;

            var coordSet = strData.split(',');
            for (var i = 0; i < coordSet.length; i++)
            {
                var coords = coordSet[i].split(' ');
                var latlng = GISPointFromInnerWKT(coordSet[i]);
                if (latlng.x > maxX)
                    maxX = latlng.x;
                if (latlng.x < minX)
                    minX = latlng.x;
                if (latlng.y > maxY)
                    maxY = latlng.y;
                if (latlng.y < minY)
                    minY = latlng.y;
            }
        }
        ZoomToLocation(minX, minY, maxX, maxY);
    }
    function ZoomToGISLine(wkt)
    {
        var maxX = -180;
        var minX = 180;
        var maxY = -90;
        var minY = 90;

        wkt = wkt.replaceAll("(", "<");
        wkt = wkt.replaceAll(")", ">");
        var coordSet = wkt.split(',');
        for (var i = 0; i < coordSet.length; i++)
        {
            var coords = coordSet[i].split(' ');
            var latlng = GISPointFromInnerWKT(coordSet[i]);
            if (latlng.x > maxX)
                maxX = latlng.x;
            if (latlng.x < minX)
                minX = latlng.x;
            if (latlng.y > maxY)
                maxY = latlng.y;
            if (latlng.y < minY)
                minY = latlng.y;
        }
        ZoomToLocation(minX, minY, maxX, maxY);
    }
    function ZoomToGISLineSet(wkt)
    {
        var maxX = -180;
        var minX = 180;
        var maxY = -90;
        var minY = 90;

        wkt = wkt.replaceAll("(", "<");
        wkt = wkt.replaceAll(")", ">");
        var lines = wkt.substring(1, wkt.length - 2).split(">,<");
        
        if (lines.length > 0)
        {
            for (var i = 0; i < lines.length; i++)
            {
                if (!lines[i].startsWith("<<"))
                {
                    lines[i] = "<<" + lines[i];
                }
                if (!lines[i].endsWith(">>"))
                {
                    lines[i] += ">>";
                }
                wkt = wkt.replaceAll("(", "<");
                wkt = wkt.replaceAll(")", ">");
                var coordSet = wkt.split(',');
                for (var i = 0; i < coordSet.length; i++)
                {
                    var coords = coordSet[i].split(' ');
                    var latlng = GISPointFromInnerWKT(coordSet[i]);
                    if (latlng.x > maxX)
                        maxX = latlng.x;
                    if (latlng.x < minX)
                        minX = latlng.x;
                    if (latlng.y > maxY)
                        maxY = latlng.y;
                    if (latlng.y < minY)
                        minY = latlng.y;
                }
            }
        }
        ZoomToLocation(minX, minY, maxX, maxY);
    }
    
    function ZoomToLocation(minX, minY, maxX, maxY)
    {
//        if (maxX == minX)
//        {
//            maxX = parseFloat(maxX);
//            minX = parseFloat(minX);
//            maxX = maxX + Math.abs(maxX * .005);
//            minX = minX - Math.abs(minX * .005);
//        }
//        if (maxY == minY)
//        {
//            maxY = parseFloat(maxY);
//            minY = parseFloat(minY);
//            maxY = maxY + Math.abs(maxY * .005);
//            minY = minY - Math.abs(minY * .005);
//        }
        if (maxX == minX && maxY == minY)
        {
            if (geOn)
                geePanTo(maxY, maxX, 20);
            else
                map.setCenter(new GLatLng(maxY, maxX), 20);
        }
        else
        {
            var nw = new GLatLng(maxY, minX);
            var ne = new GLatLng(maxY, maxX);
            var se = new GLatLng(minY, maxX);
            var sw = new GLatLng(minY, minX);
            
            var zoomAreaPoly = new GPolyline([nw, ne, se, sw, nw], "#00FFFF", 1,.4);
            var polyBounds = zoomAreaPoly.getBounds();
            var ne = polyBounds.getNorthEast();
            var sw = polyBounds.getSouthWest();
            var se = new GLatLng(sw.lat(), ne.lng());
            var nw = new GLatLng(ne.lat(), sw.lng());
            zoomLevel = map.getBoundsZoomLevel(polyBounds);
            center = polyBounds.getCenter();
            if (sw.lat() != ne.lat() || sw.lng() != ne.lng())
            {
                if (geOn)
                    geePanTo(center.lat(), center.lng(), zoomLevel+3);
                else
                    map.setCenter(center, zoomLevel-3);
            }
        }
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    function AddGISPointFromInnerWKT(wkt)
    {
        var latlng = GISPointFromInnerWKT(wkt);
        if (geOn)
        {
            
            highlightedMarker = ge.createPlacemark('');
            highlightedMarker.setName("");
            ge.getFeatures().appendChild(highlightedMarker);
          
            // Create point
            var point = ge.createPoint('');
            point.setLatitude(parseFloat(latlng.y));
            point.setLongitude(parseFloat(latlng.x));
            highlightedMarker.setGeometry(point);
        }
        else
        {
            highlightedMarker = new GMarker(latlng);
            map.addOverlay(highlightedMarker);
        }
    } 

    function GISPointFromInnerWKT(wkt)
    {
        wkt = wkt.replaceAll("(", "<");
        wkt = wkt.replaceAll(")", ">");
        wkt = wkt.replaceAll("<", "");
        wkt = wkt.replaceAll(">", "");
        
        var lat, lng, alt;
        var coords = wkt.split(' ');
        if (coords.length == 2)
        {
            lat = coords[1];
            lng = coords[0];
        }
        else if (coords.length >= 3)
        {
            lat = coords[1];
            lng = coords[0];
            alt = coords[2];
        }
        var latlng = new GLatLng(lat, lng);
        return latlng;
    }
	function getMultiple()
    {
        var ob = document.getElementById('primaryTableList');
        selected = new Array();
        for (var i = 0; i < ob.options.length; i++)
            if (ob.options[ i ].selected)
                selected.push(ob.options[ i ].value);
        // You can use the arSelected array for further processing.
        alert(selected.length);
    }
    
    function GISPolygonFromInnerWKT(wkt)
    {
        try
        {
            var poly;
            wkt = wkt.replaceAll("(", "<");
            wkt = wkt.replaceAll(")", ">");
            var pos = wkt.indexOf('>');
            var strData = wkt.substring(2, pos);
            var latlngs = [];
            var coordSet = strData.split(',');
            
            if (geOn)
            {
                var polyPlacemark2 = ge.createPlacemark('');
                var polygon2 = ge.createPolygon('');
                var outer2 = ge.createLinearRing('');
                polygon2.setOuterBoundary(outer2);
                polyPlacemark2.setGeometry(polygon2);
                polyPlacemark2.setStyleSelector(ge.createStyle(''));
                var lineStyle3 = polyPlacemark2.getStyleSelector().getLineStyle();
                lineStyle3.setWidth(4);
                lineStyle3.getColor().set('DD000000'); 
                var polyStyle2 = polyPlacemark2.getStyleSelector().getPolyStyle();
                polyStyle2.getColor().set('AAFFFF00');  // aabbggrr format
                
                for (var i = 0; i < coordSet.length; i++)
                {
                    var coords = coordSet[i].split(' ');
                    var latlng = GISPointFromInnerWKT(coordSet[i]);
                    try
                    {
                        outer2.getCoordinates().pushLatLngAlt(parseFloat(latlng.y), parseFloat(latlng.x), 0);
                    }
                    catch (ex3)
                    {
                    }
                }
                highlightedPolygon.push(polyPlacemark2);
                ge.getFeatures().appendChild(polyPlacemark2);
            }
            else
            {
                for (var i = 0; i < coordSet.length; i++)
                {
                    var coords = coordSet[i].split(' ');
                    var latlng = GISPointFromInnerWKT(coordSet[i]);
                    latlngs.push(latlng);
                }
                poly = new GPolygon(latlngs, "#000000", 2, 0.7, "#00FFFF", 0.5);
                highlightedPolygon.push(poly);
                try
                {
                    map.addOverlay(poly);
                }
                catch (ex) 
                { 
                }
            }
            
            var keepGoing = false;

            if (wkt.indexOf('>',pos+1) != pos+1)
                keepGoing = true;
            latlngs = [];
            while (keepGoing)
            {
                var startPos = wkt.indexOf('<', pos + 1);
                pos = wkt.indexOf('>', pos + 1);
                strData = wkt.substring(startPos + 1, pos - (startPos + 1));
                if (wkt.indexOf('>',pos+1) != pos+1)
                    keepGoing = true;
                else
                    keepGoing = false;
                var coordSet = strData.split(',');

                if (geOn)
                {
                    var polyPlacemark2 = ge.createPlacemark('');
                    var polygon2 = ge.createPolygon('');
                    var outer2 = ge.createLinearRing('');
                    polygon2.setOuterBoundary(outer2);
                    polyPlacemark2.setGeometry(polygon2);
                    polyPlacemark2.setStyleSelector(ge.createStyle(''));
                    var lineStyle3 = polyPlacemark2.getStyleSelector().getLineStyle();
                    lineStyle3.setWidth(4);
                    lineStyle3.getColor().set('DD000000'); 
                    var polyStyle2 = poly.getStyleSelector().getPolyStyle();
                    polyStyle2.getColor().set('AAFFFF00');  // aabbggrr format
                    for (var i = 0; i < coordSet.length; i++)
                    {
                        var coords = coordSet[i].split(' ');
                        var latlng = GISPointFromInnerWKT(coordSet[i]);
                        outer2.getCoordinates().pushLatLngAlt(parseFloat(latlng.y), parseFloat(latlng.x), 0);
                    }
                    highlightedPolygon.push(polyPlacemark2);
                    ge.getFeatures().appendChild(polyPlacemark2);
                    
                }
                else
                {
                    for (var i = 0; i < coordSet.length; i++)
                    {
                        var coords = coordSet[i].split(' ');
                        var latlng = GISPointFromInnerWKT(coordSet[i]);
                        latlngs.push(latlng);
                    }
                    poly = new GPolygon(latlngs, "#000000", 2, 0.7, "#00FFFF", 0.5);
                    highlightedPolygon.push(poly);
                    map.addOverlay(poly);
                }
            }
        }
        catch (ex)
        {
            //alert(ex);
        }
    }
    
    function GISPolygonSetFromInnerWKT(wkt)
    {
        wkt = wkt.replaceAll("(", "<");
        wkt = wkt.replaceAll(")", ">");

        var polys = wkt.substring(1, wkt.length - 1).split(">>,<<");
        if (polys.length > 0)
        {
            for (var i = 0; i < polys.length; i++)
            {
                if (!polys[i].startsWith('<<'))
                {
                    polys[i] = "<<" + polys[i];
                }
                if (!polys[i].endsWith('>>'))
                {
                    polys[i] += ">>";
                }
                GISPolygonFromInnerWKT(polys[i]);
            }
        }
    }
    

    function GISLineFromInnerWKT(wkt)
    {
        var latlngs = [];
        wkt = wkt.replaceAll("(", "<");
        wkt = wkt.replaceAll(")", ">");
        var coordSet = wkt.split(',');
        
        try
        {
            if (geOn)
            {
                highlightedPolyLine = ge.createPlacemark('');
                
                lineString = ge.createLineString('');
                highlightedPolyLine.setGeometry(lineString);
                lineString.setTessellate(true);
                lineString.setAltitudeMode(ge.ALTITUDE_CLAMP_TO_GROUND);
             
                highlightedPolyLine.setStyleSelector(ge.createStyle(''));
                var lineStyle = highlightedPolyLine.getStyleSelector().getLineStyle();
                lineStyle.setWidth(4);
                lineStyle.getColor().set('AAFFFF00');  // aabbggrr formatx

                for (var i = 0; i < coordSet.length; i++)
                {
                    var coords = coordSet[i].split(' ');
                    var latlng = GISPointFromInnerWKT(coordSet[i]);
                    lineString.getCoordinates().pushLatLngAlt(parseFloat(latlng.y), parseFloat(latlng.x), 0);
                }
                ge.getFeatures().appendChild(highlightedPolyLine);
            }
            else
            {
                for (var i = 0; i < coordSet.length; i++)
                {
                    var coords = coordSet[i].split(' ');
                    var latlng = GISPointFromInnerWKT(coordSet[i]);
                    latlngs.push(latlng);
                }
                highlightedPolyLine = new GPolyline(latlngs, "#00FFFF", 3, .7);
                map.addOverlay(highlightedPolyLine);
            }
        }
        catch (ex2)
        {
            alert(ex2);
        }
        
        //lineStringPlacemark
    }
    
    
    function GISLineSetFromInnerWKT(wkt)
    {
        wkt = wkt.replaceAll("(", "<");
        wkt = wkt.replaceAll(")", ">");
        var lines = wkt.substring(1, wkt.length - 2).split(">,<");
        
        if (lines.length > 0)
        {
            for (var i = 0; i < lines.length; i++)
            {
                if (!lines[i].startsWith("<<"))
                {
                    lines[i] = "<<" + lines[i];
                }
                if (!lines[i].endsWith(">>"))
                {
                    lines[i] += ">>";
                }
                GISLineFromInnerWKT(lines[i]);
            }
        }
    }
    function zoomToShape() 
    {
        try
        {
          var val = document.getElementById('select_results').options[document.getElementById('select_results').selectedIndex].value;
          if (val != '')
          {
            var wktsplit = val.split('<<>>');
            var wkt = wktsplit[1];
            
            var firstP = wkt.indexOf('(');
            var type = wkt.substring(0, firstP);
            type = type.replace("SRID=4326;", "");
            switch (type.toLowerCase())
            {
                case "point":
                case "point m":
                case "point z":
                    {
                        var strData = wkt.substring(firstP + 1, wkt.indexOf(')'));
                        ZoomToGISPoint(strData);
                    }
                    break;

                case "linestring":
                    {
                        var strData = wkt.substring(firstP + 1, wkt.indexOf(')') - (firstP + 1));
                        ZoomToGISLine(strData);
                    }
                    break;


                case "polygon":
                    {
                        var strData = wkt.substring(firstP);
                        ZoomToGISPolygon(strData);
                    }
                    break;

                case "multipoint":
                    {
                        var strData = wkt.substring(firstP + 1, wkt.indexOf(')'));
                        ZoomToGISPoint(strData);
                    }
                    break;

                case "multilinestring":
                    {
                        var strData = wkt.substring(firstP);
                        ZoomToGISLineSet(strData);
                    }
                    break;
                case "multipolygon":
                    {
                        var strData = wkt.substring(firstP);
                        ZoomToGISPolygonSet(strData);
                    }
                    break;
            }
          }
          else
          {
          }
      }
      catch(ex) 
      {
      }
    }
    
      var tryOnce = 0;
      function changetable() {
        try
        {
            if (geOn)
            {
                ge.getFeatures().removeChild(highlightedMarker); 
            }
            else
            {
                map.removeOverlay(highlightedMarker)
            }
        }
        catch(e) 
        {
        }
        try{
            var poly;
            for (var i = 0; i < highlightedPolygon.length; i++)
            {
                if (geOn)
                {
                    try
                    {
                        ge.getFeatures().removeChild(highlightedPolygon[i]);
                    }
                    catch (ex)
                    {
                    }

                }
                else
                {
                    try
                    {
                        poly = highlightedPolygon[i];
                        map.removeOverlay(poly);
                    }
                    catch (ex) 
                    { 
                    }
                }
            }
        }
        catch(e) {  }
        try
        {
            if (geOn)
            {
                ge.getFeatures().removeChild(highlightedPolyLine);
            }
            else
            {
                map.removeOverlay(highlightedPolyLine)
            }
        }
        catch (ex)
        {
        }
        
        try{
          var val = document.getElementById('select_results').options[document.getElementById('select_results').selectedIndex].value;
          if (val != '')
          {
            var wktsplit = val.split('<<>>');
            var wkt = wktsplit[1];
            
            var firstP = wkt.indexOf('(');
            var type = wkt.substring(0, firstP);
            type = type.replace("SRID=4326;", "");
            switch (type.toLowerCase())
            {
                case "point":
                case "point m":
                case "point z":
                    {
                        var strData = wkt.substring(firstP + 1, wkt.indexOf(')'));
                        AddGISPointFromInnerWKT(strData);
                    }
                    break;

                case "linestring":
                    {
                        var strData = wkt.substring(firstP + 1, wkt.indexOf(')') - (firstP + 1));
                        GISLineFromInnerWKT(strData);
                    }
                    break;


                case "polygon":
                    {
                        var strData = wkt.substring(firstP);
                        GISPolygonFromInnerWKT(strData);
                    }
                    break;

                case "multipoint":
                    {
                        var strData = wkt.substring(firstP + 1, wkt.indexOf(')'));
                        AddGISPointFromInnerWKT(strData);
                    }
                    break;

                case "multilinestring":
                    {
                        var strData = wkt.substring(firstP);
                        GISLineSetFromInnerWKT(strData);
                    }
                    break;
                case "multipolygon":
                    {
                        var strData = wkt.substring(firstP);
                        try{
                            GISPolygonSetFromInnerWKT(strData);
                        }
                        catch (ex3)
                        {
                        }
                    }
                    break;
            }
            
            
            
            
              var rows = wktsplit[0].split(';');
              var cols;
              var tablestring = '<table style="width:90%;border: thin solid #000000; border-collapse: collapse; empty-cells: show; border-spacing: inherit;">';
              for (var i = 0; i < rows.length; i++)
              {
                cols = rows[i].split(',');
                tablestring += '<tr>';
                for (var j = 0; j < cols.length; j++)
                {
                    tablestring += '<td style="border: thin solid #000000;">' + cols[j] + '</td>';
                }
                tablestring += '</tr>';
              }
              tablestring += '</table>';
              document.getElementById('results_table').innerHTML = tablestring;
          }
          else
          {
            document.getElementById('results_table').innerHTML = '';
          }
          }
          catch(ex) {
            try
            {
                document.getElementById('results_table').innerHTML = '';
                if (tryOnce == 0)
                {
                    tryOnce++;
                    changetable();
                }
            }
            catch (ex2)
            {
            }
          }
          tryOnce = 0;
          try
          {
              if (document.getElementById('zoomCheck').checked && !dontZoom)
                zoomToShape();
               //document.cookie = 'ZoomChecked=' + document.getElementById('zoomCheck').checked;
              var date = new Date();
              date.setTime(date.getTime()+315360000000);/* expires one year from now */
              var cookie = document.getElementById('zoomCheck').checked + "; expires="+date.toGMTString(); 
              SetCookieValue("ZoomChecked", cookie);
          } 
          catch (ex) 
          { 
            //alert(ex);
          }

        }
        function trim(stringToTrim) {
	        return stringToTrim.replace(/^\s+|\s+$/g,"");
        }
        function changelayer()
        {
            try
            {
                var selectname = document.getElementById('select_results');
                //alert(selectname);
                for (var i = selectname.length - 1; i>=0; i--) {
                    selectname.remove(i);
                }

                var elOptNew;
                var val = document.getElementById('select_layer').options[document.getElementById('select_layer').selectedIndex].value;
                if (val != '')
                {
                  var opts = val.split('?');
                  var vals;
                  for (var i = 0; i < opts.length; i++)
                  {
                    vals = opts[i].split('|');
                    elOptNew = document.createElement('option');
                    elOptNew.text = trim(vals[1]);
                    elOptNew.value = trim(vals[0]);
                    try {
                        selectname.add(elOptNew, null); // standards compliant; doesn't work in IE
                    }
                    catch(ex) {
                        selectname.add(elOptNew); // IE only
                    }
                  }
                  document.getElementById('select_results').style.visibility = 'visible';
                  document.getElementById('zoomToShapeBtn').style.visibility = 'visible';
                }
                else
                {
                  document.getElementById('select_results').style.visibility = 'hidden';
                  document.getElementById('zoomToShapeBtn').style.visibility = 'hidden';
                }
                changetable();
            }
            catch(ex)
            {
                alert(ex);
            }
        }
        
        
        
      function prevExtent() {
        currExtent--;
        if (currExtent >= 0)
        {
            skipExtentStore = true;
            try
            {
                var ext = extents[currExtent].split(",");
                if (!geOn)
                    map.setCenter(new GLatLng(parseFloat(ext[0]), parseFloat(ext[1])), parseInt(ext[2]));
                else
                {
                    if (ext.length == 3)
                        geePanToAltitude(parseFloat(ext[0]), parseFloat(ext[1]), parseFloat(ext[2]), 0, 0, 0);
                    else if (ext.length == 4)
                        geePanToAltitude(parseFloat(ext[0]), parseFloat(ext[1]), parseFloat(ext[2]), parseFloat(ext[3]), 0, 0);
                    else if (ext.length == 5)
                        geePanToAltitude(parseFloat(ext[0]), parseFloat(ext[1]), parseFloat(ext[2]), parseFloat(ext[3]), parseFloat(ext[4]), 0);
                    else if (ext.length == 6)
                        geePanToAltitude(parseFloat(ext[0]), parseFloat(ext[1]), parseFloat(ext[2]), parseFloat(ext[3]), parseFloat(ext[4]), parseFloat(ext[5]));
                }
            }
            catch (ex)
            {
            }
        }
        else
        {
            currExtent = 0;
        }
      }
      function nextExtent() {
        currExtent++;
        if (currExtent <= extents.length-1)
        {
            skipExtentStore = true;
            var ext = extents[currExtent].split(",");
            if (!geOn)
                map.setCenter(new GLatLng(parseFloat(ext[0]), parseFloat(ext[1])), parseInt(ext[2]));
            else
            {
                if (ext.length == 3)
                    geePanToAltitude(parseFloat(ext[0]), parseFloat(ext[1]), parseFloat(ext[2]), 0, 0, 0);
                else if (ext.length == 4)
                    geePanToAltitude(parseFloat(ext[0]), parseFloat(ext[1]), parseFloat(ext[2]), parseFloat(ext[3]), 0, 0);
                else if (ext.length == 5)
                    geePanToAltitude(parseFloat(ext[0]), parseFloat(ext[1]), parseFloat(ext[2]), parseFloat(ext[3]), parseFloat(ext[4]), 0);
                else if (ext.length == 6)
                    geePanToAltitude(parseFloat(ext[0]), parseFloat(ext[1]), parseFloat(ext[2]), parseFloat(ext[3]), parseFloat(ext[4]), parseFloat(ext[5]));
            }
        }
        else
        {
            currExtent = extents.length-1;
        }
        
      }
      
      function convertAreaTo(dist, distanceType)
      {
            if (distanceType == "Kilometers")
                dist = dist / 1000000;
            else if (distanceType == "Hectares")
                dist = dist / 10000;
            else if (distanceType == "Ares")
                dist = dist / 100;
            else if (distanceType == "Miles")
                dist = dist / 2590002.59000259;
            else if (distanceType == "Acres")
                dist = dist / 4046.857756592028;
            else if (distanceType == "Feet")
                dist = dist / 0.0929030399974946;
            else if (distanceType == "Yards")
                dist = dist / 0.8361273600007552;
                
            dist = dojo.number.format(dist);
            return dist;
      }
      
      function convertTo(dist, distanceType, originType)
      {
      
        switch (originType) {
            case "Meters":
                dist = dist / 1000;
                originType = "Kilometers";
                break;
            case "Decimeters":
                dist = dist / 10000;
                originType = "Kilometers";
                break;
            case "Centimeters":
                dist = dist / 100000;
                originType = "Kilometers";
                break;
            case "Millimeters":
                dist = dist / 1000000;
                originType = "Kilometers";
                break;
            case "Miles":
                dist = dist / 0.621371192;
                originType = "Kilometers";
                break;
            case "Nautical Miles":
                dist = dist / 0.539956803;
                originType = "Kilometers";
                break;
            case "Yards":
                dist = dist / 1093.6133;
                originType = "Kilometers";
                break;
            case "Feet":
                dist = dist / 3280.8399;
                originType = "Kilometers";
                break;
            case "Inches":
                dist = dist / 39370.0787;
                originType = "Kilometers";
                break;
            case "Hectares":
                dist = dist / 100;
                originType = "Kilometers";
                break;
            case "Ares":
                dist = dist / 10000;
                originType = "Kilometers";
                break;
            case "Acres":
                dist = dist / 247.10538146716533;
                originType = "Kilometers";
                break;
        }
        
        var distDD;
        if (originType == "Decimal Degrees")
        {
            distDD = dist;
        }
        else if (originType == "Kilometers")
        {
            var distMi1 = dist / 1.6093470878864446;
            var radDist1 = distMi1 / 1.1508 / 3437.74677;
            distDD = radDist1 * 180 / Math.PI;
        }
        
        var radDist = distDD * Math.PI / 180;
        var distNMi = radDist * 3437.73877;
        var distMi = radDist * 3437.74677 * 1.1508;
        var distFt = distMi * 5.2800102998e+3;
        var distKm = distMi * 1.6093470878864446;
        var distMeter = distKm * 1000;
        var distDm = distMeter * 10;
        var distCm = distMeter * 100;
        var distMm = distMeter * 1000;
        var distIn = distFt * 12;
        var distYd = distFt / 3;
        var distHect = distKm * 100;
        var distAres = distKm * 10000;
        var distAcres = distKm * 247.10538146716533;
        
        var sign = 1;
        if (distDD < 0) { sign = -1; }
        var distAbs = Math.abs(Math.round(distDD * 1000000.));
        var distDMS = ((Math.floor(distAbs / 1000000) * sign) + '&deg; ' + Math.floor(((distAbs/1000000) - Math.floor(distAbs/1000000)) * 60) + '\' ' + (Math.floor(((((distAbs/1000000) - Math.floor(distAbs/1000000)) * 60) - Math.floor(((distAbs/1000000) - Math.floor(distAbs/1000000))* 60)) * 1000000) * 60/100000 ) + '&quot;');
        
        switch (distanceType) {
            case "Kilometers":
                distDD = dojo.number.format(distKm);
                break;
            case "Meters":
                distDD = dojo.number.format(distMeter);
                break;
            case "Decimeters":
                distDD = dojo.number.format(distDm);
                break;
            case "Centimeters":
                distDD = dojo.number.format(distCm);
                break;
            case "Millimeters":
                distDD = dojo.number.format(distMm);
                break;
            case "Miles":
                distDD = dojo.number.format(distMi);
                break;
            case "Nautical Miles":
                distDD = dojo.number.format(distNMi);
                break;
            case "Yards":
                distDD = dojo.number.format(distYd);
                break;
            case "Feet":
                distDD = dojo.number.format(distFt);
                break;
            case "Inches":
                distDD = dojo.number.format(distIn);
                break;
            case "Decimal Degrees":
                distDD = distDD;
                break;
            case "Deg Min Sec":
                distDD = distDMS;
                break;
            case "Hectares":
                distDD = dojo.number.format(distHect);
                break;
            case "Ares":
                distDD = dojo.number.format(distAres);
                break;
            case "Acres":
                distDD = dojo.number.format(distAcres);
                break;
        }
        return distDD;
      }
      
      
      
      
      
    var pi = 3.14159265358979;
 
    /* Ellipsoid model constants (actual values here are for WGS84) */
    var sm_a = 6378137.0;
    var sm_b = 6356752.314;
    var sm_EccSquared = 6.69437999013e-03;
 
    var UTMScaleFactor = 0.9996;
 
 
    /*
    * DegToRad
    *
    * Converts degrees to radians.
    *
    */
    function DegToRad (deg)
    {
        return (deg / 180.0 * pi)
    }
 
 
 
 
    /*
    * RadToDeg
    *
    * Converts radians to degrees.
    *
    */
    function RadToDeg (rad)
    {
        return (rad / pi * 180.0)
    }
 
 
 
 
    /*
    * ArcLengthOfMeridian
    *
    * Computes the ellipsoidal distance from the equator to a point at a
    * given latitude.
    *
    * Reference: Hoffmann-Wellenhof, B., Lichtenegger, H., and Collins, J.,
    * GPS: Theory and Practice, 3rd ed.  New York: Springer-Verlag Wien, 1994.
    *
    * Inputs:
    *     phi - Latitude of the point, in radians.
    *
    * Globals:
    *     sm_a - Ellipsoid model major axis.
    *     sm_b - Ellipsoid model minor axis.
    *
    * Returns:
    *     The ellipsoidal distance of the point from the equator, in meters.
    *
    */
    function ArcLengthOfMeridian (phi)
    {
        var alpha, beta, gamma, delta, epsilon, n;
        var result;
 
        /* Precalculate n */
        n = (sm_a - sm_b) / (sm_a + sm_b);
 
        /* Precalculate alpha */
        alpha = ((sm_a + sm_b) / 2.0)
           * (1.0 + (Math.pow (n, 2.0) / 4.0) + (Math.pow (n, 4.0) / 64.0));
 
        /* Precalculate beta */
        beta = (-3.0 * n / 2.0) + (9.0 * Math.pow (n, 3.0) / 16.0)
           + (-3.0 * Math.pow (n, 5.0) / 32.0);
 
        /* Precalculate gamma */
        gamma = (15.0 * Math.pow (n, 2.0) / 16.0)
            + (-15.0 * Math.pow (n, 4.0) / 32.0);
    
        /* Precalculate delta */
        delta = (-35.0 * Math.pow (n, 3.0) / 48.0)
            + (105.0 * Math.pow (n, 5.0) / 256.0);
    
        /* Precalculate epsilon */
        epsilon = (315.0 * Math.pow (n, 4.0) / 512.0);
    
    /* Now calculate the sum of the series and return */
    result = alpha
        * (phi + (beta * Math.sin (2.0 * phi))
            + (gamma * Math.sin (4.0 * phi))
            + (delta * Math.sin (6.0 * phi))
            + (epsilon * Math.sin (8.0 * phi)));
 
    return result;
    }
 
 
 
    /*
    * UTMCentralMeridian
    *
    * Determines the central meridian for the given UTM zone.
    *
    * Inputs:
    *     zone - An integer value designating the UTM zone, range [1,60].
    *
    * Returns:
    *   The central meridian for the given UTM zone, in radians, or zero
    *   if the UTM zone parameter is outside the range [1,60].
    *   Range of the central meridian is the radian equivalent of [-177,+177].
    *
    */
    function UTMCentralMeridian (zone)
    {
        var cmeridian;
 
        cmeridian = DegToRad (-183.0 + (zone * 6.0));
    
        return cmeridian;
    }
 
 
 
    /*
    * FootpointLatitude
    *
    * Computes the footpoint latitude for use in converting transverse
    * Mercator coordinates to ellipsoidal coordinates.
    *
    * Reference: Hoffmann-Wellenhof, B., Lichtenegger, H., and Collins, J.,
    *   GPS: Theory and Practice, 3rd ed.  New York: Springer-Verlag Wien, 1994.
    *
    * Inputs:
    *   y - The UTM northing coordinate, in meters.
    *
    * Returns:
    *   The footpoint latitude, in radians.
    *
    */
    function FootpointLatitude (y)
    {
        var y_, alpha_, beta_, gamma_, delta_, epsilon_, n;
        var result;
        
        /* Precalculate n (Eq. 10.18) */
        n = (sm_a - sm_b) / (sm_a + sm_b);
        	
        /* Precalculate alpha_ (Eq. 10.22) */
        /* (Same as alpha in Eq. 10.17) */
        alpha_ = ((sm_a + sm_b) / 2.0)
            * (1 + (Math.pow (n, 2.0) / 4) + (Math.pow (n, 4.0) / 64));
        
        /* Precalculate y_ (Eq. 10.23) */
        y_ = y / alpha_;
        
        /* Precalculate beta_ (Eq. 10.22) */
        beta_ = (3.0 * n / 2.0) + (-27.0 * Math.pow (n, 3.0) / 32.0)
            + (269.0 * Math.pow (n, 5.0) / 512.0);
        
        /* Precalculate gamma_ (Eq. 10.22) */
        gamma_ = (21.0 * Math.pow (n, 2.0) / 16.0)
            + (-55.0 * Math.pow (n, 4.0) / 32.0);
        	
        /* Precalculate delta_ (Eq. 10.22) */
        delta_ = (151.0 * Math.pow (n, 3.0) / 96.0)
            + (-417.0 * Math.pow (n, 5.0) / 128.0);
        	
        /* Precalculate epsilon_ (Eq. 10.22) */
        epsilon_ = (1097.0 * Math.pow (n, 4.0) / 512.0);
        	
        /* Now calculate the sum of the series (Eq. 10.21) */
        result = y_ + (beta_ * Math.sin (2.0 * y_))
            + (gamma_ * Math.sin (4.0 * y_))
            + (delta_ * Math.sin (6.0 * y_))
            + (epsilon_ * Math.sin (8.0 * y_));
        
        return result;
    }
 
 
 
    /*
    * MapLatLonToXY
    *
    * Converts a latitude/longitude pair to x and y coordinates in the
    * Transverse Mercator projection.  Note that Transverse Mercator is not
    * the same as UTM; a scale factor is required to convert between them.
    *
    * Reference: Hoffmann-Wellenhof, B., Lichtenegger, H., and Collins, J.,
    * GPS: Theory and Practice, 3rd ed.  New York: Springer-Verlag Wien, 1994.
    *
    * Inputs:
    *    phi - Latitude of the point, in radians.
    *    lambda - Longitude of the point, in radians.
    *    lambda0 - Longitude of the central meridian to be used, in radians.
    *
    * Outputs:
    *    xy - A 2-element array containing the x and y coordinates
    *         of the computed point.
    *
    * Returns:
    *    The function does not return a value.
    *
    */
    function MapLatLonToXY (phi, lambda, lambda0, xy)
    {
        var N, nu2, ep2, t, t2, l;
        var l3coef, l4coef, l5coef, l6coef, l7coef, l8coef;
        var tmp;
 
        /* Precalculate ep2 */
        ep2 = (Math.pow (sm_a, 2.0) - Math.pow (sm_b, 2.0)) / Math.pow (sm_b, 2.0);
    
        /* Precalculate nu2 */
        nu2 = ep2 * Math.pow (Math.cos (phi), 2.0);
    
        /* Precalculate N */
        N = Math.pow (sm_a, 2.0) / (sm_b * Math.sqrt (1 + nu2));
    
        /* Precalculate t */
        t = Math.tan (phi);
        t2 = t * t;
        tmp = (t2 * t2 * t2) - Math.pow (t, 6.0);
 
        /* Precalculate l */
        l = lambda - lambda0;
    
        /* Precalculate coefficients for l**n in the equations below
           so a normal human being can read the expressions for easting
           and northing
           -- l**1 and l**2 have coefficients of 1.0 */
        l3coef = 1.0 - t2 + nu2;
    
        l4coef = 5.0 - t2 + 9 * nu2 + 4.0 * (nu2 * nu2);
    
        l5coef = 5.0 - 18.0 * t2 + (t2 * t2) + 14.0 * nu2
            - 58.0 * t2 * nu2;
    
        l6coef = 61.0 - 58.0 * t2 + (t2 * t2) + 270.0 * nu2
            - 330.0 * t2 * nu2;
    
        l7coef = 61.0 - 479.0 * t2 + 179.0 * (t2 * t2) - (t2 * t2 * t2);
    
        l8coef = 1385.0 - 3111.0 * t2 + 543.0 * (t2 * t2) - (t2 * t2 * t2);
    
        /* Calculate easting (x) */
        xy[0] = N * Math.cos (phi) * l
            + (N / 6.0 * Math.pow (Math.cos (phi), 3.0) * l3coef * Math.pow (l, 3.0))
            + (N / 120.0 * Math.pow (Math.cos (phi), 5.0) * l5coef * Math.pow (l, 5.0))
            + (N / 5040.0 * Math.pow (Math.cos (phi), 7.0) * l7coef * Math.pow (l, 7.0));
    
        /* Calculate northing (y) */
        xy[1] = ArcLengthOfMeridian (phi)
            + (t / 2.0 * N * Math.pow (Math.cos (phi), 2.0) * Math.pow (l, 2.0))
            + (t / 24.0 * N * Math.pow (Math.cos (phi), 4.0) * l4coef * Math.pow (l, 4.0))
            + (t / 720.0 * N * Math.pow (Math.cos (phi), 6.0) * l6coef * Math.pow (l, 6.0))
            + (t / 40320.0 * N * Math.pow (Math.cos (phi), 8.0) * l8coef * Math.pow (l, 8.0));
    
        return;
    }
    
    
    
    /*
    * MapXYToLatLon
    *
    * Converts x and y coordinates in the Transverse Mercator projection to
    * a latitude/longitude pair.  Note that Transverse Mercator is not
    * the same as UTM; a scale factor is required to convert between them.
    *
    * Reference: Hoffmann-Wellenhof, B., Lichtenegger, H., and Collins, J.,
    *   GPS: Theory and Practice, 3rd ed.  New York: Springer-Verlag Wien, 1994.
    *
    * Inputs:
    *   x - The easting of the point, in meters.
    *   y - The northing of the point, in meters.
    *   lambda0 - Longitude of the central meridian to be used, in radians.
    *
    * Outputs:
    *   philambda - A 2-element containing the latitude and longitude
    *               in radians.
    *
    * Returns:
    *   The function does not return a value.
    *
    * Remarks:
    *   The local variables Nf, nuf2, tf, and tf2 serve the same purpose as
    *   N, nu2, t, and t2 in MapLatLonToXY, but they are computed with respect
    *   to the footpoint latitude phif.
    *
    *   x1frac, x2frac, x2poly, x3poly, etc. are to enhance readability and
    *   to optimize computations.
    *
    */
    function MapXYToLatLon (x, y, lambda0, philambda)
    {
        var phif, Nf, Nfpow, nuf2, ep2, tf, tf2, tf4, cf;
        var x1frac, x2frac, x3frac, x4frac, x5frac, x6frac, x7frac, x8frac;
        var x2poly, x3poly, x4poly, x5poly, x6poly, x7poly, x8poly;
    	
        /* Get the value of phif, the footpoint latitude. */
        phif = FootpointLatitude (y);
        	
        /* Precalculate ep2 */
        ep2 = (Math.pow (sm_a, 2.0) - Math.pow (sm_b, 2.0))
              / Math.pow (sm_b, 2.0);
        	
        /* Precalculate cos (phif) */
        cf = Math.cos (phif);
        	
        /* Precalculate nuf2 */
        nuf2 = ep2 * Math.pow (cf, 2.0);
        	
        /* Precalculate Nf and initialize Nfpow */
        Nf = Math.pow (sm_a, 2.0) / (sm_b * Math.sqrt (1 + nuf2));
        Nfpow = Nf;
        	
        /* Precalculate tf */
        tf = Math.tan (phif);
        tf2 = tf * tf;
        tf4 = tf2 * tf2;
        
        /* Precalculate fractional coefficients for x**n in the equations
           below to simplify the expressions for latitude and longitude. */
        x1frac = 1.0 / (Nfpow * cf);
        
        Nfpow *= Nf;   /* now equals Nf**2) */
        x2frac = tf / (2.0 * Nfpow);
        
        Nfpow *= Nf;   /* now equals Nf**3) */
        x3frac = 1.0 / (6.0 * Nfpow * cf);
        
        Nfpow *= Nf;   /* now equals Nf**4) */
        x4frac = tf / (24.0 * Nfpow);
        
        Nfpow *= Nf;   /* now equals Nf**5) */
        x5frac = 1.0 / (120.0 * Nfpow * cf);
        
        Nfpow *= Nf;   /* now equals Nf**6) */
        x6frac = tf / (720.0 * Nfpow);
        
        Nfpow *= Nf;   /* now equals Nf**7) */
        x7frac = 1.0 / (5040.0 * Nfpow * cf);
        
        Nfpow *= Nf;   /* now equals Nf**8) */
        x8frac = tf / (40320.0 * Nfpow);
        
        /* Precalculate polynomial coefficients for x**n.
           -- x**1 does not have a polynomial coefficient. */
        x2poly = -1.0 - nuf2;
        
        x3poly = -1.0 - 2 * tf2 - nuf2;
        
        x4poly = 5.0 + 3.0 * tf2 + 6.0 * nuf2 - 6.0 * tf2 * nuf2
        	- 3.0 * (nuf2 *nuf2) - 9.0 * tf2 * (nuf2 * nuf2);
        
        x5poly = 5.0 + 28.0 * tf2 + 24.0 * tf4 + 6.0 * nuf2 + 8.0 * tf2 * nuf2;
        
        x6poly = -61.0 - 90.0 * tf2 - 45.0 * tf4 - 107.0 * nuf2
        	+ 162.0 * tf2 * nuf2;
        
        x7poly = -61.0 - 662.0 * tf2 - 1320.0 * tf4 - 720.0 * (tf4 * tf2);
        
        x8poly = 1385.0 + 3633.0 * tf2 + 4095.0 * tf4 + 1575 * (tf4 * tf2);
        	
        /* Calculate latitude */
        philambda[0] = phif + x2frac * x2poly * (x * x)
        	+ x4frac * x4poly * Math.pow (x, 4.0)
        	+ x6frac * x6poly * Math.pow (x, 6.0)
        	+ x8frac * x8poly * Math.pow (x, 8.0);
        	
        /* Calculate longitude */
        philambda[1] = lambda0 + x1frac * x
        	+ x3frac * x3poly * Math.pow (x, 3.0)
        	+ x5frac * x5poly * Math.pow (x, 5.0)
        	+ x7frac * x7poly * Math.pow (x, 7.0);
        	
        return;
    }
 
 
 
 
    /*
    * LatLonToUTMXY
    *
    * Converts a latitude/longitude pair to x and y coordinates in the
    * Universal Transverse Mercator projection.
    *
    * Inputs:
    *   lat - Latitude of the point, in radians.
    *   lon - Longitude of the point, in radians.
    *   zone - UTM zone to be used for calculating values for x and y.
    *          If zone is less than 1 or greater than 60, the routine
    *          will determine the appropriate zone from the value of lon.
    *
    * Outputs:
    *   xy - A 2-element array where the UTM x and y values will be stored.
    *
    * Returns:
    *   The UTM zone used for calculating the values of x and y.
    *
    */
    function LatLonToUTMXY (lat, lon, zone, xy)
    {
        MapLatLonToXY (lat, lon, UTMCentralMeridian (zone), xy);
 
        /* Adjust easting and northing for UTM system. */
        xy[0] = xy[0] * UTMScaleFactor + 500000.0;
        xy[1] = xy[1] * UTMScaleFactor;
        if (xy[1] < 0.0)
            xy[1] = xy[1] + 10000000.0;
 
        return zone;
    }
    
    
    
    /*
    * UTMXYToLatLon
    *
    * Converts x and y coordinates in the Universal Transverse Mercator
    * projection to a latitude/longitude pair.
    *
    * Inputs:
    *	x - The easting of the point, in meters.
    *	y - The northing of the point, in meters.
    *	zone - The UTM zone in which the point lies.
    *	southhemi - True if the point is in the southern hemisphere;
    *               false otherwise.
    *
    * Outputs:
    *	latlon - A 2-element array containing the latitude and
    *            longitude of the point, in radians.
    *
    * Returns:
    *	The function does not return a value.
    *
    */
    function UTMXYToLatLon (x, y, zone, southhemi, latlon)
    {
        var cmeridian;
        	
        x -= 500000.0;
        x /= UTMScaleFactor;
        	
        /* If in southern hemisphere, adjust y accordingly. */
        if (southhemi)
        y -= 10000000.0;
        		
        y /= UTMScaleFactor;
        
        cmeridian = UTMCentralMeridian (zone);
        MapXYToLatLon (x, y, cmeridian, latlon);
        	
        return;
    }
    
 
    /*
    * btnToGeographic_OnClick
    *
    * Called when the btnToGeographic button is clicked.
    *
    */
    function btnToGeographic_OnClick ()
    {                                  
        latlon = new Array(2);
        var x, y, zone, southhemi;
        
        if (isNaN (parseFloat (document.frmConverter.txtX.value))) {
            alert ("Please enter a valid easting in the x field.");
            return false;
        }
 
        x = parseFloat (document.frmConverter.txtX.value);
 
        if (isNaN (parseFloat (document.frmConverter.txtY.value))) {
            alert ("Please enter a valid northing in the y field.");
            return false;
        }
 
        y = parseFloat (document.frmConverter.txtY.value);
 
        if (isNaN (parseInt (document.frmConverter.txtZone.value))) {
            alert ("Please enter a valid UTM zone in the zone field.");
            return false;
        }
 
        zone = parseFloat (document.frmConverter.txtZone.value);
 
        if ((zone < 1) || (60 < zone)) {
            alert ("The UTM zone you entered is out of range.  " +
                   "Please enter a number in the range [1, 60].");
            return false;
        }
        
        if (document.frmConverter.rbtnHemisphere[1].checked == true)
            southhemi = true;
        else
            southhemi = false;
 
        UTMXYToLatLon (x, y, zone, southhemi, latlon);
        
        document.frmConverter.txtLongitude.value = RadToDeg (latlon[1]);
        document.frmConverter.txtLatitude.value = RadToDeg (latlon[0]);
 
        return true;
    }
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    function fillMeasureOptions(measureType)
        {
        
            var selectbox = document.getElementById('distanceSelect');
            selectbox.innerHTML = "";
            var options = [];
            var elOptNew;
            if (measureType == "point")
            {
                options = ['Decimal Degrees', 'Deg Min Sec', 'UTM', 'MGRS'];
           }
            else if (measureType == "line")
            {
                options = ['Kilometers', 'Meters', 'Decimeters', 'Centimeters', 'Millimeters', 'Miles', 'Nautical Miles', 'Yards', 'Feet', 'Inches', 'Decimal Degrees', 'Deg Min Sec'];
            }
            else if (measureType == "polygon")
            {
                options = ['Kilometers', 'Hectares', 'Meters', 'Ares', 'Miles', 'Acres', 'Feet', 'Yards'];
            }
            for (var i = 0; i <options.length; i++)
            {
                i = document.getElementById('distanceSelect').options.length;
                option = document.createElement('option');
                option.value = options[i];
                option.text = options[i];
                document.getElementById('distanceSelect').options.add(option,i);
            }
        }
        function activateMeasureTool(measureType)
        {
            activatedTool = 'measure';
            resetTools();
            if (geOn)
            {
                try
                {
                    ge.getFeatures().removeChild(measurePlacemark); 
                }
                catch (ex)
                {
                }
                try
                {
                    ge.getFeatures().removeChild(measureLineStringPlacemark); 
                }
                catch (ex)
                {
                }
                try
                {
                    ge.getFeatures().removeChild(lineStringPlacemark); 
                }
                catch (ex)
                {
                }
                try
                {
                    ge.getFeatures().removeChild(measurePolygonPlacemark);
                }
                catch (ex)
                {
                }
                draggingOn = false;
                polyPoints = [];
            }
            selectedTool = measureType;
            if (geOn)
            {
                ge.getOptions().setMouseNavigationEnabled(false); 
                google.earth.addEventListener(ge.getGlobe(), 'dblclick', ongedblclick);
                google.earth.addEventListener(ge.getGlobe(), 'click', ongeclick); 
                google.earth.addEventListener(ge.getGlobe(), 'mousemove', ongemeasuremousemove); 
            }
            else
            {
                myDragMeasure.initiateMeasure();
            }
            document.getElementById('lineimage').src = "images/line.gif";
            document.getElementById('polygonimage').src = "images/polygon.gif";
            document.getElementById('pointimage').src = "images/thumbtack.gif";
            if (measureType == "line")
                document.getElementById('lineimage').src = "images/lineselected.gif";
            else if (measureType == "polygon")
                document.getElementById('polygonimage').src = "images/polygonselected.gif";
            else if (measureType == "point")
                document.getElementById('pointimage').src = "images/thumbtackselected.gif";
                
        }
        function resetTools()
        {
            dontZoom = true;
            document.getElementById('identifyWindow').style.visibility = 'hidden';
            document.getElementById('lineimage').src = "images/line.gif";
            document.getElementById('polygonimage').src = "images/polygon.gif";
            document.getElementById('pointimage').src = "images/thumbtack.gif";
            if (geOn)
            {
                try 
                {
                    document.getElementById('shimmerIdentify').style.visibility = "hidden";
                }
                catch (ex)
                {
                }
                try
                {
                    ge.getOptions().setMouseNavigationEnabled(true); 
                }
                catch (ex)
                {
                }
//                try
//                {
//                    ge.getFeatures().removeChild(measurePlacemark); 
//                }
//                catch (ex)
//                {
//                }
//                try
//                {
//                    ge.getFeatures().removeChild(lineStringPlacemark); 
//                }
//                catch (ex)
//                {
//                }
//                try
//                {
//                    ge.getFeatures().removeChild(polygonPlacemark);
//                }
//                catch (ex)
//                {
//                }
                try
                {
                    google.earth.removeEventListener(ge.getGlobe(), 'mousemove', ongemousemove);
                    google.earth.removeEventListener(ge.getGlobe(), 'mousedown', ongemousedown); 
                    google.earth.removeEventListener(ge.getGlobe(), 'mouseup', ongemouseup); 

                }
                catch (ex)
                {
                }
                try
                {
                    google.earth.removeEventListener(ge.getGlobe(), 'click', ongeclick);
                    google.earth.removeEventListener(ge.getGlobe(), 'dblclick', ongedblclick); 
                    google.earth.removeEventListener(ge.getGlobe(), 'mousemove', ongemeasuremousemove); 
                }
                catch (ex)
                {
                }
//                draggingOn = false;
//                polyPoints = [];
            }
            else
            {
                myDragZoomOut.resetZoom();
                myDragZoomIn.resetZoom();
                myDragMeasure.resetMeasure();
                myDragIdentify.resetIdentify();
                try
                {
                    if (geOn)
                    {
                        ge.getFeatures().removeChild(highlightedMarker); 
                    }
                    else
                    {
                        map.removeOverlay(highlightedMarker)
                    }
                }
                catch(e) 
                {
                }
                try{
                    var poly;
                    for (var i = 0; i < highlightedPolygon.length; i++)
                    {
                        if (geOn)
                        {
                            try
                            {
                                ge.getFeatures().removeChild(highlightedPolygon[i]);
                            }
                            catch (ex)
                            {
                            }

                        }
                        else
                        {
                            try
                            {
                                poly = highlightedPolygon[i];
                                map.removeOverlay(poly);
                            }
                            catch (ex) 
                            { 
                            }
                        }
                    }
                }
                catch(e) {  }
                try
                {
                    if (geOn)
                    {
                        ge.getFeatures().removeChild(highlightedPolyLine);
                    }
                    else
                    {
                        map.removeOverlay(highlightedPolyLine)
                    }
                }
                catch (ex)
                {
                }
            }
            try{
                changetable();
            }
            catch(e) {  }
            dontZoom = false;
        }
        function recalcDistance()
        {
            if (selectedTool == "point")
            {
                calcPoint(lastCalcX, lastCalcY);
            }
            else if (selectedTool == "polygon")
            {
                var selObj = document.getElementById('distanceSelect');
                var selIndex = selObj.selectedIndex;
	            var distanceType = selObj.options[selIndex].value;
	            var polyShapeY = new GPolyline(googlePoints, lineColor, lineWeight, opacity);
	            var length = polyShapeY.getLength()/1000;
	            length = convertTo(length, distanceType, "Kilometers");
	            
	            var polyShapeX = new GPolygon(googlePoints, lineColor, lineWeight, opacity, fillColor, opacity);
	            var area = polyShapeX.getArea();
	            area = convertAreaTo(area, distanceType);
	            //area = convertTo(area, distanceType, "Kilometers");
	            var square = "";
	            if (distanceType != "Hectares" && distanceType != "Ares" && distanceType != "Acres")
	                square = "Square ";
	            document.getElementById('measureresults').innerHTML = "Area: " + area + " " + square + distanceType + "<br/><br/>Length: " + length + " " + distanceType;
	            
            }
            else if (selectedTool == "line")
            {
                var selObj = document.getElementById('distanceSelect');
                var selIndex = selObj.selectedIndex;
	            var distanceType = selObj.options[selIndex].value;
	            var polyShapeY = new GPolyline(googlePoints, lineColor, lineWeight, opacity);
	            var length = polyShapeY.getLength()/1000;
	            length = convertTo(length, distanceType, "Kilometers");
	            document.getElementById('measureresults').innerHTML = length + " " + distanceType;
            }
        }
        
        function calcPoint(x, y)
        {
            lastCalcX = x;
            lastCalcY = y;
            var selObj = document.getElementById('distanceSelect');
            var selIndex = selObj.selectedIndex;
	        var distanceType = selObj.options[selIndex].value;
	        switch (distanceType) {
	            case "Decimal Degrees":
	                document.getElementById('measureresults').innerHTML = "X: " + x.toPrecision(6) + " Decimal Degrees<br/>Y: " + y.toPrecision(6) + " Decimal Degrees";
	                break;
	            case "Deg Min Sec":
	                var dist = x;
	                var sign = 1;
                    if (dist < 0) { sign = -1; }
                    var distAbs = Math.abs(Math.round(dist * 1000000.));
                    var distDMSX = ((Math.floor(distAbs / 1000000) * sign) + '&deg; ' + Math.floor(((distAbs/1000000) - Math.floor(distAbs/1000000)) * 60) + '\' ' + (Math.floor(((((distAbs/1000000) - Math.floor(distAbs/1000000)) * 60) - Math.floor(((distAbs/1000000) - Math.floor(distAbs/1000000))* 60)) * 1000000) * 60/100000 ) + '&quot;');
                    
                    dist = y;
                    sign = 1;
                    if (dist < 0) { sign = -1; }
                    var distAbs = Math.abs(Math.round(dist * 1000000.));
                    var distDMSY = ((Math.floor(distAbs / 1000000) * sign) + '&deg; ' + Math.floor(((distAbs/1000000) - Math.floor(distAbs/1000000)) * 60) + '\' ' + (Math.floor(((((distAbs/1000000) - Math.floor(distAbs/1000000)) * 60) - Math.floor(((distAbs/1000000) - Math.floor(distAbs/1000000))* 60)) * 1000000) * 60/100000 ) + '&quot;');
                    
                    document.getElementById('measureresults').innerHTML = "X: " + distDMSX + " Deg Min Sec<br/>Y: " + distDMSY + " Deg Min Sec";
                    break;
                case "UTM":
                    var xy = new Array(2);
                    var lon = parseFloat(x);
                    var lat = parseFloat(y);
                    // Compute the UTM zone.
                    zone = Math.floor ((lon + 180.0) / 6) + 1;
                    zone = LatLonToUTMXY (DegToRad (lat), DegToRad (lon), zone, xy);
                    var isSouth = false;
                    var N_S = "N";
                    if (lat < 0)
                    {
                        N_S = "S";
                        isSouth = true;
                    }
                    var E = parseFloat(xy[0]);
                    var N = parseFloat(xy[1]);
                    
                    if(isSouth)
                        N-=10000000;    //    convert to signed form
                    
                    var u={};
                    var ok=UTMtoMGRS(zone,E,N,7,u);
                    var zdl = "";
                    if(ok)
                        zdl = u.zdl;
                    if (zone)
                        document.getElementById('measureresults').innerHTML = zone + " " + zdl + " " + roundNumber(parseFloat(xy[0]), 2) + " E " + roundNumber(parseFloat(xy[1]), 2) + " " + N_S;
                
                    break;
                case "MGRS":
                    var xy = new Array(2);
                    var lon = parseFloat(x);
                    var lat = parseFloat(y);
                    // Compute the UTM zone.
                    zone = Math.floor ((lon + 180.0) / 6) + 1;
                    zone = LatLonToUTMXY (DegToRad (lat), DegToRad (lon), zone, xy);
                    var isSouth = false;
                    var N_S = "N";
                    if (lat < 0)
                    {
                        N_S = "S";
                        isSouth = true;
                    }
                    var E = parseFloat(xy[0]);
                    var N = parseFloat(xy[1]);
                    
                    if(isSouth)
                        N-=10000000;    //    convert to signed form
                    
                    var u={};
                    var ok = UTMtoMGRS(zone,E,N,7,u);
                    if (ok)
	                    document.getElementById('measureresults').innerHTML = MGRStoStr(u.zone,u.zdl,u.c1,u.c2,u.E,u.N);
                    
                    break;
	        }
        }
        
        
        function UTMtoMGRS(zone,E,N,d,u)
        {
            if(zone<1||zone>60||Math.round(zone)!=zone)
            {
    	        //alert("Invalid Zone");
    	        return false;
            }
            
            u.zone=zone;
            
            //	for normal purposes the above is better replaced by
            var zdl=UTMtoZDL(E,N);
            
            if(zdl.length!=1)
            {
	            return false;
            }
                
            u.zdl=zdl;
            
            var e={},n={};
            
            //alert(E+" "+N+" "+d);
            
            MGRSdigits(E,e,d);
            MGRSdigits(N,n,d);
            
            //alert(e.x100+" "+e.r100);
            //alert(n.x100+" "+n.r100);
         
            var E100=e.x100,N100=n.x100;
         
            MGRSletters(zone,E100,N100,u);
            
            u.E=e.r100;
            u.N=n.r100;
            return true;
        }
        
        function UTMtoZDL(E,N)
        {
	        var d;
        	
	        if(N<=ZoneLatToN(84,E))
	        {
	            for(d=72;d>=-72;d-=8)
	            {
	                if(ZoneLatToN(d,E)<N)return UTMzdl(d+4);
	            }
	        }
        	
	        alert("Invalid Northing: cannot compute ZDL");
        	
	        return "";
        }
        var UTMzdlChars="CDEFGHJKLMNPQRSTUVWXX";
 
        function UTMzdl(latDeg)
        {
            if(-80<=latDeg&&latDeg<=84)
                return UTMzdlChars.charAt(Math.floor((latDeg+80)/8));
            else
            {
                alert("No zdl: UTM is not valid for Lat "+latDeg);  //Not normally reached
                return "";
            }
        }
        function ZoneLatToN(d,E)
        {
	        var c= [[ 0,      0.000,833978.557,   0.000,0.0000000000],
			        [ 8, 884297.851,830743.842,1205.908,0.0072920001],
			        [16,1768935.376,821099.997,2318.642,0.0144411176],
			        [24,2654226.538,805227.189,3252.171,0.0213074192],
			        [32,3540435.693,783423.227,3934.216,0.0277567819],
			        [40,4427757.219,756099.648,4311.838,0.0336635858],
			        [48,5316300.224,723775.915,4355.565,0.0389131714],
			        [56,6206079.587,687071.439,4061.740,0.0434040145],
			        [64,7097014.163,646695.227,3452.887,0.0470495860],
			        [72,7988932.503,603433.054,2576.040,0.0497798833],
			        [80,8881585.816,558132.215,1499.140,0.0515426300],
                    [84,9328093.831,534994.655, 911.352,0.0520499036]];	//	special value for N Hemisphere
         
	        var d1=(d==84)?11:Math.abs(d)/8;
        	
	        var N0=c[d1][1];
	        var E1=c[d1][2];
	        var k =c[d1][4];
        		
	        var E10=E1-500000;
        	
	        var x=(E-500000.)/E10;
        	
	        var N=N0+k*x*(E-500000.)/(1+Math.sqrt(1-k*k*x*x));
        	
	        return(d>0)?N:-N;
        }
        function MGRSdigits(EorN,u,n)
        {    
            var v=(EorN+1e7+1e-4)/10000000+"0000000000000000";
            u.x100=Number(v.substr(2,2));
            u.r100=v.substr(4,n);
            //alert(v+"\n"+u.x100+"\n"+u.r100);
        }

        var MGRSchars="ABCDEFGHJKLMNPQRSTUVWXYZ";
         
        function MGRSletters(zone,E100,N100,u)
        {
            //alert("Zone "+zone+"\nE100="+E100+"\nN100="+N100);
            
            var j=E100-1;
            var e8=8*(zone-1)+j;
            u.c1=MGRSchars.charAt(e8%24);
            u.c2=MGRSchars.charAt((N100+100+((zone%2)?0:5))%20);    //NB advance 2nd letter by 5 for odd zones
        }
        
        function MGRStoStr(zone,zdl,c1,c2,E,N)
        {
            return zone+" "+ zdl+" "+c1+c2+" "+E+" "+N;
        }










        
        function collapseexpand()
        {
            if (document.getElementById('collapseimg').src.indexOf("collapseup") >= 0)
            {
                document.getElementById('collapseimg').src = "images/collapsedown.png";
                document.getElementById('gContents').style.visibility = 'hidden'; 
                dijit.byId('layers_frame').open=true;
                dijit.byId('layers_frame').toggle();

                dijit.byId('measure_frame').open=true;
                dijit.byId('measure_frame').toggle();
 
                dijit.byId('search_frame').open=true;
                dijit.byId('search_frame').toggle();

                dijit.byId('myplaces_frame').open=true;
                dijit.byId('myplaces_frame').toggle();

                dijit.byId('results_frame').open=true;
                dijit.byId('results_frame').toggle();

           }
            else
            {
                document.getElementById('collapseimg').src = "images/collapseup.png";
                document.getElementById('gContents').style.visibility = 'visible'; 
            }
        }



        function resizeMap() {
//            if (geOn||true)
//            {
                try
                {
                    if (resizeRan)
                    {
                        resizeRan = false;
                    }
                    else
                    {
                        var headerDiv = findElement(geeDivIds.header);
                        var mapDiv = findElement(geeDivIds.map);
                        var headerHeight = getElementHeight(headerDiv);
                        var browserDimensions = browserInnerDimensions();
                        var leftPanelWidth = geeLeftPanelWidth;  // Set on startup by css.
                        if (!geeIsLeftPanelOpen) {
                        //leftPanelWidth = 0;
                        }
                        //alert(headerHeight);
                        var newHeight = browserDimensions.height - headerHeight;
                        var newWidth = browserDimensions.width - leftPanelWidth;
                        if (mapDiv) {
                            mapDiv.style.height = (newHeight-30) + "px";
                            mapDiv.style.width = (newWidth) + "px";
                            if (geOn)
                            {
                                mapDiv.style.top = headerHeight + "px";
                            }
                            else
                            {
                                mapDiv.style.top = "0px";
                            }
                        }
//                        try
//                        {
//                            LogoOverlay.getOverlayXY().setXUnits(ge.UNITS_PIXELS);
//                            LogoOverlay.getOverlayXY().setYUnits(ge.UNITS_PIXELS);
//                            LogoOverlay.getOverlayXY().setX(150);
//                            LogoOverlay.getOverlayXY().setY(110);
//                        }
//                        catch(ex)
//                        {
//                        }

                        var leftPanelParent = findElement(geeDivIds.leftPanelParent);
                        leftPanelParent.style.height = newHeight + "px";
                        resizeRan = true;
                    }
                }
                catch (ex)
                {
                    //alert(ex);
                }
                try 
                {
//                    ge.getNavigationControl().getScreenXY().setXUnits(ge.UNITS_PIXELS);
//                    ge.getNavigationControl().getScreenXY().setYUnits(ge.UNITS_INSET_PIXELS);
                }
                catch (ex)
                {
                }
//            }
//            else
//            {
//                if (panel_height.indexOf("%") >= 0 || panel_width.indexOf("%") >= 0)
//                {
//                  if (resizeRan)
//                  {
//                    resizeRan = false;
//                    
//                  }
//                  else
//                  {
//                      var navHeight = document.getElementById("navToolbar").style.height.replace("px","");
//                      var rightWidth = document.getElementById("accordionPane").style.width.replace("px","");
//                      var offsetHeight = 0;
//                      var offsetWidth = 0;
//                      if( typeof( window.innerWidth ) == 'number' ) {
//                        //Non-IE
//                        myWidth = window.innerWidth;
//                        myHeight = window.innerHeight-16;
//                      } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
//                        //IE 6+ in 'standards compliant mode'
//                        myWidth = document.documentElement.clientWidth;
//                        myHeight = document.documentElement.clientHeight-16;
//                        var offsetHeight = 16;
//                      } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
//                        //IE 4 compatible
//                        myWidth = document.body.clientWidth;
//                        myHeight = document.body.clientHeight-16;
//                      }
//                      if (myHeight <= 0)
//                      {
//                        myHeight = 460;
//                      }
//                      //mainWindow
//                      //map_canvas
//                      try{
//                        if (panel_height.indexOf("%") >= 0)
//                        {
//                            document.getElementById("mainWindow").style.height = (myHeight-10 * (panel_height.replace("%","")/100)) + "px";
//                        }
//                        else
//                        {
//                            document.getElementById("mainWindow").style.height = panel_height + "px";
//                        }
//                      }
//                      catch (e) { }
//                      try{
//                        if (panel_width.indexOf("%") >= 0)
//                        {
//                            document.getElementById("mainWindow").style.width = (myWidth-10 * (panel_width.replace("%","")/100)) + "px";
//                        }
//                        else
//                        {
//                            document.getElementById("mainWindow").style.width = panel_width + "px";
//                        }
//                      }
//                      catch (e) { }
//                      try{
//                        if (panel_height.indexOf("%") >= 0)
//                        {
//                            document.getElementById("mapPane2").style.height = ((myHeight - navHeight - 10) * (panel_height.replace("%","")/100)) + "px";
//                            document.getElementById("accordionPane").style.height = document.getElementById("mapPane2").style.height;
//                        }
//                        else
//                        {
//                            document.getElementById("mapPane2").style.height = (panel_height - navHeight - 10) + "px";
//                            document.getElementById("accordionPane").style.height = document.getElementById("mapPane2").style.height;
//                        }
//                      }
//                      catch (e) {}
//                      try{
//                        if (panel_width.indexOf("%") >= 0)
//                        {
//                            document.getElementById("mapPane2").style.width = ((myWidth - rightWidth-10) * (panel_width.replace("%","")/100)) + "px";
//                            document.getElementById("accordionPane").style.left = document.getElementById("mapPane2").style.width;
//                        }
//                        else
//                        {
//                            document.getElementById("mapPane2").style.width = (panel_width - rightWidth-10) + "px";
//                            document.getElementById("accordionPane").style.left = document.getElementById("mapPane2").style.width;
//                       }
//                      }
//                      catch (e) {}
//                      resizeRan = true;
//                  }
//                }
//                else
//                {
//                   document.getElementById("mapPane2").style.height = (panel_height - navHeight) + "px";
//                   document.getElementById("mapPane2").style.width = (panel_width - rightWidth) + "px";
//                }

//                        
//            }
            
        }
        