﻿var merkenXML;
var modellenXML;
var bouwjaarXML;
var varText = "";

$(function(){
  brandstofXML = getListFromServer("actGetBrandstof", "");
  transmissieXML = getListFromServer("actGetTransmissie", "");
  getBouwjaarXML();
})

function refresh(formName, categorie){
    getVoertuigCount('.vrt-count', '#' + formName + '-merk', '#' + formName + '-model', '#' + formName + '-brandstof', '#' + formName + '-transmissie', '#' + formName + '-prijs', '#' + formName + '-bouwjaar', categorie);
}

  
function makeUrl(form){
  var loc = "";
  
  var name = new Array("merk", "model");
  for(var i = 0; i < name.length; i++){
    var merkmodel = getSelected('#' + form + '-' + name[i] + '> option:selected');
    if(merkmodel != "") loc += name[i] + "=" + merkmodel + "&";
  }
  
  var brandstof = $('#' + form + '-brandstof > option:selected').text();
  if(brandstof != "" && ($('#' + form + '-brandstof').attr('selectedIndex') != 0)){
    brandstof = UiToBz(brandstofXML, "BRANDSTOF", brandstof);
    loc += "brandstof=" + brandstof + "&";
  }
  
  var transmissie = $('#' + form + '-transmissie > option:selected').text();
  if(transmissie != "" && ($('#' + form + '-transmissie').attr('selectedIndex') != 0)){
    transmissie = UiToBz(transmissieXML, "TRANSMISSIE", transmissie);
    loc += "transmissie=" + transmissie + "&";
  }
  
  name = new Array("prijs", "bouwjaar");
  var minmax = new Array("min", "max");
  for(var i = 0; i < name.length; i++)
  for(var j = 0; j < minmax.length; j++){
    var prijsmin = $('#' + form + '-' + name[i]).slider("values", j);
//    if(prijsmin != $('#' + form + '-' + name[i]).slider("option", minmax[j]) && getSelected('#' + form + '-merk > option:selected') != "")
    loc += name[i] + minmax[j] + "=" + prijsmin + "&";
  }
  
  return loc.substring(0, loc.length - 1);  
}

function createChoiceBlock(formName){
  
  var categorie;
  if(formName == "nieuw" || getParameterByName("autocategorie") == "nieuw")
    categorie = "nieuw";
  getMerkenXML(categorie);
  vulMerkenLijst( '#' + formName + '-merk' );
    $('#' + formName + '-merk').change(function() {
        changeMerk(formName, '#' + formName + '-model', '#' + formName + '-brandstof');
        vulSlider( 'prijs', null, null, "prijs", 500, "€", false, formName);
        vulSlider( 'bouwjaar', bouwjaarXML, 'BOUWJAAR', "bouwjaar", 1, "", false, formName);
    } );
  
    $('#' + formName + '-model').change(function() {
        changeModel(formName, '#' + formName + '-model', '#' + formName + '-brandstof');
        vulSlider( 'prijs', null, null, "prijs", 500, "€", false, formName);
        vulSlider( 'bouwjaar', bouwjaarXML, 'BOUWJAAR', "bouwjaar", 1, "", false, formName);
    } );
  
  vulLijstFromArray( '#' + formName + '-transmissie', transmissieXML, 'TRANSMISSIE' );
  
  $('select[id*="' + formName + '-"]').change(function() {
    refresh(formName, categorie);
  } );
  
    vulSlider( 'prijs', null, null, "prijs", 500, "€", false, formName);
    vulSlider( 'bouwjaar', bouwjaarXML, 'BOUWJAAR', "bouwjaar", 1, "", false, formName);
}
  
function getMerkenXML(formName){
  categorie = "";
  if(formName == "nieuw" || getParameterByName("autocategorie") == "nieuw")
    categorie += '&autocategorie=' + "nieuw".toUpperCase();
  $.ajax({
     type: "GET",
     url: serverurl + ccdb2dll + "/actGetMerk?site_id=" + ccdb2_dslnummer + categorie, 
     dataType: "xml",
     async: false,
     success: function(xml){
       merkenXML = xml;
     }
  });
}

function getModellenXML( aMerken, formName){
  categorie = "";
  if(formName == "nieuw" || getParameterByName("autocategorie") == "nieuw")
    categorie += '&autocategorie=' + "nieuw".toUpperCase();
  $.ajax({
     type: "GET",
     url: serverurl + ccdb2dll + "/actGetModel?site_id=" + ccdb2_dslnummer + '&merk=' + aMerken + categorie, 
     dataType: "xml",
     async: false,
     success: function(xml){
       modellenXML = xml;
     }
  });
}

function getBrandstofXML(formName){
  url = serverurl + ccdb2dll + "/actGetBrandstof?site_id=" + ccdb2_dslnummer;
  merken = getSelected("#" + formName + "-merk > option:selected");
  if(merken.length != 0)
    url += "&merk=" + merken;
  modellen = getSelected("#" + formName + "-model > option:selected");
  if(modellen.length != 0)
    url += "&model=" + modellen;
  if(formName == "nieuw" || getParameterByName("autocategorie") == "nieuw")
    url += '&autocategorie=' + "nieuw".toUpperCase();
    
  $.ajax({
     type: "GET",
     url: url,
     dataType: "xml",
     async: false,
     success: function(xml){
       brandstofXML = xml;
     }
  });
}

function getBouwjaarXML(formName){
  url = serverurl + ccdb2dll + "/actGetBouwjaar?site_id=" + ccdb2_dslnummer;
  merken = getSelected("#" + formName + "-merk > option:selected");
  if(merken.length != 0)
    url += "&merk=" + merken;
  modellen = getSelected("#" + formName + "-model > option:selected");
  if(modellen.length != 0)
    url += "&model=" + modellen;
  if(formName == "nieuw" || getParameterByName("autocategorie") == "nieuw")
    url += '&autocategorie=' + "nieuw".toUpperCase();
  $.ajax({
     type: "GET",
     url: url, 
     dataType: "xml",
     async: false,
     success: function(xml){
       bouwjaarXML = xml;
     }
  });
}

function vulMerkenLijst( selectList ){
  $(selectList).empty();
  var merken = getMerkenFromMerkenXML();
  merken = filterRedundancy( merken );
        merken.sort();
  var merkopties = "";
  for(var i = 0; i < merken.length; i++){
    merkopties += "<option value = '" + merken[i] + "'>" + ((merken[i].length <= 3)? merken[i].toUpperCase() + " [" + aantalVan(merkenXML, "MERK", merken[i]) + "]" : merken[i].toLowerCase().capitalize() + " [" + aantalVan(merkenXML, "MERK", merken[i]) + "]") + "</option>";
  }
  $(merkopties).appendTo(selectList);
}

/*
 * Deze methode vult de gespecificeerde lijst met de inhoud van de xml
 * @param aSelectList De lijst waar het in komt te staan
 * @param aXML De xml waar het zijn gegevens vandaan zal halen
 * @param aNodeName De naam van de node waar de xml zijn gegevens vandaan zal halen.
 */
function vulLijstFromArray( aSelectList, aXML, aNodeName ){
  var lLijst = getArrayFromXML( aXML, aNodeName );
  lLijst = filterRedundancy( lLijst );
  var optielijst = "";
  for(var i = 0; i < lLijst.length; i++){
    lLijst[i] = capatalizeLength(lLijst[i], 2);
    optielijst += "<option value = '" + lLijst[i] + "'>" + lLijst[i] + "</option>";
  }
  $(optielijst).appendTo(aSelectList);
}

/*
 * Deze methode vult de lijst van modellen met de modellen.
 * Het wordt gesorteerd op merken, wat ook de optgroup zal zijn.
 * @param aSelectList De lijst waarop het ingevuld zal worden
 */
function vulModellenFromArray( aSelectList){
  var lLijst = getModellenFromXML(modellenXML);
  for(var i = 0; i < lLijst.length; i++){
    $('<optgroup />').attr("label", capatalizeLength(lLijst[i].toLowerCase().capitalize(), 3)).appendTo(aSelectList);
    lLijst[lLijst[i]].sort();
      for(var j = 0; j < lLijst[lLijst[i]].length; j++){
      lLijst[lLijst[i]][j] = capatalizeLength(lLijst[lLijst[i]][j].toLowerCase().capitalize(), 2);
      $('<option />')
        //&nbsp;&nbsp;Modelnaam&nbsp;[aantal]
        .html("&nbsp;&nbsp;" + lLijst[lLijst[i]][j] + "&nbsp;[" + aantalVan(modellenXML, "MODEL", lLijst[lLijst[i]][j]) + "]")
        .attr("value", lLijst[lLijst[i]][j])
        .appendTo(aSelectList);  
    }
  }
}

function capatalizeLength(aString, length){
  for(j = 0; j < aString.length; j++){
    var k = 0;
    while(/[A-Za-z]/.test(aString.charAt(j + k))){
      k++;
      if(aString.length == j + k)
        break;
    }
    if(k <= length){
      aString = aString.substring(0, j) + aString.substring(j, j + k).toUpperCase() + aString.substring(j + k, aString.length);
    }
    j += k;
  }
  return aString;
}

function getMerkenFromMerkenXML(){
  var merken = new Array();
  $(merkenXML).find('MERK').each(function(){
    merken.push($(this).attr('value'));
  })
  return merken;
}

function changeMerk( formName, aModelList , aBrandstofList) {
  $(aModelList).children().remove();
  if(getSelected('#' + formName + '-merk > option:selected' )){
    if(formName == "nieuw" || getParameterByName("autocategorie") == "nieuw")
      getModellenXML( getSelected('#' + formName + '-merk > option:selected'), "nieuw" );
    else
      getModellenXML( getSelected('#' + formName + '-merk > option:selected') );
    vulModellenFromArray( aModelList);
  }
  else{
    $('<option />').html("Kies een merk").appendTo(aModelList);  
  }
  $(aBrandstofList).children().remove();
  getBrandstofXML(formName);
  $('<option />').html("Maak uw keuze").appendTo(aBrandstofList);
  vulLijstFromArray( aBrandstofList, brandstofXML, 'BRANDSTOF' );
  getBouwjaarXML(formName);
}

function changeModel( formName, aModelList , aBrandstofList) {
  $(aBrandstofList).children().remove();
  if(getSelected('#' + formName + '-merk > option:selected' ) != ""){
    getBrandstofXML(formName);
    $('<option />').html("Maak uw keuze").appendTo(aBrandstofList);
    vulLijstFromArray( aBrandstofList, brandstofXML, 'BRANDSTOF' );
  }
  getBouwjaarXML(formName);
}

/*
 * Maakt een slider aan aan de hand van de parameters die opgegeven worden.
 * @param slider De locatie van de div waar de slider zal komen te staan.
 * @param aXML De xml waarop de slider zijn data zal baseren
 * @param aNodeName De node waarin hij in de xml zal zoeken.
 * @param aTextField Het tekstveld waarop de gegevens van de slider zal ingevuld worden
 * @param aStep De stapgrootte van de slider
 * @param preMark Het teken dat voor het aantal op de slider ingevuld word
 * @param getFromParameters Een boolean of hij zijn gegevens uit de parameters van het document moet halen.
 */
function vulSlider(slider, aXML, aNodeName, aTextField, aStep, preMark, getFromParameters, formName){
var minValue;
var maxValue;
aTextField = "#" + formName + "-" + aTextField + "-output";
  //Verkrijg de minimale en maximale prijs
  if(aTextField == "#" + formName + "-prijs-output"){
    var prijzen = getPrijzen(getSelected('#' + formName + '-merk > option:selected'), getSelected('#' + formName + '-model > option:selected'), formName);
    minValue = parseInt(prijzen[0]);
    maxValue = parseInt(prijzen[1]);
  }
  //Verkrijg het minimale en maximale getal uit de xml
  else{
    var lLijst = getArrayFromXML( aXML, aNodeName );
    lLijst = filterRedundancy( lLijst );
    minValue = Number.MAX_VALUE;
    maxValue = Number.MIN_VALUE;
    for(var i = 0; i < lLijst.length; i++){
      maxValue = Math.max(lLijst[i], maxValue);
      minValue = Math.min(lLijst[i], minValue);
    }
    //Het bouwjaar kan niet groter worden dan het huidige jaar (onjuist ingevulde gegevens check)
    if(aTextField == "#" + formName + "-bouwjaar-output"){
      if(maxValue > new Date().getFullYear())
        maxValue = new Date().getFullYear();
    }
  }
  minValue = Math.floor(minValue / aStep) * aStep;
  maxValue = Math.ceil(maxValue / aStep) * aStep;
  if(minValue == maxValue){
    if(minValue == 0)
      maxValue += aStep;
    else
      minValue -= aStep;
  }
//Zet de huidige waardes op standaardwaarden
var minValueNow = minValue;
var maxValueNow = maxValue;
if(getFromParameters){
  //Zet de huidige waarden op de parameterwaarden
  if(getParameterByName(slider + "min").length != 0)
    minValueNow = getParameterByName(slider + "min");
  if(getParameterByName(slider + "max").length != 0)
    maxValueNow = getParameterByName(slider + "max");
}
//Maak de slider aan
  $("#" + formName + "-" + slider).slider({
    range: true,
    min: minValue,
    max: maxValue,
    step: aStep,
    values: [minValueNow, maxValueNow],
    stop: function(event, ui) {
      var lMerken = getSelected( "#" + $(this).attr('id').split("-")[0] + "-merk" + " > option:selected");     
      if ( lMerken != "" ) {
        getVoertuigCount('.vrt-count', ('#' + formName + '-merk'), ('#' + formName + '-model'), ('#' + formName + '-brandstof'), ('#' + formName + '-transmissie'), ('#' + formName + '-prijs'), ('#' + formName + '-bouwjaar'), formName);
      }
    },
    slide: function(event, ui) {
//      if(getSelected('#' + formName + '-merk > option:selected') == "") {
//        $(aTextField).html("Kies een merk");
//                  }
//      else{
          if(aTextField == "#" + formName + "-prijs-output"){
            var minimalValue = ui.values[0];
            var maximalValue = ui.values[1];
          }
          else{
            var minimalValue = ui.values[0];
            var maximalValue = ui.values[1];
          }
                          $(aTextField + "-van").val(minimalValue);
                          $(aTextField + "-tot").val(maximalValue);
//        $(aTextField).html(preMark + minimalValue + ' - ' + preMark + maximalValue);  
//      }
    }
  });
//  if(getSelected('#' + formName + '-merk > option:selected') == "") {  
//    $(aTextField).html("Kies een merk");
//  }
//  else{
    if(aTextField == "#" + formName + "-prijs-output"){
      var minimalValue = $('#' + formName + '-' + slider).slider("values", 0);
      var maximalValue = $('#' + formName + '-' + slider).slider("values", 1);
    }
    else{
      var minimalValue = $('#' + formName + '-' + slider).slider("values", 0);
      var maximalValue = $('#' + formName + '-' + slider).slider("values", 1);
    }
    $(aTextField + "-van").val(minimalValue);
    $(aTextField + "-tot").val(maximalValue);
//    $(aTextField).html(preMark + minimalValue + ' - ' + preMark + maximalValue);
//  }

  $(aTextField + "-van" ).change(function() {
    var lSlider = $( "#" + $(this).attr('id').substr( 0, $(this).attr('id').length - 11 ) );
    lSlider.slider("values", 0, $(this).val() );
    refresh($(this).attr('id').split("-")[0], $(this).attr('id').split("-")[0] );
  });

  $(aTextField + "-tot" ).change(function() {
    var lSlider = $( "#" + $(this).attr('id').substr( 0, $(this).attr('id').length - 11 ) );
    lSlider.slider("values", 1, $(this).val() );
    refresh($(this).attr('id').split("-")[0], $(this).attr('id').split("-")[0] );
  });
}

/*
 * Verkrijg de parameters uit de form
 * @param formName de gemeenschappelijke naam van de form waar hij zijn data moet halen.
 */
function getParamatersFromForm(formName){
    var loc = "";
  
    var name = new Array("merk", "model");
    for(var i = 0; i < name.length; i++){
      var location = getSelected('#' + formName + '-' + name[i] + '> option:selected');
      if(location != "") loc += name[i] + "=" + location + "&";
    }
    
    var brandstof = $('#' + formName + '-brandstof > option:selected').text();
    if(brandstof != "" && ($('#' + formName + '-brandstof').attr('selectedIndex') != 0)){
        brandstof = UiToBz(brandstofXML, "BRANDSTOF", brandstof);
        loc += "brandstof=" + brandstof + "&";
    }
    
    var transmissie = $('#' + formName + '-transmissie > option:selected').text();
    if(transmissie != "" && ($('#' + formName + '-transmissie').attr('selectedIndex') != 0)){
        transmissie = UiToBz(transmissieXML, "TRANSMISSIE", transmissie);
        loc += "transmissie=" + transmissie + "&";
    }
    
    //lees de sliders uit
    name = new Array("prijs", "bouwjaar");
    var minmax = new Array("min", "max");
    for(var i = 0; i < name.length; i++)
      for(var j = 0; j < minmax.length; j++){
      var prijsmin = $('#' + formName + '-' + name[i]).slider("values", j);
      if(prijsmin != $('#' + formName + '-' + name[i]).slider("option", minmax[j]) && getSelected('#' + formName + '-merk > option:selected') != "")
      loc += name[i] + minmax[j] + "=" + prijsmin + "&";
    }
    
    loc = loc.substring(0, loc.length - 1);  
    return loc;
}

/*
 * Verkrijg de minimale en maximale prijs
 */
function getPrijzen(merken, modellen, categorie){
  var url = serverurl + ccdb2dll + "/actGetPrijs?site_id=" + ccdb2_dslnummer;
  if(categorie == "nieuw")
    url += "&autocategorie=NIEUW";
  var prijzen = ["0","0"];
  if(merken.length != 0)
    url += "&merk=" + merken;
  if(modellen.length != 0)
    url += "&model=" + modellen;
  $.ajax({
    type: "GET",
    url: url,
    dataType: "text",
    async: false,
    success: function(xml) {
      prijzen = [getPrijs("min", xml), getPrijs("max", xml)];
    }
  })
  return prijzen;
}

/*
 * Haalt uit de xml de minimale en maximale prijs met een regular expression.
 */
function getPrijs(regex, xml){
  return xml.match(new RegExp(regex + '="+[0-9*]+"'))[0].match(/\d/g).join("");
}

/*
 * Verkrijg het aantal voertuigen uit de selectie.
 * @param aOutputElement Hier zet hij de tekst op die in de variabele varText staat opgeslagen.
 *                       hij vervangt #COUNT door het aantal en #OCCASION door occasions of occasion(indien het aantal 1 is)
 */
function getVoertuigCount( aOutputElement, aMerkList, aModelList, aBrandstofList, aTransmissieList, aPrijs, aBouwjaar, categorie) {
  var lVrtCount = 0;
  
  var lMerken = getSelected(aMerkList + ' > option:selected');     
  if ( lMerken != "" ) lMerken = "&merk=" + lMerken;
  
  var lBrandstoffen = $(aBrandstofList + ' > option:selected').text();
  if(lBrandstoffen != "" && ($(aBrandstofList).attr('selectedIndex') != 0))
    lBrandstoffen = "&brandstof=" + UiToBz(brandstofXML, "BRANDSTOF", lBrandstoffen);
  else
    lBrandstoffen = "";
  
  var lTransmissie = $(aTransmissieList + ' > option:selected').text();
  if(lTransmissie != "" && ($(aTransmissieList).attr('selectedIndex') != 0))
    lTransmissie = "&transmissie=" + UiToBz(transmissieXML, "TRANSMISSIE", lTransmissie);
  else
    lTransmissie = "";
    
    
  var lModellen = "";
  var lPrijs = "";
  var lBouwjaar = "";
  if(lMerken != ""){
    
    lModellen = getSelected(aModelList + ' > option:selected');
    if ( lModellen != "" ) lModellen = "&model=" + lModellen;
    
    lPrijs = $(aPrijs).slider("option", "values");
    var lPrijsmin = lPrijsmax = "";
    if(lPrijs[0] != undefined)
    if(lPrijs[0] != $(aPrijs).slider("option", "min"))
      lPrijsmin = "&prijsmin=" + lPrijs[0];
    if(lPrijs[1] != undefined)
    if(lPrijs[1] != $(aPrijs).slider("option", "max"))
      lPrijsmax = "&prijsmax=" + lPrijs[1];
    lPrijs = lPrijsmin + lPrijsmax;
  
    lBouwjaar = $(aBouwjaar).slider("option", "values");
    var lBouwjaarmin = lBouwjaarmax = "";
    if(lBouwjaar[0] != undefined)
    if(lBouwjaar[0] != $(aBouwjaar).slider("option", "min"))
      lBouwjaarmin = "&bouwjaarmin=" + lBouwjaar[0];
    if(lBouwjaar[1] != undefined)
    if(lBouwjaar[1] != $(aBouwjaar).slider("option", "max"))
      lBouwjaarmax = "&bouwjaarmax=" + lBouwjaar[1];
    lBouwjaar = lBouwjaarmin + lBouwjaarmax;
  }
  
  if(categorie != "nieuw")
    categorie = null;
  var text = getCountFromServer(lMerken + lModellen + lBrandstoffen + lTransmissie + lPrijs + lBouwjaar, categorie);
  var lCaption = varText;
  if ( text == "1" ) {
  lCaption = varText.replace('#OCCASION', 'occasion' )
  } else {
  lCaption = varText.replace('#OCCASION', 'occasions' )
  }
  $(aOutputElement).html(lCaption.replace('#COUNT', text ) );
  if ( lMerken != "" ) {
    if(categorie != "nieuw")
      $(aOutputElement + "-1").html('(' + text + ')');
    else
      $(aOutputElement + "-2").html('(' + text + ')');
  }
}

