
//handle features returned by selection
//controls formatting, sorting, data download

function IMS2_ResultPane(id,mapid,pageSize,displayType,rowCssClass,altRowCssClass,headerCssClass,expandImagePath,collapseImagePath){
    var self = this;
    
    this.id = id;
    this.mapid = mapid;
    this.pageSize = pageSize;
    this.pageDelta = 2;
    this.displayType = displayType;
    this.rowCssClass = rowCssClass;
    this.altRowCssClass = altRowCssClass;
    this.headerCssClass = headerCssClass;
    this.expandImagePath = expandImagePath;
    this.collapseImagePath = collapseImagePath;
    this.currentIndex = 0;
    this.xmlReq;
    this.query = null;
    this.selectionBackup = null;
    
    
    function GetContainingDiv(){     
        return(document.getElementById("_mapresult_" + self.id));
    }
    this.GetContainingDiv = GetContainingDiv;
    
    function Reset(){
        self.currentIndex = 0;
    }
    this.Reset = Reset;
    
    
    
    //render drill is used to handle a request where features from multiple layers are selected
    //this is used throughout the app, even when only one layer is queried
    function RenderDrill(mapobj){
        if(mapobj){
            var div = self.GetContainingDiv();
            var features = mapobj.drilldownResultSet;
            self.query = mapobj.selection;
            var html = "";
            if(features){
                var rcc = ((self.rowCssClass)?(self.rowCssClass):(""));
                var rcca = ((self.altRowCssClass)?(self.altRowCssClass):(""));
                var tbstyle = ((features.length > 1)?("display:none;"):("display:block;"));
                var plusPath = ((features.length > 1)?("images/buttons/minus.gif"):("images/buttons/plus.gif"));
                for(var layeri = 0; layeri < features.length; layeri++){
                    var result = features[layeri];
                    var fields = result["Fields"];
                    var vals = result["Values"];
                    var oid = -1;
                    var l = mapobj.layers.Get(result["Layer"]);
                    
                    //find the unique id field
                    for(var j = 0;j< fields.length; j++){
						//if(fields[j] == "OBJECTID" || fields[j].indexOf("OBJECTID") > -1){
						//if(fields[j] == l.idField || fields[j].indexOf(l.idField) > -1 || fields[j].indexOf("#ID#") > -1){
						if(fields[j] == l.idField || fields[j].indexOf(l.idField) > -1 )
						{
							oid = j;
							break;
						}	
					}					
					
					//var oids = mapobj.layers.layers.Get(result["Layer"]).selectedOIDs;
					
					//keep track of features to download
					if(l.selectedOIDs){
						l.selectedOIDs.length = 0;
					}
					
                    //set up html to output
                    var layerhtml = "<div" + ((self.headerCssClass)?(" class=\"" + self.headerCssClass + "\""):("")) + " >";
                    layerhtml += "<table width=\"100%\" cellpadding=\"2\"><tr valign=\"middle\">";
                    //layerhtml += "<td align=\"left\"><img style=\"margin:0px 4px 0px 4px;\" id=\"_resulttoggleimg" + layeri + "\" src=\"" + plusPath + "\" onclick=\"IMS2_ResultPanes.ToggleInfoDisplay('" + self.id + "'," + layeri + ");\"/>"
                    layerhtml += "<td align=\"left\">"
                    + result["Layer"] + " (" + vals.length + ")";
                    
                    //print results list - removed for now
                    layerhtml +="</td><td align=\"right\" onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').PrintResults(null);\">Print Results List";
                    
                    //layerhtml += "<td align=\"right\">";
                    //layerhtml += "<table><tr>";
                    //layerhtml += "<td class=\"resultsAction\"><input class=\"textButton\" style=\"margin:0px;\" onmouseover=\"this.className='textButtonOver';\" onmouseout=\"this.className='textButton';\" type=\"button\" value=\"Select All\" onclick=\"IMS2_ResultPanes.Get('" + self.id + "').SelectAll('" + layeri + "',true);\"></td>";
                    //layerhtml += "<td class=\"resultsAction\"><input class=\"textButton\" style=\"margin:0px;\" onmouseover=\"this.className='textButtonOver';\" onmouseout=\"this.className='textButton';\" type=\"button\" value=\"Download\" onclick=\"IMS2_ResultPanes.Get('" + self.id + "').DownloadData('" + result["Layer"] + "','" + layeri + "');\"></td></tr></table>";
                    //layerhtml += "<td class=\"resultsAction\" onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').SelectAll('" + layeri + "',true);\" onmouseover=\"this.className='resultsActionOver';\" onmouseout=\"this.className='resultsAction';\">Select All</td>";
                    //layerhtml += "<td class=\"resultsAction\" onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').DownloadData('" + result["Layer"] + "','" + layeri + "');\" onmouseover=\"this.className='resultsActionOver';\" onmouseout=\"this.className='resultsAction';\">Download</td></tr></table></td>";                    
                    layerhtml += "</td></tr></table></div>";
                    
                    //field names
                    var tableheaderhtml = "<td class=\"resultsField\" align=\"center\" colspan=\"4\">&nbsp;</td>";
                    
                    
                    for(var fieldi = 0;fieldi < fields.length;fieldi++){
                        //var reFn = new RegExp(/<[^>]*>/);
                        //var fieldname = (reFn.exec(fields[fieldi]))?(reFn.exec(fields[fieldi])):(fields[fieldi]);
                        //alert(fieldname);
                        
                        //want to remove objectid from results table
                        if(fieldi == oid)
                        {
							continue;
                        }
                        
                        tableheaderhtml += "<td class=\"resultsField\" nowrap>"; 
                        tableheaderhtml += "<img style=\"padding-left: 2px;padding-right:4px;\" src=\"images/buttons/ascending_unsel.gif\"  alt=\"Sort Ascending (Low to High)\" onmouseover=\"this.src='images/buttons/ascending_sel.gif';\" onmouseout=\"this.src='images/buttons/ascending_unsel.gif';\"";
                        tableheaderhtml += " onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').SortField('" + layeri + "','" + result["Layer"] + "','" + fields[fieldi].replace(/<[^>]*>/g,"") + "','asc');\" >";
                        //tableheaderhtml += " onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').SortField('" + layeri + "','" + result["Layer"] + "','" + fieldname + "','asc');\" >";
                        tableheaderhtml += fields[fieldi];
                        tableheaderhtml += "<img style=\"padding-left: 4px;padding-right:2px;\" src=\"images/buttons/descending_unsel.gif\"  alt=\"Sort Descending (High to Low)\" onmouseover=\"this.src='images/buttons/descending_sel.gif';\" onmouseout=\"this.src='images/buttons/descending_unsel.gif';\"";
                        tableheaderhtml += " onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').SortField('" + layeri + "','" + result["Layer"] + "','" + fields[fieldi].replace(/<[^>]*>/g,"") + "','desc');\" >";
                        //tableheaderhtml += " onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').SortField('" + layeri + "','" + result["Layer"] + "','" + fieldname + "','desc');\" >";
                        tableheaderhtml += "</td>";
                    }
                    tableheaderhtml = "<tr valign=\"middle\">" + tableheaderhtml + "</tr>";
                    
                    var tdata = "";
                    
                    //field values
                    //for(var di = 0;di < vals.length; di++){
                    //alert(self.currentIndex);
                    //alert(self.pageSize);
                    for(var di = self.currentIndex * self.pageSize; di < (((self.currentIndex + 1) * self.pageSize) < (vals.length - 1)?((self.currentIndex + 1) * (self.pageSize)):(vals.length));di++){
                        var tr = "";
                        //tr += "<td class=\"resultsData\" align=\"center\"><input type=\"checkbox\" value=\"" + vals[di][oid] + "\"></input></td>";
                        tr += "<td class=\"resultsData\"";
                        tr += "onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').GetMoreInfo('" + layeri + "','" + result["Layer"] + "'," + vals[di][oid] + ");\">More Info...</td>";
                        tr += "<td class=\"resultsData\" onmouseover=\"showHoverMap('" + result["Layer"] + "'," + vals[di][oid] + ",window.event?window.event:event);\" onmouseout=\"document.getElementById('hoverMap').style.display='none';\" ";
                        tr += "onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').ZoomTo('" + result["Layer"] + "'," + vals[di][oid] + ");\">Map</td>";
                        //tr += "<td class=\"resultsData\" onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').SetAOI('" + result["Layer"] + "'," + vals[di][oid] + ");\">Set AOI</td>";
                        
                        //for adjoiners..
                        tr += "<td class=\"resultsData\" ";
                        tr += "onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').FindAdjoiners('" + result["Layer"] + "'," + vals[di][oid] + ");\">Adjoiners</td>";
                        
                        //print parcel information
                        tr += "<td class=\"resultsData\" ";
                        tr += "onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').PrintResults(null,'" + result["Layer"] + "'," + di + ");\">Print</td>";
                        
                        for(fi = 0;fi < fields.length;fi++){
                            var val = vals[di][fi];
                            
                            //want to remove objectid from results table
                            if(fi == oid)
                            {
								continue;
                            }
                            
                            tr += "<td class=\"resultsData\">" + ((val)?(val):("&nbsp;")) + "</td>";
                        }
                        
                        tdata += "<tr id=\"layer_" + layeri + "_feature_" + vals[di][oid] + "\" ";
                        tdata += "class=\"" + ((di % 2)?(rcc):(rcca)) + "\" onmouseover=\"this.className='resultsRowOver';\" onmouseout=\"this.className='" + ((di % 2)?(rcc):(rcca)) + "';\">" + tr + "</tr>";
                        
                        tdata += "<tr id=\"layer_" + layeri + "_featureDetail_" + vals[di][oid] + "\" class=\"trDetail\"><td  class=\"tdDetail\" colspan=\"" + (fields.length + 4) + "\" ><div id=\"div_" + layeri + "_featureDetail_" + vals[di][oid] + "\" style=\"margin:10px 5px 10px 20px;\"></div></td></tr>";
                        
                        l.selectedOIDs[l.selectedOIDs.length] = vals[di][oid];
                    }
                    
                    //paging controls
                    var tablepage = "";
                    //see if there are more than one page
                    //alert(vals.length);
                    //if(vals.length > self.pageSize)
                    //{
						tablepage += "<table width=\"500\" border=\"0\" cellspacing=\"0\" cellpadding=\"2\" id=\"_result_" + layeri + "_page_" + self.currentIndex + "\" class=\"resultsTable\" ><tr>";
					
						//get the current range
						var rangeMin = self.currentIndex * self.pageSize + 1;
						var rangeMax = (((self.currentIndex + 1) * self.pageSize) < vals.length)?((self.currentIndex + 1) * self.pageSize):(vals.length);
	                    var numberPages = Math.ceil(vals.length / self.pageSize);
	                    var curPage = self.currentIndex + 1;
	                    
						
	                    
	                    tablepage += "<td nowrap class=\"resultsData\">Records per Page <select style=\"font-family:Verdana, sans-serif;font-size: x-small;\" onchange=\"IMS2_ResultPanes.Get('" + self.id + "').pageSize=parseInt(this.value);IMS2_ResultPanes.Get('" + self.id + "').currentIndex=0;IMS2_ResultPanes.Get('" + self.id + "').RenderDrill(IMS2_MapManager.GetMap('" + self.mapid + "'));\">";
	                    tablepage += "<option value=\"10\" " + ((10 == self.pageSize)?("selected"):("")) + ">10</option>";
	                    tablepage += "<option value=\"20\" " + ((20 == self.pageSize)?("selected"):("")) + ">20</option>";
	                    tablepage += "<option value=\"50\" " + ((50 == self.pageSize)?("selected"):("")) + ">50</option>";
	                    tablepage += "<option value=\"100\" " + ((100 == self.pageSize)?("selected"):("")) + ">100</option>";
	                    tablepage += "</select>";
	                    
	                    //tablepage += curPage + " of " + numberPages + " pages.";
	                    
	                    tablepage += "</td><td nowrap class=\"resultsData\">Records " + rangeMin + " to " + rangeMax + " of " + vals.length + "</td><td width=\"30\">"; 
	                    
	                    if(numberPages > 1)
	                    {
							tablepage += "<td align=\"center\"><table><tr>";
							tablepage += "<td class=\"resultsData\" onmouseover=\"this.className='resultsDataOver';\" onmouseout=\"this.className='resultsData';\" onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').GotoPage(1);\">First</td>";
							tablepage += "<td class=\"resultsData\" onmouseover=\"this.className='resultsDataOver';\" onmouseout=\"this.className='resultsData';\" onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').GetPreviousPage();\">Prev</td>";
		                    
		                    var start = self.currentIndex - self.pageDelta;
		                    var end = self.currentIndex + self.pageDelta;
		                    
		                    
		                    if(start < 0)
		                    {
								start = 0;
		                    }
		                    if( (end - start) < (2* self.pageDelta + 1))
		                    {
								end = start + (2* self.pageDelta);
		                    }
		                    if(end > (numberPages - 1))
		                    {
								end = (numberPages - 1);
								start = end - (2* self.pageDelta);
		                    }
		                    if(start < 0)
		                    {
								start = 0;
		                    }
		                    
		                    //alert(start + ", " + end + ", " + self.currentIndex);
		                    
		                    for(var i = 0; i < (end - start + 1); i++)
		                    {
								if( (start + i) == self.currentIndex )
								{
									tablepage += "<td class=\"resultsData\" style=\"font-weight:bold;\" onmouseover=\"this.className='resultsDataOver';\" onmouseout=\"this.className='resultsData';\" onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').GotoPage(" + self.currentIndex + ");\">" + curPage + "</td>";
								}
								else
								{
									tablepage += "<td class=\"resultsData\" onmouseover=\"this.className='resultsDataOver';\" onmouseout=\"this.className='resultsData';\" onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').GotoPage(" + (start + i) + ");\">" + (start + i + 1) + "</td>";
								}	
		                    }
		                    		                    
		                    tablepage += "<td class=\"resultsData\" onmouseover=\"this.className='resultsDataOver';\" onmouseout=\"this.className='resultsData';\" onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').GetNextPage();\">Next</td>";
		                    tablepage += "<td class=\"resultsData\" onmouseover=\"this.className='resultsDataOver';\" onmouseout=\"this.className='resultsData';\" onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').GotoPage(" + (numberPages - 1) + ");\">Last</td>";
							tablepage += "</tr></table></td>";
	                    }
	                    
	                    tablepage += "</tr></table>";	                    
						
//						tablepage += "<td width=\"30\">";
//						
//						//get the previous page range, if not first page
//						if(self.currentIndex > 0)
//						{
//							//tablepage += "<td class=\"resultsData\" onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').GetPreviousPage();\">&lt;&lt; " + (rangeMin - self.pageSize) + " - " + (rangeMin - 1) + "</td>";
//							tablepage += "<input class=\"textButton\" onmouseover=\"this.className='textButtonOver';\" onmouseout=\"this.className='textButton';\" type=\"button\" value=\"&lt;&lt; " + (rangeMin - self.pageSize) + " - " + (rangeMin - 1) + "\" onclick=\"IMS2_ResultPanes.Get('" + self.id + "').GetPreviousPage();\" />";
//						}
//						else
//						{
//							tablepage += "&nbsp;";
//						}
//						
//						//get the next page range, if not last page
//						if(rangeMax < vals.length)
//						{
//							var fmax = ((rangeMax + self.pageSize) < vals.length)?((rangeMax + self.pageSize)):(vals.length);
//							//alert(fmax + ", " + rangeMax + ", " + self.pageSize + ", " + ((rangeMax + self.pageSize)));
//							//tablepage += "<td class=\"resultsData\" onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').GetNextPage();\">" + (rangeMax + 1) + " - " + fmax + " &gt;&gt;</td>";
//							tablepage += "<input class=\"textButton\" onmouseover=\"this.className='textButtonOver';\" onmouseout=\"this.className='textButton';\" type=\"button\" value=\"" + (rangeMax + 1) + " - " + fmax + " &gt;&gt;\" onclick=\"IMS2_ResultPanes.Get('" + self.id + "').GetNextPage();\" />";
//						}
//						else
//						{
//							tablepage += "&nbsp;";
//						}
//                    
//						tablepage += "</td></tr></table>";
						//alert(tablepage);
                    //}
                    
                    layerhtml += "<div id=\"div_result_" + layeri + "\"><table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" id=\"_result_" + layeri + "\" class=\"resultsTable\" >" + tableheaderhtml + tdata + "</table>" + tablepage + "</div>";
                    html += layerhtml;
                }
            }
            else
            {
				html = "No Records Found.  Please try again.";
            }
            div.innerHTML = html;
        }
    }
    this.RenderDrill = RenderDrill;
    
    
    //used to ouput other forms of results.  not used in this application
    function Render(mapobj){
        if(mapobj){
            if("Drill" == displayType){
                self.RenderDrill(mapobj);
            }    
            else{
                var div = self.GetContainingDiv();
                if(div && pageSize){
                    var html = 
                    "<div id=\"_mapresult_" + self.id + "_exportArea\" align=\"center\" style=\"font-size:smaller;\">Export to Excel<br/>"
                    + mapobj.featureResultSet.Values.length
                    + " features found in "
                    + mapobj.featureResultSet.Layer
                    + "</div><div id=\"_mapresult_" + self.id + "_data\">";
                    var rowhtml = "";
                    var tbodyhtml = "";
                    var fieldCount = mapobj.featureResultSet.Fields.length;
                    
                    var pridDispIndex = null;
                    var curLayer = mapobj.layers.Get(mapobj.featureResultSet.Layer);
                    var idFieldi = null;
                    
                    for(var fi = 0; fi < fieldCount; fi++){
                        var fid = mapobj.featureResultSet.Fields[fi];
                        if(fid == curLayer.primaryDisplay){
                            pridDispIndex = fi;
                        }
                        //if(fid == "OBJECTID"){
                        if(fid == curLayer.idField){
                            idFieldi = fi;
                        }
                    }
                    
                    var endIndex = mapobj.featureResultSet.Values.length < self.currentIndex + pageSize ? mapobj.featureResultSet.Values.length : self.currentIndex + pageSize;
                    if("Tabular" == displayType){
                       
                        html += "<table cellspacing=\"0\" cellpadding=\"0\"><tr"
                        if(self.headerCssClass)
                            html += " class=\"" + self.headerCssClass + "\"";
                        html += "><td colspan = \"" + mapobj.featureResultSet.Fields.length + "\">" + mapobj.featureResultSet.Layer + "</td></tr>"
                        html += "<tr>";
                        for(var i = 0; i < mapobj.featureResultSet.Fields.length; i++)
                        {
                            html += "<th>" + mapobj.featureResultSet.Fields[i] + "</th>";
                        }
                        html +=  "</tr>";

                        for(var i = self.currentIndex; i< endIndex ; i++)
                        {
                            rowhtml = "<tr";
                            
                            if(i%2==0 && self.rowCssClass)
                                rowhtml += " class=\"" + self.rowCssClass + "\"";
                            else if(i%2 != 0 && self.altRowCssClass)
                                rowhtml += " class=\"" + self.altRowCssClass + "\"";
                                
                            rowhtml += ">";
                            for(var j = 0; j< mapobj.featureResultSet.Fields.length; j++)
                            {
                                rowhtml += "<td>" + mapobj.featureResultSet.Values[i][j] + "</td>";
                            }
                            html += (rowhtml + "</tr>");
                        }
                        html += "</table>";
                    }
                    if("NameValue" == displayType)
                    {
                        
                        var rcc = ((self.rowCssClass)?(" class=\"" + self.rowCssClass + "\""):(""));
                        var rcca = ((self.altRowCssClass)?(" class=\"" + self.altRowCssClass + "\""):(""));
                        var tbstyle = ((mapobj.featureResultSet.Values.length > 1)?("display:none;"):("display:block;"));
                        var plusPath = ((mapobj.featureResultSet.Values.length > 1)?(self.expandImagePath):(self.collapseImagePath));
                        html += "<table cellspacing=\"0\" cellpadding=\"1\" width=\"100%\" >";
                        
                        for(var i = self.currentIndex; i < endIndex; i++){
                            var dataRow = mapobj.featureResultSet.Values[i];
                            tbodyhtml = "<tbody><tr><td colspan=\"2\"" + ((self.headerCssClass)?(" class=\"" + self.headerCssClass + "\""):("")) + ">"
                            + "<div style=\"float: left; text-align: left;\"><img id=\"_resulttoggleimg" + i + "\" src=\"" + plusPath + "\" onclick=\"IMS2_ResultPanes.ToggleInfoDisplay('" + self.id + "'," + i + ");\"/>"
                            + " " + mapobj.featureResultSet.Layer + ((pridDispIndex != null)?(": " + dataRow[pridDispIndex]):("")) + "</div><div style=\"float: right; text-align: right;\">"
                            + (
                                (idFieldi)?(
                                "<img id=\"_zoomto" + i + "\" src=\"" + plusPath + "\" onclick=\"IMS2_ResultPanes.ZoomToFeature('" + self.mapid + "'," + dataRow[idFieldi] + ",'" + mapobj.featureResultSet.Layer + "');\"/>"
                                ):("")
                            )
                            + "</div></td></tr></tbody><tbody id=\"_result" + i + "\" style=\"" + tbstyle + "\">";
                            rowhtml = "";
                            
                            for(var j = 0; j < fieldCount; j++)
                            {
                                rowhtml += "<tr" + 
                                    (
                                    (j%2==0)
                                    ?
                                    (rcc)
                                    :
                                    (rcca)
                                    )
                                    + "><td>" + mapobj.featureResultSet.Fields[j] + "</td><td>" + dataRow[j] + "</td></tr>";
                            }
                            html += (tbodyhtml + (rowhtml + "</tbody>"))
                        }
                        html += "</table>";
                        
                    }
                    html += "</div>";
//                    html += "<div align=\"center\" style=\"font-size:smaller;\"><span>Page "  + Math.ceil(endIndex / self.pageSize) + " of " + Math.ceil(mapobj.featureResultSet.Values.length / self.pageSize) + "</span><br/>";
//                    if(self.currentIndex >= self.pageSize)
//                        html += "<input type=\"button\" value=\"Prev\" onclick=\"IMS2_ResultPanes.GetPreviousPage('" + self.id + "'," + self.currentIndex + ");\"/>";
//                    if((self.currentIndex + pageSize) < mapobj.featureResultSet.Values.length)
//                        html += "<input type=\"button\" value=\"Next\" onclick=\"IMS2_ResultPanes.GetNextPage('" + self.id + "',"  + self.currentIndex + ");\"/>";
//                    html += "</div>";
                    div.innerHTML = html;
                }
            }
        }
    }
    this.Render = Render;
    
    function GetNextPage(){
        self.currentIndex ++;
        self.RenderDrill(IMS2_MapManager.GetMap(self.mapid));
    }
    this.GetNextPage = GetNextPage;
    
    function GetPreviousPage(){
        self.currentIndex --;
        self.RenderDrill(IMS2_MapManager.GetMap(self.mapid));
    }
    this.GetPreviousPage = GetPreviousPage;
    
    function GotoPage(index){
        self.currentIndex  = parseInt(index);
        self.RenderDrill(IMS2_MapManager.GetMap(self.mapid));
    }
    this.GotoPage = GotoPage;
    
    function ToggleInfoDisplay(elem){
        var elemid = "_result" + elem;
        var element = document.getElementById(elemid);
        var imgelement = document.getElementById("_resulttoggleimg" + elem);
        if(element && imgelement){  
            element.style.display == "none"  ? element.style.display = "" : element.style.display = "none";
            imgelement.src.indexOf(self.expandImagePath) == -1 ? imgelement.src = self.expandImagePath : imgelement.src = self.collapseImagePath;
           
        }
    }    
    this.ToggleInfoDisplay = ToggleInfoDisplay;
    
    
    //method to download data (selected features in results) at user request
    function DownloadData(lid,id){
		div = document.getElementById("_result_" + id);
		oids = new Array();
		
		if(div){
			arr = div.getElementsByTagName("input");
			var mapctl = ((IMS2_MapManager)?(IMS2_MapManager.GetMap(self.mapid)):(null));
			for(var i = 0; i < arr.length; i++){
				if(arr[i].checked)
					oids[oids.length] = arr[i].value;
			}
			if(oids.length < 1){
				var sel = window.confirm("You have no features selected from layer " + lid + " for download.\nWould you like to download all of the results for this layer?");
				if(sel){
					
					if(mapctl){
						oids = mapctl.layers.Get(lid).selectedOIDs;
					}
				}else{
					return;
				}
			}			
			//make the call to the web service
			var requestMade = false;
			if(null == self.xmlReq){
				self.xmlReq = IMS2_createXMLHTTPRequest();
				if(self.xmlReq){
					var url = ServicesURL + "datadownloadservice.asmx/DownloadData";
	                                
					var reqXMLString = new String("<DownloadSpecs outputType=\"shapefile\"><FeatureLayer sdeTableName=\"" + mapctl.layers.Get(lid).dataset + "\" OIDs=\"" + oids + "\" /></DownloadSpecs>");
					reqXMLString = reqXMLString.replace('%', '%25');
					self.xmlReq.onreadystatechange = self.ProcessDownloadData;
					self.xmlReq.open("POST", url, true);
					self.xmlReq.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
					self.xmlReq.send("downloadspecs=" + reqXMLString);
					requestMade = true;
					//self.UpdateLoadingFeedback();
				}
			}
			return(requestMade);
		}
    }
    this.DownloadData = DownloadData;
    
    function ProcessDownloadData(){
		if(self.xmlReq){
            if( self.xmlReq.readyState == 4 )
		    {
			    if( self.xmlReq.status == 200 )
			    {
			        if(self.xmlReq.responseXML.normalize){
			            self.xmlReq.responseXML.normalize();
			        }
			        var root = self.xmlReq.responseXML.documentElement;   
			        if(root.childNodes[0])
			        {
						try{
							eval("arr = " + root.childNodes[0].nodeValue + ";");
							for(var i = 0; i < arr.DOWNLOADS.length; i++)
							{
								var dl;
								dl = IMS2_Downloads.Add();
								dl.url = arr.DOWNLOADS[i].URL;
								dl.name = arr.DOWNLOADS[i].NAME;
							}
							IMS2_Tasks.Add("downloads");
			                    
						}catch(e){
		                    alert("Error packaging files for download.");
		                }
			        }
			        else
			        {
						alert("Error packaging files for download.");
					}	
			    }else{
			        alert("Connection error: " + self.xmlReq.status + "\n" + self.xmlReq.statusText + "\n" + self.xmlReq.responseText);
			    }
			    try{
			        self.xmlReq.abort();
			    }catch(e){;}
			    self.xmlReq = null;
			}
        }
    }
    this.ProcessDownloadData = ProcessDownloadData;
    
    
    //select all features for download
    function SelectAll(id,sel){
		div = document.getElementById("_result_" + id);
		oids = new Array();
		if(div){
			arr = div.getElementsByTagName("input");
			for(var i = 0; i < arr.length; i++){
				arr[i].checked = sel;
			}
		}
    }
    this.SelectAll = SelectAll;
    
    
    //sort results based on user-selected field
    function SortField(id,lid,field,asc){
		resultcurrentlayer = id;
		resultcurrentlayerID = lid;
		self.currentIndex = 0;
		var mapctl = ((IMS2_MapManager)?(IMS2_MapManager.GetMap(self.mapid)):(null));
		if(mapctl){
			var l = mapctl.layers.Get(lid);
		 
			//var q = "OBJECTID IN (" + l.selectedOIDs + ") ORDER BY " + l.GetFields().Find(field).name + " " + asc;
			var q = l.idField + " IN (" + l.selectedOIDs + ") ORDER BY " + l.GetFields().Find(field).name + " " + asc;
			//alert(q);
			//mapctl.DataQueryLayer("OBJECTID IN (" + l.selectedOIDs + ")",lid,false,l.GetFields().Find(field).name + " " + asc);
			
			var isShort = true;
			mapctl.customHandleFeatures = ProcessSortField;
			if(self.query){
				self.query.order = l.GetFields().Find(field).name + " " + asc;
				mapctl.RequestFeatures("<IMSXML><Identify layer=\"" + lid + ";\" short=\"" + isShort + "\">" + self.query.CreateQueryXML(null,self.query.buffer) + mapctl.CreateLayersXMLString(mapctl.layers,-1) + "</Identify></IMSXML>");
			}else{
				mapctl.DataQueryLayer(l.idField + " IN (" + l.selectedOIDs + ")",lid,false,l.GetFields().Find(field).name + " " + asc);
				mapctl.RequestSelectedFeatures(isShort);
			}
		}
	}
    this.SortField = SortField;
    
    
    function ProcessSortField(data,drill){		
		var l;
		var rcc = ((self.rowCssClass)?(self.rowCssClass):(""));
        var rcca = ((self.altRowCssClass)?(self.altRowCssClass):(""));
		var mapctl = ((IMS2_MapManager)?(IMS2_MapManager.GetMap(self.mapid)):(null));
		if(mapctl)
		{
			l = mapctl.layers.Get(resultcurrentlayerID);
			if(mapctl.drilldownResultSet)
			{
				mapctl.drilldownResultSet = data;
				var layerDataChunk = null;
				for(var li = 0; li < mapctl.drilldownResultSet.length; li++)
				{
					if(mapctl.drilldownResultSet[li].Layer == l.id)
					{
						layerDataChunk = mapctl.drilldownResultSet[li];
						break;
					}
				}
				if(null != layerDataChunk)
				{
					layerDataChunk = data[0];
				}
			}
		}
		data = data[0];
//		var result = features[layeri];
//        var fields = result["Fields"];
//        var vals = result["Values"];
		
		var fields = data["Fields"];
        var vals = data["Values"];
        var oid = -1;
        for(var j = 0;j< fields.length; j++){
			//if(fields[j] == "OBJECTID" || fields[j].indexOf("OBJECTID") > -1){
			if(fields[j] == l.idField || fields[j].indexOf(l.idField) > -1){
				oid = j;
				break;
			}	
		}
		var tableheaderhtml = "<td class=\"resultsField\" align=\"center\" colspan=\"4\">&nbsp;</td>";
        for(var fieldi = 0;fieldi < fields.length;fieldi++){
            
            //remove objectid
            if(fieldi == oid)
            {
				continue;
            }
            
            tableheaderhtml += "<td class=\"resultsField\" nowrap>"; 
            tableheaderhtml += "<img style=\"padding-left: 2px;padding-right:4px;\" src=\"images/buttons/ascending_unsel.gif\" alt=\"Sort Ascending (Low to High)\" onmouseover=\"this.src='images/buttons/ascending_sel.gif';\" onmouseout=\"this.src='images/buttons/ascending_unsel.gif';\"";
            tableheaderhtml += " onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').SortField('" + resultcurrentlayer + "','" + resultcurrentlayerID + "','" + fields[fieldi].replace(/<[^>]*>/g,"") + "','asc');\" >";
            tableheaderhtml += fields[fieldi];
            tableheaderhtml += "<img style=\"padding-left: 4px;padding-right:2px;\" src=\"images/buttons/descending_unsel.gif\" alt=\"Sort Descending (High to Low)\" onmouseover=\"this.src='images/buttons/descending_sel.gif';\" onmouseout=\"this.src='images/buttons/descending_unsel.gif';\"";
            tableheaderhtml += " onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').SortField('" + resultcurrentlayer + "','" + resultcurrentlayerID + "','" + fields[fieldi].replace(/<[^>]*>/g,"") + "','desc');\" >";
            tableheaderhtml += "</td>";
        }
        tableheaderhtml = "<tr valign=\"middle\">" + tableheaderhtml + "</tr>";
        
        var tdata = "";
        
        for(var di = self.currentIndex * self.pageSize; di < (((self.currentIndex + 1) * self.pageSize) < (vals.length - 1)?((self.currentIndex + 1) * (self.pageSize)):(vals.length));di++){
        //for(var di = 0;di < vals.length; di++){
            var tr = "";
            //tr += "<td class=\"resultsData\" align=\"center\"><input type=\"checkbox\" value=\"" + vals[di][oid] + "\"></input></td>";
            //tr += "<td class=\"resultsData\" onmouseover=\"showHoverMap('" + resultcurrentlayerID + "'," + vals[di][oid] + ",window.event?window.event:event);\">More info...</td>";
            tr += "<td class=\"resultsData\" ";
            tr += "onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').GetMoreInfo('" + resultcurrentlayer + "','" + resultcurrentlayerID + "'," + vals[di][oid] + ");\">More Info...</td>";
            tr += "<td class=\"resultsData\" onmouseover=\"showHoverMap('" + resultcurrentlayerID + "'," + vals[di][oid] + ",window.event?window.event:event);\" ";
            tr += "onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').ZoomTo('" + resultcurrentlayerID + "'," + vals[di][oid] + ");\">Map</td>";
            //tr += "<td class=\"resultsData\" onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').SetAOI('" + resultcurrentlayerID + "'," + vals[di][oid] + ");\">Set AOI</td>";
            
            //for adjoiners...
            tr += "<td class=\"resultsData\" ";
            tr += "onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').FindAdjoiners('" + resultcurrentlayerID + "'," + vals[di][oid] + ");\">Adjoiners</td>";
            
            //print parcel information
            tr += "<td class=\"resultsData\" ";
            tr += "onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').PrintResults(null,'" + resultcurrentlayerID + "'," + di + ");\">Print</td>";
            
            for(fi = 0;fi < fields.length;fi++){
                var val = vals[di][fi];
                
                //remove objectid
                if(fi == oid)
                {
					continue;
                }
                
                tr += "<td class=\"resultsData\">" + ((val)?(val):("&nbsp;")) + "</td>";
            }
            
            tdata += "<tr id=\"layer_" + resultcurrentlayer + "_feature_" + vals[di][oid] + "\" ";
            tdata += "class=\"" + ((di % 2)?(rcc):(rcca)) + "\" onmouseover=\"this.className='resultsRowOver';\" onmouseout=\"this.className='" + ((di % 2)?(rcc):(rcca)) + "';\">" + tr + "</tr>";
            
            tdata += "<tr id=\"layer_" + resultcurrentlayer + "_featureDetail_" + vals[di][oid] + "\" class=\"trDetail\"><td  class=\"tdDetail\" colspan=\"" + (fields.length + 4) + "\" ><div id=\"div_" + resultcurrentlayer + "_featureDetail_" + vals[di][oid] + "\" style=\"margin:10px 5px 10px 20px;\"></div></td></tr>";
        }
        
        //paging controls
                    var tablepage = "";
                    //see if there are more than one page
                    //alert(vals.length);
                    //if(vals.length > self.pageSize)
                    //{
						tablepage += "<table width=\"500\" border=\"0\" cellspacing=\"0\" cellpadding=\"2\" id=\"_result_" + resultcurrentlayer + "_page_" + self.currentIndex + "\" class=\"resultsTable\" ><tr>";
					
						//get the current range
						var rangeMin = self.currentIndex * self.pageSize + 1;
						var rangeMax = (((self.currentIndex + 1) * self.pageSize) < vals.length)?((self.currentIndex + 1) * self.pageSize):(vals.length);
	                    var numberPages = Math.ceil(vals.length / self.pageSize);
	                    var curPage = self.currentIndex + 1;
	                    
						
	                    
	                    tablepage += "<td nowrap class=\"resultsData\">Records per Page <select style=\"font-family:Verdana, sans-serif;font-size: x-small;\" onchange=\"IMS2_ResultPanes.Get('" + self.id + "').pageSize=parseInt(this.value);IMS2_ResultPanes.Get('" + self.id + "').currentIndex=0;IMS2_ResultPanes.Get('" + self.id + "').RenderDrill(IMS2_MapManager.GetMap('" + self.mapid + "'));\">";
	                    tablepage += "<option value=\"10\" " + ((10 == self.pageSize)?("selected"):("")) + ">10</option>";
	                    tablepage += "<option value=\"20\" " + ((20 == self.pageSize)?("selected"):("")) + ">20</option>";
	                    tablepage += "<option value=\"50\" " + ((50 == self.pageSize)?("selected"):("")) + ">50</option>";
	                    tablepage += "<option value=\"100\" " + ((100 == self.pageSize)?("selected"):("")) + ">100</option>";
	                    tablepage += "</select>";
	                    
	                    //tablepage += curPage + " of " + numberPages + " pages.";
	                    
	                    tablepage += "</td><td nowrap class=\"resultsData\">Records " + rangeMin + " to " + rangeMax + " of " + vals.length + "</td><td width=\"30\">"; 
	                    
	                    if(numberPages > 1)
	                    {
							tablepage += "<td align=\"center\"><table><tr>";
							tablepage += "<td class=\"resultsData\" onmouseover=\"this.className='resultsDataOver';\" onmouseout=\"this.className='resultsData';\" onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').GotoPage(1);\">First</td>";
							tablepage += "<td class=\"resultsData\" onmouseover=\"this.className='resultsDataOver';\" onmouseout=\"this.className='resultsData';\" onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').GetPreviousPage();\">Prev</td>";
		                    
		                    var start = self.currentIndex - self.pageDelta;
		                    var end = self.currentIndex + self.pageDelta;
		                    
		                    
		                    if(start < 0)
		                    {
								start = 0;
		                    }
		                    if( (end - start) < (2* self.pageDelta + 1))
		                    {
								end = start + (2* self.pageDelta);
		                    }
		                    if(end > (numberPages - 1))
		                    {
								end = (numberPages - 1);
								start = end - (2* self.pageDelta);
		                    }
		                    if(start < 0)
		                    {
								start = 0;
		                    }
		                    
		                    //alert(start + ", " + end + ", " + self.currentIndex);
		                    
		                    for(var i = 0; i < (end - start + 1); i++)
		                    {
								if( (start + i) == self.currentIndex )
								{
									tablepage += "<td class=\"resultsData\" style=\"font-weight:bold;\" onmouseover=\"this.className='resultsDataOver';\" onmouseout=\"this.className='resultsData';\" onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').GotoPage(" + self.currentIndex + ");\">" + curPage + "</td>";
								}
								else
								{
									tablepage += "<td class=\"resultsData\" onmouseover=\"this.className='resultsDataOver';\" onmouseout=\"this.className='resultsData';\" onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').GotoPage(" + (start + i) + ");\">" + (start + i + 1) + "</td>";
								}	
		                    }
		                    		                    
		                    tablepage += "<td class=\"resultsData\" onmouseover=\"this.className='resultsDataOver';\" onmouseout=\"this.className='resultsData';\" onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').GetNextPage();\">Next</td>";
		                    tablepage += "<td class=\"resultsData\" onmouseover=\"this.className='resultsDataOver';\" onmouseout=\"this.className='resultsData';\" onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').GotoPage(" + (numberPages - 1) + ");\">Last</td>";
							tablepage += "</tr></table></td>";
	                    }
	                    
	                    tablepage += "</tr></table>";
        
//        //paging controls
//        var tablepage = "";
//        //see if there are more than one page
//        //alert(vals.length);
//        //alert(self.pageSize);
//        if(vals.length > self.pageSize)
//        {
//			tablepage += "<table width=\"500\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" id=\"_result_" + resultcurrentlayer + "_page_" + self.currentIndex + "\" class=\"resultsTable\" ><tr>";
//					
//			//get the current range
//			var rangeMin = self.currentIndex * self.pageSize + 1;
//			var rangeMax = (((self.currentIndex + 1) * self.pageSize) < vals.length)?((self.currentIndex + 1) * self.pageSize):(vals.length);
//            
//			tablepage += "<td width=\"30\">";
//			
//			//get the previous page range, if not first page
//			if(self.currentIndex > 0)
//			{
//				//tablepage += "<td class=\"resultsData\" onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').GetPreviousPage();\">&lt;&lt; " + (rangeMin - self.pageSize) + " - " + (rangeMin - 1) + "</td>";
//				tablepage += "<input class=\"textButton\" onmouseover=\"this.className='textButtonOver';\" onmouseout=\"this.className='textButton';\" type=\"button\" value=\"&lt;&lt; " + (rangeMin - self.pageSize) + " - " + (rangeMin - 1) + "\" onclick=\"IMS2_ResultPanes.Get('" + self.id + "').GetPreviousPage();\" />";
//			}
//			else
//			{
//				tablepage += "&nbsp;";
//			}
//            
//            tablepage += "</td><td width=\"*\" class=\"resultsData\">Records " + rangeMin + " to " + rangeMax + " of " + vals.length + "</td><td width=\"30\">"; 
//            
//			//get the next page range, if not last page
//			if(rangeMax < vals.length)
//			{
//				var fmax = ((rangeMax + self.pageSize) < vals.length)?((rangeMax + self.pageSize)):(vals.length);
//				//tablepage += "<td class=\"resultsData\" onmousedown=\"IMS2_ResultPanes.Get('" + self.id + "').GetNextPage();\">" + (rangeMax + 1) + " - " + fmax + " &gt;&gt;</td>";
//				tablepage += "<input class=\"textButton\" onmouseover=\"this.className='textButtonOver';\" onmouseout=\"this.className='textButton';\" type=\"button\" value=\"" + (rangeMax + 1) + " - " + fmax + " &gt;&gt;\" onclick=\"IMS2_ResultPanes.Get('" + self.id + "').GetNextPage();\" />";
//			}
//			else
//			{
//				tablepage += "&nbsp;";
//			}
//        
//			tablepage += "</td></tr></table>";
//			
//        }
        
		div = document.getElementById("div_result_" + resultcurrentlayer);
		div.innerHTML = "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" id=\"_result_" + resultcurrentlayer + "\" class=\"resultsTable\" >" + tableheaderhtml + tdata + "</table>" + tablepage;
		
		// unhook
		var mapctl = ((IMS2_MapManager)?(IMS2_MapManager.GetMap(self.mapid)):(null));
		if(mapctl){
			mapctl.customHandleFeatures = null;
		}		
    }
    this.ProcessSortField = ProcessSortField;
    
    //return detailed info about a feature
    function GetMoreInfo(id,lid,oid){
		
		resultcurrentOID = oid;
		resultcurrentlayer = id;
		resultcurrentlayerID = lid;		
		
		var div = document.getElementById("layer_" + resultcurrentlayer + "_featureDetail_" + resultcurrentOID);
		if(div.style.display == "block"){
			div.style.display = "none";
			return;
		}		
		
		var mapctl = ((IMS2_MapManager)?(IMS2_MapManager.GetMap(self.mapid)):(null));
		if(mapctl){
			var l = mapctl.layers.Get(lid);
			//mapctl.DataQueryLayer("OBJECTID IN (" + oid + ")",lid,false,null);
			self.selectionBackup = mapctl.selection;
			mapctl.selection = new IMS2_SelectionGroup();
			mapctl.DataQueryLayer(l.idField + " IN (" + oid + ")",lid,false,null,false);
			mapctl.customHandleFeatures = ProcessGetMoreInfo;
			mapctl.RequestSelectedFeatures(false);
		}
	}
    this.GetMoreInfo = GetMoreInfo;
    
    function ProcessGetMoreInfo(data,drill){
		html = "";		
		
		//var result = features[layeri];
        var fields = data["Fields"];
        var vals = data["Values"];
        var oid = -1;
        var mapobj = ((IMS2_MapManager)?(IMS2_MapManager.GetMap(self.mapid)):(null));
        var l = mapobj.layers.Get(data["Layer"]);
		
		for(var i = 0; i < fields.length; i++){
			//remove objectid
			if(fields[i] == l.idField || fields[i].indexOf(l.idField) > -1 )
			{
				continue;
			}
			
			var cls = ((i % 2)?("resultsEvenRow"):("resultsOddRow"))
			html += "<tr class=\"" + cls + "\" onmouseover=\"this.className='resultsRowOver';\" onmouseout=\"this.className='" + cls + "';\">";
			html += "<td class=\"detailField\">" + fields[i] + "</td><td class=\"detailData\">" + vals[0][i] + "</td></tr>";
			
			
		}
		
		//thtml = "<table id=\"div_" + resultcurrentlayer + "_featureDetail_" + oid + "\">";
		html = "<table cellpadding=\"0\" cellspacing=\"0\" id=\"table_" + resultcurrentlayer + "_featureDetail_" + resultcurrentOID + "\" class=\"detailTable\">" + html + "</table>";		
		var tr = document.getElementById("layer_" + resultcurrentlayer + "_featureDetail_" + resultcurrentOID);
		var div = document.getElementById("div_" + resultcurrentlayer + "_featureDetail_" + resultcurrentOID);
		div.innerHTML = html;
		tr.style.display = "block";
		
		// unhook
		var mapctl = ((IMS2_MapManager)?(IMS2_MapManager.GetMap(self.mapid)):(null));
		if(mapctl){
			mapctl.customHandleFeatures = null;
			mapctl.selection = self.selectionBackup;
			self.selectionBackup = null;
		}
    }
    this.ProcessGetMoreInfo = ProcessGetMoreInfo;
    
    function ZoomTo(lid,oid){
		var mapctl = ((IMS2_MapManager)?(IMS2_MapManager.GetMap(self.mapid)):(null));
		if(null != mapctl){
			var l = mapctl.layers.Get(lid);
			//mapctl.DataQueryLayer("OBJECTID in (" + oid + ")",lid,false,null);						
			mapctl.DataQueryLayer(l.idField + " in (" + oid + ")",lid,false,null);						
			mapctl.ZoomToFeatures(lid,[oid]);
			selectMapTab("map");
		}
    }
    this.ZoomTo = ZoomTo;
    
    function FindAdjoiners(lid,oid){
		var mapctl = ((IMS2_MapManager)?(IMS2_MapManager.GetMap(self.mapid)):(null));
		if(null != mapctl){
			var l = mapctl.layers.Get(lid);
			mapctl.DataQueryLayer(l.idField + " in (" + oid + ")",lid,false,null);
			mapctl.selection.sels[0].buffer = 0.001;
			mapctl.selection.sels[0].target = lid;
			mapctl.RequestSelectedFeaturesDrill(null,true);
			mapctl.ZoomToSelection(lid);
		}
    }
    this.FindAdjoiners = FindAdjoiners;
    
    function PrintResults(results,layer,rownum)
    {
        var mapobj = ((IMS2_MapManager)?(IMS2_MapManager.GetMap(self.mapid)):(null));
        var printRes = null;
        if(null == results && mapobj)
        {
            results = mapobj.drilldownResultSet
        }
        if(results)
        {
            if(layer)
            {
                var layeri = -1;
                for(var i = 0; i < results.length ;i++)
                {
                    if(results[i]["Layer"] == layer)
                    {
                        layeri = i;
                        break;
                    }
                }
                if(layeri >= 0){
                    if(rownum || 0 == rownum)
                    {
                        // specific feature
                        if(mapobj){
                            var l = mapobj.layers.Get(layer);
                            var oid = 0;
                            var oidi = 0;
                            for(var i = 0; i < results[layeri]["Fields"].length; i++){
                                if(results[layeri]["Fields"][i] == l.idField){
                                    oidi = i;
                                    break;
                                }
                            }
                            oid = results[layeri]["Values"][rownum][oidi];
                            
			                mapobj.DataQueryLayer(l.idField + " IN (" + oid + ")",layer,false,null);
			                mapobj.ZoomToFeatures(layer,[oid]);
			                mapobj.customHandleFeatures = self.ProcessPrintMoreInfo;
			                mapobj.RequestSelectedFeatures(false);
			                return;
                        }else{
                            var layerRes = {};
                            layerRes["Fields"] = results[layeri]["Fields"];
                            layerRes["Values"] = [results[layeri]["Values"][rownum]];
                            layerRes["Layer"] = layer;
                            printRes = [layerRes];
                        }
                    }
                    else
                    {
                        // all results for layer
                        printRes = [results[layeri]];
                    }
                }
            }
            else
            {
                // all results
                printRes = results;
            }
        }
        else
        {
            // no results
            ;
        }
        
        self.PrintPage(mapobj,printRes);
    }
    this.PrintResults = PrintResults;
    
    function PrintPage(mapobj,printRes)
    {
        var whatToPrint = null;
        if(printRes && !mapobj){
            whatToPrint = " Results";
        }else if(!printRes && mapobj){
            whatToPrint = " Map";
        }else{
            whatToPrint = " Map and Results";
        }
        var title = "Print" + whatToPrint;
        
        var printDiv = document.getElementById("printFrameDiv");
        printDiv.style["text-align"] = "center";
        var iframe = mapobj.printFrame.CreateFrame(printDiv);
        mapobj.printFrame.pageScreen = DarkenPage();
        mapobj.printFrame.pageScreen.style["zIndex"] = "999";
        mapobj.printFrame.CreatePrintSetup(printRes,mapobj,title);
        var iframeWidth = 820;
        var iframeHeight = 500;
        iframe.style["zIndex"] = "1001";
        iframe.style["width"] = iframeWidth + "px";
        iframe.style["height"] = iframeHeight + "px";
        
        iframe.style["border"] = "solid 1px #000000";
        var iframeDim = IMS2_GetElementDimension(iframe);
        var pageScreenDim = IMS2_GetElementDimension(mapobj.printFrame.pageScreen);
        var iframeOffset = [ ((pageScreenDim[0] / 2) - (((iframeDim[0])?(iframeDim[0]):(iframeWidth)) / 2)),((pageScreenDim[1] / 2) - ( ((iframeDim[1])?(iframeDim[1]):(iframeHeight)) / 2)) ];
        printDiv.style["left"] = parseInt(iframeOffset[0]) + "px";
        printDiv.style["top"] = parseInt(iframeOffset[1]) + "px";
        document.getElementById("printFrameDiv").style["display"] = "block";
    }
    this.PrintPage = PrintPage;
    
    function ProcessPrintMoreInfo(data,drill){
		// unhook
		var mapctl = ((IMS2_MapManager)?(IMS2_MapManager.GetMap(self.mapid)):(null));
		if(mapctl){
			mapctl.customHandleFeatures = null;
		}
		html = "";		
		for(var i = 0; i < data["Fields"].length; i++){
			var cls = ((i % 2)?("resultsEvenRow"):("resultsOddRow"))
			html += "<tr class=\"" + cls + "\" onmouseover=\"this.className='resultsRowOver';\" onmouseout=\"this.className='" + cls + "';\">";
			html += "<td class=\"detailField\">" + data["Fields"][i] + "</td><td class=\"detailData\">" + data["Values"][0][i] + "</td></tr>";
//			if(data["Fields"][i] == "OBJECTID"){
//				oid = data["Values"][i];
//			}
		}
		
		//thtml = "<table id=\"div_" + resultcurrentlayer + "_featureDetail_" + oid + "\">";
		html = "<table cellpadding=\"0\" cellspacing=\"0\" id=\"table_" + resultcurrentlayer + "_featureDetail_" + resultcurrentOID + "\" class=\"detailTable\">" + html + "</table>";				
		if(mapctl){
			self.PrintPage(mapctl,html);
		}
    }
    this.ProcessPrintMoreInfo = ProcessPrintMoreInfo;
    
    
    //user wants to use feature as AOI
    function SetAOI(lid,oid){
		var task;
		if(currentAOI > -1){
			//aoi task exists
			task = IMS2_Tasks.Get(currentAOI);
			
			IMS2_Tasks.ActivateTask(currentAOI);
		}
		else
		{
			//add new aoi task
			IMS2_Tasks.Add("aoi");
			task = IMS2_Tasks.Get(IMS2_Tasks.currentTask);
		}
		
		//set up aoi task accordingly
		document.getElementById(task.id + "_page_1_radio_3").checked = true;
		//task.GetNextPage();
		task.selectedFeatureLayer = lid;
		task.selectedFeatureId = oid;
		var mapctl = ((IMS2_MapManager)?(IMS2_MapManager.GetMap(self.mapid)):(null));
		if(null == mapctl){
			return;
		}
		
		task.aoiclass = "feature";
		task.dataType = mapctl.layers.Get(lid).dataType.toLowerCase();
		
		if(mapctl.layers.Get(lid).dynamic){
			task.aoiclass = "upload";
		}
		
		var html = "";
		html += "<table width=\"100%\" cellpadding=\"2\" cellspacing=\"0\">";
		html += "<tr><td class=\"wizSmall\">You Selected</td></tr>";
		//html += "<tr><td class=\"wizSmall\" onmouseover=\"showHoverMap('" + lid + "'," + oid + ",window.event?window.event:event);\">Feature: " + oid + "</td></tr>";
		
		
		//skipping the following line for some reason
		html += "<tr><td class=\"wizSmall\" \">Feature: " + oid + "</td></tr>";
		html += "<tr><td class=\"wizSmall\">From Layer: " + lid + "</td></tr>";
		html += "</table>";
		
		document.getElementById(task.id + "_page_3_div_1").innerHTML = html;
		
		document.getElementById("_task_" + task.id + "_page_" + task.currentIndex ).style.display = "none";
		document.getElementById("_task_" + task.id + "_page_3").style.display = "block";
		task.currentIndex = 3;
		
		self.ZoomTo(lid,oid);
    }
    this.SetAOI = SetAOI;
}

function IMS2_ResultPaneManager(){
    var self = this;
    
    this.panes = new Array();
    
    function Add(id,mapid,pageSize,displayType,rowCssClass,altRowCssClass,headerCssClass,expandImagePath,collapseImagePath){
        if( (null != id) && (!self.Contains(id)) ){
            var n = new IMS2_ResultPane(id,mapid,pageSize,displayType,rowCssClass,altRowCssClass,headerCssClass,expandImagePath,collapseImagePath);
            self.panes[self.panes.length] = n;
            //alert(pageSize);
        }
    }
    this.Add = Add;
    
    function Contains(id){
        return(false);
    }
    this.Contains = Contains;
    
    function Get(id){
        var obj = null;
        for(var i = 0; i < self.panes.length; i++){
            var cur = self.panes[i];
            if((null != cur) && cur.id == id){
                obj = cur;
                break;
            }
        }
        return(obj);
    }
    this.Get = Get;
    
    function TriggerUpdate(mapid){
        if(mapid && IMS2_MapManager){
            var mapobj = IMS2_MapManager.GetMap(mapid);
           for(var i = 0; i < self.panes.length; i++){
                var pane = self.panes[i];
                if(pane){
                    if(pane.mapid == mapid){
                        pane.Render(mapobj);
                    }
                }
           }
        }
    }
    this.TriggerUpdate = TriggerUpdate;
    
    function ResetPanels(mapid){
        if(mapid){
            for(var i = 0; i < self.panes.length; i++){
                var pane = self.panes[i];
                if(pane){
                    if(pane.mapid == mapid){
                        pane.Reset();
                    }
                }
            }
        }
    }
    this.ResetPanels = ResetPanels;
    
    function ClearPanels(mapid)
    {
		if(mapid){
            for(var i = 0; i < self.panes.length; i++){
                var pane = self.panes[i];
                if(pane){
                    if(pane.mapid == mapid){
                        var div = pane.GetContainingDiv();
                        div.innerHTML = "No Records Found.  Please try again.";
                    }
                }
            }
        }
    }
    this.ClearPanels = ClearPanels;
    
    function GetPreviousPage(paneid, index){
        var pane = self.Get(paneid);
        if(pane){
            pane.GetPreviousPage(index);
        }
    }
    this.GetPreviousPage = GetPreviousPage;
    
   function GetNextPage(paneid, index){
        var pane = self.Get(paneid);
        if(pane){
            pane.GetNextPage(index);
        }
    }
    this.GetNextPage = GetNextPage;
    
    function ToggleInfoDisplay(paneid, elem){
        var pane = self.Get(paneid);
        if(pane){
            pane.ToggleInfoDisplay(elem);
        }
    }
    this.ToggleInfoDisplay = ToggleInfoDisplay;
    
    function ZoomToFeature(mapid,fid,layer){
        var mapctl = ((IMS2_MapManager)?(IMS2_MapManager.GetMap(mapid)):(null));
        if(mapctl){
            mapctl.ZoomToFeatures(layer,[fid]);
        }
    }
    this.ZoomToFeature = ZoomToFeature;
}

function IMS2_TriggerResultPaneUpdate(mapid){
    if(IMS2_ResultPanes){
        IMS2_ResultPanes.TriggerUpdate(mapid);
    }
}

function IMS2_TriggerResultPaneReset(mapid){
    if(IMS2_ResultPanes){
        IMS2_ResultPanes.ResetPanels(mapid);
    }
}

function IMS2_RegisterResultPaneControl(id,mapid,pageSize,displayType,rowCssClass,altRowCssClass,headerCssClass,expandImagePath,collapseImagePath){
    if(IMS2_ResultPanes){
        IMS2_ResultPanes.Add(id,mapid,pageSize,displayType,rowCssClass,altRowCssClass,headerCssClass,expandImagePath,collapseImagePath);
    }
}

var IMS2_ResultPanes = new IMS2_ResultPaneManager();
var resultcurrentlayer;
var resultcurrentlayerID;
var resultcurrentOID;