﻿var mapminx = 0;
var mapminy = 0;
var mapmaxx = 0;
var mapmaxy = 0;
var prevminx = 0;
var prevminy = 0;
var prevmaxx = 0;
var prevmaxy = 0;
var currentMapView;
var currMapTitle = "";
var currentTool = "pan";
var currentMapClass;
var currInfoWindowTitle = "";
var mapPoints;    
var mapResultset;
var mapResultsExtent = [];
var tabstripMap = null;
var mapConfig = null;
var popUpGraphic;

var jsMap, jsNav, jsSR, jsDraw, theDrawConnect, theExtentConnect, theResizeMapConnect, theResizeConnect, theBufferConnect, theGraphicsClickConnect, theGraphicsClearConnect, theGraphicAddConnect
var mapsAdded = "";
var layersToShow = [];
var idMapLayers = [];
var idResults = [];
var idLayers = [];
var idGeometry;
var idLatLong;
var idPoint;
var selResults = [];
var qResults = [];
var qLayer;
var currfeatureSet = null;
var gsvc = null;
var gloc = null;
var timeoutWipeOut = null;

dojo.require("esri.map");
dojo.require("esri.toolbars.navigation");
dojo.require("esri.toolbars.draw");
dojo.require("esri.tasks.identify");
dojo.require("esri.tasks.query");    
dojo.require("esri.tasks.geometry");
dojo.require("esri.tasks.locator");
dojo.require("dojo.fx");
//dojo.addOnLoad(initMap);   //this is accomplished in displayUtilities.js OnLoad() function

function initMap() {
    esri.config.defaults.map.slider = { left:"15px", top:"75px", width:null, height:"100px" };
    esri.config.defaults.map.zoomSymbol = {color:[0,0,0,64],outline:{color:[0,0,0,255],width:1.5,style:"esriSLSSolid"},style:"esriSFSSolid"}
    var mapInitExtent = document.getElementById("bbusMap_mapInitExtent").value.split(",");
    var mapSR = document.getElementById("bbusMap_mapSpatialReference").value;
    if (mapInitExtent.length == 4)
    {
        var iExtent = new esri.geometry.Extent(parseFloat(mapInitExtent[0]),parseFloat(mapInitExtent[1]),parseFloat(mapInitExtent[2]),parseFloat(mapInitExtent[3]),new esri.SpatialReference({"wkid":mapSR}));
        jsMap = new esri.Map("jsMap",{ extent:iExtent });
    }
    else
        jsMap = new esri.Map("jsMap");
        
    dojo.connect(jsMap, "onLoad", mapLoadHandler);
    wipeLayers('out',1);
    
    var mapServices = document.getElementById("bbusMap_mapServices").value.split(",");
    var mapServiceURLs = document.getElementById("bbusMap_mapServiceURLs").value.split(",");
    var mapDefault = document.getElementById("bbusMap_mapDefault").value;
    var mapLayers = document.getElementById("bbusMap_mapLayers").value;
    if (mapLayers != "")    mapConfig = dojo.fromJson(mapLayers);
    var x;
    var mapService;
    var mapURL;
    var defaultIndex;
    var layer, alayer;
    for (x in mapServices)
    { 
      mapService = mapServices[x];
      if(mapService==mapDefault)defaultIndex = x;
    }
    currentMapView = mapDefault;
    var currTab = getMapTab(currentMapView);
    if (currTab)
        layer = initLayer(mapServiceURLs[defaultIndex],mapServices[defaultIndex],true,currTab.type);
    else
        layer = initLayer(mapServiceURLs[defaultIndex],mapServices[defaultIndex],true);
    for (x in mapServices)
    { 
      mapService = mapServices[x];
      if(mapService!=mapDefault)
      {
        mapURL = mapServiceURLs[x];
        currTab = getMapTab(mapService);
        if (currTab)
            alayer = initLayer(mapURL, mapService, false,currTab.type);
        else
            alayer = initLayer(mapURL, mapService, false);
        if (alayer != null){
            if(alayer.loaded && mapsAdded.indexOf(":"+mapService+":")==-1) 
            {
              jsMap.addLayer(alayer);
              alayer.hide();
              mapsAdded = mapsAdded+":"+mapService+":";
            }
        }
      }
    }
    
    
    jsNav = new esri.toolbars.Navigation(jsMap);
    //dojo.connect(jsNav, "onExtentHistoryChange", extentHistoryChangeHandler);
    jsNav.zoomSymbol = new esri.symbol.SimpleFillSymbol({color:[0,0,0,64],outline:{color:[0,0,0,255],width:1.5,style:"esriSLSSolid"},style:"esriSFSSolid"});
    
}

function testWebService()
{
    var deferred = dojo.xhrPost({
    url:"http://localhost:3214/Mapit.NET/WebService.asmx/HelloWorld",
    handleAs:"text",
    load: function(data){
        alert(data);
    }
    });
}


function initLayer(url, idName, initload, type, initlayer, opacity) {
    if(mapsAdded.indexOf(":"+idName+":")!=-1) 
        return null;
        
    if (opacity == null) opacity = 1.0;
    if (type == "dynamic")
        var layer = new esri.layers.ArcGISDynamicMapServiceLayer(url,{id:idName});
        
    else
        var layer = new esri.layers.ArcGISTiledMapServiceLayer(url,{id:idName});
    if(initload)
    {
        mapsAdded = mapsAdded+":"+idName+":";
        jsMap.addLayer(layer);
        layer.show();
    }
    else
    {
        if (initlayer)
        {    dojo.connect(layer, "onLoad", function() {
                mapsAdded = mapsAdded+":"+idName+":";
                buildLayerList(layer);
                demoLayers();
                layer.setOpacity(opacity);
                jsMap.addLayer(layer);
                layer.show();
                });
        }
        else
        {    dojo.connect(layer, "onLoad", function() {
                mapsAdded = mapsAdded+":"+idName+":";
                layer.hide();
                layer.setOpacity(opacity);
                jsMap.addLayer(layer);
                });
        }
    }
   return layer;
}

function mapLoadHandler()
{
    var mapSR = document.getElementById("bbusMap_mapSpatialReference").value;
    if(mapSR=="map")
    {jsSR = jsMap.spatialReference;}
    else {jsSR = new esri.SpatialReference({"wkid":mapSR});}
    
    jsDraw = new esri.toolbars.Draw(jsMap);
    jsDraw.setFillSymbol(new esri.symbol.SimpleFillSymbol({color:[0,0,0,64],outline:{color:[0,0,0,255],width:1.5,style:"esriSLSSolid"},style:"esriSFSSolid"}));
    setMapIcon();
    dojo.connect(jsMap.graphics, "onClick", setMapIcon);
    dojo.connect(jsMap.graphics, "onClick", clickLocGraphic);
    dojo.connect(jsMap,"onResize",function(){blnResizing=false});
    dojo.connect(jsMap, "onExtentChange", extentHistoryChangeHandler);
    mapminx = jsMap.extent.xmin;
    mapmaxx = jsMap.extent.xmax;
    mapminy = jsMap.extent.ymin;
    mapmaxy = jsMap.extent.ymax;
    setScaleBar();
    //dojo.connect(jsMap, "onUnload", initMap);
    
    
    //add additional map layers
    if (mapConfig != null){
      for (m in mapConfig.layers.maptab)
      {
        var maptab = mapConfig.layers.maptab[m];
        for (l in maptab.layer)
        {
            var initlayer = false;
            if (maptab.id == currentMapView) initlayer = true;
            var maptabLayer = maptab.layer[l];
            alayer = initLayer(maptabLayer.url,maptabLayer.id,false,maptabLayer.type,initlayer,maptabLayer.opacity);
            if (alayer != null){
                if(alayer.loaded && mapsAdded.indexOf(":"+maptabLayer.id+":")==-1) 
                {
                    mapsAdded = mapsAdded+":"+maptabLayer.id+":";
                    if (maptabLayer.opacity != null) 
                        alayer.setOpacity(maptabLayer.opacity);
                    if (initlayer)
                    {
                        buildLayerList(alayer);
                        demoLayers();
                        
                    }
                    else alayer.hide();
                    jsMap.addLayer(alayer);
                }
            }
        }
      }
    }
    hideLayer("BusyIndicator");
    
    
    var setTab = getQueryStringVariable("TabID");
    if(setTab!=null) selectRadTab(setTab);
    
    var PropID = getQueryStringVariable("PropID");
    var PropX = getQueryStringVariable("PropX");
    var PropY = getQueryStringVariable("PropY");
    if(PropID!=null) gotoPropertyDetails(PropID, PropX, PropY);
}      

function getMapTab(id)
{
    var mapTab = null;
    if (mapConfig != null){
      for (m in mapConfig.layers.maptab)
      {
        mapTab = mapConfig.layers.maptab[m];
        if (mapTab.id == id) return mapTab;
      }
    }
    return mapTab;
        
}

function extentHistoryChangeHandler() {
    showGlow(0,0);
    prevminx = mapminx;
    prevminy = mapminy;
    prevmaxx = mapmaxx;
    prevmaxy = mapmaxy;
    mapminx = jsMap.extent.xmin;
    mapmaxx = jsMap.extent.xmax;
    mapminy = jsMap.extent.ymin;
    mapmaxy = jsMap.extent.ymax;
    
    setScaleBar();
    //dijit.byId("zoomprev").disabled = navToolbar.isFirstExtent();
    //dijit.byId("zoomnext").disabled = navToolbar.isLastExtent();
    setMapIcon();
    hideLayer("BusyIndicator");
}

function setScaleBar()
{
    var scale = ((jsMap.extent.xmax - jsMap.extent.xmin)/jsMap.width)*96;
    var divScaleMiles = document.getElementById("divScaleMiles");
    var divScaleKM = document.getElementById("divScaleKM");
    if(divScaleMiles == null || divScaleKM == null) return;
    var units;
    for (var j=0, jl=jsMap.layerIds.length; j<jl; j++) {
      var layer = jsMap.getLayer(jsMap.layerIds[j]);
      if (currentMapView == layer.id) {
        units = layer.units;
      }
    }
    var miles, km;
    if (units == "esriFeet")
    {
        miles = scale/5280;
        km = scale*0.3048/1000;
    }
    if (units == "esriMeters") 
    {
        miles = scale/0.3048/5280;
        km = scale/1000;
    }
    if (units == "esriDecimalDegrees")
    {
        divScaleMiles.innerHTML = "";
        divScaleKM.innerHTML = "";
    }
    else
    {
        divScaleMiles.innerHTML = miles.toFixed(2)+" miles";
        divScaleKM.innerHTML = km.toFixed(2)+" km";
    }
}

function demoLayers()
{
    cancelWipeOut();
    window.setTimeout("wipeLayers('in');",1);
    timeoutWipeOut = window.setTimeout("wipeLayers('out');",5000);
}
function cancelWipeOut()
{
    if (timeoutWipeOut != null)
        window.clearTimeout(timeoutWipeOut);
}
function wipeOutLayers()
{
    cancelWipeOut();
    wipeLayers('out');
}
function wipeInLayers()
{
    cancelWipeOut();
    wipeLayers('in');
}
function wipeLayers(animation, time)
{
    if (time == null) time = 1000;
    if (animation == 'out')
    {
        var wipe = dojo.fx.wipeOut({node: "divWipeMapLayers",duration: time});
        var anim = 'in';
    }
    else
    {
        var wipe = dojo.fx.wipeIn({node: "divWipeMapLayers",duration: time});
        var anim = 'out';
    }
    wipe.play();
    var link = dojo.byId("divWipeLink");
    if (anim == 'in') link.onclick = wipeInLayers;
    if (anim == 'out') link.onclick = wipeOutLayers;
}
    
function clickMapTab()
{
        doNothing();
}

function resizeMapControl()
{
    ResizeInPane('paneRightBody', 'divMap',			 600, 200, -1, 0);

}
function expandMap(expand)
{
    swapDIV('imgSizer_Map',		expand);
}

function activateMapTool(tool)
{
    var prevTool = currentTool;
    currentTool = tool;
    switch (tool)
    {
        case "identify":
            dojo.disconnect(theDrawConnect);
            theDrawConnect = dojo.connect(jsDraw, "onDrawEnd", doIdentify);
            jsNav.deactivate();
            jsDraw.activate(esri.toolbars.Draw.POINT);
            showIdentify();
            break;
        case "select":
            dojo.disconnect(theDrawConnect);
            theDrawConnect = dojo.connect(jsDraw, "onDrawEnd", doSelect);
            jsNav.deactivate();
            jsDraw.activate(esri.toolbars.Draw.POINT);
            showSelect();
            break;
        case "pan":
            jsNav.deactivate();
            jsDraw.deactivate();
            break;
        case "pointer":
            jsNav.deactivate();
            jsDraw.deactivate();
            break;
        case "zoomin":
            //jsDraw.deactivate();
            jsNav.activate(esri.toolbars.Navigation.ZOOM_IN);
            
            break;
        case "zoomout":
            //jsDraw.deactivate();
            jsNav.activate(esri.toolbars.Navigation.ZOOM_OUT);
            break;
        case "zoomprev":
            currentTool = prevTool;
            jsNav.zoomToPrevExtent();
            break;
        case "legend":
            currentTool = prevTool;
            showLegend();
            break;
        case "print":
            currentTool = prevTool;
            printMap();
            break;
        case "printHTML":
            currentTool = prevTool;
            printMapHTML(jsMap);
            break;
        case "measure":
            dojo.disconnect(theDrawConnect);
            theDrawConnect = dojo.connect(jsDraw, "onDrawEnd", doMeasure);
            jsNav.deactivate();
            jsDraw.activate(esri.toolbars.Draw.POLYGON);
            showMeasure();
            break;
        case "drawPortfolioPropPolygon":
            dojo.disconnect(theDrawConnect);
            theDrawConnect = dojo.connect(jsDraw, "onDrawEnd", doDrawPortfolioPropPolygon);
            jsNav.deactivate();
            jsDraw.activate(esri.toolbars.Draw.POLYGON);
            var dp = getGraphicById("drawPortfolioPropPolygon");
            if (dp) jsMap.graphics.remove(dp);
            hideLayer('divPortfolioPropDrawingResults');
            showLayer('divPortfolioPropDrawingInstructions');
            break;
        case "setlocation":
            dojo.disconnect(theDrawConnect);
            theDrawConnect = dojo.connect(jsDraw, "onDrawEnd", doSetLocation);
            jsNav.deactivate();
            jsDraw.activate(esri.toolbars.Draw.POINT);
            break;
        default:
            currentTool = prevTool;
            break;
    }
    setMapIcon();
}

function setMapIcon()
{
    if (currentTool == "pointer")
        cur = "pointer";
    else
        cur = "url('img/"+currentTool+".cur'),url('App_Themes/BinaryBus/img/"+currentTool+".cur'),auto";
    document.getElementById("jsMap_container").style.cursor = cur;
}
      
function maptoolsOver()
{
    var maptools = document.getElementById("bbusMap_divMapTools");
    var zoomtools = document.getElementById("divZoomTools");
    var navback1 = document.getElementById("divNavBack1");
    var navback2 = document.getElementById("divNavBack2");
    var navback3 = document.getElementById("divNavBack3");
    maptools.className='maptoolsover';
    //zoomtools.className='maptoolsover';
    navback1.className='maptoolsover';
    navback2.className='maptoolsover';
    navback3.className='maptoolsover';
}

function maptoolsOut()
{
    var maptools = document.getElementById("bbusMap_divMapTools");
    var zoomtools = document.getElementById("divZoomTools");
    var navback1 = document.getElementById("divNavBack1");
    var navback2 = document.getElementById("divNavBack2");
    var navback3 = document.getElementById("divNavBack3");
    maptools.className='maptools';
    //zoomtools.className='maptools';
    navback1.className='maptools';
    navback2.className='maptools';
    navback3.className='maptools';
}

function showMeasure()
{
    var mg = getGraphicById("measuregeometry");
    if (mg) jsMap.graphics.remove(mg);
    showMapPopup();
    setMapPopupTitle("Measure Area or Length");
    expandMapPopup();
    var content = "<div id='divMapMeasure' class='mapPopupSubContent'>Choose what to measure<br>"
    content+= "<input type='radio' name='radioMeasure' checked onclick='jsDraw.activate(esri.toolbars.Draw.POLYGON);' value='area'> Area"
    content+= "<input type='radio' name='radioMeasure' onclick='jsDraw.activate(esri.toolbars.Draw.POLYLINE);' value='length'> Length"
    content+= "<br><br>- Click on the map at each corner (vertex) of the area or length to measure.<br><br>- Double click to complete drawing and display measurement information.</div>"
    setMapPopupContent(content);
}
function doMeasure(geometry)
{
    var mapGsvc = document.getElementById("bbusMap_mapGeometryService").value;
    if (mapGsvc == "") mapGsvc = "http://maps.binarybus.net/arcgis/rest/services/Geometry/GeometryServer";
    if(gsvc == null) gsvc = new esri.tasks.GeometryService(mapGsvc);
    var mg = getGraphicById("measuregeometry");
    if (mg) jsMap.graphics.remove(mg);
    mGeom = geometry;
    mGeom.setSpatialReference(jsSR);
    if (mGeom.type == "polygon")    mSymbol = new esri.symbol.SimpleFillSymbol();
    else    mSymbol = new esri.symbol.SimpleLineSymbol();
    mGraphic = new esri.Graphic(mGeom,mSymbol);
    mGraphic.attributes = { "id":"measuregeometry", "type":"measure" };
    jsMap.graphics.add(mGraphic);
        
    if (mGeom.type == "polygon") gsvc.simplify([mGraphic], function(graphics) {
            gsvc.areasAndLengths(graphics,showAreaResults);
        });
    else  gsvc.simplify([mGraphic], function(graphics) {
            gsvc.lengths(graphics,showLengthResults);
        });
    activateMapTool('pan');
    
}
function showLengthResults(results)
{
    showMapPopup();
    setMapPopupTitle("Measure Length");
    expandMapPopup();
    var units;
    for (var j=0, jl=jsMap.layerIds.length; j<jl; j++) {
      var layer = jsMap.getLayer(jsMap.layerIds[j]);
      if (currentMapView == layer.id) {
        units = layer.units;
      }
    }
    var ft, meters;
    var length = results.lengths[0];
    if (units == "esriFeet")
    {
        ft = length;
        meters = length*0.3048;
    }
    if (units == "esriMeters") 
    {
        ft = length/0.3048;
        meters = length;
    }
    
    var unitLenSelect = "<select id='selLengthUnits' class='measureUnits' onchange='changeLenMeasure(this.options[this.selectedIndex].value)' >"
    unitLenSelect+= "<option value='"+ft.toFixed(2)+"' selected>ft</option>"
    unitLenSelect+= "<option value='"+meters.toFixed(2)+"'>meters</option></select>"
    var content = "<div id='divMapMeasure' class='mapPopupSubContent'><span class='header'>Length:</span><span class='value' id='measureLength'>"+ft.toFixed(2)+"</span>"+unitLenSelect
    content+="<br><br><a href='#' onclick='activateMapTool(&quot;measure&quot;);'>Measure again</a></div>"
    setMapPopupContent(content);
    
}

function showAreaResults(results)
{
    showMapPopup();
    setMapPopupTitle("Measure Area");
    expandMapPopup();
    var units;
    for (var j=0, jl=jsMap.layerIds.length; j<jl; j++) {
      var layer = jsMap.getLayer(jsMap.layerIds[j]);
      if (currentMapView == layer.id) {
        units = layer.units;
      }
    }
    
    var ft, meters, sqft, sqm, acres, ha;
    var length = results.lengths[0];
    var area = results.areas[0];
    if (units == "esriFeet")
    {
        ft = length;
        meters = length*0.3048;
        sqft = area;
        acres = sqft/43560;
        sqm = area*0.3048*.3048;
        ha = sqm/10000;
    }
    if (units == "esriMeters") 
    {
        ft = length/0.3048;
        meters = length;
        sqft = area/0.3048/.3048;
        acres = sqft/43560;
        sqm = area;
        ha = sqm/10000;
    }
    
    var unitAreaSelect = "<select id='selAreaUnits' class='measureUnits' onchange='changeAreaMeasure(this.options[this.selectedIndex].value)' >"
    unitAreaSelect+= "<option value='"+sqft.toFixed(2)+"' selected>sq ft</option>"
    unitAreaSelect+= "<option value='"+acres.toFixed(2)+"'>acres</option>"
    unitAreaSelect+= "<option value='"+sqm.toFixed(2)+"'>sq m</option>"
    unitAreaSelect+= "<option value='"+ha.toFixed(2)+"'>hectares</option></select>"
    var unitLenSelect = "<select id='selLengthUnits' class='measureUnits' onchange='changeLenMeasure(this.options[this.selectedIndex].value)' >"
    unitLenSelect+= "<option value='"+ft.toFixed(2)+"' selected>ft</option>"
    unitLenSelect+= "<option value='"+meters.toFixed(2)+"'>meters</option></select>"
    
    var content = "<div id='divMapMeasure' class='mapPopupSubContent'><span class='header'>Area:</span><span class='value' id='measureArea'>"+sqft.toFixed(2)+"</span>"+unitAreaSelect+"<br><span class='header'>Perimeter:</span><span class='value' id='measureLength'>"+ft.toFixed(2)+"</span>"+unitLenSelect
    content+="<br><br><a href='#' onclick='activateMapTool(&quot;measure&quot;);'>Measure again</a></div>"
    setMapPopupContent(content);
    
}

function changeAreaMeasure(value)
{
    var area = document.getElementById('measureArea');
    area.innerHTML = value;
}
function changeLenMeasure(value)
{
    var len = document.getElementById('measureLength');
    len.innerHTML = value;
}
function doSetLocation(geometry)
{
    mapResultset = "setLocation";
    
    var maptip = document.getElementById("mapTip_"+mapResultset);
    if (maptip == null) return;
    
    slTitle =  maptip.getAttribute("title");
    var slg = getGraphicById("setlocation");
    if (slg) jsMap.graphics.remove(slg);
    slPoint = geometry;
    slPoint.setSpatialReference(jsSR);
    slSymbol = new esri.symbol.PictureMarkerSymbol("/App_Themes/BinaryBus/img/location_point.gif",20,20);
    slGraphic = new esri.Graphic(slPoint,slSymbol);
    slGraphic.attributes = { "id":"setlocation", "type":"setlocation" };
    
    pointArray = [];
    pointArray.push(slPoint.x);
    pointArray.push(slPoint.y);
    popcontent = "";
    popcontent = parseIndexes(maptip.innerHTML,pointArray);   
    slGraphic.infoTemplate = new esri.InfoTemplate(slTitle,popcontent);
    
    jsMap.graphics.add(slGraphic);
    currPropGraphic = slGraphic;
    getPopUp('setlocation', true);
    activateMapTool('pan');
    
}
function showIdentify()
{
    showMapPopup();
    setMapPopupTitle("Identify Map Layers");
    expandMapPopup();
    var content = "<div id='divMapIdentify' class='mapPopupSubContent'>Click on the map to list map information at that location.</div>"
    setMapPopupContent(content);
}
function doIdentify(geometry)
{
    showLayer("BusyIndicator");
    
    var idg = getGraphicById("identifylocation");
    if (idg) jsMap.graphics.remove(idg);
    idPoint = geometry;
    idSymbol = new esri.symbol.PictureMarkerSymbol("/App_Themes/BinaryBus/img/identify_point.gif",20,20);
    idGraphic = new esri.Graphic(idPoint,idSymbol);
    idGraphic.attributes = { "id":"identifylocation", "type":"identify" };
    jsMap.graphics.add(idGraphic);
    idGeometry = geometry;
    
    var mapGsvc = document.getElementById("bbusMap_mapGeometryService").value;
    if (mapGsvc == "") mapGsvc = "http://maps.binarybus.net/arcgis/rest/services/Geometry/GeometryServer";
    if(gsvc == null) gsvc = new esri.tasks.GeometryService(mapGsvc);
    var outSR = new esri.SpatialReference({ wkid: 4326});
    gsvc.project([ new esri.Graphic( idPoint ) ], outSR, processIDLocation);

}
function processIDLocation(features)
{
    idLatLong = features[0].geometry;
    idMapLayers = [];    
    idResults = [];
    idLayers = [];
    var identifyParams = new esri.tasks.IdentifyParameters();
    identifyParams.tolerance = 4;
    identifyParams.returnGeometry = false;

    identifyParams.geometry = idGeometry;
    identifyParams.layerOption = "visible";
    identifyParams.height = jsMap.height;
    identifyParams.width = jsMap.width;
    identifyParams.mapExtent = jsMap.extent;

    var layerIds = identifyParams.layerIds = [];
    var layer;
    var ix, il;
    layer = jsMap.getLayer(currentMapView);
    for(il in layer.layerInfos)
    {
        if (layer.layerInfos[il].subLayerIds==null)
            layerIds.push(layer.layerInfos[il].id);
    }
    var identify = new esri.tasks.IdentifyTask(layer.url);
    dojo.connect(identify, "onComplete", showIdentifyResults);

    esri.config.defaults.io.proxyUrl = "proxy.ashx";
    idMapLayers.push(layer.id);
    identify.execute(identifyParams);
    
    activateMapTool('pan');
    
    showMapPopup();
    setMapPopupTitle("Identify Map Layers");
    expandMapPopup();
    var content = "<div id='divMapIdentify' class='mapPopupSubContent'>Processing the identify location<br>"+idLatLong.x.toFixed(7)+", "+idLatLong.y.toFixed(7)+"<br><br>The map layer information will display momentarily.</div>"
    setMapPopupContent(content);
    dojo.disconnect(theGraphicsClickConnect);
}

function showIdentifyResults(results)
{
    var sIdLayers = ":::";
    var tidLayers = [];
    for (var i=0, il=results.length; i<il; i++) {
        var graphic = results[i].feature;
        var infoTemplate = new esri.InfoTemplate(results[i].layerName,"${*}");
        if (sIdLayers.indexOf(":::"+results[i].layerName+":::")==-1) {
            sIdLayers = sIdLayers + results[i].layerName + ":::";
            tidLayers.push(results[i].layerName);
        }
        graphic.setInfoTemplate(infoTemplate);
        var tempcont = graphic.getContent();
        tempcont = tempcont.slice(0,tempcont.lastIndexOf("<br/>"));
        idResults.push(results[i].layerName +":::"+ "<table cellspacing='0'><tr><td>"+tempcont.replace(/ = /gi,"</td><td>").replace(/<br\/>/gi,"</td></tr><tr><td>") +"</td></tr></table>");
        
    }
    idLayers = tidLayers.concat(idLayers);
    var layer = null;
    var currMapTab = getMapTab(currentMapView);
    var currMapLayers = null;
    if (currMapTab) currMapLayers = currMapTab.layer;
    if (currMapLayers != null)
    {
        for (ml in currMapLayers)
        {
            if (dojo.indexOf(idMapLayers,currMapLayers[ml].id)==-1) 
            {
                layer = jsMap.getLayer(currMapLayers[ml].id);
                break;
            }
        }
        if (layer)
        {
            var identifyParams = new esri.tasks.IdentifyParameters();
            var layerIds = identifyParams.layerIds = [];
            var ix, il;
            if (layer.declaredClass == "esri.layers.ArcGISDynamicMapServiceLayer") //if it is a dynamic layer
            {
                for(ix in layer.visibleLayers)
                {
                    layerIds.push(parseInt(layer.visibleLayers[ix]));
                }
            }
            else
            {
                for(il in layer.layerInfos)
                {
                if (layer.layerInfos[il].subLayerIds==null)
                    layerIds.push(layer.layerInfos[il].id);
                }
            }
            identifyParams.tolerance = 4;
            identifyParams.returnGeometry = false;
            identifyParams.geometry = idGeometry;
            identifyParams.layerOption = "all";
            identifyParams.height = jsMap.height;
            identifyParams.width = jsMap.width;
            identifyParams.mapExtent = jsMap.extent;

            var identify = new esri.tasks.IdentifyTask(layer.url);
            dojo.connect(identify, "onComplete", showIdentifyResults);

            esri.config.defaults.io.proxyUrl = "proxy.ashx";
            idMapLayers.push(layer.id);
            identify.execute(identifyParams);
        }
    }
    
    if (layer == null)
    {
        idMapLayers = [];
        idGeometry = null;
        esri.config.defaults.io.proxyUrl = null;
        theGraphicsClickConnect =  dojo.connect(jsMap.graphics, "onClick", clickIdGraphic);
        setIdContent(idLayers[0]);
    }
     
}

function setIdContent(curLayer)
{
    showLayer("BusyIndicator");
    
    var idTitle = "<span>"+idLatLong.x.toFixed(7)+", "+idLatLong.y.toFixed(7)+"</span><br>"
    idTitle = idTitle + "<span class='header'>Map Layer:</span><select class='layers' onchange='setIdContent(this.options[this.selectedIndex].value)' >"
    for (var ix=0, ilx= idLayers.length; ix<ilx; ix++) {
        idTitle = idTitle + "<option ";
        if (idLayers[ix]==curLayer) idTitle = idTitle + " selected ";
        idTitle = idTitle + " value='"+idLayers[ix]+"'>"+idLayers[ix]+"</option>";
    }
    idTitle = idTitle + "</select>";
    
    var idContent = "";
    for (var ir=0, irx = idResults.length; ir<irx; ir++) {
        var idTemp = idResults[ir].split(":::");
        if (idTemp[0] == curLayer)
        {
            idContent = idContent+idTemp[1]+"<br/>"
        }    
    }
//    jsMap.infoWindow.setTitle(idTitle);
//    jsMap.infoWindow.setContent(idContent);
//    jsMap.infoWindow.show(jsMap.toScreen(idPoint),jsMap.getInfoWindowAnchor(jsMap.toScreen(idPoint)));
    
    showMapPopup();
    setMapPopupTitle("Identify Map Layers");
    expandMapPopup();
    var content = "<div id='divMapIdentifyHeader' class='mapPopupSubContent'>"+idTitle+"</div>"
    var content = content+"<div id='divMapIdentifyContent' class='mapPopupSubTable'>"+idContent+"</div>"
    setMapPopupContent(content);  
    var divIdContent = document.getElementById('divMapIdentifyContent');
    if (divIdContent.offsetHeight > jsMap.height-100) divIdContent.style.height=(jsMap.height-100)+"px";
    setAltRows('divMapIdentifyContent');
    window.setTimeout("setTableWidth('divMapIdentifyContent');",1);
    
    hideLayer("BusyIndicator");
}

function clickIdGraphic(gEvent)
{
    var g = gEvent.graphic;
    if (g.attributes.type)
    {    
        if(g.attributes.type == "identify") setIdContent(idLayers[0]);
    }
}

function clickLocGraphic(gEvent)
{
    var g = gEvent.graphic;
    currInfoWindowTitle = "";
    if (g.attributes.type)
    {    
        if(g.attributes.type == "location")
        {
            SetSelectedRow(mapResultset,g.attributes.id);
            currInfoWindowTitle = g.infoTemplate.title;
        }
    }
}
function setWinTitle(sTitle)
{
    jsMap.infoWindow.setTitle(sTitle);
    currInfoWindowTitle = sTitle;
} 

function selectFeatureByStringAttribute(val)
{
    var layer = document.getElementById("bbusMap_mapSelectURL").value;
    var id = document.getElementById("bbusMap_mapSelectID").value;
    var field = document.getElementById("bbusMap_mapSelectField").value;
    if(layer==""||field==""||id=="")return;
    layer = layer + "/" + id;
    
    showLayer("BusyIndicator");
    
    var queryTask = new esri.tasks.QueryTask(layer);
    //build query filter

    var query = new esri.tasks.Query();
    query.returnGeometry = true;
    query.where = field+" = '"+val+"'";
    queryTask.execute(query, function(featureSet){
        var results = [];
        for (var i=0, il=featureSet.features.length; i<il; i++) {
          
          results.push(featureSet.features[i]);
        }
        getSelectResults(results);
        });

}

function clearSelect()
{
    selResults = [];
    removeGraphicsByType("select");
    showMapPopup();
    setMapPopupTitle("Select");
    expandMapPopup();
    var content = "<div id='divMapSelect' class='mapPopupSubContent'>"+selResults.length+" features selected<br><a href='#' onclick='clearSelect();'>Clear Selection</a></div>"
    setMapPopupContent(content);
}

function showSelect()
{
    //clearSelect();
    showMapPopup();
    setMapPopupTitle("Select");
    expandMapPopup();
    var content = "<div id='divMapSelect' class='mapPopupSubContent'>Click on the map to select a feature.</div>"
    setMapPopupContent(content);
    
}

function doSelect(geometry)
{
    var layer = document.getElementById("bbusMap_mapSelectURL").value;
    var id = document.getElementById("bbusMap_mapSelectID").value;
    var field = document.getElementById("bbusMap_mapSelectField").value;
    if(layer==""||field==""||id=="")return;
    
    showLayer("BusyIndicator");
    
    var identifyParams = new esri.tasks.IdentifyParameters();
    identifyParams.tolerance = 1;
    identifyParams.returnGeometry = true;

    geometry.setSpatialReference(jsSR);
    identifyParams.geometry = geometry;
    identifyParams.layerOption = "LAYER_OPTION_ALL";
    identifyParams.mapExtent = jsMap.extent;
    identifyParams.height = jsMap.height;
    identifyParams.width = jsMap.width;

    var layerIds = identifyParams.layerIds = [];
    layerIds.push(parseInt(id));
    
    var identify = new esri.tasks.IdentifyTask(layer);
    dojo.connect(identify, "onComplete", function(identifyResults){
        var results = [];
        for (var i=0, il=identifyResults.length; i<il; i++) {
            results.push(identifyResults[i].feature);
        }
        getSelectResults(results);
        });

    
    esri.config.defaults.io.proxyUrl = "proxy.ashx";
    
    identify.execute(identifyParams);
    //activateMapTool('pan');
    
    showMapPopup();
    setMapPopupTitle("Select");
    expandMapPopup();
    var content = "<div id='divMapSelect' class='mapPopupSubContent'>Selecting...<br>The selected features will display momentarily.</div>"
    setMapPopupContent(content);
}

function getSelectResults(results)
{
    esri.config.defaults.io.proxyUrl = null;
    
    var field = document.getElementById("bbusMap_mapSelectField").value;
    for (var i=0, il=results.length; i<il; i++) {
        var graphic = results[i];
        var value = eval("graphic.attributes."+field);
        if (value == null) value="select"+(i+selResults.length);
        
        var inalready = false;
        for (var s=0, sl=selResults.length; s<sl; s++) {
            if (selResults[s].attributes.id == value)
            {
               inalready = true; 
               break;
            } 
        }
        if (inalready) continue;
        
        var attribs = {"id": value, "type":"select"};
        graphic.setAttributes(attribs);
        selResults.push(graphic);
    }
    
    
    showMapPopup();
    setMapPopupTitle("Select");
    expandMapPopup();
    var content = "<div id='divMapSelect' class='mapPopupSubContent'>"+selResults.length+" features selected<br><a href='#' onclick='clearSelect();'>Clear Selection</a>";
    var action = document.getElementById("bbusMap_mapSelectAction").value;
    var actionText = document.getElementById("bbusMap_mapSelectActionText").value;
    if(action != "") var content = content + "<br><br><a href='#' onclick='" + action +"'>"+actionText+"</a>";
    var content = content + "</div>";
    setMapPopupContent(content);
    
    showSelectResults();
    hideLayer("BusyIndicator");
}

function showSelectResults()
{
    removeGraphicsByType("select");
    if(selResults)
    {
        var symbol = new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_NONE, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_DASHDOT, new dojo.Color([255,0,0]), 2), new dojo.Color([255,255,0,0.25]));
        for (var i=0, il=selResults.length; i<il; i++) {
          var graphic = selResults[i];
          graphic.setSymbol(symbol);
          if (graphic.geometry!=null) jsMap.graphics.add(graphic);
        }
    }
}

function hideSelectResults()
{
    showSelectResults();
    
    showMapPopup();
    setMapPopupTitle("Select");
    expandMapPopup();
    var content = "<div id='divMapSelect' class='mapPopupSubContent'>"+selResults.length+" features selected<br><a href='#' onclick='clearSelect();'>Clear Selection</a>";
    var action = document.getElementById("bbusMap_mapSelectAction").value;
    var actionText = document.getElementById("bbusMap_mapSelectActionText").value;
    if(action != "") var content = content + "<br><br><a href='#' onclick='" + action +"'>"+actionText+"</a>";
    var content = content + "</div>";
    setMapPopupContent(content);
} 
    
function listSelectResults()
{
    showMapPopup();
    setMapPopupTitle("Select");
    expandMapPopup();
    var content = "<div id='divMapSelect' class='mapPopupSubContent'>"+selResults.length+" features selected<br><a href='#' onclick='clearSelect();'>Clear Selection</a> | <a href='#' onclick='showSelectResults();'>Show Selection</a>";
    var content = content + " | <a href='#' onclick='hideSelectResults()'>Hide List</a><br>";
    for (var s=0, sl=selResults.length; s<sl; s++) {
        var content = content + "<br><a href='#' onclick='gotoPropertyDetails(&quot;"+selResults[s].attributes.id+"&quot;)'>View "+selResults[s].attributes.id+"</a>"
    }
    var content = content + "</div>";
    setMapPopupContent(content);
}

function changeMapView(sMapView) {
    cancelWipeOut();
    wipeLayers('out',1);
    dojo.byId("divMapLayersList").innerHTML = "";
    currentMapView = sMapView;
    hideImageTiledLayers(sMapView);
    layersToShow = [];
    var showLayers = false;
    if (mapConfig != null)
    {
      for (m in mapConfig.layers.maptab)
      {
        var maptab = mapConfig.layers.maptab[m];
        if (maptab.id != sMapView) continue;
        for (l in maptab.layer)
        {
            layersToShow.push(maptab.layer[l].id);
        }
      }
    }
    jsMap.reorderLayer(sMapView, 0);

    for (var j=0, jl=jsMap.layerIds.length; j<jl; j++) 
    {
      var layer = jsMap.getLayer(jsMap.layerIds[j]);
      if (layer.id == sMapView) layer.show();
      else if (dojo.indexOf(layersToShow,layer.id)!=-1) 
      {
            buildLayerList(layer);
            layer.show();
            showLayers = true;
      }
    }
    if (showLayers) demoLayers();
}

function hideImageTiledLayers(sMapView) {
    for (var j=0, jl=jsMap.layerIds.length; j<jl; j++) {
      var layer = jsMap.getLayer(jsMap.layerIds[j]);
      if (sMapView != layer.id) {
        layer.hide();
      }
    }
}

function turnOffMapGraphics() {
    for (var j=0, jl=jsMap.graphicsLayerIds.length; j<jl; j++) {
      var layer = jsMap.getLayer(jsMap.graphicsLayerIds[j]);
      layer.hide();
    }
}
    

function getMapLayerById(sLayerId) {
    for (var j=0, jl=jsMap.layerIds.length; j<jl; j++) {
      var layer = jsMap.getLayer(jsMap.layerIds[j]);
      if (sLayerId == layer.id) {
        return layer;
      }
    }
    return null;
}

function buildLayerList(layer) 
{
    if (layer.declaredClass == "esri.layers.ArcGISDynamicMapServiceLayer") //if there is a dynamic layer
    {  
    var infos = layer.layerInfos, info;
    var items = [];
    var visible = [];
    for (var i=0, il=infos.length; i<il; i++) {
      info = infos[i];
      if (info.parentLayerId == -1 && dojo.indexOf(layer.visibleLayers,info.id)!=-1) {
        visible.push(info.id);
        if (info.subLayerIds != null)
            visible = visible.concat(info.subLayerIds);
        items.push("<input type='checkbox' class='layer_list_item' checked='checked' id='" + info.id + "' onclick='updateLayerVisibility(&quot;"+layer.id+"&quot;);' /><label for='" + info.id + "'>" + info.name + "</label>");
      }
      else if (info.parentLayerId == -1)
        items.push("<input type='checkbox' class='layer_list_item' id='" + info.id + "' onclick='updateLayerVisibility(&quot;"+layer.id+"&quot;);' /><label for='" + info.id + "'>" + info.name + "</label>");
    }
    if (items.length > 0) dojo.byId("divMapLayersList").innerHTML = items.join("<br>");
    else dojo.byId("divMapLayersList").innerHTML = "";

    layer.setVisibleLayers(visible);
    }
    //jsMap.addLayer(layer);
}

function updateLayerVisibility(sLayerId) 
{
    cancelWipeOut();
    var layer = getMapLayerById(sLayerId);
    var inputs = dojo.query(".layer_list_item"), input;
    var visible = [];
    for (var i=0, il=inputs.length; i<il; i++) {
      if (inputs[i].checked) {
        visible.push(inputs[i].id);
      }
    }
    layer.setVisibleLayers(visible);
}

function gotoPropertyOnMap(x,y,strPropertyId)
{
    currPropId = strPropertyId;
	currPropX = x;
	currPropY = y;
	currPropGraphic = getGraphicById(currPropId);
	
	//zoomToPoint(x,y);
	//window.setTimeout('zoomPopUp('+strPropertyId+')',100);
    
	// load Property Details
	if (strPropertyId)
	{
	//    __doPostBack('bbusPropertyDetails$updatePropertyDetails', 'Event=updatePropertyDetails&strPropertyId='+strPropertyId+'&MapEvent=ZoomPoint&x='+ x +'&y='+ y);
        __doPostBack('bbusPropertyDetails$updatePropertyDetails', 'Event=updatePropertyDetails&strPropertyId='+strPropertyId);
        GACTTrack("Property Details");
    
    }
    
	// show "loading..." display

	// go to Property Details page
	selectRadTab('Details');
	selectRadTab('Description');
}

function queryFeature(val)
{
    //alert(val);
    showLayer("BusyIndicator");
    
    var layer = document.getElementById("bbusMap_mapHighlightURL").value;
    var field = document.getElementById("bbusMap_mapHighlightField").value;
        if(layer!=""&&field!="")
        {
            var queryTask = new esri.tasks.QueryTask(layer);
            //build query filter
        
            var query = new esri.tasks.Query();
            query.returnGeometry = true;
            query.where = field+" IN ('"+val.replace(/, /g,",").replace(/,/g,"','")+"')";
            queryTask.execute(query, highlightFeature);

        }
        else 
        {    
            hideLayer("BusyIndicator");
        }
    
}

function highlightFeature(featureSet)
{
    if(featureSet)
    {
    
    currfeatureSet = featureSet;
        
    theGraphicsClearConnect = dojo.connect(jsMap.graphics, "onGraphicsClear", function(){
        dojo.disconnect(theGraphicsClearConnect);
        //alert("Results Found");
        var symbol = new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_NONE, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_DASHDOT, new dojo.Color([255,0,0]), 2), new dojo.Color([255,255,0,0.25]));
            
        var adding = false;
        for (var i=0, il=currfeatureSet.features.length; i<il; i++) {
          
          //Get the current feature from the featureSet.
          //Feature is a graphic
          var graphic = currfeatureSet.features[i];
          graphic.setSymbol(symbol);

          //Set the infoTemplate.
          //graphic.setInfoTemplate(infoTemplate);

          //Add graphic to the map graphics layer.
          if (graphic.geometry!=null) 
          {
            if (graphic.geometry.rings[0][0] != null) 
            {    
                theGraphicAddConnect = dojo.connect(jsMap.graphics, "onGraphicAdd", function(){
                    dojo.disconnect(theGraphicAddConnect);
                    adding = false;
                    });
                adding = true;
                jsMap.graphics.add(graphic);
            }
          }
        }
        while (adding)
        {
            var x = 0;
        }
        jsMap.graphics.add(currPropGraphic);
        });

    }
    else
    {
    theGraphicsClearConnect = dojo.connect(jsMap.graphics, "onGraphicsClear", function(){
        dojo.disconnect(theGraphicsClearConnect);
        jsMap.graphics.add(currPropGraphic);
        });
    }
    
    window.setTimeout('jsMap.graphics.clear();',10);
          //showMapPoints();
    hideLayer("BusyIndicator");
    
}

function bufferPoint(thegraphic,thedistance,theunit)
{
    //var layer = document.getElementById("bbusMap_mapHighlightURL").value;
    var mapGsvc = document.getElementById("bbusMap_mapGeometryService").value;
    if (mapGsvc == "") mapGsvc = "http://maps.binarybus.net/arcgis/rest/services/Geometry/GeometryServer";
    if(gsvc == null) gsvc = new esri.tasks.GeometryService(mapGsvc);
      
    showLayer("BusyIndicator");
    
      var params = new esri.tasks.BufferParameters();
      params.features = [ thegraphic ];

      params.distances = [ thedistance ];
      
      if(theunit!=null)
      {
        if(theunit=="miles")    params.unit = esri.tasks.BufferParameters.UNIT_STATUTE_MILE;
        if(theunit=="km")    params.unit = esri.tasks.BufferParameters.UNIT_KILOMETER;
      }
      params.bufferSpatialReference = jsMap.spatialReference;
      params.outSpatialReference = jsMap.spatialReference;

    theBufferConnect = dojo.connect(gsvc, "onBufferComplete", showBuffer);
    gsvc.buffer(params);

}

function showBuffer(features)
{
    var symbol = new esri.symbol.SimpleFillSymbol(
        esri.symbol.SimpleFillSymbol.STYLE_SOLID,
        new esri.symbol.SimpleLineSymbol(
        esri.symbol.SimpleLineSymbol.STYLE_SOLID,
        new dojo.Color([255,0,0,0.65]), 2
        ),
        new dojo.Color([255,0,0,0.05])
        );
        
    jsMap.graphics.clear();
    
    
    var newExtent = null;
    var bufGraphics = features[0];
    bufGraphics.setSymbol(symbol);
    bufGraphics.attributes = { "id":"buffer", "type":"buffer" };
    newExtent = bufGraphics.geometry.getExtent();//.expand(1.5);
    jsMap.graphics.add(bufGraphics);
    
    
    //showMapPoints();
    jsMap.graphics.add(currPropGraphic);
    if(newExtent)    
       jsMap.setExtent(newExtent.expand(2));
    
    hideLayer("BusyIndicator");
    
}

function geocodeAddress(sStAdd,sStInt,sZip)
{
    showLayer("BusyIndicator");
    
    jsMap.graphics.clear();
    
    var valStAdd, valStInt, valZip;
    inStAdd = document.getElementById("bbusSearchForm_criteria"+sStAdd);
    inStInt= document.getElementById("bbusSearchForm_criteria"+sStInt);
    inZip = document.getElementById("bbusSearchForm_criteria"+sZip);
    if (inStAdd == null) valStAdd = "";
    else valStAdd = inStAdd.value;
    if (inStInt == null) valStInt = "";
    else valStInt = inStInt.value;
    if (inZip == null) valZip = "";
    else valZip = inZip.value;
    if (valStInt.length > 0) valStAdd = valStAdd + " @ "+valStInt;
    
    var mapGLoc = document.getElementById("bbusMap_mapLocatorService").value;
    if (mapGLoc == "") return;
    if(gloc == null) gloc = new esri.tasks.Locator(mapGLoc);
    //dojo.connect(gloc, "onAddressToLocationsComplete", showGeocodeResults);

    var address = {
      Street : valStAdd,
      Zone: valZip
    };
    gloc.addressToLocations(address,null,showGeocodeResults);
    
}

function showGeocodeResults(candidates)
{
    var candidate;
    var hidXML = "";
    for (var i=0, il=candidates.length; i<il&&i<20; i++) {
        candidate = candidates[i];
        var attribs = { "id": "geocode"+i , "type": "geocode", "address": candidate.address.replace("&","@"), "score":candidate.score, "x": candidate.location.x, "y":candidate.location.y }
        hidXML = hidXML + "<Table><LINK_ID>"+attribs.id+"</LINK_ID><LINK_X>"+attribs.x+"</LINK_X><LINK_Y>"+attribs.y+"</LINK_Y><LINK_PID>"+attribs.id+"</LINK_PID><QUICK_1>"+attribs.address+"</QUICK_1><QUICK_2>Score: "+attribs.score+"%</QUICK_2><QUICK_3>"+attribs.address+"</QUICK_3></Table>";
    }
    if (candidates.length > 0)
    {
        hidXML = "<NewDataSet>"+hidXML+"</NewDataSet>";
        document.getElementById("bbusSearchResults_hiddenResultsXML").value = hidXML;
        doXML();
    }
    else
    {
        clearResults();
        showNoResults();
    }

    hideLayer("BusyIndicator");
}

function zoomToPoint(thex,they)
{
    if(thex==null||they==null)return;
    var mapPropZoom = document.getElementById("bbusMap_mapPropertyZoomLevel").value;
    if (mapPropZoom == null) mapPropZoom = "8";
    var mapLevel = parseInt(mapPropZoom);
    
    showLayer("BusyIndicator");
    //var mapOffset = ((mapmaxy-mapminy)*.01)
    var pt_point = new esri.geometry.Point(thex, they, jsSR);
    
    jsMap.centerAndZoom(pt_point, mapLevel);
}
    

function ZoomResultSet(resultset, page){
    showLayer("BusyIndicator");
    selectRadTab('Map');
    
	//disableRadTab("Property");
	//if (mapisvisible)
    //	__doPostBack('bbusMap_MapProcessPanel', 'MapEvent=ZoomResultSet&ResultSet='+resultset+'&Page='+page);
    
    setExtent(mapResultsExtent[0],mapResultsExtent[1],mapResultsExtent[2],mapResultsExtent[3]);
    mapResultset = resultset;
    jsMap.graphics.clear();
    jsMap.infoWindow.hide();
    window.setTimeout('showMapPoints();',50);
}

function setExtent(xmin,ymin,xmax,ymax)
{
    var newExtent = new esri.geometry.Extent(xmin, ymin, xmax, ymax, jsSR) 
    jsMap.setExtent(newExtent,true);
}

function ZoomMapFull(){
    showLayer("BusyIndicator");
    //jsNav.zoomToFullExtent();  //this appears buggy - requires map object to be called "map"?
    var mapInitExtent = document.getElementById("bbusMap_mapInitExtent").value.split(",");
    var iExtent;
    if (mapInitExtent.length == 4)
    {
        iExtent = new esri.geometry.Extent(parseFloat(mapInitExtent[0]),parseFloat(mapInitExtent[1]),parseFloat(mapInitExtent[2]),parseFloat(mapInitExtent[3]));
    }
    else
    {
        var layer = jsMap.getLayer(jsMap.layerIds[0]);
        iExtent = layer.fullExtent;
    }
   jsMap.setExtent(iExtent);
}

function Pan(direction){
    switch(direction)
    {
      case "N":
        jsMap.panUp();
        break;
      case "S":
        jsMap.panDown();
        break;
      case "E":
        jsMap.panRight();
        break;
      case "W":
        jsMap.panLeft();
        break;
    }
     
}   

function clearMap(){
    mapPoints = "";
    mapResultset = "";
    jsMap.graphics.clear();
    jsMap.infoWindow.hide();
    ZoomMapFull();
    //__doPostBack('MapProcessPanel', 'MapEvent=ClearMap');
    
}

//update map extent
function updateMapExtent(extentParams){
    var ext = extentParams.split(":");
    prevminx = mapminx;
    prevminy = mapminy;
    prevmaxx = mapmaxx;
    prevmaxy = mapmaxy;
    mapminx = parseFloat(ext[0]);
    mapminy = parseFloat(ext[1]);
    mapmaxx = parseFloat(ext[2]);
    mapmaxy = parseFloat(ext[3]);
}

function setMapPoints(resultset,extent,points)
{
    mapResultset = resultset;
    mapPoints = points;
   
    if(extent != null)
    {
        mapResultsExtent = extent;
        theExtentConnect = dojo.connect(jsMap, "onExtentChange", displayPoints);
            setExtent(mapResultsExtent[0],mapResultsExtent[1],mapResultsExtent[2],mapResultsExtent[3]);
    }
    else  displayPoints();
}

function displayPoints()
{
    dojo.disconnect(theExtentConnect);
    jsMap.infoWindow.hide();
    
    theGraphicsClearConnect = dojo.connect(jsMap.graphics, "onGraphicsClear", function(){
        dojo.disconnect(theGraphicsClearConnect);
        window.setTimeout('showMapPoints();',10);
        });
    
    window.setTimeout('jsMap.graphics.clear();',10);
    
}

function showMapPoints()
{
    if(mapPoints != "")
        PlotPoints(mapPoints);
}

function zoomPopUp(idgraphic)
{
    //var idgraphic = getGraphicById(id);
    
    if(idgraphic != null)
    {       queryFeature(idgraphic.attributes.pid);
            showPopUp(idgraphic,false,true);
            }
}

function getGraphicById(id)
{
    var i;
    var aGraphics = jsMap.graphics.graphics;
    var thegraphic = null;
    for(i in aGraphics)
    {
      if(aGraphics[i].attributes.id)
      {
        if(aGraphics[i].attributes.id == id)
        {            
            thegraphic = aGraphics[i];
        }
      }
    }
    return thegraphic;
}

function removeGraphicsByType(type)
{
    var i;
    var aGraphics = jsMap.graphics.graphics;
    var thegraphics = [];
    for(i in aGraphics)
    {
      if(aGraphics[i].attributes.type)
      {
        if(aGraphics[i].attributes.type == type)
        {            
            thegraphics.push(aGraphics[i]);
        }
      }
    }
    
    for(var g=0, ig=thegraphics.length; g<ig; g++)  {
        jsMap.graphics.remove(thegraphics[g]);
    }
}

function getPopUp(id, b_pan)
{
    var idgraphic = getGraphicById(id);
    if(idgraphic)
        showPopUp(idgraphic,b_pan,true);
}

function showPopUp(thegraphic, b_pan, blnShow)
{
    var b_setAnchor = false;
    currInfoWindowTitle = thegraphic.getTitle();
    jsMap.infoWindow.setTitle(currInfoWindowTitle);
    jsMap.infoWindow.setContent(thegraphic.getContent());
    popUpGraphic = thegraphic;
    if(thegraphic.geometry.type == 'point')
    {
        if((b_pan)&&((thegraphic.geometry.x>mapmaxx)||(thegraphic.geometry.x<mapminx)||(thegraphic.geometry.y>mapmaxy)||(thegraphic.geometry.y<mapminy)))
        { 
            b_setAnchor = true;
            theExtentConnect = dojo.connect(jsMap, "onExtentChange", function(){
                dojo.disconnect(theExtentConnect);
                jsMap.infoWindow.show(jsMap.toScreen(popUpGraphic.geometry),esri.dijit.InfoWindow.ANCHOR_LOWERLEFT);
                });
            jsMap.centerAt(thegraphic.geometry);
        }
    }
    if (blnShow)
    {
        if(b_setAnchor)  jsMap.infoWindow.show(jsMap.toScreen(thegraphic.geometry),esri.dijit.InfoWindow.ANCHOR_LOWERLEFT);
        else    jsMap.infoWindow.show(jsMap.toScreen(thegraphic.geometry),jsMap.getInfoWindowAnchor(jsMap.toScreen(thegraphic.geometry)));
    }
}

function PlotPoints(points) //points is a string composed of n number of "<x>||||<y>||||<id>||||<name>||||<n...>" coordinate sets separated by ";;;;"
{
    var maptip = document.getElementById("mapTip_"+mapResultset);
    if (maptip == null) return;
    
    pArray = points.split(";;;;");
    arraylength = pArray.length;
    var pt_graphic;
    var pt_symbol;
    var pt_point;
    var xcoord;
    var ycoord;
    var title;
    var att_id;
    var att_pid;
    var symbol_id;
    var symbol = "/App_Themes/BinaryBus/img/location_point.gif";
    var popcontent = "";
   
    var i;
    for(i in pArray)
    {
        pointsArray = pArray[i].split("||||");
        
        xcoord = parseFloat(parseIndexes(maptip.getAttribute("x"),pointsArray));
        ycoord = parseFloat(parseIndexes(maptip.getAttribute("y"),pointsArray));
        title = parseIndexes(maptip.getAttribute("title"),pointsArray);
        att_id = parseIndexes(maptip.getAttribute("att_id"),pointsArray);
        att_pid = parseIndexes(maptip.getAttribute("att_pid"),pointsArray);
        symbol_id = parseIndexes(maptip.getAttribute("symbol_id"),pointsArray);
        pt_point = new esri.geometry.Point(xcoord, ycoord, jsSR);
        
        if (symbol_id!=null)
            symbol = "/App_Themes/BinaryBus/img/location_point_"+symbol_id+".gif";
            
        pt_symbol = new esri.symbol.PictureMarkerSymbol(symbol,20,20);
        pt_graphic = new esri.Graphic(pt_point,pt_symbol);
        pt_graphic.attributes = { "type":"location", "id": att_id , "pid": att_pid };
        
        popcontent = "";
        popcontent = parseIndexes(maptip.innerHTML,pointsArray);     

        if (popcontent != "")    pt_graphic.infoTemplate = new esri.InfoTemplate(title,popcontent);
        jsMap.graphics.add(pt_graphic);
        
    }
}

function pointToGoogle(thex,they)
{
    var pt_point = new esri.geometry.Point(thex, they, jsSR);
    
    var mapGsvc = document.getElementById("bbusMap_mapGeometryService").value;
    if (mapGsvc == "") mapGsvc = "http://maps.binarybus.net/arcgis/rest/services/Geometry/GeometryServer";
    if(gsvc == null) gsvc = new esri.tasks.GeometryService(mapGsvc);
    var outSR = new esri.SpatialReference({ wkid: 4326});
    gsvc.project([ new esri.Graphic( pt_point ) ], outSR, function(features){
        showGoogle(features[0].geometry.x,features[0].geometry.y);
        
    });
}

function pointToBing(thex,they)
{
    var pt_point = new esri.geometry.Point(thex, they, jsSR);
    
    var mapGsvc = document.getElementById("bbusMap_mapGeometryService").value;
    if (mapGsvc == "") mapGsvc = "http://maps.binarybus.net/arcgis/rest/services/Geometry/GeometryServer";
    if(gsvc == null) gsvc = new esri.tasks.GeometryService(mapGsvc);
    var outSR = new esri.SpatialReference({ wkid: 4326});
    gsvc.project([ new esri.Graphic( pt_point ) ], outSR, function(features){
        showBing(features[0].geometry.x,features[0].geometry.y);
        
    });
}
 
function parseIndexes(value,pointsArray)
{
    var str = value;
    var repval = "";
    var rex = new RegExp("{.}","g");
    var result=rex.exec(str);
    while (result!=null) 
    {
        repval = "pointsArray["+result.toString().replace("{","").replace("}","")+"]";
        str = str.replace(result,eval(repval));
        result=rex.exec(str); 
    }
    return str;
}

function OnMapTabLoad(sender)
{
    currMapTitle = sender.SelectedTab.Text;
    tabstripMap = sender;
    tabstripMap.OnClientTabSelected = OnMapTabSelectedHandler;
}

function unselectMapTab(strTabText)
{
	var tab = tabstripMap.FindTabByText(strTabText);
	if (tab)
	{
		tab.UnSelect();
	}
}
function selectMapTab(strTabText)
{
	var tab = tabstripMap.FindTabByText(strTabText);
	if (tab)
	{
		tab.Enable();
		tab.Select();
	}
}

function OnMapTabSelectedHandler(sender, eventArgs)
{
    currMapTitle = eventArgs.Tab.Text;
	if (eventArgs.Tab.Value.length > 0)
	{
		eval(eventArgs.Tab.Value);
	}
}

function showLegend()
{
    mapminx = jsMap.extent.xmin;
    mapmaxx = jsMap.extent.xmax;
    mapminy = jsMap.extent.ymin;
    mapmaxy = jsMap.extent.ymax;
    mapw = jsMap.width;
    maph = jsMap.height;
    var mapurl;
    for (var j=0, jl=jsMap.layerIds.length; j<jl; j++) {
      var layer = jsMap.getLayer(jsMap.layerIds[j]);
      if (currentMapView == layer.id) {
        mapurl = layer.url;
      }
    }
    var mapname = currentMapView;
    var mapNames = document.getElementById("bbusMap_mapServiceMapNames").value;
    if (mapNames!= "")
    {
        var arrMapNames = mapNames.split(",");
	    var arrMapServices = document.getElementById("bbusMap_mapServices").value.split(",");
	    for (var am in arrMapServices)
	    {
	        if(arrMapServices[am]==currentMapView)
	            mapname = arrMapNames[am];
	    }
	}
    
    //__doPostBack('', 'MapEvent=PrintMap&MapURL='+mapurl+'&MapName='+currentMapView+'&MinX='+mapminx+'&MinY='+mapminy+'&MaxX='+mapmaxx+'&MaxY='+mapmaxy);
    var url = 'Dialogs/legend.aspx?MapTitle='+currMapTitle+'&MapURL='+mapurl+'&MapName='+mapname+'&MinX='+mapminx+'&MinY='+mapminy+'&MaxX='+mapmaxx+'&MaxY='+mapmaxy+'&MapW='+mapw+'&MapH='+maph;
    
    
    showMapPopup();
    setMapPopupTitle("Legend");
    expandMapPopup();
    var content = "<iframe id='iframeLegend' class='legendFrame' frameborder='0' src='"+url+"' ></iframe>"
    setMapPopupContent(content);
    GACTTrack("Map Legend");
}
function setMapPopupTitle(title)
{
    var mapPopupTitle = document.getElementById("mapPopupTitle");
    mapPopupTitle.innerHTML = title;
}
function setMapPopupContent(content)
{
    var divMapPopupContent = document.getElementById("divMapPopupContent");
    divMapPopupContent.innerHTML = content;
}
function showMapPopup()
{
    var divMapPopup = document.getElementById("divMapPopup");
    divMapPopup.className = "mapPopupShow";
}
function expandMapPopup()
{
    var divMapPopupContent = document.getElementById("divMapPopupContent");
    divMapPopupContent.className = "mapPopupContent"; 
    
    var divCollapse = document.getElementById("divCollapseMapPopup");
    divCollapse.onclick = collapseMapPopup;
    divCollapse.className = "collapse"
}
function collapseMapPopup()
{
    var divMapPopupContent = document.getElementById("divMapPopupContent");
    divMapPopupContent.className = "mapPopupHide"; 
    var divCollapse = document.getElementById("divCollapseMapPopup");
    divCollapse.onclick = expandMapPopup;
    divCollapse.className = "expand"
}
function hideMapPopup(reset)
{
    setMapPopupContent("");
    var divMapPopup = document.getElementById("divMapPopup");
    divMapPopup.className = "mapPopupHide";
    var mg = getGraphicById("measuregeometry");
    if (mg) jsMap.graphics.remove(mg);
    removeGraphicsByType("select");
    if(!reset) activateMapTool('pan');
}

function printMap()
{
    var d = new Date();
	
	mapminx = jsMap.extent.xmin;
    mapmaxx = jsMap.extent.xmax;
    mapminy = jsMap.extent.ymin;
    mapmaxy = jsMap.extent.ymax;
    mapw = jsMap.width;
    maph = jsMap.height;
    var srid = jsSR.wkid;
    var mapurl;
    for (var j=0, jl=jsMap.layerIds.length; j<jl; j++) {
      var layer = jsMap.getLayer(jsMap.layerIds[j]);
      if (currentMapView == layer.id) {
        mapurl = layer.url;
      }
    }
    
    var mapname = currentMapView;
    var mapNames = document.getElementById("bbusMap_mapServiceMapNames").value;
    if (mapNames!= "")
    {
        var arrMapNames = mapNames.split(",");
	    var arrMapServices = document.getElementById("bbusMap_mapServices").value.split(",");
	    for (var am in arrMapServices)
	    {
	        if(arrMapServices[am]==currentMapView)
	            mapname = arrMapNames[am];
	    }
	}
    
    var url = 'Dialogs/print_map.aspx?t='+d.getTime()+'&type=Map&MapURL='+mapurl+'&MapName='+mapname+'&MinX='+mapminx+'&MinY='+mapminy+'&MaxX='+mapmaxx+'&MaxY='+mapmaxy+'&MapW='+mapw+'&MapH='+maph+'&SRID='+srid;
    if (mapResultset == 'propertyDetails')
        url = url + '&x='+currPropX+'&y='+currPropY+'&pin='+currPropGraphic.attributes.pid;
    else
        url = url + '&ResultSet='+mapResultset;
    var pFrame = document.getElementById('iframePrintMap');
    pFrame.src = url;
    
    GACTTrack("Print Map");
}

function processCallbackResult(response, context) {
    if (response==null || response.length==0)
    {
        return;
    }
    
    var ov2 = null;
	var pairs = response.split("^^^");
	var actions;
	var o;
	var action;
    var controlType = "";
	var controlID = "";
	var responseItem = "";
	var validResponse = false;
	for (var i=0;i<pairs.length;i++)
	{
		actions = pairs[i].split(":::");
		responseItem = pairs[i];
		if (responseItem==null || responseItem.length==0) 
		    continue;
		controlType = actions[0].toLowerCase();
		controlID = actions[1];
		action = actions[2].toLowerCase();
		switch (controlType) {
		    case "map":
		        map2 = Maps[controlID];
                if (action=="changelevel") {
		            validResponse = true;
		            var minCol = (actions[13]==null) ? 0 : actions[13];
		            var minRow = (actions[14]==null) ? 0 : actions[14];  
					var resourceLimits = (actions[15]==null) ? "" : actions[15];
					var resourceMapping = (actions[16]==null) ? "": actions[16];
		            window.setTimeout("Maps['" + controlID + "'].setUpLevelGrid(" + actions[3] + "," + actions[4] + "," + actions[5] + "," + actions[6] + "," + actions[7] + "," + actions[8] + "," + actions[9] + "," + actions[10] + "," + actions[11] + "," + actions[12] + "," + minCol + "," + minRow + ", '" + resourceLimits + "', '" + resourceMapping + "');", 1);
		        } 
		        else if (action=="shiftgrid") {
		            validResponse = true;
		            window.setTimeout("Maps['" + controlID + "'].shiftGrid(" + actions[3] + "," + actions[4] + "," + actions[5] + "," + actions[6]  + ");", 1);
		        }
		        else if (action=="gettiles") {
		            validResponse = true;
		            window.setTimeout("Maps['" + controlID + "'].updateView(true);", 1);
		        }
		        else if (action=="cleargrid") {
		            validResponse = true;
					var resourceLimits = (actions[4]==null) ? "" : actions[4];
		            if (actions.length>3)
		                 window.setTimeout("Maps['" + controlID + "'].clearLevelGrid('" + actions[3] + "','" + resourceLimits + "');", 1);
		            else   
		                window.setTimeout("Maps['" + controlID + "'].clearLevelGrid(null,'" + resourceLimits + "');", 1);
		        }
		        else if (action=="tileserverurl") {
		            validResponse = true;
		            if (actions[3].toLowerCase()=="null") actions[3] = "";
		            map2.tileServerUrl = actions[3];
		        }
		        else if (action=="serverextentupdated") {
		            validResponse = true;
		            if (map2.overviewId!="") {
		                var ov_id = map2.overviewId;
                        ov2 = Overviews[ov_id];
                        if (ov2!=null) window.setTimeout("Overviews['" + ov_id + "'].getAOIBox();", 1);
                        ov2 = null;
                    }
		        }
		        map2.divObject.style.cursor = map2.cursor;  
	            map2=null;
		        break;
		    case "page":
		        page2 = Pages[controlID];
            if (action=="changeExtent") {
		            validResponse = true;
		        } 
		        else if (action=="shiftgrid") {
		            validResponse = true;
		        }
		        else if (action=="serverextentupdated") {
		            validResponse = true;
		        }
		        else if (action=="updateimage") {
		            validResponse = true;
		            if (actions[3].toLowerCase()=="null") actions[3] = "";
		            updateImage(actions[3]);
		        }
		        page2.divObject.style.cursor = page2.cursor;
	            page2=null;
		        break;
		    case "overviewmap":
		        ov2 = Overviews[controlID];
		        if (action=="aoiextent") {
		            validResponse = true;
                    window.setTimeout("Overviews['" + controlID + "'].parseUpdateString('" + responseItem + "');",0);
                }
	            ov2=null;
		        break;
		        
		    case "maptips":
		        maptipString = escape(responseItem);
		        validResponse = true;		        
   	            window.setTimeout("MapTipCollections['" + controlID + "'].addMapTips('" + maptipString + "');", 1000);
		        break;
		        
		    case "taskresults":
	            if (action=="content")
	            {
	                if ((actions.length==6 && esriTaskResultsCancelledJobs[actions[4]]==null) || actions.length==4)
	                {
	                    validResponse = true;
		                o = document.getElementById(controlID);
		                if (o != null) o.outerHTML = actions[3];
		            }
		            else if (actions.length==6)
		            {
		                // remove node if the job was cancelled
		                validResponse=true;
                        window.setTimeout("TreeViewPlusObjects['" + controlID + "'].clearNode('" + actions[5] + "');",0);
                        return; // ignore the map.Refresh stuff.
		            }
		        }
		        if (action=="showcallout")
		        {
		            validResponse = true;
		            showCallout(actions[3],actions[4],actions[5],actions[6]);
		        }
		        break;
		        
		    case "task":
		        break;
		    case "magnifier":
		        mag2 = FloatingPanels[controlID];
		        mag3 = esriMagnifiers[controlID];
		        map2 = Maps[mag3.mapBuddyId];
		        if (action=="mapimage") 
		        {
		            validResponse = true;
                	var imgObj = document.getElementById(actions[3]);
                	if (imgObj!=null) 
                	{
                		imgObj.src = actions[4];
                		imgObj.style.visibility = "visible";
                		if (actions.length>5) 
                		{
                    		if (mag2!=null) mag2.extentString = actions[5];
                    		var magcoord0 = map2.setDecimalDelimiter(Math.round(map2.setDecimalDelimiter(actions[5],esriJavaScriptDecimalDelimiter)* 1000)/1000);
                    		var magcoord1 = map2.setDecimalDelimiter(Math.round(map2.setDecimalDelimiter(actions[6],esriJavaScriptDecimalDelimiter)* 1000)/1000);
                    		var magcoord2 = map2.setDecimalDelimiter(Math.round(map2.setDecimalDelimiter(actions[7],esriJavaScriptDecimalDelimiter)* 1000)/1000);
                    		var magcoord3 = map2.setDecimalDelimiter(Math.round(map2.setDecimalDelimiter(actions[8],esriJavaScriptDecimalDelimiter)* 1000)/1000);
                			extString = "Extent: " + magcoord0 + ", " + magcoord1 + ", " + magcoord2 + ", " + magcoord3;
                			imgObj.alt = extString;
                			imgObj.title = extString;
                		}
                	}
                	if (mag3!=null) {
                        if (mag3.magnifierAOI!=null)
                            mag3.magnifierAOI.style.visibility = "hidden";
                        if (mag3.magnifierCrosshair!=null)
                            mag3.magnifierCrosshair.style.visibility = "hidden";
                    }
		        }
		        break;
		    case "measure":
		        validResponse = true;
		        if (actions[2]=="addpoint" || actions[2]=="coordinates") {
		            if (m_measureDisplay!=null) {
			            var md = document.getElementById(m_measureDisplay);
			            if (md!=null) md.innerHTML = actions[3];
			        }
		        }
		        break;
		    default:
		        break;
		}
		if (!validResponse)
		{
            if (action=="content") {
		        // content...response: ///:::elementId:::content:::html_content ....///=any character as place holder to split triple colons
	            validResponse = true;
		        o = document.getElementById(actions[1]);
		        if (o != null)
		        {
                    o.outerHTML=actions[3];
		        }
	        }
            else if (action=="innercontent") {
		        // content...response: ///:::elementId:::content:::html_content ....///=any character as place holder to split triple colons
	            validResponse = true;
		        o = document.getElementById(actions[1]);
		        if (o != null)
		        {
                    o.innerHTML=actions[3];
		        }
	        }
	        else if (action=="image")
	        {
	            validResponse = true;
		        o = document.images[actions[1]];
		        if (o != null)
		        {
		            o.src = actions[3];
		        }
		        else alert (actions[1] + " was null");
	        } 		
	        else if (action=="javascript") {
	            // javascript... response: ///:::///:::javascript:::javascript_content ... ///=any character as place holder to split triple colons
	            validResponse = true;
		        eval(actions[3]);
	        }
	        else if(response.length>0)
	        {
	            alert(response + "\nContext: " + context);
	        }
		}
		if (validResponse)
		{
		    //lastResponseReceivedTime=new Date();
		    validResponse=false;
		}
	}
}
