(function($) {

Drupal.Suzuki = Drupal.Suzuki || {};
Drupal.Suzuki.Cars = {};
Drupal.Suzuki.Cars.selector = false;

/**
 * Bind all the event listeners.
 */
Drupal.Suzuki.Cars.initSelectorForm = function(context) {
  
  Drupal.Suzuki.Cars.onModelPage = $('ul#models').length;
  
  // save form elements on object for performance
  var form = $('#suzuki-cars-block-car-selector');
  Drupal.Suzuki.Cars.carBodyField = $('input[name="car_body"]', form);
  Drupal.Suzuki.Cars.carAccelerationField = $('input[name="acceleration"]', form);
  Drupal.Suzuki.Cars.carShifterField = $('select[name="gearbox"]', form);
  Drupal.Suzuki.Cars.carFuelField = $('select[name="fuel"]', form);

  Drupal.Suzuki.Cars.submitLink = $('#submit-link a, #submit-link div', form);

  if (Drupal.Suzuki.Cars.onModelPage == 1) {
    Drupal.Suzuki.Cars.allCars = $('.node-model', 'ul#models');
  }

  // set default values based on stored cookie
  Drupal.Suzuki.Cars.readCookie();

  // add event listeners
  Drupal.Suzuki.Cars.carBodyField.change(Drupal.Suzuki.Cars.calculateResults);
  Drupal.Suzuki.Cars.carAccelerationField.change(Drupal.Suzuki.Cars.calculateResults);
  Drupal.Suzuki.Cars.carShifterField.change(Drupal.Suzuki.Cars.calculateResults);
  Drupal.Suzuki.Cars.carFuelField.change(Drupal.Suzuki.Cars.calculateResults);
  
  Drupal.Suzuki.Cars.carBodyField.change(function() {
    suzuki_cars_ga('carbody', $(this).val());
  });
  Drupal.Suzuki.Cars.carAccelerationField.change(function() {
    suzuki_cars_ga('acceleration', $(this).val());
  });
  Drupal.Suzuki.Cars.carShifterField.change(function() {
    suzuki_cars_ga('gearbox', $(this).val());
  });
  Drupal.Suzuki.Cars.carFuelField.change(function() {
    suzuki_cars_ga('fuel', $(this).val());
  });

  // init the slider
  Drupal.Suzuki.Cars.initSlider(context);
}


/**
 * Event tracking.
 */
suzuki_cars_ga = function(type, value) {
  var values = {
    carbody: {
      0: 'all',
      1: '3',
      2: '5'
    },
    acceleration: {
      0: 'all',
      1: '2',
      2: '4'
    },
    gearbox: {
      0: 'all',
      1: 'man',
      2: 'aut'
    },
    fuel: {
      0: 'all',
      1: 'ben',
      2: 'die'
    }
  };
  
  if($('body').hasClass('front')) {
    _gaq.push(['_trackEvent', 'carconfig_home', type, values[type][value]]);
  }
  else {
    _gaq.push(['_trackEvent', 'carconfig_model', type, values[type][value]]);
  }

  //console.log(values[type][value]);
}


/**
 * Init the jquery ui slider.
 */
Drupal.Suzuki.Cars.initSlider = function(context) {

  var $context = $(context);
  Drupal.Suzuki.Cars.minRangeField = $('#edit-price-range-min', $context);
  Drupal.Suzuki.Cars.maxRangeField = $('#edit-price-range-max', $context);
  price_slider = $('#price-slider', $context);
  
  var min_value = 5000;
  var max_value = 35000;
  
  if (Drupal.Suzuki.Cars.selector) {
    min_value = Drupal.Suzuki.Cars.selector.minPrice;
    max_value = Drupal.Suzuki.Cars.selector.maxPrice;
  }
  
  price_slider.slider({
    range: true,
    min: 5000,
    max: 35000,
    values: [ min_value, max_value ],
    step: 1000,
    slide: function(event, ui) {
      Drupal.Suzuki.Cars.minRangeField.val(ui.values[0]);
      Drupal.Suzuki.Cars.minRangeField.next('span').html(Drupal.Suzuki.Cars.displayRange(ui.values[0]));      
      Drupal.Suzuki.Cars.maxRangeField.val(ui.values[1]);
      Drupal.Suzuki.Cars.maxRangeField.next('span').html(Drupal.Suzuki.Cars.displayRange(ui.values[1]));       
    },
    stop: function(event, ui) {
      Drupal.Suzuki.Cars.calculateResults();

      if($('body').hasClass('front')) {
        _gaq.push(['_trackEvent', 'carconfig_home', 'price', Drupal.Suzuki.Cars.minRangeField.val() + '_' + Drupal.Suzuki.Cars.maxRangeField.val()]);
      }
      else {
        _gaq.push(['_trackEvent', 'carconfig_model', 'price', Drupal.Suzuki.Cars.minRangeField.val() + '_' + Drupal.Suzuki.Cars.maxRangeField.val()]);
      }

    }
  });
  
  Drupal.Suzuki.Cars.minRangeField.val(price_slider.slider('values', 0));
  Drupal.Suzuki.Cars.minRangeField.after('<span>' + Drupal.Suzuki.Cars.displayRange(price_slider.slider('values', 0)) + '</span>');
  Drupal.Suzuki.Cars.maxRangeField.val(price_slider.slider('values', 1));  
  Drupal.Suzuki.Cars.maxRangeField.after('<span>' + Drupal.Suzuki.Cars.displayRange(price_slider.slider('values', 1)) + '</span>');  
}


/**
 * Calculate the number of results found for the current search settings.
 */
Drupal.Suzuki.Cars.displayRange = function(value) {
  var tempValue = value + '';
  return '&euro; ' + tempValue.substr(0, tempValue.length - 3) + '.' + tempValue.substr(-3, 3);
}

/**
 * Calculate the number of results found for the current search settings.
 */
Drupal.Suzuki.Cars.calculateResults = function() {
    
  Drupal.Suzuki.Cars.selector = {
    'bodyStyle' : Drupal.Suzuki.Cars.carBodyField.fieldValue()[0],
    'acceleration' : Drupal.Suzuki.Cars.carAccelerationField.fieldValue()[0],
    'gearShifter' : Drupal.Suzuki.Cars.carShifterField.fieldValue()[0],
    'fuel' : Drupal.Suzuki.Cars.carFuelField.fieldValue()[0],
    'minPrice' :  Drupal.Suzuki.Cars.minRangeField.val(),
    'maxPrice' :  Drupal.Suzuki.Cars.maxRangeField.val(),
    'resultsFound' : null
  };
  
  $.cookie('suzukiSelector', JSON.stringify(Drupal.Suzuki.Cars.selector), { path : Drupal.settings.basePath });
  $.ajax({
    url : '/' + Drupal.settings.carSelector.language + '/models/results/count',
    type : 'post',
    dataType : 'json',
    success : function(data) {
      if (data.success) {
        Drupal.Suzuki.Cars.selector.resultsFound = data.results;
        Drupal.Suzuki.Cars.selector.models = data.models;
        Drupal.Suzuki.Cars.selector.cars = data.cars;
        $.cookie('suzukiSelector', JSON.stringify(Drupal.Suzuki.Cars.selector), { path : Drupal.settings.basePath });
        Drupal.Suzuki.Cars.updateLink();
        if (Drupal.Suzuki.Cars.onModelPage != 0) {
          Drupal.Suzuki.Cars.applySelectionFilter();
        }
      } 
    }
  });    
}

/**
 * Set correct default values when a cookie is found.
 */
Drupal.Suzuki.Cars.readCookie = function() {
  
  var cookie = $.cookie('suzukiSelector');
  if (cookie) {
    Drupal.Suzuki.Cars.selector = $.parseJSON(cookie);
    if (Drupal.Suzuki.Cars.selector) {
      Drupal.Suzuki.Cars.carBodyField.filter("[value=" + Drupal.Suzuki.Cars.selector.bodyStyle + "]").attr("checked","checked");
      Drupal.Suzuki.Cars.carAccelerationField.filter("[value=" + Drupal.Suzuki.Cars.selector.acceleration + "]").attr("checked","checked");
      Drupal.Suzuki.Cars.carShifterField.val(Drupal.Suzuki.Cars.selector.gearShifter);
      Drupal.Suzuki.Cars.carFuelField.val(Drupal.Suzuki.Cars.selector.fuel);
      if (Drupal.Suzuki.Cars.onModelPage) {
        Drupal.Suzuki.Cars.applySelectionFilter();  
      }
      Drupal.Suzuki.Cars.updateLink();
    }
  }
  
}

/**
 * Update the submit link to the correct results.
 */
Drupal.Suzuki.Cars.updateLink = function() {
  if (Drupal.Suzuki.Cars.selector.resultsFound != null) {
    var link = '';
    var show = Drupal.settings.carSelector.show;
    if (show) {
      var link = Drupal.t('Show cars');
    }
    if (Drupal.Suzuki.Cars.selector.resultsFound == 1) {
      Drupal.Suzuki.Cars.submitLink.html("<span class='results-found'>" + Drupal.t("@total car found", {'@total': Drupal.Suzuki.Cars.selector.resultsFound}) + '</span> ' + link);      
    }
    else {
      Drupal.Suzuki.Cars.submitLink.html("<span class='results-found'>" + Drupal.t("@total cars found", {'@total': Drupal.Suzuki.Cars.selector.resultsFound}) + '</span> ' + link);
    }
    
    // Hide * and show a 'no results' message.
    if (Drupal.Suzuki.Cars.onModelPage == 1) {
      var $block = $('#block-system-main');
      if (Drupal.Suzuki.Cars.selector.resultsFound == 0) {
        if ($('.no-results', $block).length == 0) {
          $('#block-system-main').prepend('<div class="no-results">' + Drupal.t('No cars found that match your criteria.') + '</div>');
        }
        else {
          $('.no-results', $block).show();          
        }
        $('.block-block').hide();
      }
      else {
        $('.no-results', $block).hide();
        $('.block-block').show();     
      }
    }
  }  
}

/**
 * Apply the user his selection as filter on the results.
 */
Drupal.Suzuki.Cars.applySelectionFilter = function() {
  
  checks = Drupal.Suzuki.Cars.selector.models;
  
  // Catch potential problems.
  if (undefined == checks) {
    $('.node-model').show();
    return true;
  }
  
  // Hide all first.
  $('.node-model').hide();
  
  // Iterate to show all models.
  $.each(checks, function (i, val) {
    $('#models .model_' + val).show();
  });
}

/**
 * Attach the behavior for car selectors.
 */
Drupal.behaviors.carSelector = {
  attach: function(context) {
  
    // Bind on car selector.
    if ($('#suzuki-cars-block-car-selector').length > 0) {
      Drupal.Suzuki.Cars.initSelectorForm(context);
    }
    
    // Bind on motorisation table.
    if ($('#motorisatie-table').length > 0) {
      Drupal.Suzuki.Cars.motorisationTable(context);
    }
  }
}

/**
 * Bind on the motorisation table.
 */
Drupal.Suzuki.Cars.motorisationTable = function(context) {
  
  var cookie = $.cookie('suzukiSelector');
  if (cookie) {
    Drupal.Suzuki.Cars.selector = $.parseJSON(cookie);
    checks = Drupal.Suzuki.Cars.selector.cars;
    
    // Catch potential problems.
    if (undefined == checks) {
      return true;
    }
    
    // Hide all first.
    var number = $('tr.motor-row', '#motorisatie-table').length;
    $('tr.motor-row', '#motorisatie-table').hide();
    
    // Iterate to show all motorisations.
    showing = 0;
    $.each(checks, function (i, val) {
      if ($('#car-' + val).length > 0) {
        showing++;
        $('#car-' + val).show();
      }
    });
    
    if (number != showing) {
      $('#show-all-motor').show();
    }
  }
  
  // Show all motorisations link.
  $('#show-all-motor-link').click(function() {
    $('tr', '#motorisatie-table > tbody').each(function() {
      $(this).show();
    });
    $('#show-all-motor').toggle();
    return false;
  });
}






//implement JSON.stringify serialization
JSON.stringify = JSON.stringify || function (obj) {
 var t = typeof (obj);
 if (t != "object" || obj === null) {
 // simple data type
 if (t == "string") obj = '"'+obj+'"';
 return String(obj);
 }
 else {
 // recurse array or object
 var n, v, json = [], arr = (obj && obj.constructor == Array);
 for (n in obj) {
 v = obj[n]; t = typeof(v);
 if (t == "string") v = '"'+v+'"';
 else if (t == "object" && v !== null) v = JSON.stringify(v);
 json.push((arr ? "" : '"' + n + '":') + String(v));
 }
 return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
 }
};

})(jQuery);
;

