﻿/*****************

  (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;
    }

    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");
            }
          }
       }
    }
  },
  
  showTotals : function (accommodationCount, productCount)
  {
    // Display the amount of results
    document.getElementById("resultCount").innerHTML = accommodationCount;

    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');
}