// the filterMatrix
var filterMatrix = new Object();

// this is only for testreason ==> normally it will be derived from conrad
var contentMatrix = new Array();
var lastFilterSettings = new Array();
var hotelAttributesEnabled = true;

function enableHotelAttributes() {
  e = document.getElementById('hotel_attribute_heading')
  if (e) e.style.display = '';
  e = document.getElementById('hotel_attribute_panel_disabled')
  if (e) e.style.display = 'none';
  e = document.getElementById('hotel_attribute_panel_enabled')
  if (e) e.style.display = '';
}

function disableHotelAttributes() {
  e = document.getElementById('hotel_attribute_heading')
  if (e) e.style.display = 'none';
  e = document.getElementById('hotel_attribute_panel_disabled')
  if (e) e.style.display = '';
  e = document.getElementById('hotel_attribute_panel_enabled')
  if (e) e.style.display = 'none';
}

function checkClassesOfHotelCategoryLabels(hotel_category_id) {
  for (var i = 0; i < 20; i++)
  {
    el = document.getElementById('hotel_category_' + i + '_label');
    if (el)	el.className = (i == hotel_category_id) ? 'checkbox_checked' : 'checkbox_unchecked';
  }
}

function isEventplaceTypeButNotHotel(filter) {
  return ((filter == 'has_eventplacetype_2') || (filter == 'has_eventplacetype_3') || (filter == 'has_eventplacetype_4')
        ||(filter == 'has_eventplacetype_6') || (filter == 'has_eventplacetype_7') || (filter == 'has_eventplacetype_8'));
}

function isHotelAttribute(filter) {
  return ((filter == 'search_rooms_single') || (filter == 'search_rooms_double'));
}

function isHotelAttribute2(filter) {
  return ((filter == 'search_rooms_single') || (filter == 'search_rooms_double') || (filter == 'hotel_category_id') 
		  || (filter == 'has_eventplacetype_1') || (filter == 'has_eventplacetype_5'));
}

//
var filterEnabled = true;

/**
*   sets a particular filter-attribute (name is the element.id) (relation operator is '>=')
*
*	@author	Michael Schidlowski
**/
function setFilterAttribute(element) {
  setFilterAttributeAndOperator(element, '>=');
}

function setToggledHotel(id)
{
	var toggled_hotel_el = $('form_detail_toggled_hotel');
	if (toggled_hotel_el) toggled_hotel_el.value = id;	
}

/**
*  applies the last filter settings to the page
*
*  @author	Michael Schidlowski
**/
function applyLastFilter(praefix) {
  // alert('apply last: ' + lastFilterSettings.length);
  for (var i = 0; i  < lastFilterSettings.length; i ++)
  {
    var filterElement = null;

    var filterElement = $(lastFilterSettings[i]['id']);
    if ((filterElement) && (filterElement.type == 'checkbox')) {
    	filterElement = $(lastFilterSettings[i]['id'] + '_label');
    }
    else {
    	filterElement = null;
    }

    if (!filterElement)
    {
      filterElement = $(lastFilterSettings[i]['id']);
      if (filterElement)
      {
        // alert('apply: ' + filterElement.type + ' : ' + lastFilterSettings[i]['id'] + ' => ' + lastFilterSettings[i]['value']);
        if (filterElement.type == 'select-one')
        {
          filterElement.value = lastFilterSettings[i]['value'];
          // filterElement.selectedIndex = lastFilterSettings[i]['value'];
          setFilterAttributeAndOperator(filterElement, '==');
          checkElementContainer(filterElement);

        }
        else if (filterElement.type == 'checkbox')
        {
          filterElement.click();
          checkElementContainer(filterElement);
        }
        else if (filterElement.type == 'text')
        {
          filterElement.value = lastFilterSettings[i]['value'];
          setFilterAttribute(filterElement);
          checkElementContainer(filterElement);
        }
        else {
          // alert('unnkonw element type: ' + filterElement.type + ' : ' + lastFilterSettings[i]['id'] + ' => ' + lastFilterSettings[i]['value']);
        }
      } else {
        // alert('not found: ' + lastFilterSettings[i]['id'] + ' => ' + lastFilterSettings[i]['value']);
      }
    }
    else
    {
      // alert('apply label: ' + lastFilterSettings[i]['id'] + ' => ' + lastFilterSettings[i]['value']);
      checkBoxLabelClicked(filterElement);
      filterElement = $(lastFilterSettings[i]['id']);
      if (!document.all) {
        filterElement.click();
      }
      checkElementContainer(filterElement);
    }
  }
}

function checkElementContainer(element)
{
    var parent = element;
    while(parent.nodeName != 'DIV') 
    {
  	  parent = parent.parentNode;
    }
    
    if(parent.style.display == 'none')
    {
    	var id = parent.id + "_headline";
    	toggleHead($(id), parent.id);
    }
}

function checkBoxLabelClicked(element) {
  // get checkboxelement and
  checkbox = $(element.htmlFor);
  if (document.all) { // IE
    checkbox.click();
    (checkbox.checked) ? element.className = 'checkbox_checked': element.className = 'checkbox_unchecked';
  }
  else {// Mozilla
    checkbox.checked = (checkbox.checked == false);
    checkbox.checked ? element.className = 'checkbox_checked' : element.className = 'checkbox_unchecked';
    checkbox.click();
  }
}

function clickHotel(element) {
	var el = $(element);
	checkbox = $(el.htmlFor);
	if(!checkbox.checked)
	{
		if(document.all)
		{
			checkBoxLabelClicked(el);
		}
		else
		{
			checkBoxLabelClicked(el);
			checkbox.click();
		}
	}
}

/**
*	sets a particular filter-attribute (name is the element.id) in the filtermatrix with the particular relation operator
*
*   @author	Michael Schidlowski
*	@params Input	element		the element with the value for the filter (checkbox or textfield)
*			string	operator	relation operator ('==', '>', '<', '<=', '>=')
**/
function setFilterAttributeAndOperator(element, operator) {

  // name of the filter-attribute
  // TODO: switch id to name (must not be unique)
  var attribute = element.id;
  // value of the filter-attribute
  var value = 0;
  var value_title = 0;

  if (element.type == 'checkbox') {
    if (element.checked)
    {
      value = 1;
      value_title = '##c##';
    }
    else
    {
      value = 0;
      value_title = '##uc##';
    }
  } else if (element.type == 'text') {
    value = element.value;
    value_title = element.title ? element.title : element.value;
  } else if (element.type == 'select-one') {
    value = parseInt(element.value);
    value_title = element.options[element.value].innerHTML;
    if (value == 0) operator = '>=';
  } else {
    throw "cannot call function from this element: " + element.type;
  }

  if ((operator != '==') && (operator != '>') && (operator != '<') && (operator != '>=') && (operator != '<=')) {
    throw "unknown operator: " + operator;
  }

  // set the filter attribute
    if (!filterMatrix[attribute]) filterMatrix[attribute] = new Array();
    filterMatrix[attribute]['operator'] = operator;
    filterMatrix[attribute]['value'] = value;
    filterMatrix[attribute]['value_title'] = value_title;

  return true;
}

/**
*  checks which list of locations should be displayes
*  
*  @author	Norman Pohl <n.pohl@ewerk.com>
* 
**/
function checkLocationList(location_hotel_id, location_id) {
	// check if hotel is selected
	var hotel_clicked  = false;
	var others_clicked = false;
	
	for (var filter in filterMatrix)
	{
	    if(!hotel_clicked && ((filter == 'has_eventplacetype_1') || (filter == 'has_eventplacetype_5')))
	    {
	    	hotel_clicked = filterMatrix[filter]['value'] != 0;
	    }
	    
	    if(!others_clicked && isEventplaceTypeButNotHotel(filter))
	    {
	    	others_clicked = filterMatrix[filter]['value'] != 0;
	    }
	}
	
	if(hotel_clicked && others_clicked)
	{
		$(location_id).hide();
		$(location_hotel_id).show();
	}
	else
	{
		$(location_hotel_id).hide();
		$(location_id).show();
	}
	
	return true;
}

/**
*	compares a contentElement of a contentMatrix with a filterMatrix
*
*   @author	Michael Schidlowski
**/
function compareMatrix(contentElement, filterMatrix) {

  // compare each filterEntry with the contentElement
  var filter_value = 0;
  var content_value = 0;
  for (var filter in filterMatrix) {
    if (!( (!hotelAttributesEnabled) && (isHotelAttribute(filter))) )
    {
      filter_value = isNumber(filterMatrix[filter]['value']) ? parseInt(filterMatrix[filter]['value']) : filterMatrix[filter]['value']
      content_value = isNumber(contentElement[filter]) ? parseInt(contentElement[filter]) : contentElement[filter]
      if (filterMatrix[filter]['operator'] == '==') {
        if (content_value != filter_value) return false;
      }
      else if (filterMatrix[filter]['operator'] == '>') {
        if (isNumeric(content_value) && isNumeric)
        if (content_value <= filter_value) return false;
      }
      else if (filterMatrix[filter]['operator'] == '<') {
          if (content_value >= filter_value) return false;
      }
      else if (filterMatrix[filter]['operator'] == '>=') {
        if (content_value < filter_value) return false;
      }
      else if (filterMatrix[filter]['operator'] == '<=') {
          if (content_value > filter_value) return false;
      }
   }
  }
  // all filter attributes passed
  return true;
}

function compareHotelMatrix(contentElement, filterMatrix) {

	  // compare each filterEntry with the contentElement
	  var filter_value = 0;
	  var content_value = 0;
	  for (var filter in filterMatrix) {
	    if (!isHotelAttribute2(filter))
	    {
	      filter_value = isNumber(filterMatrix[filter]['value']) ? parseInt(filterMatrix[filter]['value']) : filterMatrix[filter]['value']
	      content_value = isNumber(contentElement[filter]) ? parseInt(contentElement[filter]) : contentElement[filter]
	      if (filterMatrix[filter]['operator'] == '==') {
	        if (content_value != filter_value) return false;
	      }
	      else if (filterMatrix[filter]['operator'] == '>') {
	        if (isNumeric(content_value) && isNumeric)
	        if (content_value <= filter_value) return false;
	      }
	      else if (filterMatrix[filter]['operator'] == '<') {
	          if (content_value >= filter_value) return false;
	      }
	      else if (filterMatrix[filter]['operator'] == '>=') {
	        if (content_value < filter_value) return false;
	      }
	      else if (filterMatrix[filter]['operator'] == '<=') {
	          if (content_value > filter_value) return false;
	      }
	   }
	  }
	  // all filter attributes passed
	  return true;
	}

/**
* 
* filters the list of locations with hotels
* 
* @author Norman Pohl <n.pohl@ewerk.com>
* 
* @return boolean
**/
function filterHotelList()
{
	var praefix = "hotel_loc_";
	
	if(!filterEnabled)
	{
		return true;
	}
	
	// number of matching entries of the search
	var result_count = 0;	
	
	// calculate total number of rooms (sum of single and double) for locations only
	var search_rooms_total = 0;
	var chairs_total = 0;
    if ((filterMatrix['search_rooms_single']) && (filterMatrix['search_rooms_single']['value'])) search_rooms_total += parseInt(filterMatrix['search_rooms_single']['value']);
    if ((filterMatrix['search_rooms_double']) && (filterMatrix['search_rooms_double']['value'])) search_rooms_total += parseInt(filterMatrix['search_rooms_double']['value']);
    
    // chairs in a row
    if ((filterMatrix['chairs_in_a_row']) && (filterMatrix['chairs_in_a_row']['value'])) chairs_total += parseInt(filterMatrix['chairs_in_a_row']['value']);

	// apply filter
	for (var i = 0; i < contentMatrix[praefix].length; i++) 
	{
	    var content_search_rooms_total = 0;
	    var content_chairs_total = 0;
	    var hotels_exists = false;
	    
	    if(contentMatrix[praefix][i]['hotels'])
	    {
	    	hotels_exists = true;
		    for(j = 0; j < contentMatrix[praefix][i]['hotels'].length; j++)
		    {
			    if (contentMatrix[praefix][i]['hotels'][j]['search_rooms_total'])
			    {
			    	content_search_rooms_total += parseInt(contentMatrix[praefix][i]['hotels'][j]['search_rooms_total']);
			    }
		    }
	    }
	    
	    // chairs in a row
	    if (contentMatrix[praefix][i]['chairs_in_a_row'])
	    {
	    	content_chairs_total += parseInt(contentMatrix[praefix][i]['chairs_in_a_row']);
	    }

	    // enough rooms in the hotel
	    var enough_chairs = content_chairs_total >= chairs_total;
	    var enough_rooms = content_search_rooms_total >= search_rooms_total;

	    if ((hotels_exists == true) && (enough_chairs == true) && (compareHotelMatrix(contentMatrix[praefix][i], filterMatrix))) 
	    {
	    	$(praefix + contentMatrix[praefix][i]['id']).show();
	    	result_count++;
	    	
	    	// check hotels
	    	if(enough_rooms == true)
	    	{
	    		$(praefix + 'advice_' + contentMatrix[praefix][i]['id']).hide();
	    	}
	    	else
	    	{
	    		$(praefix + 'advice_' + contentMatrix[praefix][i]['id']).show();
	    	}
	    } 
	    else 
	    {
	    	$(praefix + contentMatrix[praefix][i]['id']).hide();
	    }
	}

	// 'no matches found' message if the dom-elements exist
	if ($(praefix + 'no_matches')) (result_count > 0) ? $(praefix + 'no_matches').hide() : $(praefix + 'no_matches').show();
	
	return true;
}

/**
*	filters a list of elements by using the filterMatrix
*	- element-id for 'no entries found' is praefix + 'no_matches'
*	- element-id for 'result_count' is praefix + 'result' and praefix + 'result_count'
*
*	@author	Michael Schidlowski
**/
function filterList(praefix) {

  enableHotelAttributes();
  
  if(contentMatrix['hotel_loc_'])
  {
	  filterHotelList();
  }

  // exit if filter is enabled global
  if (!filterEnabled) return true;

  // number of matching entries of the search
  var result_count = 0;

  var filterNames = "";
  var filterOperator = "";
  var filterValues = "";
  var filterValueTitles = "";
  var filterTitles = "";

  // add selected filters to form
  for (var filter in filterMatrix) {
    if ((filterMatrix[filter]['value'] != 0) && (filterMatrix[filter]['value'] != "0") && (filterMatrix[filter]['value'] != ""))  {
      filterNames += filter + '~';
      filterValues += filterMatrix[filter]['value']  + '~';
      filterValueTitles += filterMatrix[filter]['value_title']  + '~';
      title_element = $(filter + '_label');
      filterTitles += title_element ? title_element.innerHTML : 'NO_TITLE_ELEMENT'
      filterTitles += '~'
    }
  }

  elementForFilterNames = $('form_detail_filter_names');
  if (elementForFilterNames) elementForFilterNames.value = filterNames;

  elementForFilterNames = $('form_detail_filter_values');
  if (elementForFilterNames) elementForFilterNames.value = filterValues;

  elementForFilterNames = $('form_detail_filter_value_titles');
  if (elementForFilterNames) elementForFilterNames.value = filterValueTitles;

  elementForFilterNames = $('form_detail_filter_titles');
  if (elementForFilterNames) elementForFilterNames.value = filterTitles;

  //save again for services
  //TODO save only once for both (or more) forms and add to form before submit
  elementForFilterNames = $('form_service_detail_filter_names');
  if (elementForFilterNames) elementForFilterNames.value = filterNames;
  
  elementForFilterNames = $('form_service_detail_filter_values');
  if (elementForFilterNames) elementForFilterNames.value = filterValues;
  
  elementForFilterNames = $('form_service_detail_filter_value_titles');
  if (elementForFilterNames) elementForFilterNames.value = filterValueTitles;
  
  elementForFilterNames = $('form_service_detail_filter_titles');
  if (elementForFilterNames) elementForFilterNames.value = filterTitles;

  // calculate total number of rooms (sum of single and double) for locations only
  var search_rooms_total = 0;
  var chairs_total = 0;
  if(praefix == 'location_')
  {
    if ((filterMatrix['search_rooms_single']) && (filterMatrix['search_rooms_single']['value'])) search_rooms_total += parseInt(filterMatrix['search_rooms_single']['value']);
    if ((filterMatrix['search_rooms_double']) && (filterMatrix['search_rooms_double']['value'])) search_rooms_total += parseInt(filterMatrix['search_rooms_double']['value']);
    if ((filterMatrix['chairs_in_a_row']) && (filterMatrix['chairs_in_a_row']['value'])) chairs_total += parseInt(filterMatrix['chairs_in_a_row']['value']);
  }


  // apply filter
  for (var i = 0; i < contentMatrix[praefix].length; i++) {
    var content_search_rooms_total = 0;
    var content_chairs_total = 0;
    if (contentMatrix[praefix][i]['search_rooms_total'])
    {
      content_search_rooms_total += parseInt(contentMatrix[praefix][i]['search_rooms_total']);
    }
    
    if (contentMatrix[praefix][i]['chairs_in_a_row'])
    {
    	content_chairs_total += parseInt(contentMatrix[praefix][i]['chairs_in_a_row']);
    }

    // enough rooms in the hotel
    var enough_rooms = content_search_rooms_total >= search_rooms_total;
    var enough_chairs = content_chairs_total >= chairs_total;

    if ((enough_rooms == true) && (enough_chairs) && (compareMatrix(contentMatrix[praefix][i], filterMatrix))) {
      $(praefix + contentMatrix[praefix][i]['id']).show();
      result_count++;
      result_count % 2 == 0 ? $(praefix + contentMatrix[praefix][i]['id']).className = '' : $(praefix + contentMatrix[praefix][i]['id']).className = 'odd';
    } else {
      $(praefix + contentMatrix[praefix][i]['id']).hide();
    }
  }

  // show result_count or 'no matches found' message if the dom-elements exist
  if ($(praefix + 'no_matches')) (result_count > 0) ? $(praefix + 'no_matches').hide() : $(praefix + 'no_matches').show();
  if ($(praefix + 'result_count')) {
    $(praefix + 'result_count').innerHTML = result_count;
    (result_count == 0) ? $(praefix + 'result').hide() : $(praefix + 'result').show();
  }

  return true;
}

function isHotelAttributesEnabled()
{
  var r = true;
  var hotel_clicked = false;
  var others_clicked = false;

  for (var filter in filterMatrix)
  {
    if ((filter == 'has_eventplacetype_1') || (filter == 'has_eventplacetype_5'))
    {
      hotel_clicked = filterMatrix[filter]['value'] != 0;
    }
    else if(isEventplaceTypeButNotHotel(filter))
    {
    if (filterMatrix[filter]['value'] != 0)
              others_clicked = true;
    }
  }

  if (others_clicked && hotel_clicked)
    r = true
  else if (others_clicked)
    r = false;
  return r;
}

function toggleHead(elem, toggleElement)
{
	Effect.toggle(toggleElement, 'slide', {duration: 0.5})

	var queryOpenCat = {
		de: "Kategorie öffnen",
		en: "Open category"
	}
	
	var queryCloseCat = {
		de: "Kategorie schließen",
		en: "Close category"
	}
	
	if (elem.title == queryOpenCat[window.doitat_lang])
	{
		elem.title = queryCloseCat[window.doitat_lang];
		$(elem).setStyle({
		  backgroundPosition: '8px bottom'
		});
	}
	else
	{
		elem.title = queryOpenCat[window.doitat_lang];
		$(elem).setStyle({
		  backgroundPosition: '8px top'
		});
	}
}

function toggleHotels(elem, toggleElement)
{
	var queryOpen = {
		de: "Hotels in der Umgebung der Location anzeigen",
		en: "Hotels in the vicinity"
	}
	
	var queryClose = {
		de: "Hotels verbergen",
		en: "Hide hotels in the vicinity"
	}
	
	if (!$(elem).hasClassName('close'))
	{
		$$('#location_hotel_list span.trigger.close').each(function(e) {
			Effect.toggle(e.removeClassName('close').next('div'), 'slide', {duration: 0.5});
			e.title = queryOpen[window.doitat_lang];
		});
		elem.title = queryClose[window.doitat_lang];
		$(elem).addClassName('close');
	}
	else
	{
		elem.title = queryOpen[window.doitat_lang];
		$(elem).removeClassName('close');
	}
	
	Effect.toggle(toggleElement, 'slide', {duration: 0.5});
}

/**
 *  unchecks all elements with the given name (groupName)
 *
 *  @author Michael Schidlowski
 **/
function uncheckFilterGroup(groupName, listPraefix) {

  filterEnabled = false;

  var groupElements = document.getElementsByName(groupName)

  if (groupElements) {
    for (var i = 0; i  < groupElements.length; i ++) {
      gElement = groupElements[i];
      if (gElement.type == 'checkbox') {
        gElement.checked = false;
        checkbox_label = $(gElement.id + '_label');
        if (checkbox_label) checkbox_label.className = 'checkbox_unchecked';
        setFilterAttribute(gElement);
      } else if (gElement.type == 'text') {
        gElement.value = '';
        setFilterAttribute(gElement);
      } else if (gElement.type == 'select-one') {
        gElement.value = 0;
        setFilterAttribute(gElement);
      } else {

      }
    }
  }
  else {
    filterEnabled = true;
    return false;
  }
  filterEnabled = true;
  filterList(listPraefix);
}

function isNumber(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

