var g_data = null;
var g_filteredData = null;

function DataManager_load(onLoadHandler) {
  
  $.ajax({
    type: "GET",    
    url: dataXMLUrl,    
    dataType: "xml",
    success: function(xml) {      
      var answer = [];
      $(xml).find("impresora").each(function(i, impresoraXML) {
        var impresora = new Object();
        impresora['id'] = $(impresoraXML).attr('id');
        $(impresoraXML).children().each(function(i, propertyXML) {
          var propertyName = propertyXML.nodeName;          
          if($(propertyXML).children().length > 0) {
            var propertyValue = [];
            $(propertyXML).children().each(function(i, propertyValueXML) {
              propertyValue.push($(propertyValueXML).text());
            });
          } else {
            var propertyValue = $(propertyXML).text();
          }
          impresora[propertyName] = propertyValue;
        });        
        answer.push(impresora);
      });
      
      g_data = answer;
      g_filteredData = answer;
      onLoadHandler(answer);
      //$.toJSON(answer);
    },
    error: function(XMLHttpRequest, textStatus, errorThrown) {
      var description = "";
      if(textStatus != undefined) {
        description += textStatus;
      }
      if(errorThrown != undefined) {
        if(description != '') {
          description += "; ";
        }
        description += errorThrown;
      }
      alert('Error loading data: ' + description);
    }
  });  
}

var g_dataFilters = {};

// Filters :
// {
//  type: 'num' | 'enum',
//  category: name,
//  (min: minValue,
//   max: maxValue)|
//  (value: aValue)
// }

function DataManager_addFilter(aFilter) {
  
  var filtersForCategory = g_dataFilters[aFilter.category];
  if(filtersForCategory == undefined) {
    filtersForCategory = new Array();
  } else {
    for(var i=0;i!=filtersForCategory.length;i++) {
      if(aFilter.type == 'num') {
        if(aFilter.min == filtersForCategory[i].min &&
           aFilter.max == filtersForCategory[i].max) {
          
          return;
        }
      } else if(aFilter.type == 'enum') {
        if(aFilter.value == filtersForCategory[i].value) {
          return;
        }
      }
    }    
  }
  
  filtersForCategory.push(aFilter);
  
  g_dataFilters[aFilter.category] = filtersForCategory;
  
  //alert($.toJSON(g_dataFilters));
  g_filteredData = DataManager_filterData(g_data, g_dataFilters);
  buildResultsTable(g_filteredData);
  plot_displayData(g_filteredData);
}

function Array_remove(array, from, to) {
  var rest = array.slice((to || from) + 1 || array.length);
  array.length = from < 0 ? array.length + from : from;
  return array.push.apply(array, rest);
};

function DataManager_removeFilter(aFilter) {
  
  var filtersForCategory = g_dataFilters[aFilter.category];
  if(filtersForCategory == undefined) {
    return;
  } else {
    for(var i=0;i!=filtersForCategory.length;i++) {
      if(aFilter.type == 'num') {
        if(aFilter.min == filtersForCategory[i].min &&
           aFilter.max == filtersForCategory[i].max) {
          Array_remove(filtersForCategory, i);
          break;
        }
      } else if(aFilter.type == 'enum') {
        if(aFilter.value == filtersForCategory[i].value) {
          Array_remove(filtersForCategory, i);
          break;
        }
      }
    }    
  }
    
  g_dataFilters[aFilter.category] = filtersForCategory;
    
  g_filteredData = DataManager_filterData(g_data, g_dataFilters);
  buildResultsTable(g_filteredData);
  plot_displayData(g_filteredData);
}

function DataManager_clearFilters() {

  g_dataFilters = {};
  g_filteredData = g_data;
  buildResultsTable(g_filteredData);
  plot_displayData(g_filteredData);
}

function isArray(obj) {
   if (obj.constructor.toString().indexOf("Array") == -1)
      return false;
   else
      return true;
}

function DataManager_filterData(data, filters) {
  
  var results = [];
  var axe=0;
  jQuery.each(data, function(i, currentPrinter) {
    allCategoriesMatched = true;
    jQuery.each(filters, function(i, currentCategory) {
      var filterMatched = false;
      
      if(currentCategory.length == 0) {
        filterMatched = true;
      } else {            
        jQuery.each(currentCategory, function(i, currentFilter) {
          
          value = currentPrinter[currentFilter.category];
          if(value == null || value == undefined) {
            filterMatched = false;
          } else if(currentFilter.type == 'num') {
            if(value >= Number(currentFilter.min) && value <= Number(currentFilter.max)) {
              filterMatched = true;
            }
          } else if(currentFilter.type == 'enum') {
            if(isArray(value)) {
              if(jQuery.inArray(currentFilter.value, value) != -1) {                
                filterMatched = true;
              }
            } else {
              if(value.toUpperCase() == currentFilter.value.toUpperCase()) {
                filterMatched = true;
              }
            }
          }
        });
      }
      if(!filterMatched) {
        allCategoriesMatched = false;
      }
    });
    if(allCategoriesMatched) {
      results.push(currentPrinter);
    }
  });
    
  return results;
}

//$.toJSON(filters);
