var EnergieLabelSwapper = Class.create();
var tmpSwapper;

EnergieLabelSwapper.prototype = 
{
  // Array containing all the id's of the checkboxes for the energylabels
  inputBoxList: ['ela','elb','elc','eld','ele','elf','elg'],
  
  // Initialize everything (add listeners to the right checkboxes)
  initialize: function()
  {
    if ($('labelA') == null)
      return;
      
    for (var i = 0; i < this.inputBoxList.length; i++)
    {
      tmpSwapper = this;
      $(this.inputBoxList[i]).observe('click',this.updateModelsBasedOnLabels);
    }
      
    for (var i = 0; i < registeredCarModels.length; i++)
    {
      tmpSwapper = this;
      $('carmodel_' + registeredCarModels[i]).observe('click',this.updateLabelsBasedOnModels);
    }
    
    if (typeof(selectedCarmodels) != 'undefined' && typeof(selectedLabels) != 'undefined')
      this.loadInitialState();
  },
  
  // The search was saved in the session and is now returned to us in 2 global
  // js vars called 'selectedCarmodels' and 'selectedLabels', containing the
  // id's and the letters of the models and labels that should be selected.
  loadInitialState: function()
  {
    // labels
    for (var i = 65; i <= 71; i++)
    {
      var c = String.fromCharCode(i);
      if (selectedLabels.indexOf(c) != -1)
        this.enableEnergyLabel(c);
    }
    
    // carmodels
    for (var i = 0; i < registeredCarModels.length; i++)
    {
      if (selectedCarmodels.indexOf(registeredCarModels[i]) != -1)
        this.enableCarModel(registeredCarModels[i]);
    }
  },

  selectAllLabels: function(enab)
  {
    for (var i = 65; i <= 71; i++)
    {
      var c = String.fromCharCode(i);
      $('label'+c).checked = enab;
      
      if (enab)
        tmpSwapper.enableEnergyLabel(c);
      else
        tmpSwapper.disableEnergyLabel(c);
    }
    tmpSwapper.updateModelsBasedOnLabels();
  },
  
  selectGreenLabels: function()
  {
    for (var i = 65; i <= 71; i++)
    {
      var c = String.fromCharCode(i);
      var enab = (i <= 67);
      $('label'+c).checked = enab;
      
      if (enab)
        this.enableEnergyLabel(c);
      else
        this.disableEnergyLabel(c);
    }
    this.updateModelsBasedOnLabels();    
  },
   
  // Someone clicked a checkbox, update the fields accordingly
  updateModelsBasedOnLabels: function(clickevent)
  {
    this.swapper = tmpSwapper;
    
    var selectedLabels = [];
    for (var i = 65; i <= 71; i++)
    {
      var c = String.fromCharCode(i);
      if ($('label'+c).checked)
        selectedLabels[selectedLabels.length] = c;
    }
    
    var models = this.swapper.getModelsForLabels(selectedLabels);
    for (var i = 0; i < registeredCarModels.length; i++)
    {
      var carModelId = registeredCarModels[i];
      if (models.indexOf(carModelId) >= 0)
        this.swapper.enableCarModel(carModelId);
      else
        this.swapper.disableCarModel(carModelId);
    }
    
    // enable/disable our own field
    if (clickevent == null)
      return;
    
    var inputElement = Event.element(clickevent);
    
    var letter = inputElement.id.substring(5);
    if (inputElement.checked)
      this.swapper.enableEnergyLabel(letter);
    else
      this.swapper.disableEnergyLabel(letter);    
  },
  
  // Take the models selected and disable labels that have nothing to do with these models
  updateLabelsBasedOnModels: function(clickevent)
  {
    this.swapper = tmpSwapper;
    
    var selectedModels = [];
    for (var i = 0; i < registeredCarModels.length; i++)
    {
      if ($('carmodel_' + registeredCarModels[i]).checked)
        selectedModels[selectedModels.length] = registeredCarModels[i];
    }
    
    // get labels that should be selected, based on the models
    var labels = this.swapper.getLabelsForModels(selectedModels);
    
    // loop A to G
    for (var i = 65; i <= 71; i++)
    {
      var c = String.fromCharCode(i);
      if (labels.indexOf(c) >= 0)
        this.swapper.enableEnergyLabel(c);
      else
        this.swapper.disableEnergyLabel(c);  
    }
    
    // enable/disable our own field
    var inputElement = Event.element(clickevent);
    
    var id = inputElement.id.split("_")[1];
    
    if (inputElement.checked)
      this.swapper.enableCarModel(id);
    else
      this.swapper.disableCarModel(id);
  },
  
  // Gets the labels that should be enabled for the models provided, based
  // on the compiled labelmodelrelations.js
  getLabelsForModels: function(models)
  {
    var returnArray = [];
    
    // loop A to G
    for (var i = 65; i <= 71; i++)
    {
      var c = String.fromCharCode(i);
      var labelArray = eval('label' + c);
      
      // see if one of our models is in the label array
      for (var j = 0; j < models.length; j++)
      {
        if (labelArray.indexOf(models[j]) >= 0)
        {
          returnArray[returnArray.length] = c;
          break;
        }
      }
    }

    return returnArray;
  },
  
  // Gets the models that should be enabled for the labels provided
  getModelsForLabels: function(labels)
  {
    var returnArray = [];
    
    for (var i = 0; i < labels.length; i++)
    {
      var modelArray = eval('label' + labels[i]);
      for (var j = 0; j < modelArray.length; j++)
      {
        if (returnArray.indexOf(modelArray[j]) == -1)
          returnArray[returnArray.length] = modelArray[j];
      }
    }
    return returnArray;
  },
  
  // Disable an energylabel
  disableEnergyLabel: function(letter)
  {
    if (!letter || letter == '') return;
    
    var inputElement = $('label' + letter);
    var divElement = $('el' + letter.toLowerCase());
    inputElement.checked = false;
    divElement.className = 'energylabel_disabled';
    $('label' + letter + 'img').src = '/images/label_' + letter.toLowerCase() + '_off.gif';
  },
  
  // Enable an energylabel
  enableEnergyLabel: function(letter)
  {
    if (!letter || letter == '') return;
    
    var inputElement = $('label' + letter);
    var divElement = $('el' + letter.toLowerCase());
    inputElement.checked = true;
    divElement.className = '';
    $('label' + letter + 'img').src = '/images/label_' + letter.toLowerCase() + '.gif';
  },
    
  // Disable a car model
  disableCarModel: function(modelId)
  {
    $('carmodel_' + modelId).checked = false;
//    $('cm'+modelId).className = 'carmodel_disabled';
    $('cm_img'+modelId).src = '/uploaded_files/frontpage/' + modelId + '_disabled.gif';
  },
  
  // Enable a car model
  enableCarModel: function(modelId)
  {
    $('carmodel_' + modelId).checked = true;
//    $('cm'+modelId).className = '';
    $('cm_img'+modelId).src = '/uploaded_files/frontpage/' + modelId + '.gif';
  }
};