﻿/* Copyright (c) Hoseasons Holidays Limited
* Author: Chris O'Brien
* Date: 24th August 2009
*/

jQuery.fn.featureFilter = function(RegionDDL, SleepRangeDDL, FromPriceDDL, UpToPriceDDL, BedroomRangeDDL, AccommodationTypeDDL,
    featuresCheckBoxes, featuresCheckBoxesMoreFilters, numberOfVillasFound, viewMoreLessFeatureFilters, jsonAccommodationData,
    jsonRegions, jsonSleeps, jsonFromPrices, jsonUpToPrices, jsonBedrooms, jsonAccommodationTypes, jsonFeatureMasks) {

  RegionDDL.change(refreshDDLs);
  SleepRangeDDL.change(refreshDDLs);
  FromPriceDDL.change(refreshDDLs);
  UpToPriceDDL.change(refreshDDLs);
  BedroomRangeDDL.change(refreshDDLs);
  AccommodationTypeDDL.change(refreshDDLs);
  featuresCheckBoxes.click(refreshDDLs);
  refreshDDLs();

  function refreshDDLs(e) {
    // Get feature bit mask filter.
    var featureBitMaskFilter = 0;
    featuresCheckBoxes.each(function(i) {
      if (this.checked) featureBitMaskFilter += jsonFeatureMasks[i];
    });

    // Get Region filter
    var regionFilter = 0;
    if (RegionDDL.get(0).selectedIndex != 0) regionFilter = RegionDDL.get(0).value;

    // Get Sleeps Filter
    var sleepsRange = getSleepsRange(SleepRangeDDL.get(0).value);

    // Get Bedroom Filter
    var bedroomRange = getBedroomRange(BedroomRangeDDL.get(0).value);

    // Get Accommodation Type Filter
    var accommodationType = AccommodationTypeDDL.get(0).value;

    // Get Price Range Filter
    var priceRange = { from: FromPriceDDL.get(0).value, upto: UpToPriceDDL.get(0).value };

    // Populate Region DDL.
    var selectedValue = RegionDDL.get(0).value;
    var numberOfOptions = RegionDDL.get(0).options.length;
    for (var k = 0; k < numberOfOptions; k++) RegionDDL.get(0).remove(0);
    var option = document.createElement('option');
    option.text = "Select";
    option.value = "-1";
    if (option.value == selectedValue) option.selected = true;
    RegionDDL.get(0).options[RegionDDL.get(0).options.length] = option;
    option = document.createElement('option');
    option.text = "All sub regions";
    option.value = "0";
    if (option.value == selectedValue) option.selected = true;
    RegionDDL.get(0).options[RegionDDL.get(0).options.length] = option;
    for (var k = 0; k < jsonRegions.length; k++) {
      villaCount = getVillaCount(featureBitMaskFilter, jsonRegions[k].value, priceRange.from, priceRange.upto, sleepsRange.min,
        sleepsRange.max, bedroomRange.min, bedroomRange.max, accommodationType);
      if (villaCount == 0) continue;
      option = document.createElement('option');
      option.text = jsonRegions[k].text + " (" + villaCount + ")";
      option.value = jsonRegions[k].value;
      if (option.value == selectedValue) option.selected = true;
      RegionDDL.get(0).options[RegionDDL.get(0).options.length] = option;
    }

    //Populate Sleeps DDL
    var selectedValue = SleepRangeDDL.get(0).value;
    numberOfOptions = SleepRangeDDL.get(0).options.length;
    for (var k = 0; k < numberOfOptions; k++) SleepRangeDDL.get(0).remove(0);
    var option = document.createElement('option');
    option.text = "Select";
    option.value = "Select";
    if (option.value == selectedValue) option.selected = true;
    SleepRangeDDL.get(0).options[SleepRangeDDL.get(0).options.length] = option;
    option = document.createElement('option');
    option.text = "Any";
    option.value = "Any";
    if (option.value == selectedValue) option.selected = true;
    SleepRangeDDL.get(0).options[SleepRangeDDL.get(0).options.length] = option;
    for (var k = 0; k < jsonSleeps.length; k++) {
      sleepsRange = getSleepsRange(jsonSleeps[k].value);
      villaCount = getVillaCount(featureBitMaskFilter, regionFilter, priceRange.from, priceRange.upto, sleepsRange.min,
        sleepsRange.max, bedroomRange.min, bedroomRange.max, accommodationType);
      if (villaCount == 0) continue;
      option = document.createElement('option');
      option.text = jsonSleeps[k].text + " (" + villaCount + ")";
      option.value = jsonSleeps[k].value;
      if (option.value == selectedValue) option.selected = true;
      SleepRangeDDL.get(0).options[SleepRangeDDL.get(0).options.length] = option;
    }
    sleepsRange = getSleepsRange(SleepRangeDDL.get(0).value); // Reset to sleeps range to selected value.

    //Populate Bedroom DDL
    var selectedValue = BedroomRangeDDL.get(0).value;
    numberOfOptions = BedroomRangeDDL.get(0).options.length;
    for (var k = 0; k < numberOfOptions; k++) BedroomRangeDDL.get(0).remove(0);
    var option = document.createElement('option');
    option.text = "Any";
    option.value = "Any";
    BedroomRangeDDL.get(0).options[BedroomRangeDDL.get(0).options.length] = option;
    for (var k = 0; k < jsonBedrooms.length; k++) {
      bedroomRange = getBedroomRange(jsonBedrooms[k].value);
      villaCount = getVillaCount(featureBitMaskFilter, regionFilter, priceRange.from, priceRange.upto, sleepsRange.min,
        sleepsRange.max, bedroomRange.min, bedroomRange.max, accommodationType);
      if (villaCount == 0) continue;
      option = document.createElement('option');
      option.text = jsonBedrooms[k].text + " (" + villaCount + ")";
      option.value = jsonBedrooms[k].value;
      if (option.value == selectedValue) option.selected = true;
      BedroomRangeDDL.get(0).options[BedroomRangeDDL.get(0).options.length] = option;
    }
    bedroomRange = getBedroomRange(BedroomRangeDDL.get(0).value); // Reset to bedroom range to selected value.

    //Populate Accommodation Type DDL
    var selectedValue = AccommodationTypeDDL.get(0).value;
    numberOfOptions = AccommodationTypeDDL.get(0).options.length;
    for (var k = 0; k < numberOfOptions; k++) AccommodationTypeDDL.get(0).remove(0);
    var option = document.createElement('option');
    option.text = "Any";
    option.value = "Any";
    AccommodationTypeDDL.get(0).options[AccommodationTypeDDL.get(0).options.length] = option;
    for (var k = 0; k < jsonAccommodationTypes.length; k++) {
      accommodationType = jsonAccommodationTypes[k].value;
      villaCount = getVillaCount(featureBitMaskFilter, regionFilter, priceRange.from, priceRange.upto, sleepsRange.min,
        sleepsRange.max, bedroomRange.min, bedroomRange.max, accommodationType);
      if (villaCount == 0) continue;
      option = document.createElement('option');
      option.text = jsonAccommodationTypes[k].text + " (" + villaCount + ")";
      option.value = jsonAccommodationTypes[k].value;
      if (option.value == selectedValue) option.selected = true;
      AccommodationTypeDDL.get(0).options[AccommodationTypeDDL.get(0).options.length] = option;
    }
    accommodationType = AccommodationTypeDDL.get(0).value; ; // Reset to accommodation type to selected value.

    //Populate From Price DDL
    if (FromPriceDDL.length > 0) {
      var selectedValue = FromPriceDDL.get(0).value;
      numberOfOptions = FromPriceDDL.get(0).options.length;
      for (var k = 0; k < numberOfOptions; k++) FromPriceDDL.get(0).remove(0);
      var option;
      for (var k = 0; k < jsonFromPrices.length; k++) {
        villaCount = getVillaCount(featureBitMaskFilter, regionFilter, jsonFromPrices[k].value, priceRange.upto, sleepsRange.min,
          sleepsRange.max, bedroomRange.min, bedroomRange.max, accommodationType);
        if (villaCount == 0) continue;
        option = document.createElement('option');
        option.text = jsonFromPrices[k].text;
        option.value = jsonFromPrices[k].value;
        if (option.value == selectedValue) option.selected = true;
        FromPriceDDL.get(0).options[FromPriceDDL.get(0).options.length] = option;
      }
    }

    //Populate Up To Price DDL
    if (UpToPriceDDL.length > 0) {
      var selectedValue = UpToPriceDDL.get(0).value;
      numberOfOptions = UpToPriceDDL.get(0).options.length;
      for (var k = 0; k < numberOfOptions; k++) UpToPriceDDL.get(0).remove(0);
      var option;
      for (var k = 0; k < jsonUpToPrices.length; k++) {
        villaCount = getVillaCount(featureBitMaskFilter, regionFilter, priceRange.from, jsonUpToPrices[k].value, sleepsRange.min,
          sleepsRange.max, bedroomRange.min, bedroomRange.max, accommodationType);
        if (villaCount == 0) continue;
        option = document.createElement('option');
        option.text = jsonUpToPrices[k].text;
        option.value = jsonUpToPrices[k].value;
        if (option.value == selectedValue) option.selected = true;
        UpToPriceDDL.get(0).options[UpToPriceDDL.get(0).options.length] = option;
      }
    }

    //Disable/enable any feature filter check boxes.
    featuresCheckBoxes.each(function(i) {
      if (this.checked) return;
      var featureBitMask = featureBitMaskFilter + jsonFeatureMasks[i];
      villaCount = getVillaCount(featureBitMask, regionFilter, priceRange.from, priceRange.upto, sleepsRange.min, sleepsRange.max,
        bedroomRange.min, bedroomRange.max, accommodationType);
      this.disabled = villaCount == 0;
    });

    var villaCount = getVillaCount(featureBitMaskFilter, regionFilter, priceRange.from, priceRange.upto, sleepsRange.min, sleepsRange.max,
      bedroomRange.min, bedroomRange.max, accommodationType);
    numberOfVillasFound.html(villaCount + " Holiday villas found ");
  }

  /*
  JSON Accommodations will have the following structure where r = region code, s = max sleep count, p = prices and f = feature set mask,
  [{r:48,s:3,p:[436,345],f:36,t:'villa',b:2},{r:48,s:3,p:[436,765],f:36,t:'apartment',b:1}]
  */
  function getVillaCount(featureBitMaskFilter, regionFilter, minPrice, maxPrice, minSleeps, maxSleeps, minBedrooms, maxBedrooms, accommodationType) {
    var villaCount = 0;
    for (var k = 0; k < jsonAccommodationData.length; k++) {
      if ((jsonAccommodationData[k].f & featureBitMaskFilter) == featureBitMaskFilter) { // Feature Filter
        if (regionFilter == 0 || regionFilter == -1 || regionFilter == jsonAccommodationData[k].r) { // Region Filter
          if (jsonAccommodationData[k].s >= minSleeps && (maxSleeps == 0 || jsonAccommodationData[k].s <= maxSleeps)) { // Sleeps Filter
            if (jsonAccommodationData[k].b >= minBedrooms && (maxBedrooms == -1 || jsonAccommodationData[k].b <= maxBedrooms)) { // Bedrooms Filter
              if (accommodationType == "Any" || accommodationType == "" || jsonAccommodationData[k].t == accommodationType) { // Accommodation Type Filter
                for (var j = 0; j < jsonAccommodationData[k].p.length; j++) {
                  if (jsonAccommodationData[k].p[j] >= minPrice && (maxPrice == 0 || jsonAccommodationData[k].p[j] <= maxPrice)) { // Price Filter
                    villaCount++;
                    break;
                  }
                }
              }
            }
          }
        }
      }
    }
    return villaCount;
  }

  // Returns { min: , max:  } from DDL value e.g. TwoToFour
  function getSleepsRange(value) {
    var minSleeps = 0;
    var maxSleeps = 0;
    if (value == "TwoToFour") {
      minSleeps = 2;
      maxSleeps = 4;
    } else if (value == "FiveToSeven") {
      minSleeps = 5;
      maxSleeps = 7;
    } else if (value == "EightToTen") {
      minSleeps = 8;
      maxSleeps = 10;
    } else if (value == "ElevenPlus") {
      minSleeps = 11;
    }
    return { min: minSleeps, max: maxSleeps };
  }

  // Returns { min: , max:  } from DDL value e.g. TwoToFour
  function getBedroomRange(value) {
    var minBedrooms = -1;
    var maxBedrooms = -1;
    if (value == "Studio") {
      minBedrooms = 0;
      maxBedrooms = 0;
    } else if (value == "One") {
      minBedrooms = 1;
      maxBedrooms = 1;
    } else if (value == "Two") {
      minBedrooms = 2;
      maxBedrooms = 2;
    } else if (value == "Three") {
      minBedrooms = 3;
      maxBedrooms = 3;
    } else if (value == "Four") {
      minBedrooms = 4;
      maxBedrooms = 4;
    } else if (value == "Five") {
      minBedrooms = 5;
      maxBedrooms = 5;
    } else if (value == "SixPlus") {
      minBedrooms = 6;
    }
    return { min: minBedrooms, max: maxBedrooms };
  }

  viewMoreLessFeatureFilters.click(function(e) {
    if (featuresCheckBoxesMoreFilters.css("display") == "none") {
      viewMoreLessFeatureFilters.html("<< View less filters");
      featuresCheckBoxesMoreFilters.each(function(i) {
        $(this).css("display", "inline");
      });
    } else {
      featuresCheckBoxesMoreFilters.each(function(i) {
        viewMoreLessFeatureFilters.html("View more filters &#187;");
        $(this).css("display", "none");
      });
    }
  });
};

function eventTrack_featuresCheckBoxList() {
  try {
    var checkBoxes = $(".featureCheckboxes input");
    var filtersChecked = '';
    var separator = '';
    checkBoxes.each(function(i) {
      if (this.type.substr(0, 8) == 'checkbox' && this.checked == true) {
        filtersChecked += separator + this.nextSibling.innerHTML;
        separator = ', ';
      }
    });
    pageTracker2._trackEvent('Feature Filters Checked', filtersChecked);
  } catch (Error) { }
}