//
// File : weeds-rtwgmap-filtering.js
//
// Description : Javascript functions for filtering components on the Weed Survey Results Map
//               implementation. Overrides several functions found in the 
//               RTWGMap's javascript lib
//
// Contents    : 
//               returnFilters(data)
//               setDefaultFilter
//               filterChanged()
//               returnFilteredMarkers()
//


 var selectBoxes = [];
	
	//
    // Callback for getFilters()
    //
    //TODO this should be using the rtwgmap filtering.js function ?
    //
    var returnFilters = function(data){
        if(data != null)   {
	        selectBoxes = [];
	        filterMsgConnector = " amounts of ";
	        filterMsgSuffix = "";
	        
        	var container = document.getElementById("advFilterContainer");
        
        	var filterBySelectBox = document.createElement("select");
        	filterBySelectBox.id = "filterBy";
        	filterBySelectBox.className = 'hidden';	
        	
        	container.appendChild( filterBySelectBox );
        		
            for(var i = 0; i < data.length; i++)   {                        
                filters[i] = data[i]; 
                                
                // create the filter by <blat> option
				filterBySelectBox.appendChild( createSelectOption(filters[i]) );
				
				// create the a select box for each child of 'Filter'
				if(filters[i].children) {
					filters[i].selectBoxes = new Array();
					
					for(var c=0;c<filters[i].children.length; c++) {
						var filter = filters[i].children[c];
						var filterId = filter.id;
						if(!filterId) {
						  filterId = c;
						  filters[i].id = filterId;
						}
						  
						//create a select box for this filter
						var selectBox = createSelectBox(filter);
			        	selectBox.onchange=filterChanged;
			        	selectBox.setAttribute("style","width: 175px");
						if(selectBox.width) 
						   selectBox.width = 125;
						   			        			        	
			        	//create the container/panel for the select box with it's label
			       		var selContainer = document.createElement("div");
						//filters[i].selectBoxes[c] = selContainer;	
						filters[i].selectBoxes[c] = selectBox;						
			       		container.appendChild(selContainer); 
			       		selContainer.className = 'hidden';			        	
        				
        				//add filter/selectbox label
        				//selContainer.appendChild( document.createTextNode(filter.label + ':' ) );
        				selContainer.appendChild( selectBox );
        			}
				}
			}    
			//setDefaultFilter();
        }
    }
    
   //
   // Filter changed
   //
	var filterChanged = function() {	
		map.closeInfoWindow();
			
		 
			
		//hide all the select boxes
		//for(var i=0; i< filters.length; i++) {
		//	filter = filters[i];
		//	for(s=0;s<filters[i].selectBoxes.length; s++) {
		//		filters[i].selectBoxes[s].parentNode.className = 'hidden';
		//		filters[i].selectBoxes[s].className = 'hidden';
		//	}
		//}

			// only show the select boxes for the current filterby selection
			var index = document.getElementById("filterBy").selectedIndex;
			var filterBy = filters[index];
			for(s=0;s<filterBy.selectBoxes.length; s++) {
				filterBy.selectBoxes[s].parentNode.className = 'visible';
				filterBy.selectBoxes[s].className = 'visible';
			}
				
    	 	selectedFilters = [];
     
			if(	filterBy.children ) {	
     			for(var c=0;c<filterBy.children.length; c++) {
     				//set the selected filters
     				var filter = filterBy.children[c];
	     			var selectBox = filterBy.selectBoxes[c];
    	 			selectBox.className = 'visible';
     				index = selectBox.selectedIndex; //selectBox.value doesn't work !?
					var filter = filter.children[index];
					selectedFilters[selectedFilters.length] = filter;
				}				
    	 	}


     	
     	if(selectedFilters.length > 0 && selectedFilters[0].label != "Choose a Weed") {	  	
 	    	applySelectedFilters(); 	    	
 	    } else {
 	    	document.getElementById("filters").innerHTML = "&nbsp;";
 	    	manageMarkers(null, null);
 	    	    	    
 	    	 //hide all the markers
			for(m in gmarkers)  {
    	   		gmarkers[m].hide();
			}	
 	    }
 	    
 	    //
        // Zoom out on the map until at least one marker
        // is visiable
        //     
        panZoomToAtLeastOneVisibleMarker();
	}
  

 
    
    var getSideListingsLabel = function() {
        return "Counties";
    }
    
    //
    // Comparator for sorting weed survey markers by severity (& name)
    //
	var sortBySeverity = function(a,b) {
	if(selectedFilters && selectedFilters.length != 0) {
		var weed = selectedFilters[0].label;
	
		var diff = b.severityLevels[weed] - a.severityLevels[weed];
		if(diff == 0) {
			if(a.name < b.name)
				diff = -11;
			else 
				diff = 1;
		}
		return diff;
	}
	
	
	return -1;
}
    
    
        //`
    // Callback for applyFilter()
    // 
    // Loads the rendered markers that match the filter
    // into the "sideListing' element
    //
    // See also 
    //   renderMarkerForSideListing(marker)
    //   applyFilter(filter)
    //
    var returnFilteredMarkers = function(data){    	

       		
        var label = getSideListingsLabel();
        document.getElementById('sideListingHeader').innerHTML = label;

		if(selectedFilters.length > 0 && selectedFilters[0].label == "Choose a Weed") {
		   initSideListing();
		   document.getElementById("filters").innerHTML = "&nbsp;";           
		 
		   return;
		}
           
        var htmlList = '<div class="smallTextCenter"><br/>';    
        
        htmlList += getPrintUrl(label) ;

  
 		printableMarkers = data;
        if(data != null && data.length > 0)
        {
			data.sort(sortBySeverity);   

            htmlList = htmlList + '<br/>';
            for(var i = 0; i < data.length; i++)
            {
                htmlList = htmlList + renderMarkerForSideListing ( data[i] );                
                
                var id = data[i].id;
				var weed = "";
				var severityLevel = "-1";

				if(selectedFilters && selectedFilters.length > 0)  {
				   	weed = selectedFilters[0].label;
					severityLevel = data[i].severityLevels[weed];
				}

				if(severityLevel != "-1") {
                	gmarkers[id].setImage( '/app68/listings/icons/maps/weeds/' + severityLevel + '.png' );
                }    
            }
            
            htmlList = htmlList + '</div>';
            
            document.getElementById("sideListing").innerHTML = htmlList;
        } else {
        	initSideListing();
		    document.getElementById("filters").innerHTML = "&nbsp;";   
		}
    }
    
    var isFiltering = function() {
       return 	(selectedFilters.length > 0 && selectedFilters[0].label != "Choose a Weed");
    }    
    
    
    //
	// overrideable function for updating the filtered results msg(s)
	//    
    var updateFilterResultMsg = function (filteredMarkers, noun) {
        var msg = "";
        
        if(selectedFilters.length > 0 && selectedFilters[0].label != "Choose a Weed") {
 			msg = getFilterMsg(filteredMarkers, noun); 
        }
        
        document.getElementById("filters").innerHTML = msg;          
    }
    

    //
    // shows only the Markers that match a filter
    //
    // Uses the function 'matchesAllSelectedFilters(markerObj) to determine
    // if the marker should be visible.
    //
    // Implementors should override matchesAllSelectedFilters or carefully
    // maintain the list of selected filters in the selectedFilters[] array
    //
    var applySelectedFilters = function (){
        var filteredMarkers = [];
        var gmarker = 0;
        
        if(directions != null)
           directions.clear();        
        
        //hide all the markers
		for(m in gmarkers)  {
       		gmarkers[m].hide();
		}	
			
        var j=0;
		// 
		// show or hide each marker as required
		//
        for(var m = 0; m < markerObjs.length; m++)
        {
            //
            // Filter by selected nodes
            //
            if( matchesAllSelectedFilters(markerObjs[m]) ) {
             
               // (re)set the marker's color to the current filter if specified
               //if(selectedFilters[0].color) {
               //	  setGMarkerColor(markerObjs[m], selectedFilters[0].color);
               //}
               
               var info = markerObjs[m].infoHtml;
               info +=  "<p/>";        
               info += "<span class=\"smallTextCenter\"><a href=\"javascript:zoomIn('" + markerObjs[m].id + "');\">Zoom In</a>" + "</span>&nbsp;&nbsp;";

               show( markerObjs[m] );
               
				// add it to the resultset for display on the sidelisting
               filteredMarkers[j++] = markerObjs[m];
            } 
        }
		
	    var filter = {label:getSideListingsLabel()};
        globalRegion = filter;
		// display on the sidelisting
        returnFilteredMarkers(filteredMarkers);
       
        //
        //update the msg string
        //      
        var noun = markerInfo.markerTypeLabel;
        updateFilterResultMsg(filteredMarkers, noun);
        
       	if(selectedFilters.length > 0 && selectedFilters[0].label != "Choose a Weed") 	 
	        showNonParticipatingCounties();
    }
    
    
   	//
	//
	//    
    var showNonParticipatingCounties = function (){        
		// 
		// show or hide each marker as required
		//
        for(var m = 0; m < markerObjs.length; m++)
        {
            if( markerObjs[m].additionalInfo.participating == 'N' ) {
               show( markerObjs[m] );
            } 
        }
    }    
	