
SidebarExtraSpacingTop = 60;
SidebarExtraSpacingBottom = 2;

$(document).ready
 (
  function ()
   {
    /* load cities for province */
    $("select#province_slug").change
     (
      function ()
       {
        /* alte Klasse übergeben sonst fängt Box an zu wandern */
        var old_class = $("select#city_slug").attr ('class');
        $("select#city_slug").attr ('disabled', 'disabled');
        $("select#city_slug").attr ('class', 'disabled ' + old_class);

        jQuery.getJSON
         (
          $("#url_for_city_update").val() + $(this).val(),
          function (data)
           {
            $("select#city_slug option:not(:first)").remove();

            $.each
             (
              data,
              function (i, item)
               {
                var option = new Option(item.name, item.slug);
                $(option).attr ('class', item['class']);

                $("select#city_slug").attr('options')[$("select#city_slug").attr('options').length] = option;
               }
             );

            $("select#city_slug").val('');
            $("select#city_slug").attr ('disabled', '');
            $("select#city_slug").attr ('class', old_class);
            $("select#city_slug").change();
           }
         );
       }
     )

    /* load districts for city */
    $("select#city_slug").change
     (
      function ()
       {
        /* alte Klasse übergeben sonst fängt Box an zu wandern */
        var old_class = $("select#district_slug").attr ('class');
        $("select#district_slug").attr ('disabled', 'disabled');
        $("select#district_slug").attr ('class', 'disabled ' + old_class);

        jQuery.getJSON
         (
          $("#url_for_district_update").val() + $(this).val(),
          function(data)
           {
            $("select#district_slug option:not(:first)").remove();

            $.each
             (
              data,
              function (i, item)
               {
                var option = new Option(item.name, item.slug);
                $(option).attr ('class', item['class']);

                $("select#district_slug").attr('options')[$("select#district_slug").attr('options').length] = option;
               }
             );

            $("select#district_slug").val('');
            $("select#district_slug").attr ('disabled', '');
            $("select#district_slug").attr ('class', old_class);
            $("select#district_slug").change();
           }
         );
       }
     );

    /* Update List by Sidebar-Change */
    if ($("#container-for-results").size ())
     {
      // Auswahllisten, Checkboxen, Eingabefelder
      $("#search_sidebar_form select").change(updateSearchEntries);
      $("#search_sidebar_form input.checkbox").click(updateSearchEntries);
      $("#search_sidebar_form input.text").keyup(updateSearchEntries);

      $("#rent_switch_button_img").click(updateSearchEntries);

      //updateSearchEntries ();
      /* Control scrolling */
      tableHeadBehaviorInit();

      /* Sidebar scrolling */
      sideBarScrollBehaviorInit();
      sideBarResizing();
  
      $(window).scroll (handleScrollEvent);

      $("#search_sidebar_form_reset").click(resetSidebarSearchForm);
     }

    /* Get-Search-Count */
    if ($("#placeholder_search_count_top").size () && $("#placeholder_search_count").size ())
     {
      updateSearchCount();

      // Auswahllisten, Checkboxen, Eingabefelder
      $("#search_form select").change(updateSearchCount);
      $("#search_form input.checkbox").click(updateSearchCount);
      $("#search_form input.text").keyup(updateSearchCount);

      $("#rent_switch_button_img").click(updateSearchCount);
      
      $("#detailed_search_form_reset").click(resetDetailedSearchForm);
     }

    ajaxLoaderImageHide ();
   }
 );

function updateSearchCount()
 {
  jQuery.post
   (
    $("#url_for_json_count").val(),
    $("#search_form").serialize(),
    function(response)
     {
      if (response.indexOf ('kein') == -1)
       {
        if ($("#placeholder_search_count").size () && $("#placeholder_search_count").attr ('class'))
         {
          $("#placeholder_search_count").attr ('class', $("#placeholder_search_count").attr ('class').replace ('error', ''));
         }
        if ($("#detailed_search_form_submit").size () && $("#detailed_search_form_submit").attr ('class'))
         {
          $("#detailed_search_form_submit").attr ('class', $("#detailed_search_form_submit").attr ('class').replace ('disabled', ''));
         }
        $("#detailed_search_form_submit").attr ('disabled', '');
       }
      else
       {
        if ($("#placeholder_search_count").attr ('class').search ('error') == -1)
         {
          $("#placeholder_search_count").attr ('class', $("#placeholder_search_count").attr ('class') + ' error');
         }
        if ($("#detailed_search_form_submit").attr ('class').search ('disabled') == -1)
         {
          $("#detailed_search_form_submit").attr ('class', $("#detailed_search_form_submit").attr ('class') + ' disabled');
         }
        $("#detailed_search_form_submit").attr ('disabled', true);
       }

      $("#placeholder_search_count_top").html('- ' + response);
      if (response.indexOf ('kein Ergebnis') != -1)
       {
        $("#placeholder_search_count").html('&nbsp;' + response);
       }
      else
       {
        $("#placeholder_search_count").html('&nbsp;');
       }
     },
    "html"
   );
 }

 

function resetDetailedSearchForm ()
 {
  resetSearchForm ('search_form');

  /* resetSearchForm macht führt keine vollständige Eventansteuerung durch */
  if ($("select#district_slug option:not(:first)").size ())
   {
    $("select#district_slug option:not(:first)").remove();
   }

  updateSearchCount ();
 }

function resetSidebarSearchForm ()
 {
  resetSearchForm ('search_sidebar_form');

  /* resetSearchForm macht führt keine vollständige Eventansteuerung durch */
  if ($("select#district_slug option:not(:first)").size ())
   {
    $("select#district_slug option:not(:first)").remove();
   }

  updateSearchEntriesContent ();
 }

/**
 *
 */
function resetSearchForm(id)
{
    var aElements = document.getElementById(id).elements;
    var iI;
    for (iI=0; iI<aElements.length;iI++) {
        switch (aElements[iI].nodeName) {
            case 'INPUT':
                if (aElements[iI].type != 'hidden' && aElements[iI].type != 'submit' && aElements[iI].type != 'button') {
                    if (aElements[iI].type == 'checkbox') {
                        aElements[iI].checked = false;
                    } else {
                        aElements[iI].value = '';
                    }
                }
                break;
            case 'SELECT':
                if (aElements[iI].id != 'dimension') {
                    aElements[iI].options.selectedIndex = 0;
                    aElements[iI].value = '';
                    $(aElements[iI]).val ('');
                }
                break;
        }
    }
    /* Warm-/Kaltmiete-Umschalter zurücksetzen */
    if ($("input#rent_type").val () != 'base')
     {
      RentSwitchButtonEvent ();
     }
}

function ajaxLoaderImageShow ()
 {
  if (! $('#ajax_loader_image').size ()) return;

  $('#ajax_loader_image').stop ();
  $('#ajax_loader_image').fadeTo (500, 1);
 }
function ajaxLoaderImageHide ()
 {
  if (! $('#ajax_loader_image').size ()) return;

  $('#ajax_loader_image').stop ();
  $('#ajax_loader_image').fadeTo (500, 0);
 }



var count_update_requests_content = 0;

var ignoring_key_codes = new Array
 (
  16, // Shift
  17, // Ctrl
  18, // Alt
  19, // Capslock
  27, // Escape
  33, // Pageup
  34, // Pagedown
  35, // End
  36, // Home
  37, // Left
  38, // Up
  39, // Right
  40, // Down
  91, // Windows
  93, // Contextmenu
  112, // F1
  113, // F2
  114, // F3
  115, // F4
  116, // F5
  117, // F6
  118, // F7
  119, // F8
  120, // F9
  121, // F10
  122, // F11
  123, // F11
  144, // Numlock
  145, // Scrolllock
  
  255
 );

function updateSearchEntries (e)
 {
  if (e == null)
   {
    // ie
    var k = event.keyCode;
   }
  else
   {
    // mozilla
    var k = e.which;
   }

  for (var p in ignoring_key_codes)
   {
    if (ignoring_key_codes[p] == k)
     {
      return;
     }
   }

  if (! count_update_requests_content)
   {
    setTimeout (function ()
     {
      orig_scrolling_y = $(window).scrollTop();
      orig_scrolling_x = $(window).scrollLeft();

      updateSearchEntriesContent ();
     }, 10);
   }
  else
   {
    ajaxLoaderImageShow ();
   }

  count_update_requests_content++;
 }



function updateSearchEntriesContent ()
 {
  jQuery.post
   (
    $("#url_for_update").attr("value"),
    $("#search_sidebar_form").serialize(),
    function(response)
     {
      if (count_update_requests_content > 1)
       {
        count_update_requests_content = 1;
        updateSearchEntriesContent ();
        return;
       }

      $(".pager").html($('#pager', response).html ());
      $("#container-for-results").html($('#container-for-results', response).html ());

      tableHeadBehaviorInit();

      if (orig_scrolling_x + orig_scrolling_y > 0)
       {
        window.scrollTo (orig_scrolling_x, orig_scrolling_y);
       }
      else
       {
        $(window).scroll();
       }

      // Click-Events zum Öffnen der Thickboxen wieder setzen, nur für Ergebnisliste
      if (window._existsTb)
       {
        tb_initBox ('#container-for-results a.thickbox, #container-for-results area.thickbox, #container-for-results input.thickbox');
       }
      // Click-Events zum Hinzufügen/Entfernen eines Objekts von der Merkliste
      $(".watchlist-control").click (addRemoveFromWatchlist);

      if (count_update_requests_content > 1)
       {
        count_update_requests_content = 1;
        updateSearchEntriesContent ();
        return;
       }

      count_update_requests_content = 0;

      if (count_update_requests_content == 0)
       {
        ajaxLoaderImageHide ();
       }
     },
    "html"
   );
 }


function tableHeadBehaviorScrollTop ()
 {
  // Tabellenkopf in Höhe in Ergebnisliste positionieren.
  cloned_table.css('position', 'absolute').css('top', $("#table-for-results").position().top);
 }
function tableHeadBehaviorScroll_ ()
 {
  // Tabellenkopf in Höhe von Scrollposition positionieren.
  cloned_table.css('position', 'absolute').css('top', $(window).scrollTop() - SidebarExtraSpacingTop);
 }
function tableHeadBehaviorScrollBottom ()
 {
  // Tabellenkopf in Höhe von Ergebnisliste positionieren, aber am Fuss der Liste ausrichten und dabei Höhe der Seitensuchleiste (!) abziehen.
  cloned_table.css('position', 'absolute').css('top', $("#table-for-results").position().top + $("#table-for-results").height() - $("#search-sidebar").height() - SidebarExtraSpacingBottom);
 }



function sidebarBehaviorScrollTop ()
 {
  // Seitensuchleiste in Höhe in Ergebnisliste positionieren.
  $("#search-sidebar").css('position', 'absolute').css('top', $("#table-for-results").position().top);
 }
function sidebarBehaviorScroll_ ()
 {
  // Seitensuchleiste in Höhe von Scrollposition positionieren.
  $("#search-sidebar").css('position', 'absolute').css('top', $(window).scrollTop() - SidebarExtraSpacingTop);
 }
function sidebarBehaviorScrollBottom ()
 {
  // Seitensuchleiste in Höhe von Ergebnisliste positionieren, aber am Fuss der Liste ausrichten und dabei Höhe der Seitensuchleiste abziehen.
  $("#search-sidebar").css('position', 'absolute').css('top', $("#table-for-results").position().top + $("#table-for-results").height() - $("#search-sidebar").height() - SidebarExtraSpacingBottom);
 }


function handleScrollEvent ()
 {
  // 1. Zustand: Der Nutzer hat bis zu einem gewissen Grad nicht gescrollt und/oder die Seite ist so klein, dass nicht gescrollt werden muss.
  if (($("#table-for-results").position().top + SidebarExtraSpacingTop > $(window).scrollTop ()) || ($("#table-for-results").height () < $("#search-sidebar").height ()))
   {
    tableHeadBehaviorScrollTop ();
    sidebarBehaviorScrollTop ();
   }
  // 2. Zustand: Der Nutzer hat über einen gewissen Grad gescrollt, aber noch nicht bis zum Ende der Seite.
  else if ($("#table-for-results").height () - $(window).scrollTop () - $("#search-sidebar").height () + SidebarExtraSpacingTop + 12 + SidebarExtraSpacingBottom > 0)
   {
    tableHeadBehaviorScroll_ ();
    sidebarBehaviorScroll_ ();
   }
  // 3. Zustand: Der Nutzer hat bis ans Ende der Seite gescrollt oder steht kurz davor.
  else
   {
    tableHeadBehaviorScrollBottom ();
    sidebarBehaviorScrollBottom ();
   }      
 }


tableHeadBehaviorInit = function()
 {
  origin_table_ths = $("#table-for-results").children('thead').children('tr').children('th');
  cloned_table = $("#table-for-results").clone().attr('id', 'cloned_table').attr('width', $("#table-for-results").width()).appendTo($("#container-for-results"));
  cloned_table.width($("#table-for-results").width());
  cloned_table.children('thead').children('tr').children('th').each
   (
    function (i, item)
     {
      $(item).width($(origin_table_ths[i]).width());
      $(origin_table_ths[i]).attr ('class', $(origin_table_ths[i]).attr ('class') + ' cloned');
     }
   );
  cloned_table.children('tbody').remove();

  cloned_table.mouseover
   (
    function()
     {
      // Nur ausblenden ermöglichen wenn Position verschoben
      if (cloned_table.position().top != $("#table-for-results").position ().top)
       {
        $(this).stop();
        $(this).fadeTo(30, 0.1);
       }
     }
   );

  cloned_table.mouseout
   (
    function()
     {
      $(this).stop();
      $(this).fadeTo(300, 1);
     }
   );

  // Verstecken der Originaltabelle übernimmt positions-screen/-print
//  origin_table_ths.css('visibility', 'hidden');
//  cloned_table.hide();

  handleScrollEvent ();
 }

sideBarScrollBehaviorInit = function()
 {
  $(window).resize(sideBarResizing);

  handleScrollEvent ();
 }

sideBarResizing = function()
 {
  if ($(window).height() - SidebarExtraSpacingTop < $("#search-sidebar").height())
   {
    $("#search-sidebar").css('position', 'absolute').css('top', $("#table-for-results").position().top);
    //$("#search-sidebar").height($(window).height() - SidebarExtraSpacingTop);
    $("#search-sidebar").height('auto');
   }
  else
   {
    $("#search-sidebar").height('auto');
   }
 }

