﻿/*****************

  (c) 2006 Q42 B.V.

  The contents of this file, partially or in whole, may not be reproduced
  without prior written permission by Q42 B.V.

*****************/

function DataCollector()
{
  Spif.DOMEvents.attach(window, "load", this.attachEvents);
}

DataCollector.prototype =
{
  MAX_SUMMARY_CHARS: 64,

  waitTimeout: null,

  accommodationCount: 0,

  productCount: 0,

  firstLoad: true,

  attachEvents: function() {
    //TODO haal alle juiste waarden op
    var form = document.getElementById("search-full-panel");
    if (!form)
      return;

    //TODO maak het werkend
    //    var inputFields = getElementsByTagNameAttributeValue(form, "input", "type", "text");
    //    for(var i=0;i<inputFields.length;i++)
    //      DOMEvents.attach(inputFields[i], "blur", dataCollector.test);
    //      DOMEvents.attach(inputFields[i], "enter", dataCollector.getTotals);

    // Attach the getTotal event to all elements which influence the amount of searchresults
    var resetButtonsA = getElementsByTagNameAttributeValue(form, "a", "class", "button-reset"); //form.getElementsByTagName("button");
    for (var i = 0; i < resetButtonsA.length; i++)
      Spif.DOMEvents.attach(resetButtonsA[i], "click", dataCollector.getTotals);

    // Attach the getTotal event to all elements which influence the amount of searchresults
    var resetButtons = getElementsByTagNameAttributeValue(form, "input", "type", "image"); //form.getElementsByTagName("button");
    for (var i = 0; i < resetButtons.length; i++)
      Spif.DOMEvents.attach(resetButtons[i], "click", dataCollector.getTotals);

    var selectBoxes = form.getElementsByTagName("select");
    for (var i = 0; i < selectBoxes.length; i++)
      Spif.DOMEvents.attach(selectBoxes[i], "change", dataCollector.getTotals);

    // execute getTotals *after* doChangeCheckBox (see searchcountryandarea.js)
    var checkBoxes = getElementsByTagNameAttributeValue(form, "input", "type", "checkbox");
    for (var i = 0; i < checkBoxes.length; i++)
      Spif.DOMEvents.attach(checkBoxes[i], "click", function() { dataCollector.waiting = setTimeout(function() { dataCollector.getTotals() }, 100) });

    var radioButtons = getElementsByTagNameAttributeValue(form, "input", "type", "radio");
    for (var i = 0; i < radioButtons.length; i++)
      Spif.DOMEvents.attach(radioButtons[i], "click", dataCollector.getTotals);

    if (this.accommodationCount == 0 && this.productCount == 0)
      dataCollector.getTotals();

    // set up click tracking for misc. objects    
    var searchfull4 = document.getElementById('search-full-4');
    var search4checkboxes = searchfull4.getElementsByTagName('input');
    for (var i = 0; i < search4checkboxes.length; i++) {
      var cbox = search4checkboxes[i];
      Spif.DOMEvents.attach(cbox, "click", function(evt) {
        var el = evt.subject;
        if (el.nodeName.toLowerCase() == "label") el = el.getElementsByTagName('input')[0];
        ClickTracker.trackClick(new Click(resources.messages.clicktracker.ct_search_acco + el.id));
      });
    }

    var numberofbedrooms = document.getElementById('number-of-bedrooms');
    Spif.DOMEvents.attach(numberofbedrooms, "change", function(evt) {
      ClickTracker.trackClick(new Click(resources.messages.clicktracker.ct_search_acco_rooms + evt.subject.value));
    });

    var selnumberofpeople = document.getElementById('selNumberOfPeople');
    Spif.DOMEvents.attach(selnumberofpeople, "change", function(evt) {
      ClickTracker.trackClick(new Click(resources.messages.clicktracker.ct_search_travelparty_persons + evt.subject.value));
    });

    var lastMinuteAndPromotionsOptionsCheckboxes = document.getElementById('lastMinuteAndPromotionsOptions').getElementsByTagName('input');
    if (lastMinuteAndPromotionsOptionsCheckboxes.length >= 2) {
      Spif.DOMEvents.attach(lastMinuteAndPromotionsOptionsCheckboxes[0], "click", function(evt) {
        ClickTracker.trackClick(new Click(resources.messages.clicktracker.ct_search_offer));
      });
      Spif.DOMEvents.attach(lastMinuteAndPromotionsOptionsCheckboxes[1], "click", function(evt) {
        ClickTracker.trackClick(new Click(resources.messages.clicktracker.ct_search_lastminute));
      });
    }

    var totalsBox = document.getElementById('totalsBox');
    Spif.DOMEvents.attach(totalsBox, "click", function(evt) {
      ClickTracker.trackClick(new Click(resources.messages.clicktracker.ct_search_searchbutton));
    });

    var mapBox = document.getElementById('search-full-submit-map');
    if (mapBox != null) {
      Spif.DOMEvents.attach(mapBox, "click", function(evt) {
        ClickTracker.trackClick(new Click(resources.messages.clicktracker.ct_search_mapbutton));
      });
    }

    var durationboxCheckboxes = document.getElementById('duration-box').getElementsByTagName('input');
    for (var i = 0; i < durationboxCheckboxes.length; i++) {
      var cbox = durationboxCheckboxes[i];
      Spif.DOMEvents.attach(cbox, "click", function(evt) {
        ClickTracker.trackClick(new Click(resources.messages.clicktracker.ct_search_period_duration + evt.subject.value));
      });
    }
    var durationExact = document.getElementById('duration-exact-select');
    Spif.DOMEvents.attach(durationExact, "change", function(evt) {
      ClickTracker.trackClick(new Click(resources.messages.clicktracker.ct_search_period_duration + evt.subject.value));
    });

    var bandwidthOptionsInputs = document.getElementById('bandwidthOptions').getElementsByTagName('input');

    //Bandwidth options are optional
    if (bandwidthOptionsInputs.length != 0) {
      var exact = bandwidthOptionsInputs[0];
      Spif.DOMEvents.attach(exact, "click", function(evt) {
        ClickTracker.trackClick(new Click(resources.messages.clicktracker.ct_search_period_exact));
      });
      var margin = bandwidthOptionsInputs[1];
      Spif.DOMEvents.attach(margin, "click", function(evt) {
        ClickTracker.trackClick(new Click(resources.messages.clicktracker.ct_search_period_marge5));
      });
    }

    // calendar, not working correctly, due to Frame updates
    //Moved to calendar
  },
  getTotals: function() {
    // timeout already running?
    if (dataCollector.waiting) {
      // clear!
      clearTimeout(dataCollector.waiting);
      dataCollector.waiting = null;
    }

    var beginTime = new Date().getTime();

    var frm = document.getElementById("search-full-panel");
    var els = frm.elements;

    var params = "";
    var value = "";
    for (var i = 0; i < els.length; i++) {
      var el = els.item(i);
      switch (el.type) {
        case "checkbox":
          value = (el.checked ? "on" : null);
          break;
        case "radio":
          if (el.checked) value = el.value; else value = null;
          break;
        default:
          if (el.nodeName == "SELECT") {
            value = el.options[el.selectedIndex].value;

            // if the value is "-", then interpret it as "no preference"
            if (
              (value == '-' || el.options[el.selectedIndex].innerHTML == '-') ||
              (!value && value != '')
            )
              value = el.options[el.selectedIndex].innerHTML;
          }
          else
            value = el.value;
          break;
      }
      if (value) params += "&" + el.name + "=" + value;
    }

    var chkText = document.getElementById('search-by-code-input-chk');
    if (chkText != null && chkText.checked) {
      var inputField = document.getElementById('search-by-code-input-ctrl');
      var check = "";
      if (document.getElementById("freeTextSearch") != null) check = resources.messages.free_text_example;
      if (inputField.value != "" && inputField.value != check) {
        params += "&search-by-code-input=" + escape(inputField.value);
      }
    }

    dataCollector.updateSummaries();

    var cmd = function() {
      xmlhttp.request("/Search/GetTotals.aspx?date=" + new Date().getTime(), params, true, "dataCollector.processTotals", true);
    }

    Spif.ClassNameAbstraction.replace(document.getElementById("search-full-submit"), "enabled", "disabled");
    Spif.ClassNameAbstraction.replace(document.getElementById("search-full-submit-m"), "enabled", "disabled");
    Spif.ClassNameAbstraction.replace(document.getElementById("search-full-submit-map"), "totalsShown", "totalsHidden");
    Spif.ClassNameAbstraction.replace(document.getElementById("totalsBox"), "totalsShown", "totalsHidden");
    Spif.ClassNameAbstraction.replace(document.getElementById("loadingBox"), "loadingHidden", "loadingShown");
    document.getElementById("loadingImage").src = "/img/loading.gif";

    dataCollector.waiting = setTimeout(cmd, 1000);

  },
  processTotals: function() {
    if (xmlhttp.req["dataCollector.processTotals"].readyState == 4) {
      if (xmlhttp.req["dataCollector.processTotals"].status == 200) {
        dataCollector.setTotals(xmlhttp.req["dataCollector.processTotals"].responseXML);
      }
    }
  },
  setTotals: function(xmlDocument) {
    //Reset indication resetAll is called
    var resetAll = document.getElementById("rall");
    if (resetAll) resetAll.value = '0';

    if (xmlDocument.documentElement) {
      var ac = xmlDocument.documentElement.getElementsByTagName('accommodationCount');

      if (navigator.userAgent.indexOf("MSIE 5.5_") != -1) {
        // Change the resultsbutton for display in IE 5.5
        if (document.getElementById("resultCountShow") != null)
          Spif.ClassNameAbstraction.add(document.getElementById("resultCountShow"), "ie55show");
        if (document.getElementById("resultCountHolidays") != null)
          Spif.ClassNameAbstraction.add(document.getElementById("resultCountHolidays"), "ie55holidays");
        Spif.ClassNameAbstraction.replace(document.getElementById("resultCount"), "expanded", "collapsed");
        Spif.ClassNameAbstraction.replace(document.getElementById("search-full-submit"), "disabled", "enabled");
        Spif.ClassNameAbstraction.replace(document.getElementById("search-full-submit-m"), "disabled", "enabled");
        Spif.ClassNameAbstraction.replace(document.getElementById("search-full-submit-map"), "totalsHidden", "totalsShown");
        Spif.ClassNameAbstraction.replace(document.getElementById("totalsBox"), "totalsHidden", "totalsShown");
        Spif.ClassNameAbstraction.replace(document.getElementById("loadingBox"), "loadingShown", "loadingHidden");
      }
      else {   // Everything but IE 5.5 --> normal execution of events
        if (ac.length > 0)
          this.accommodationCount = (ac.childNodes > 1) ? ac[0].childNodes[1].nodeValue : ac[0].firstChild.nodeValue;

        var pc = xmlDocument.documentElement.getElementsByTagName('productCount');

        if (pc.length > 0)
          this.productCount = (pc.childNodes > 1) ? pc[0].childNodes[1].nodeValue : pc[0].firstChild.nodeValue;

        dataCollector.showTotals(this.accommodationCount, this.productCount);

        //RW20070702 VS issue 8494, 8505
        var selectionDiv = document.getElementById("search-selection-div");
        if (selectionDiv) {
          var st = xmlDocument.documentElement.getElementsByTagName('searchText');

          if (st.length > 0) {
            var selectionText = document.getElementById("search-selection-text");
            var searchText = (st.childNodes > 1) ? st[0].childNodes[1].nodeValue : st[0].firstChild.nodeValue;

            Spif.ClassNameAbstraction.replace(selectionDiv, "hidden", "shown");
            selectionText.innerText = searchText;
          }
          else {
            Spif.ClassNameAbstraction.replace(selectionDiv, "shown", "hidden");
          }
        }
      }

      //Set additional count parameters
      var items = xmlDocument.documentElement.getElementsByTagName('item');
      var facets = xmlDocument.documentElement.getElementsByTagName('facet');
      var countrySelect = document.getElementById("selCountry");
      var subfacets = null;
      var facetAlias, facetType, facetAdd;
      var facetEntryValue, facetEntryCount;
      var countNode;
      var i, j, k, l;

      //Clear all items
      for (i = 0; i < items.length; i++) {
        countNode = document.getElementById(items[i].getAttribute('id'));
        if (countNode != null) countNode.innerHTML = '';
      }

      //Clear select
      if (countrySelect != null) {
        for (k = 0; k < countrySelect.options.length; k++) {
          l = countrySelect.options[k].text.indexOf(" (");
          if (l != -1) {
            countrySelect.options[k].text = countrySelect.options[k].text.substring(0, l);
          }
        }
      }

      //Set appropriate count nodes
      for (i = 0; i < facets.length; i++) {
        facetAlias = facets[i].getAttribute('alias');
        facetType = facets[i].getAttribute('type');
        facetAdd = facetType == '1' ? '<br>' : '&nbsp;';
        subfacets = facets[i].getElementsByTagName('facetentry');

        for (j = 0; j < subfacets.length; j++) {
          facetEntryCount = subfacets[j].getAttribute('count');
          facetEntryValue = subfacets[j].getAttribute('value');

          //Select
          if (facetType == '2') {
            if (countrySelect != null && facetEntryCount != '0') {
              for (k = 0; k < countrySelect.options.length; k++) {
                l = countrySelect.options[k].value;
                if (facetEntryValue == l) {
                  countrySelect.options[k].text = countrySelect.options[k].text + ' (' + facetEntryCount + ')';
                  break;
                }
              }
            }
          }
          else {
            countNode = document.getElementById(facetAlias + '_' + facetEntryValue + '_cl');

            //Node present and NOT '0'
            if (countNode != null && facetEntryCount != '0') countNode.innerHTML = facetAdd + '(' + facetEntryCount + ')';
          }
        }
      }
    }
  },

  showTotals: function(accommodationCount, productCount) {
    // Display the amount of results
    document.getElementById("resultCount").innerHTML = accommodationCount;

    //Different text for single/multiple results
    if (resources.messages.searchtextsingle != '' && resources.messages.searchtextmultiple != '') {
      var theCount = parseInt(accommodationCount);
      document.getElementById("resultText").innerHTML = theCount <= 1 ? resources.messages.searchtextsingle :
                                                                        resources.messages.searchtextmultiple;
    }

    if (
					(typeof results != 'undefined' && dataCollector.firstLoad) ||
					(productCount == 0 && accommodationCount == 0)
			 ) {
      dataCollector.firstLoad = false;
      Spif.ClassNameAbstraction.replace(document.getElementById("search-full-submit"), "enabled", "disabled");
      Spif.ClassNameAbstraction.replace(document.getElementById("search-full-submit-m"), "enabled", "disabled");
    }
    else if (!isNaN(productCount)) {
      Spif.ClassNameAbstraction.replace(document.getElementById("search-full-submit"), "disabled", "enabled");
      Spif.ClassNameAbstraction.replace(document.getElementById("search-full-submit-m"), "disabled", "enabled");
    }

    // Set the resultcount to lime-green when we have 42 results
    if (accommodationCount == 42) {
      Spif.ClassNameAbstraction.add(document.getElementById("resultCount"), "q42");
    }
    else {
      Spif.ClassNameAbstraction.remove(document.getElementById("resultCount"), "q42");
    }

    // hide loading image & show totals box
    Spif.ClassNameAbstraction.replace(document.getElementById("search-full-submit-map"), "totalsHidden", "totalsShown");
    Spif.ClassNameAbstraction.replace(document.getElementById("totalsBox"), "totalsHidden", "totalsShown");
    Spif.ClassNameAbstraction.replace(document.getElementById("loadingBox"), "loadingShown", "loadingHidden");

  },

  getTotalsMap: function() {
    // timeout already running?
    if (dataCollector.waitingMap) {
      // clear!
      clearTimeout(dataCollector.waitingMap);
      dataCollector.waitingMap = null;
    }

    var map_params = document.getElementById('map_params');
    var params = '&' + map_params.value;

    var cmd = function() {
      xmlhttp.request("/Search/GetTotalsMap.aspx?date=" + new Date().getTime(), params, true, "dataCollector.processTotalsMap", true);
    }

    dataCollector.waitingMap = setTimeout(cmd, 50);
  },

  processTotalsMap: function() {
    if (xmlhttp.req["dataCollector.processTotalsMap"].readyState == 4) {
      if (xmlhttp.req["dataCollector.processTotalsMap"].status == 200) {
        dataCollector.setTotalsMap(xmlhttp.req["dataCollector.processTotalsMap"].responseXML);
      }
    }
  },

  setTotalsMap: function(xmlDocument) {
    if (xmlDocument.documentElement) {
      // Display the amount of results
      if (xmlDocument.documentElement.xml) {
        document.getElementById("googleMapResultsCoords").innerHTML = xmlDocument.documentElement.xml;
      }
      else {
        var serializer = new XMLSerializer();
        var xml = serializer.serializeToString(xmlDocument);
        document.getElementById("googleMapResultsCoords").innerHTML = xml;
      }

      if (GoogleMapResults) {
        var coordsEl = document.getElementById('googleMapResultsCoords');

        // load total
        GoogleMapUtils.loadTotal(GoogleMapResults, coordsEl);

        //First clear previous overlays
        GoogleMapResults.map.clearOverlays();

        // load markers
        GoogleMapUtils.loadMarkers(GoogleMapResults, coordsEl, true);
      }
    }
  },

  updateSummaries: function() {
    // type of holiday (Bestemming en accommodatie)
    var chosen = [];

    var el = document.getElementById("search-full-4");
    var inputs = el.getElementsByTagName("input");

    for (var i = 0; i < inputs.length; i++) {
      var input = inputs.item(i);
      if (input.type == "checkbox" && input.checked) {
        // assume label is parentNode
        if (input.parentNode.nodeName.toLowerCase() == "label") {
          var accoText = input.parentNode.innerText || input.parentNode.textContent;
          if (accoText.indexOf('(') > 0) {
            accoText = accoText.substr(0, accoText.indexOf('(') - 1);
          }

          chosen[chosen.length] = accoText;
        }
      }
    }


    var bedrooms = document.getElementById("number-of-bedrooms");

    if (bedrooms.selectedIndex > 0)
      chosen[chosen.length] = bedrooms.options[bedrooms.selectedIndex].innerHTML;

    this.showSummary("searchtype-summary", chosen);


    // update budget summary
    if (searchBudgetSlider.minBudget == null && searchBudgetSlider.maxBudget == null) {
      searchBudgetSlider.construct();
    }

    if (searchBudgetSlider.minBudget.value == 0 && searchBudgetSlider.maxBudget.value == 0) {
      this.showSummary("searchbudget-summary", searchBudgetSlider.sliderNoPreference);

    } else if (searchBudgetSlider.minBudget.value == 0) {
      this.showSummary("searchbudget-summary", ""
                + searchBudgetSlider.sliderLeftLabel
                + " " + searchBudgetSlider.sliderMoneyPattern.replace(searchBudgetSlider.sliderMoneyRegExp, searchBudgetSlider.maxBudget.value)
                );

    } else if (searchBudgetSlider.maxBudget.value == 0) {
      this.showSummary("searchbudget-summary", ""
                + searchBudgetSlider.sliderRightLabel
                + " " + searchBudgetSlider.sliderMoneyPattern.replace(searchBudgetSlider.sliderMoneyRegExp, searchBudgetSlider.minBudget.value)
                );

    } else {
      this.showSummary("searchbudget-summary", ""
                + searchBudgetSlider.sliderMoneyPattern.replace(searchBudgetSlider.sliderMoneyRegExp, searchBudgetSlider.minBudget.value)
                + " " + searchBudgetSlider.sliderBudgetTo
                + " " + searchBudgetSlider.sliderMoneyPattern.replace(searchBudgetSlider.sliderMoneyRegExp, searchBudgetSlider.maxBudget.value)
                );
    }


    // number of people
    el = document.getElementById("numberofpeople-summary");
    if (el) {
      var numberDDL = document.getElementById("selNumberOfPeople");
      if (numberDDL) {
        var nr = numberDDL.options[numberDDL.selectedIndex].value;
        if (numberDDL.options.length <= 10) {
          if (nr > 0 && nr < 9) el.innerHTML = nr + " " + resources.messages.search_persons;
          else if (nr == 9) el.innerHTML = resources.messages.search_morethan8persons;
          else el.innerHTML = resources.messages.no_preference;
        }
        else {
          if (nr > 0 && nr < 9) el.innerHTML = nr + " " + resources.messages.search_persons;
          else if (nr == 9) el.innerHTML = resources.messages.search_morethan9persons;
          else if (nr == 10) el.innerHTML = resources.messages.search_morethan20persons;
          else el.innerHTML = resources.messages.no_preference;
        }

        // Change the classname of the summary so a different layout is used, depending on the selection			
        if (nr > 0 && nr <= 10) Spif.ClassNameAbstraction.replace(document.getElementById('numberofpeople-summary'), 'search-summary-noselection', 'search-summary-selected');
        else Spif.ClassNameAbstraction.replace(document.getElementById('numberofpeople-summary'), 'search-summary-selected', 'search-summary-noselection');
      }
    }


    // period
    var vs = [];
    var s = document.getElementById("date-of-arrival").value;
    s = s.replace(/^\s+|\s+$/g, "").replace(/\s[\s]+/g, ' ');
    if (s && s.length > 0)
      vs[vs.length] = resources.messages.from + " " + s; // resources.messages.search.from

    var dur = document.getElementById("duration-box");

    var inputs = dur.getElementsByTagName("input");

    for (var i = 0; i < inputs.length; i++) {
      var input = inputs.item(i);
      if (input.type == "radio" && input.checked && input.value != "") {
        if (input.parentNode.nodeName.toLowerCase() == "label") {
          vs[vs.length] = input.parentNode.innerText || input.parentNode.textContent;
        }
        else if (input.value == "exact") {
          durationExactSelect = document.getElementById("duration-exact-select");
          durationExactLabel = document.getElementById("duration-exact-label");
          if (durationExactSelect.selectedIndex > 0) {
            vs[vs.length] = durationExactSelect.selectedIndex + " " + (durationExactLabel.innerText || durationExactLabel.textContent);
          }
        }
      }
    }

    this.showSummary("searchperiod-summary", vs);
  },

  showSummary: function(elId, options, maxChars) {
    if (!maxChars) maxChars = this.MAX_SUMMARY_CHARS;
    var s = "";
    if (options.join)
      s = options.length == 0 ? resources.messages.no_preference : options.join(", ");
    else
      s = options;

    if (s.length > maxChars) s = s.substring(0, maxChars) + " ..";
    document.getElementById(elId).innerHTML = s;
    toggleSummaryClass(document.getElementById(elId).innerHTML, elId);
  }

};
var dataCollector = new DataCollector();

function toggleSummaryClass(summarytext, elementId)
{
  // Change the classname of the summary so a different layout is used, depending on the selection
  if(summarytext == resources.SpecialDecode(resources.messages.no_preference)) Spif.ClassNameAbstraction.replace(document.getElementById(elementId), 'search-summary-selected', 'search-summary-noselection');
  else Spif.ClassNameAbstraction.replace(document.getElementById(elementId), 'search-summary-noselection', 'search-summary-selected');
}
