
//the report that is currently being shown
var HIGHLIGHT_COLOR = 'rgb(255,220,100)';

// ========================= REPORT TABS ==========================

var scratchPadReport;

// ========================== UTILITIES =============================

function toggleDisplay(element)
{
    var display = element.style.display;
    var changeToDisplay;
    var hidden;
    if(display == null || display != 'none')
    {
        changeToDisplay = 'none';
        hidden = true;
    }
    else
    {
        changeToDisplay= '';
        hidden = false;
    }
    element.style.display = changeToDisplay;
    return hidden;
}

function empty(object)
{
    return object == null || object == "";
}
function displayOn(element)
{
    element.style.display = '';
}
function displayOff(element)
{
    element.style.display = 'none';
}

function selectedOptionsFor(selectElement)
{
    var options  = selectElement.options;
    var selectedOptions = new Array();
    for(var whichOption = 0; whichOption < options.length; whichOption++)
    {
        var option = options[whichOption];
        if(option.selected)
        {
            selectedOptions.push(option);
        }
    }
    return selectedOptions;
}

//========================== TABS ==============================
SCRATCH_PAD_INDEX = 0;
//the default tab where all changes will be applied.
var scratchPad;
function highlightScratchPad()
{
    topnav.displayTabSelected(SCRATCH_PAD_INDEX);
}

//===================  MESSAGE BANNNER =======================
DIGEST_SORT_LIMITATIONS_URL = "http://wiki.motionbased.com/mb/TrailNetwork#Limitations";

var messageBanner = new MessageBanner("messageBanner");
/**The banner at the top of the page that displays all the messages that helps explain what the heck is going on.
* This banner is used to explain what the user did, not necessarily what the system is doing (like the AJAX messaging at the top right.
*/
function MessageBanner(id)
{
    this.setMessage = function(message,helpHref)
    {
        if(helpHref != null)
    	{
	    	message += '&#160;&#160;<a href="' + helpHref+ '" style="font-size:8px" target="new">Read More...</a>';	
    	}
    	message += '&#160;&#160;<a href="javascript:messageBanner.hide();" style="vertical-align:super;font-size:8px">[X]</a>';

        this.element.innerHTML = message;
        this.alreadyTried = false;
        this.element.style.display="block";
        this.timestampOfMessage = new Date();
    }
    
    this.messageExpired = function()
    {
    	var expired = false;
    	if(this.timestampOfMessage != null)
    	{
			var now = new Date();
			var millisecondsPast = now.getTime() - this.timestampOfMessage.getTime();
			if( millisecondsPast > this.minimumMillisForDisplay)
			{
				 	  expired = true;
			}
		}
		
    	return expired;
    }
    this.hide = function()
    {
    	 this.element.style.display="none";
    }
    /**The message will be set, but the report will always try to hide the message after a report has refreshed.
    * If the message was recently set then this will not hide...it must be called a second time in order to hide.
    */
    this.tryToHide = function()
    {
		if( this.messageExpired())
		{
			 	 this.hide();
		}
    }

    this.element = document.getElementById(id);
	this.timestampOfMessage = null;
	this.minimumMillisForDisplay = 1000;
    this.tryToHide();
    
}

/**@deprecated use messageBanner.setMessage()*/
function showError(message)
{
	messageBanner.setMessage(message);
}
// ===================== FILTER ============================

/**standardized messages that are displayed in a uniform manner called from various filters like Advanced, Quick, etc*/
function setFilterMessage(filterDisplayName, extraMessage)
{
	var extraMessage;

	if(extraMessage == null)
	{
		extraMessage = "";
		
	}
	else
	{
		extraMessage = "  " + extraMessage;
	}
	messageBanner.setMessage("Adding " + filterDisplayName  + " to filters." + extraMessage);
}
/**Fiter types are strict keys that connect the jsp filters to the filters stored in the database*/
var FILTER_TYPE_INDIVIDUAL_ACTIVITY = 'IndividualActivity' ;
var FILTER_TYPE_ADVANCED_FILTER = 'AdvancedFilter';
var FILTER_TYPE_DATE = "DateFilter";
var FILTER_TYPE_QUICK = "QuickFilter";
var FILTER_TYPE_KEYWORD = "Keyword";
var FILTER_TYPE_MAP = 'MapBoundary';
var FILTER_TYPE_SHARED_DIGEST = "SharedDigest";

var ADVANCED_FILTER_TYPE_PRIVATE = "privateView";
var ADVANCED_FILTER_TYPE_PENDING = "pending";
var ADVANCED_FILTER_TYPE_REPORTABLE = "reportable";
//make reportable visible to all so keep default .hidden
var REPORTABLE_FILTER = new ReportFilter(FILTER_TYPE_ADVANCED_FILTER,"Reportable",ADVANCED_FILTER_TYPE_REPORTABLE +FILTER_OPERATOR_EQUALS + "true"); //UPDATED FILTER
//don't allow deletion because it causes too many undersireable experiences.
REPORTABLE_FILTER.canDelete = false;

function highlightRecorder(recorder,override)
{
   var highlightElement = recorder.highlightElement;

    if(override || !recorder.reported)
    {
        highlightElement .style.visibility = 'visible';
            doReport = false;
    }
    else
    {
            highlightElement.style.visibility = 'hidden';    
            doReport = true;
    }

    return doReport;
}

/**selects all checkboxes from the standard resultsForm.
*/
function selectAllResults(checked)
{
	selectAll(checked,document.getElementById("resultsForm"));
	if(!checked)
	{
		listFilters.clearFilters();
	}
}

/**selects all or none of the checkboxes found in the form based on the checked boolean given.
*/
function selectAll(checked, form)
{
    var inputables = form.elements;
    for(var whichInputable = 0; whichInputable < inputables.length; whichInputable++)
    {
        var inputable = inputables[whichInputable];
        var type = inputable.type.toLowerCase();
        if(type == "checkbox")
        {
            inputable.checked = checked;
            inputable.onclick();
        }
    }
}

//===================== NEW QUICKFILTERS ======================

function notifyQuickFilterAdded(type,display,value,refresh)
{
    var filter = new ReportFilter(type,display,value);
    setFilterMessage(display);
    activeReport.reportFilters.addFilter(filter);
    if (refresh){
		refreshReport();
	}
} //END NEW QUICKFILTERS

function notifyDateFilterAdded(display, value) {
		//remove any previous date entry
		if (activeReport.reportFilters.numberFilters(FILTER_TYPE_DATE) > 0){
			activeReport.reportFilters.deleteFilterByType(FILTER_TYPE_DATE)
			setFilterMessage(display,"Previous date filter removed.");
		}
		else
		{
			setFilterMessage(display);
		}
		var filter = new ReportFilter(FILTER_TYPE_DATE,display,value);
		activeReport.reportFilters.addFilter(filter); //UPDATED FILTER
		refreshReport();
}

//================================ COLUMN DISPLAY ===========================
function dockChart()
{
    var chartImage = document.getElementById('chartImage');
    //remove the id for uniqueness among the document.
    var chartImageClone = chartImage.cloneNode(true);
    chartImage.removeAttribute('src');

    chartImageClone.removeAttribute('id');
    document.getElementById('reportContainer').appendChild(chartImageClone);
    closeChart();
}
function closeChart()
{
    var chartWindow = document.getElementById('chartWindow');
    toggleDisplay(chartWindow);
}

function showColumnChart(numericColumnKey,target)
{
    var chartSizeSelect = document.getElementById('chartSizeSelect');
    var selectedSizeOption = chartSizeSelect.options[chartSizeSelect.selectedIndex];
    var selectedSize = selectedSizeOption.innerHTML;
    var selectedSizeParts = selectedSize.split('x');
    var width = selectedSizeParts[0];
    var height = selectedSizeParts[1];
    var chartWindow = document.getElementById('chartWindow');
    chartWindow.setAttribute('width',width);
    chartWindow.setAttribute('height',height);
    
    /*get a copy of the report and the column set...modify them to show on the chosen metric*/
    var mandatoryColumns = [numericColumnKey];
    var optionalColumnsUrl = null;
    var chosenOptionalColumns = [];
    var columnSet = new ReportColumnSet(mandatoryColumns,chosenOptionalColumns);
    var columnReport = activeReport;
    columnReport.columnSet = CopyReportColumnSet(columnSet);
 
    var queryPath = columnReport.buildQueryPath();
    queryPath += "&columnChartRequested=true";
    queryPath += "&chartRequest.width=" + width;
    queryPath += "&chartRequest.height=" + height;
    var showChartLegend = document.getElementById('showChartLegendTrue').checked;
    queryPath += "&chartRequest.legendVisible=" + showChartLegend.toString();
	 if(activeReport.reportTitle != null)
	{
		queryPath += "&chartRequest.chartTitle=" + activeReport.reportTitle;
	}
    //queryPath += "&chartRequest.chartSubtitles=" + activeReport.reportSubtitle;
    
    var embed = document.getElementById('chartImage');
    embed.setAttribute('src',queryPath);
    
    //set style attribute works for Mozilla browsers
    embed.setAttribute('width',width);
    embed.setAttribute('height',height);
	toggleDisplay(chartWindow);
}

/** Handles any row that is clicked.  The row may come from report view or table view.
 * @param <string> rowCriteria is a name=value pair that is suitable to build filters.
 * @param <string> rowTitle the display being shown in the Table view for the row being handled. 
*/
function reportSaysHandleRow(rowCriteria,rowTitle)
{

        var criteriaParts = decodeRowCriteria(rowCriteria);
        var key = criteriaParts[EPISODE_PK_KEY_INDEX];
        var pk = criteriaParts[EPISODE_PK_PK_INDEX];
        
        //if the key is episodePk-id then we know it is an activity...process it accordingly.
        //if not then we are coming from report and need to show a listing of the current rowCriteria.
        if(key == appendIdSuffix(EPISODE_PK))
        {
            
                   //all customers can view directly by pk.
                   var href = '/trail/activity/' + pk;
                          
            showWindow(href);
        }
        else
        {
	        	var filter = new ReportFilter(FILTER_TYPE_INDIVIDUAL_ACTIVITY,rowTitle,rowCriteria);
	        	activeReport.reportFilters.addFilter(filter);
	        	listFilters.clearFilters();
        		//reset to the listings view since we must be in report view.
                reportDefaultListings(activeReport);
                messageBanner.setMessage(rowTitle + " has been added as a filter");
        }
    
}
var EPISODE_PK_KEY_INDEX = 0;
var EPISODE_PK_PK_INDEX = 1;


function decodeRowCriteria(rowCriteria)
{
        var parts = rowCriteria.split('=');
        return parts;
}

    
    
/**shows the window based on the preference to view as a popup or in the digest pane.
*/
function showWindow(href, forcePopup) 
{

    var popup = document.getElementById('popupForActivities');
    var selectedValue;
    if(popup == null)
    {
        selectedValue = "other";
    }
    else
    {
         var selectedOption = popup.options[popup.selectedIndex];
         selectedValue = selectedOption.getAttribute('value');
    }
  
    if(selectedValue == 'new' || forcePopup)
    {
        window.open(href);            
    }
    else
    {
        location.href = href;
    }
}

/**Given a input element (like the checkbox in table view) this will identify that the row is selected.
* @param <Checkbox> sourceInputElement the checkbox that was checked.
* @param <boolean> isHighlighted - to show or not to show.
*/
function highlightRow(sourceInputElement, isHighlighted)
{
      var highlightColor = 'rgb(210,210,210)';
    if(isHighlighted)
    {
        sourceInputElement.parentNode.parentNode.style.backgroundColor = highlightColor;
        sourceInputElement.checked = true;
    }
    else
    {
        sourceInputElement.parentNode.parentNode.style.backgroundColor = '';
        sourceInputElement.checked = false;
    }
    //list for reports or listings.

}

/**List Filters is the items that are currently checked, but have not been added to the active report filters yet.
*/  
var listFilters = new ReportFilters();
 
 /**Intended for the checkbox in Table to call when selected/deselected.
 * @param <string> conditionRequest name=value pair that is suitable to build a filter.
 * @param <Checkbox> sourceInputElement the checkbox that was checked.
 * @param <string> rowTitle - the display shown in the row associated to the input element.
 */
function reportRowSelectionChanged(conditionRequest,sourceInputElement,rowTitle)
{

    var checked = sourceInputElement.checked;
    if(checked)
    {
		//add filter to list array
		var filter = new ReportFilter(FILTER_TYPE_INDIVIDUAL_ACTIVITY,rowTitle,conditionRequest);
		listFilters.addFilter(filter);            
	}
    else
    {
		//remove filter from list array
		listFilters.deleteFilterByType(FILTER_TYPE_INDIVIDUAL_ACTIVITY,conditionRequest);
    }
    
    updateNumberChecked();
    highlightRow(sourceInputElement,checked);
    
}



function filterOptionFor(conditionRequest)
{
    var option = false;
	for (var f = 0;f < listFilters.filters.length;f++){
		var filter = listFilters.filters[f];
		if (filter.value == conditionRequest){
			option = true;
		}
	} 
    
    return option;            
}

//======== MENU ====================

var defaultReportMenu;

if(isCallerActivitiesOnly())
{
    defaultReportMenu= document.getElementById('defaultReport');
}
else
{
    defaultReportMenu= document.getElementById('defaultTrailNetworkReport');                        
}
            
var listingsMenuOnBody=  document.getElementById('activityListingOnSideMenu');
var listingsMenuBody=  document.getElementById('activityListingSideMenu');
var statsMenuOnBody=  document.getElementById('statsOnSideMenu');
var statsMenuBody=  document.getElementById('statsSideMenu');
        
function remove(element)
{
    element.parentNode.removeChild(element);
}

function UpdateReportHeader(){
	//update the links
	var saveCurrentReportLink = document.getElementById("saveCurrentReportLink");
	var saveAsCurrentReportLink = document.getElementById("saveAsCurrentReportLink");
	var deleteCurrentReportLink = document.getElementById("deleteCurrentReportLink");
	var defaultCurrentReportLink = document.getElementById("defaultCurrentReportLink");
	var closeCurrentReportLink = document.getElementById("closeCurrentReportLink");
	if (activeReport.savedReportPk > 0) {
		if (saveCurrentReportLink) { saveCurrentReportLink.style.display  = 'inline'; }
		if (deleteCurrentReportLink) { deleteCurrentReportLink.style.display  = 'inline'; }
		//TODO implement these options
		//if (defaultCurrentReportLink) { defaultCurrentReportLink.style.display  = 'inline'; }
		//if (closeCurrentReportLink) { closeCurrentReportLink.style.display  = 'inline'; }
	}
	else {
		if (saveCurrentReportLink) { saveCurrentReportLink.style.display  = 'none'; }
		if (deleteCurrentReportLink) { deleteCurrentReportLink.style.display  = 'none'; }
		if (defaultCurrentReportLink) { defaultCurrentReportLink.style.display  = 'none'; }
		if (closeCurrentReportLink) { closeCurrentReportLink.style.display  = 'none'; }
	}
	if (saveAsCurrentReportLink) { saveAsCurrentReportLink.style.display = 'inline'; }
}

//Highlights the report menu that has been selected.
function updateSourceMenu()
{
    //highlight the appropriate menu if available.
    var sourceMenu = activeReport.sourceMenu;
    if(sourceMenu != null)
    {
        resetHighlightedMenus();
        highlightSourceMenu(sourceMenu,true);
        var parent = sourceMenu.parentNode.parentNode.parentNode.firstChild;
        highlightSourceMenu(parent,true);
    }
}

/**Called after the report XML is returned from the server, this finished the request by making all components 
* show up in the appropriate parts of the user interface.
*/
function ReportRefreshed()
{
	UpdateReportHeader();

	//update the local array
	//show the filters
	//showFilters();
    
    //leaving the checkboxes is confusing...remove them every time.
    
    listFilters.clearFilters();

	updateSourceMenu();
            
        var listingsMenuOn = document.getElementById('activityListingOnSideMenu');
        var listingsMenu = document.getElementById('activityListingSideMenu');
        var statsMenuOn=  document.getElementById('statsOnSideMenu');
        var statsMenu=  document.getElementById('statsSideMenu');
        
        if( (activeReport.type == LISTINGS_REPORT_TYPE || activeReport.type == MAP_REPORT_TYPE)  && !activeReport.inbox)
        {
            displayOn(listingsMenuOnBody);
            displayOff(listingsMenu);
        }
        else
        {
                displayOn(listingsMenuBody);
                displayOff(listingsMenuOn);
        }
        if(activeReport.type == STATISTICS_REPORT_TYPE)
        {
                displayOn(statsMenuOnBody);
                displayOff(statsMenu);
        }
        else
        {
                displayOn(statsMenuBody);
                displayOff(statsMenuOn );
        }

    if(activeReport.type == STATISTICS_REPORT_TYPE)
    {
        //document.getElementById('raceButtonHeader').disabled = true;
        //document.getElementById('raceButtonFooter').disabled = true;
        //document.getElementById('keyholeButtonHeader').disabled = true;
        //document.getElementById('keyholeButtonFooter').disabled = true;
        
    }
    else if(activeReport.type == MAP_REPORT_TYPE)
    {
        refreshMap();
        listingsMenuSelected(document.getElementById('listingsMapViewMenuItem'));
    }
    else if(activeReport.type == LISTINGS_REPORT_TYPE)
    {
        listingsMenuSelected(document.getElementById('listingsTableViewMenuItem'));
    }

    updateFilterCountDisplay();
    updateNumberChecked();
    listingsMenuSelected();
    //update the action select lists
    reportActionUpdateSelect();
}

function updateFilterCountDisplay()
{
    //update filter count...
    var filterCountDisplay = document.getElementById('filterCountDisplayElement');
    
    var  numberOfFilters = 0;

    //get a count of the non hidden filters
    for (var f = 0; f < activeReport.reportFilters.length; f++) {
		if (activeReport.reportFilters.filters[f].hidden == false) {
			numberOfFilters++;
		}
    }

   if (filterCountDisplay){
	   filterCountDisplay.innerHTML  = numberOfFilters;
	   var clearFiltersHighlight = document.getElementById('clearFiltersHighlight');
	   
	   if(numberOfFilters > 0 || activeReport.pageNumber > 1)
	   {
	        if(numberOfFilters > 0)
	        {   
	            clearFiltersHighlight.style.backgroundColor= HIGHLIGHT_COLOR;
	        }
	
	        document.getElementById('popupForActivitiesPopup').selected=true;
	    }
	    else
	    {
	        clearFiltersHighlight.style.backgroundColor= "";
	        document.getElementById('popupForActivitiesThis').selected=true;
	    }
    }
        
}
function supplyListingsActions(selectElement)
{
    var raceOption  = document.createElement('option');
    raceOption.setAttribute('value','race');
    raceOption.innerHTML = 'Race';
    selectElement.appendChild(raceOption);
}

function getResultsLimitSelected()
{
    var resultsLimitSelect =  document.getElementById('resultsLimitSelect');
    var selectedOption = resultsLimitSelect[resultsLimitSelect.selectedIndex];
    var limit =  selectedOption.getAttribute('value');
    return limit;
}
     
function goToPageNumber(page)
{
    messageBanner.tryToHide();
    activeReport.setPageNumber(page);
    activeReport.load();
}

function changeResultsLimit()
{
    //bypass the normal refresh and history.
    activeReport.assignResultsLimit(getResultsLimitSelected());
    activeReport.load();    
}

var PLANET_EARTH_LOCATION_PK = '90000000000';
function regionSelected()
{
    refreshReport();

}

//========= CALL FROM Header Links ====================
function isFilteringByKeyword()
{
   return activeReport.reportFilters.containsFilterType(FILTER_TYPE_KEYWORD);
}

function isFilteringByDate()
{
   return activeReport.reportFilters.containsFilterType(FILTER_TYPE_DATE);
}
function isFilteringByUsername()
{
    var usernameKey= "username=";
    //no need to check if viewing personal activities
    var isIt = isCallerActivitiesOnly();   
    
    if(!isIt)
    {
          isIt =    activeReport.reportFilters.containsFilterTypeAndKey(FILTER_TYPE_ADVANCED_FILTER,usernameKey);
    }
    if(!isIt)
    {
        isIt =    activeReport.reportFilters.containsFilterTypeAndKey(FILTER_TYPE_SHARED_DIGEST,usernameKey);
    }
    return isIt;
}
function sortResults(columnKey,sortTypeParam)
{
    var filterIsOk = isFilteringByUsername() ||isFilteringByDate() ;
    
    
    //no sorting unless username filter is applied to save on painful sorts without indexes
    if(  !filterIsOk )
    {
        messageBanner.setMessage("You must add a Time Period or username filter.",DIGEST_SORT_LIMITATIONS_URL);
    }    
    else if (  isCallerAuthorized() ||  activeReport.type == STATISTICS_REPORT_TYPE)  
    {
        activeReport.resetPageNumber();
        activeReport.setSortByKey(columnKey,sortTypeParam,true);
        activeReport.load();
    }
    else
    {
        userIsAuthorized("Activity List sorting is available to MotionBased Standard Customers.");
    }
}


function userIsAuthorized(messageIfDenied)
{
    var isAuthorized = isCallerAuthorized();
	if(!isAuthorized)
	{
		var baseMessage = messageIfDenied;
		if(baseMessage == null){
  		  baseMessage = "This feature is available to Standard Customers.";
  		}
		
		var chosen = window.confirm(  baseMessage + " Upgrade Now?");
		if(chosen)
		{
			//todo: make this reference external variable
			location = trailSecureWebAddress + '/commerce/subscription/view.mb';
		}
	}
	
    return isAuthorized;;
}

function SavedReportsObject()
{
    this.reports = new Array();

    this.addReport = function(report)
    {
        this.reports.push(report);
    }
    
    this.getReport = function (savedReportPk){
		for (var r=0;r<this.reports.length;r++){
			var report = this.reports[r];
			if (report.savedReportPk == savedReportPk){
				return report;
			}
		}
    }
    
}

//=========================== FILTERS =================================

    function toggleFilter(linkId,cell,type)
    {
        var link = document.getElementById(linkId);
        var currentState;
        if( toggleDisplay(cell) )
        {                        
            currentState = "Show";
        }
        else
        {
            currentState = "Hide";
        }
        link.innerHTML = currentState + " " + type + " " + " Filters";
    }
function isAuthorizedToViewQuickFilter()
{
    //quick filter available to all in TrailNetwork.
    return    isCallerAuthorized() || !isCallerActivitiesOnly() ;
}
function toggleQuickFilter()
{
    toggleFilterOrOffer('quickFilterLink', 'quickFilterCell', 'Quick',isAuthorizedToViewQuickFilter());
}
function toggleFilterOrOffer(linkId,cellId,type,authorized)
{
    if(!authorized)
    {
        cellId = 'filterUpgradeOfferCell';
    }
    toggleFilter(linkId,document.getElementById(cellId),type);

}

function toggleAdvancedFilter()
{
    toggleFilterOrOffer('advancedFilterLink', 'advancedFilterCell', 'Advanced',isCallerAuthorized());
}

function addEntryFilter()
{
	setAskToLoadReport(true);
    var entryTypeFilterSelect  = document.getElementById('entryTypeFilterSelect');
    var selectedType = entryTypeFilterSelect.options[entryTypeFilterSelect.selectedIndex];
    var name = selectedType.value;
    var entryOperatorFilterSelect = document.getElementById('entryOperatorFilterSelect');
    var operator = entryOperatorFilterSelect.options[entryOperatorFilterSelect.selectedIndex].value;
    var displayoperator = entryOperatorFilterSelect.options[entryOperatorFilterSelect.selectedIndex].innerHTML;
    var entryOperandInput = document.getElementById('entryOperandInput');
    var value = entryOperandInput.value;
    var displayName= selectedType.innerHTML + " " + displayoperator + " " + value;
    var filter = new ReportFilter(FILTER_TYPE_ADVANCED_FILTER,displayName,name + operator + value); //UPDATED FILTER
    setFilterMessage(displayName);
    //remove previous for singles
    if (name == ADVANCED_FILTER_TYPE_PENDING || name == ADVANCED_FILTER_TYPE_PRIVATE || name == ADVANCED_FILTER_TYPE_REPORTABLE) {
		filter.hidden = true;
	}
	activeReport.reportFilters.addFilter(filter);
    refreshReport();
    //reset form
    entryTypeFilterSelect.selectedIndex = 0;
    entryOperatorFilterSelect.selectedIndex = 0;
    entryOperandInput.value = "";    
    //closeAddFilterForm();
}

function clearFilters()
{
    activeReport.reportFilters.clearFilters();

}

    
    
//=================================== STATS  =================================

function refreshReport()
{  
	
    messageBanner.tryToHide();

  if(activeReport.type == STATISTICS_REPORT_TYPE)
    {
		report(activeReport.primaryColumns,activeReport.sourceMenu,activeReport.sortByColumns);
    }
    else if(activeReport.type == MAP_REPORT_TYPE)
    {
        showMap(activeReport);
    }
    else
    {
            list(activeReport);
    }

}

function statsSelected()
{
        if(activeReport.type == STATISTICS_REPORT_TYPE)
        {
            refreshReport();
        }
        else
        {
            reportDefaultStats(activeReport);
        }
}

var STATISTICS_REPORT_TYPE = 'stats';
var LISTINGS_REPORT_TYPE = 'listings';
var USER_REPORT_TYPE = 'user';
var MAP_REPORT_TYPE = 'map';
    
/**Builds the report table of the digest.
* 
* @see list() for activity listings
* @see runReport for common report calls for all types
*/
function report(primaryColumns,sourceMenu,sortByColumns, reportTitle)
{

        if(sortByColumns == null)
        {
            sortByColumns = DEFAULT_REPORT_SORT_COLUMNS;
        }
        else
        {
            sortByColumns = sortByColumns.concat(DEFAULT_REPORT_SORT_COLUMNS);
        }
        
        //var switchingReport = activeReport != null && activeReport.type ==  STATISTICS_REPORT_TYPE;
        if(primaryColumns == null)
        {
            primaryColumns = activeReport.primaryColumns.copy();
        }
        //needed when something other than report type is changed...
        
        var columnSet = CopyReportColumnSet(statisticsReportColumnSet);
		
		activeReport.type = STATISTICS_REPORT_TYPE;
		activeReport.primaryColumns = primaryColumns;
		activeReport.columnSet = columnSet;
		activeReport.setXslUrl(TABLE_RESULTS_XSL_URL);
		

        if(reportTitle == null)
        {
            reportTitle = "";
        }
        var titleBase = 'Report: ' + reportTitle ;

        activeReport.sourceMenu = sourceMenu;

       runReport(activeReport,sortByColumns,titleBase);
}

var highlightedMenus = new Array();

function resetHighlightedMenus()
{
    var menu;
    while(menu = highlightedMenus.pop())
    {
        highlightSourceMenu(menu,false);
    }
}

var highlightedListingsMenu;
/**called when the menu is clicked...this will manage the view of the menu, but not handle the actions associated.
*/
function listingsMenuSelected(menu)
{
    if(menu == null)
    {
        menu = highlightedListingsMenu; 
    }
    if(menu != null)
    {
        if(highlightedListingsMenu != null)
        {
            highlightSourceMenu(highlightedListingsMenu,false);
        }
        highlightedListingsMenu = menu;
        highlightSourceMenu(menu,true);
    }
}
function highlightSourceMenu(sourceMenu,highlight)
{
    if(highlight)
    {
        sourceMenu.style.backgroundColor=HIGHLIGHT_COLOR;
        highlightedMenus.push(sourceMenu);
    }
    else
    {
        sourceMenu.style.backgroundColor='';
    }
}

/**adds the rows checked into the filter box*/
function listSelected()
{
	//add listed filters here??
	activeReport.reportFilters.deleteFilterByType(FILTER_TYPE_INDIVIDUAL_ACTIVITY)
	activeReport.reportFilters.addFilters(listFilters.filters);
	messageBanner.setMessage(listFilters.filters.length + " activities added to Filters");
    runReport(activeReport);
}
    
function list(report, sortByColumns)
{
    if (!report) {
		statusMessage.showMessage('ERROR: list report is nul');
		return;
	}
	report.type = LISTINGS_REPORT_TYPE;
    if(sortByColumns == null)
    {
        sortByColumns = DEFAULT_LISTING_SORT_COLUMNS;
    }
    var title = 'Listing';
    
    
    
     runReport(report,sortByColumns,title);
    
}
    
function runReport(report,sortByColumns,titleBase)
{ 

    if(!isFilteringByUsername() && !isFilteringByDate() && !isFilteringByKeyword())
    {
        messageBanner.setMessage("You must add keyword, Time Period or username filter.",DIGEST_SORT_LIMITATIONS_URL); 
    }
    else
    {        
    	//get rid of the banner on the way out so there is no confusion about what is happening.  
    	//Also, some requests can take longer than the expire time.
        messageBanner.tryToHide();
        
        //whenever a new report is run...it always applies to the scratchpad.
        if (!report) {
    		statusMessage.showMessage('ERROR: runReport report is nul');
    		return;
    	}
        activeReport = report;
        activeReport.resetPageNumber();
    
        if(isCallerActivitiesOnly())
        {
            titleBase = "My Activities " + titleBase;
        }
        else
        {
            titleBase = "TrailNetwork " + titleBase;
        }
    
    	
       //===================== REMOVE PARTIAL BOUNDARY FILTER ======================
        if(activeReport.reportFilters.numberFilters("MapBoundary") != 2)
        {
    		filterOnMapBoundary(false);
        }
        //END REMOVE PARTIAL BOUNDARY FILTER
    
    	//===================== ADD FILTERS ======================
    
    
        //===================== AUTOMAGIC DEFAULT FILTERS ======================
        var pqs = new ParseQueryString();
    	    	
    	//for now only reports get REPORTABLE until we can add user interface to manage it.
    	if(activeReport.type == STATISTICS_REPORT_TYPE)
    	{
    		//only report table uses reportable right now...do here so they may delete and still "runReport"
    		activeReport.reportFilters.addFilter(REPORTABLE_FILTER);
    	}
    	else
    	{
    		//lists never show reportable
        	activeReport.reportFilters.deleteFilterByType(FILTER_TYPE_ADVANCED_FILTER,REPORTABLE_FILTER.value);
    	}
        //END AUTOMAGIC FILTERS    
    
        if(isFilteringByKeyword() && !isCallerActivitiesOnly())
        {    
            report.sortByColumns =  null;
        }
        else
        {
            report.sortByColumns =  sortByColumns;
        }
        
        if (report.reportTitle == ""){
    		report.setReportTitle(titleBase );
    	}
        report.setReportSubtitle("");
        report.assignResultsLimit(getResultsLimitSelected());
        
        showFilters();
    	if (askToLoad == true){
        	askToLoadReport();
    	}
    	else {
    		report.load();
    		hideDirtyRunReport(true);
        }
        setAskToLoadReport(false);
    }//end if not enough filters.
        
}//end runReport

function setAskToLoadReport(show) {
	//alert("set to:" + show);
	askToLoad = show;
}

function hideDirtyRunReport(hideit) {
    var dirtyRunReport = document.getElementById('dirtyRunReport');
    if (hideit == true) {
		dirtyRunReport.style.display = 'none';
	}
	else {
		dirtyRunReport.style.display = '';
		clearResults();
	}
}

function forceRunReport() {
	hideDirtyRunReport(true);
	activeReport.load();	
}

function askToLoadReport() {

		var dirtyRunReport = document.getElementById('dirtyRunReport');
		hideDirtyRunReport(false);
}

// ============================= COLUMNS ==========================================
var standardReportColumns = [appendSumSuffix(TOTAL_DISTANCE),appendSumSuffix(TOTAL_DURATION),appendSumSuffix(TOTAL_ELEVATION_GAIN),appendSumSuffix(TOTAL_ELEVATION_LOSS),appendAvgSuffix(AVERAGE_SPEED),appendAvgSuffix(AVERAGE_PACE)];

var inboxColumns = [appendIdSuffix(EPISODE_PK),EPISODE_START_DATE,LOCATION_ABSOLUTE_NAME,TOTAL_DURATION,TOTAL_DISTANCE,TOTAL_ELEVATION_GAIN,TOTAL_ELEVATION_LOSS,AVERAGE_SPEED];
var standardListingColumns;

    var episodePkColumnRequest = appendIdSuffix(EPISODE_PK);        

//must group by episode pk since there are multiple names for geo features...

if(isCallerActivitiesOnly())
{
    standardListingColumns = [episodePkColumnRequest].concat(MY_ACTIVITIES_COLUMNS);
}
else
{

    standardListingColumns = [episodePkColumnRequest].concat(TRAILNETWORK_COLUMNS);
}    
 
var standardMapColumns = [episodePkColumnRequest,EPISODE_NAME,USERNAME,EPISODE_START_DATE,ACTIVITY_TYPE,LOCATION_ABSOLUTE_NAME,EVENT_TYPE,TOTAL_DURATION,TOTAL_DISTANCE,TOTAL_ELEVATION_GAIN,TOTAL_ELEVATION_LOSS,AVERAGE_SPEED,AVERAGE_PACE,TRACK_START_LATITUDE,TRACK_START_LONGITUDE,TRACK_MIN_LATITUDE,TRACK_MIN_LONGITUDE,TRACK_MAX_LATITUDE,TRACK_MAX_LONGITUDE];



var DEFAULT_REPORT_SORT_COLUMNS = [appendDescSuffix(appendCountSuffix(EPISODE_NAME))];
var SORT_BY_PRIMARY_COLUMNS = null;
var  DEFAULT_LISTING_SORT_COLUMNS = [appendDescSuffix(EPISODE_START_DATE)];
var statisticsColumnsUrl = '/trail/report/test/SampleReport.xml';
var statisticsReportColumnSet = new ReportColumnSet([appendCountSuffix('episodeName')],standardReportColumns);
var listingReportColumnSet = new ReportColumnSet([],standardListingColumns );
var mapReportColumnSet = new ReportColumnSet([],standardMapColumns );
var inboxReportColumnSet = new ReportColumnSet([],inboxColumns );

function CopyReportColumnSet(reportColumnSet){
	var newSet = null;
	if (reportColumnSet) {
	 newSet = new ReportColumnSet(reportColumnSet.mandatoryColumns,reportColumnSet.chosenOptionalColumns);
	 }
	return newSet;
}

function ReportColumnSet(mandatoryColumns,chosenOptionalColumns)
{
    this.mandatoryColumns = mandatoryColumns;
    this.chosenOptionalColumns = chosenOptionalColumns;
    
    this.getAll = function()
    {
        var all =  this.mandatoryColumns.copy();
        all = all.concat(this.chosenOptionalColumns);
        return all;

    }
    
}//end ReportColumnSet


var KML_FORMAT = 'kml';
function exportAsXml(format)
{
    var path = activeReport.queryPath;

    if(format != null)
    {
        path += '&format=' + format;
        if(format == KML_FORMAT)
        {
    		var acct = new MBAccount();
    		var authenticatedUsername = acct.getUsername();
            //must use a non-authenticated link.
            path = path.replace('/network/report/stats/get.mb','/service/report.mb');
            path = path.replace('query.callerActivitiesOnly=true','query.andConditionGroups=username=' + authenticatedUsername);
            //must indicate that the bounding box is looking at the track start
            path += '&query.recordEntryKeys=trackStartLatitude-select&query.recordEntryKeys=trackStartLongitude-select&boundaryRecordEntryKey=trackStart';
            
        }
    }
   
   location = path;
}

function reportDefaultStats(report)
{
    
  if (!report) {
		statusMessage.showMessage('ERROR: list report is nul');
		return;
	}
	else
	{
	    activeReport = report;
        defaultReportMenu.onclick();
    }
}

/**a good way to refresh a report when showing the listings.
 * @param <Report> report - the report to modify and show as a listing.
 * @param <String> username - for shared digests this will show a specific user's activities.
*/
function reportDefaultListings(report)
{
	if (!report){
		statusMessage.showMessage('ERROR: reportDefaultListings report is null');
		return;
	}
    listingsMenuSelected(document.getElementById('defaultListingsViewType'));
        
	//is this a different type of report??
	report.primaryColumns = [];
	report.columnSet = CopyReportColumnSet(listingReportColumnSet);
	report.setXslUrl(TABLE_RESULTS_XSL_URL);
	report.queryResults = null;

	list(report);

}

function reportInbox()
{

    title = 'Inbox'
    var columnSet = CopyReportColumnSet(inboxReportColumnSet);
    activeReport = new Report(LISTINGS_REPORT_TYPE,[],columnSet);        
    activeReport.inbox = true;

    list(activeReport);
}

var userColumns = [USERNAME,CUSTOMER_FIRST_NAME,CUSTOMER_LAST_NAME,CUSTOMER_EMAIL_ADDRESS,BILLING_PROFILE_ID,BILLING_PROFILE_NEXT_DATE,BILLING_PROFILE_CREATE_DATE,BILLING_PROFILE_MODIFY_DATE,BILLING_PROFILE_ISSUER_PK];
var userListingsColumnSet = new ReportColumnSet([],userColumns );

var TABLE_RESULTS_XSL_URL = "/report/table/ReportResultsXsl.jsp";
function listUsers()
{
    var title;
  
    title = 'Users';
	var report = activeReport;
	report.type = USER_REPORT_TYPE;
	report.primaryColumns = [appendGroupSuffix(USERNAME)];
	report.columnSet = CopyReportColumnSet(userListingsColumnSet);
	report.setXslUrl(TABLE_RESULTS_XSL_URL);
    
    runReport(report,null,title);

}

var reportMap;

function showMap(report)
{

    if (!report) {
		statusMessage.showMessage('ERROR: showMap report is nul');
		return;
	}
	
    var sortByColumns = DEFAULT_LISTING_SORT_COLUMNS;

    var title;
    title = 'Map';
	report.type = MAP_REPORT_TYPE;
	report.primaryColumns = [];
	report.columnSet = CopyReportColumnSet(mapReportColumnSet);
    report.setXslUrl('/report/map/ReportResultsMapXsl.jsp');
    //switch between map and activity listings using the same page...otherwise always use#1
    //if(activeReport.type == LISTINGS_REPORT_TYPE)
    //{
        //activeReport.setPageNumber(activeReport.getPageNumber());
    //}
    runReport(report,sortByColumns,title);


}

 //============================ SAVED REPORTS =============================

function loadSavedReports() {
	if (savedReportData == null){
		savedReportData = new sr_Data();
		savedReportData.load();
	}
}

function sr_Data() {
	this.httpReq = null;
	this.loaded = true;

	this.getXml = function() {
		if (this.loaded)
			return this.httpReq.getXmlData();
	}

	this.getXsl = function() {
		if (this.loaded)
			return this.httpReq.getXslData();
	}

	this.setXml = function(xml) {
			this.httpReq.setXmlData(xml);
	}

	this.getHtml = function() {
		if (this.loaded)
			return this.httpReq.getHtmlData();
	}
	
	this.requestCompleted = function(mbHttpRequest)
	{
		this.loaded = true;
		sr_LoadAndTransform();
	}
		
	this.load = function() {
		var xslturl = "/trail/report/saved/SavedReports.xsl";
		var xmlurl = "/trail/reports/saved/xml/get.mb";
		this.httpReq = new MbTransformedRequest('Saved Reports');
		this.httpReq.setXsltUrl(xslturl);
		this.httpReq.setXmlUrl(xmlurl);
		this.httpReq.registerListener(this);
		this.httpReq.requestData();
		
	}
	
}

var savingNewReport = false;

function sr_LoadAndTransform() {
	if (!savedReportData || !savedReportData.loaded){
		statusMessage.showMessage('Error, saved reports not loaded!');
		return;
	}
	savedReportsObject = new SavedReportsObject();
	//load the Reports Array for js.
	var xml = savedReportData.getXml();
	var reportNodes = xml.getElementsByTagName("Report");
	var lastSavedReport;
	var xsl = savedReportData.getXsl();
	for (var r=0;r<reportNodes.length;r++) {
		var reportNode = reportNodes[r];
		var report = new Report();
		var savedReportPkNode = reportNode.getElementsByTagName("SavedReportPk")[0];
		if (savedReportPkNode.childNodes[0]){
			report.savedReportPk = savedReportPkNode.childNodes[0].nodeValue;
		}
		var nameNode = reportNode.getElementsByTagName("Name")[0];
		if (nameNode.childNodes[0])
			report.reportTitle = nameNode.childNodes[0].nodeValue;
		var filterNodes = reportNode.getElementsByTagName("Filter");
		for (var f=0;f<filterNodes.length;f++) {
			var filterNode = filterNodes[f];
			var filter = new ReportFilter();
			var typeNode = filterNode.getElementsByTagName("Type")[0];
			if (typeNode.childNodes[0])
				filter.type = typeNode.childNodes[0].nodeValue;
			var displayNameNode = filterNode.getElementsByTagName("DisplayName")[0];
			if (displayNameNode.childNodes[0])
				filter.displayName = displayNameNode.childNodes[0].nodeValue;
			var valueNode = filterNode.getElementsByTagName("Value")[0];
			if (valueNode.childNodes[0])
				filter.value = valueNode.childNodes[0].nodeValue;
			var hiddenNode = filterNode.getElementsByTagName("Hidden")[0];
			if (hiddenNode.childNodes[0]){
				if (hiddenNode.childNodes[0].nodeValue == 'false')
					filter.hidden = false;
				else
					filter.hidden = true;
			}
			var canDeleteNode = filterNode.getElementsByTagName("CanDelete")[0];
			if (canDeleteNode.childNodes[0]){
				if (canDeleteNode.childNodes[0].nodeValue == 'false')
					filter.canDelete = false;
				else
					filter.canDelete = true;
			}
			report.reportFilters.addFilter(filter);
		}
		lastSavedReport = report;
		savedReportsObject.addReport(report);
	}
	//END load Array
	//load the drop down
	var targetElement = document.getElementById("savedReports");
	targetElement.innerHTML = savedReportData.getHtml();
	var dropDownElement = document.getElementById("SavedReportsDropDown");
	if (dropDownElement){
		var numResults = dropDownElement.childNodes.length;
		if (numResults == 1)
			dropDownElement.disabled=true;
	}
	//Add the tab on new report
	if (savingNewReport){
		savingNewReport = false;		
	    //copy the report
	    //add this to the local array and add the pk from lastSavedReport.savedReportPk
	    var newReport = CopyReport(activeReport);
	    newReport.savedReportPk = lastSavedReport.savedReportPk;
	    newReport.reportTitle = report.reportTitle;
	    activeReport = newReport;
	    var created =  topnav.createTabPane(newReport.savedReportPk,newReport.reportTitle);
	    reportViews[created.index] = newReport;
        created.show = function() {  };
	    topnav.tabSelected(created.index);
	    //update it so it can be shown in the future
	    created.show = function() {  reportViews[created.index].show(); };
	    ReportRefreshed();
    }
}

function sr_ReportFromSavedReport(savedReportPk) {
	var newReport = new Report();
	if (savedReportPk > -1){
		if (!savedReportsObject){
			statusMessage.showMessage("ERROR: Saved Reports NOT Available.");
			return;			
		}
		for (var f = 0;f< savedReportsObject.reports.length;f++){
			var report = savedReportsObject.reports[f];
			if (report.savedReportPk == savedReportPk){
				newReport = CopyReport(report);
				break;
			}
		}	
	}
	return newReport;
}

function sr_loadSavedReport(selectElement) {
	var savedReportPk = selectElement.value;
	selectElement.selectedIndex = 0;
	//is it already loaded?
	for (var t = 0;t < topnav.tabs.length;t++) {
		if (topnav.tabs[t].id == savedReportPk) {
			topnav.tabSelected(t);
			return;
		}
	}
	//load new report
	if (savedReportPk > -1){
		//look for report information in savedReports
		var newReport = sr_ReportFromSavedReport(savedReportPk);
		//add this to the local array
		newReport.type = activeReport.type;
		newReport.primaryColumns = activeReport.primaryColumns.copy();
		newReport.columnSet = CopyReportColumnSet(activeReport.columnSet);
		newReport.setXslUrl(activeReport.xslUrl);
		activeReport = newReport;
		refreshReport();
		//add tab
		var created =  topnav.createTabPane(savedReportPk,newReport.reportTitle);
		created.show = function() {  };
		topnav.tabSelected(created.index);
		reportViews[created.index] = newReport;
		//update it so it can be shown in the future
		created.show = function() {  reloadTabData(reportViews[created.index]); };
	}
}

function reloadTabData(report) {
	//has the view change??
	if (activeReport.type == report.type) {
		report.show();
	}
	else {
		//reload it
		report.type = activeReport.type;
		report.primaryColumns = activeReport.primaryColumns.copy();
		report.columnSet = CopyReportColumnSet(activeReport.columnSet);
		report.setXslUrl(activeReport.xslUrl);
		activeReport = report;
		refreshReport();
	}
}

function dr_DeleteReport(savedReportPk) {
	this.httpReq;
	this.savedReportPk = savedReportPk;
	
	this.responseSuccess = function(o)
	{
		savedReportRefresh = false;
		var xml = o.responseXML;
		if (savedReportData.loaded){
			savedReportData.setXml(xml);
			sr_LoadAndTransform();
		}
		statusMessage.showMessage("Report Deleted");
		statusMessage.hideMessage(1000);
	}
	
	this.responseFailure = function(o)
	{
	   statusMessage.showMessage("Error deleting report");
	}
	
	this.callback =
	{
	   success : this.responseSuccess,
	   failure : this.responseFailure,
	   scope: this
	};	
	
	this.sendRequest = function()
	{
		var url = '/trail/reports/saved/xml/delete.mb?savedReportPk.pkValue=' + savedReportPk;
		statusMessage.showMessage("Deleting Report");
		YAHOO.util.Connect.asyncRequest('GET',url,this.callback);
	}
}  

function sr_SaveReport(savedReportXml) {
	this.httpReq;
	this.savedReportXml = savedReportXml;

	this.responseSuccess = function(o)
	{
		savedReportRefresh = false;
		var xml = o.responseXML;
		if (savedReportData.loaded){ 
			savedReportData.setXml(xml);
			sr_LoadAndTransform();
		}		
		statusMessage.showMessage("Report Saved");
		statusMessage.hideMessage(1000);
	}
	
	this.responseFailure = function(o)
	{
	   statusMessage.showMessage("Error saving report");
	}
	
	this.callback =
	{
	   success : this.responseSuccess,
	   failure : this.responseFailure,
	   scope: this
	};	
	
	this.sendXml = function()
	{
		var url = '/trail/reports/saved/xml/save.mb';
		var savedReportForm = document.getElementById("savedReportForm");
		var savedReportFormXml = document.getElementById("xml");
		savedReportFormXml.value = this.savedReportXml;
		var httpReq = httpRequestFactory.createRequest('Saving Report');
		statusMessage.showMessage("Saving Report");
		YAHOO.util.Connect.setForm(savedReportForm);
		YAHOO.util.Connect.asyncRequest('POST',url,this.callback);
	}
}  

function defaultCurrentReport(){
	statusMessage.showMessage('This is not implemented yet.');
}

function closeCurrentReport(){
	statusMessage.showMessage('This is not implemented yet.');
}

function deleteCurrentReport(){
   if(userIsAuthorized("Saved Reports are only available to MB standard subscription customers."))
   {
		if (activeReport.savedReportPk > -1){
			if(confirm('Are you sure you want to delete this report?')){
				var dr = new dr_DeleteReport(activeReport.savedReportPk);
				dr.sendRequest();
				//delete the tab
				for (var t = 0;t < topnav.tabs.length;t++) {
					if (topnav.tabs[t].id == activeReport.savedReportPk) {
						topnav.tabs[t].hideCompletely();
					}
				}
				//reselect the scratchpad
				topnav.tabSelected(0);
			}
		}
		else { statusMessage.showMessage('Report not saved.'); }
	}
}

function saveCurrentReport()
{
   if(userIsAuthorized("Saved Reports are only available to MB standard subscription customers."))
   {
	   var name = "";
		if (activeReport.savedReportPk == -1){
			name = prompt('Please name this report.',name);
			if(name != null && name != "null" && name != "") {
				savingNewReport = true;
				activeReport.reportTitle = name;
			}
		}
		else {
			name = activeReport.reportTitle;
			savingNewReport = false;
		}
		//pressing cancel returns null.
	
		if(name != null && name != "null" && name != "")
		{
			//build xml for database storage
			var xml = getSavedReportXml( activeReport );
			var sr = new sr_SaveReport(xml);
			//after send, the result will load a new tab if it is new.
			sr.sendXml();
		}
	}//end if access 
}

function saveAsCurrentReport()
{
   if(userIsAuthorized("Saved Reports are only available to MB standard subscription customers."))
   {
		var name = "";
		name = prompt('Please name this report.',name);
		//pressing cancel returns null.
	
		if(name != null && name != "null" && name != "")
		{		
			savingNewReport = true;
			activeReport = CopyReport(activeReport);
			activeReport.savedReportPk = -1;
			activeReport.reportTitle = name;
			//build xml for database storage
			var xml = getSavedReportXml( activeReport );
			var sr = new sr_SaveReport(xml);
			//after send, the result will load a new tab if it is new.
			sr.sendXml();
		}
	}//end if access 
}           

function cleanForXml(str) {
	return str.replace(/&/g,"&amp;");
}

function getSavedReportXml( report ) {
	var xml = "<Reports><Report>";
	if (report.savedReportPk&& report.savedReportPk > -1)
		xml += "<SavedReportPk>" + report.savedReportPk + "</SavedReportPk>";
	xml += "<Name>" + cleanForXml(report.reportTitle) + "</Name><Description /><Filters>";
	var filters = report.reportFilters.filters;
	for (var f = 0; f < filters.length; f++) {
		xml += "<Filter>";
		xml += "<Type>" + filters[f].type + "</Type>";
		xml += "<DisplayName>" + cleanForXml(filters[f].displayName) + "</DisplayName>";
		xml += "<Value>" + cleanForXml(filters[f].value) + "</Value>";
		xml += "<Hidden>" + filters[f].hidden + "</Hidden>";
		xml += "<CanDelete>" + filters[f].canDelete + "</CanDelete>";
		xml += "</Filter>";
	}
	xml += "</Filters></Report></Reports>";
	return xml;
}

function updateNumberChecked() {

    var addFilterButton = document.getElementById('checkboxAddFilterButtonHeader');
	if(addFilterButton != null ) {
	
	
		if (listFilters.filters.length == 0){
			addFilterButton.disabled = true;
			document.getElementById('checkboxAddFilterButtonFooter').disabled = true;
//			document.getElementById('raceButtonHeader').disabled = true;
//			document.getElementById('keyholeButtonHeader').disabled = true;
//			document.getElementById('raceButtonFooter').disabled = true;
//			document.getElementById('keyholeButtonFooter').disabled = true;
		}
		else {
			document.getElementById('checkboxAddFilterButtonFooter').disabled = false;
			document.getElementById('checkboxAddFilterButtonHeader').disabled = false;

			
		}
		var numChecked = document.getElementById("numCheckedHeader");
		numChecked.innerHTML = listFilters.filters.length;
		var numCheckedFooter = document.getElementById("numCheckedFooter");
		numCheckedFooter.innerHTML = listFilters.filters.length;
	}
}

 //============================ SAVED REPORTS =============================

function showLoading() {
		//change activeReport to LOADING
		var resultsTable = document.getElementById('reportContainer');
		resultsTable.innerHTML = "<span class='largestatusmessage'>Loading report data.</span>";
}

function addMotionBasedEngine()
{
 if ((typeof window.sidebar == "object") && (typeof window.sidebar.addSearchEngine == "function")) { 
     window.sidebar.addSearchEngine(
       "http://localtrail.motionbased.com/update/MotionBasedSearchPlugin.src",
       "http://localtrail.motionbased.com/update/MotionBasedSearchPlugin.png", "MotionBased", "General" );
 } else {
   errorMsg(name,ext,cat);
 } 
}
