$(document).ready(function() {
    var tabellen = $("table.fachobjektetabelle").get();
    reichereTabellenAn(tabellen);
});

/**************************/
/* Filterung für Tabellen */
/**************************/
var anzahlFilter = 0;
var aktiveFilter = new Array();

function filtere(table, filter) {
  var spaltennummer = bestimmeSpaltennummerAusCssClass(filter.attr("class"));
  var $inhalt = filter.closest("#linkerBereich").children("div.filterinhalt.spalte"+spaltennummer);
  $("div.filterinhalt").not($inhalt).removeClass("aktiv");
  $inhalt.toggleClass("aktiv");

  var attribute = {
    "opacity": 0.925,
    "left": filter.offset().left,
    "top": filter.offset().top + 18
  };
  $inhalt.css(attribute);
  $inhalt.children(":input:first").focus();
  $inhalt.children(":input").keydown(function(event) {
    if (event.keyCode == 13) aktiviereFilter(filter, $inhalt, event, table);
  });

  var eingabefelder = $inhalt.children("input:text, select");
  eingabefelder.bind("keyup click", function(event) {
    event.stopPropagation();
    if (!sindEingabefelderGefuellt(eingabefelder)) {
      $inhalt.children("a.button.ok").removeClass("aktiv");
      $inhalt.children("a.button.ok").addClass("inaktiv");
      return;
    }
    $inhalt.children("a.button.ok").removeClass("inaktiv");
    $inhalt.children("a.button.ok").addClass("aktiv");
  });
  if (eingabefelder.length == 0) eingabefelder = $inhalt.find("input:checkbox");
  if (eingabefelder.length > 0) {
    $inhalt.children("a.button.ok").removeClass("inaktiv");
    $inhalt.children("a.button.ok").addClass("aktiv");
  }

  $inhalt.bind("click", function(event) { event.stopPropagation(); });

  var okButtons = $inhalt.children("a.button.ok");
  okButtons.click(function(event) {
    event.stopPropagation();
    if ($(this).hasClass("inaktiv")) return;
    aktiviereFilter(filter, $inhalt, event, table);
  });

  var loeschenButtons = $inhalt.children("a.button.loeschen");
  loeschenButtons.click(function(event) {
    event.stopPropagation();
    deaktiviereFilter(event, table, $inhalt);
  });
  var abbrechenButtons = $inhalt.children("a.button.abbrechen");
  abbrechenButtons.click(function() { $inhalt.removeClass("aktiv"); });
  $("body").click(function() { $("div.filterinhalt").removeClass("aktiv"); });
}


function aktiviereFilter(filter, $inhalt, event, tabelle) {
  $inhalt.removeClass("aktiv");

  var eingabefelder = $inhalt.children("input:text, select");
  var suchbegriffe;
  if (eingabefelder.length > 0) {
    if (!sindEingabefelderGefuellt(eingabefelder))  {
      deaktiviereFilter(event, tabelle, $inhalt);
      return false;
    }
    suchbegriffe = ermittleSuchebegriffe(eingabefelder);
  } else {
    eingabefelder = $inhalt.find("input:checkbox");
    suchbegriffe = ermittleSuchebegriffeAusCheckboxFilter(eingabefelder);
  }
  filter.addClass("angewendet");


  var regexTyp = /typ(\D+)/;
  regexTyp.exec(eingabefelder.eq(0).attr("class"));
  fuegeFilterHinzu(tabelle.attr("id"), RegExp.$1, bestimmeSpaltennummerAusCssClass(filter.attr("class")), suchbegriffe);
  var zeilen = tabelle.get(0).tBodies[0].rows;
  for (var i = 0; i < zeilen.length; i++) zeilen[i].style.display = "";
  filtereTabelle(tabelle);
  eingabefelder.blur();
}

function sindEingabefelderGefuellt(eingabefelder) {
  var aEingabefelder = eingabefelder.get();
  if (aEingabefelder.length == 1 && aEingabefelder[0].value && aEingabefelder[0].value.length > 0) return true;
  for (var i = aEingabefelder.length - 1; i >= 0; i--) {
    var feld = aEingabefelder[i];
    if (feld.value && feld.className.match(/typDatum/) &&
        feld.value.match(/^\d{6}$|^\d{8}$|^\d{2}\.\d{2}\.\d{4}|^\d{4}$/))
      return true;
    if (feld.value && feld.className.match(/typZahl/) && feld.value.match(/^(\d+|\d+,\d+)$/)) return true;
  }
  return false;
}

function ermittleSuchebegriffe(eingabefelder) {
  var suchbegriffe = {};
  if (eingabefelder.length == 1) suchbegriffe["standard"] = eingabefelder;
  else if (eingabefelder.length == 2) {
    suchbegriffe["von"] = eingabefelder.eq(0);
    suchbegriffe["bis"] = eingabefelder.eq(1);
  }
  return suchbegriffe;
}

function ermittleSuchebegriffeAusCheckboxFilter(eingabefelder) {
  var suchbegriffe = {};
  eingabefelder.each(function() {
    var eingabefeld = $(this);
    if (eingabefeld.prop("checked") == true) suchbegriffe[eingabefeld.prop("name")] = eingabefeld.prop("value");
  });
  return suchbegriffe;
}

function fuegeFilterHinzu(id, typ, spaltennummer, suchbegriffe) {
  for (var i = 0; i < aktiveFilter.length; i++) {
    if (aktiveFilter[i].id == id && aktiveFilter[i].spaltennummer == spaltennummer) {
      aktiveFilter[i].suchbegriffe = suchbegriffe;
      return;
    }
  }
  aktiveFilter[anzahlFilter] = {};
  aktiveFilter[anzahlFilter].id = id;
  aktiveFilter[anzahlFilter].typ = typ;
  aktiveFilter[anzahlFilter].spaltennummer = spaltennummer;
  aktiveFilter[anzahlFilter].suchbegriffe = suchbegriffe;
  anzahlFilter++;
}

function filtereTabelle(tabelle) {
  for (var i = 0; i < aktiveFilter.length; i++) {
    if (aktiveFilter[i].id != tabelle.attr("id")) continue;
    var zeilen = tabelle.get(0).tBodies[0].rows;
    for (var j = 0; j < zeilen.length; j++)
      eval("filtereZeile"+aktiveFilter[i].typ+"(i, zeilen[j], aktiveFilter[i].suchbegriffe)");
  }
	if ($("div#einsatztabelle tbody tr:visible td:nth-child(1)").size()) {
		var spalten = $("div#einsatztabelle tbody tr:visible td:nth-child(1)").css("textAlign", "center").get();
		for (var i = 1; i <= spalten.length; i++) {
			spalten[spalten.length - i].innerHTML = i;
		}
	}
}

function filtereZeileStandard(filterId, zeile, suchbegriffe) {
  var suchbegriff = new RegExp("^"+suchbegriffe["standard"].prop("value").toLowerCase());
  var wert = $(zeile.cells[aktiveFilter[filterId].spaltennummer]).text();
  if (!wert.toLowerCase().match(suchbegriff)) zeile.style.display = "none";
}

function filtereZeileZahl(filterId, zeile, suchbegriffe) {
  var von = (suchbegriffe["von"].prop("value").length > 0) ?
    Number(suchbegriffe["von"].prop("value").replace(/\./, "").replace(/,/, ".")) : null;
  var bis = (suchbegriffe["bis"].prop("value").length > 0) ?
    Number(suchbegriffe["bis"].prop("value").replace(/\./, "").replace(/,/, ".")) : null;
  var text = $(zeile.cells[aktiveFilter[filterId].spaltennummer]).text();
  var wert = Number(text.replace(/\./, "").replace(/,/, "."));
  if (text.length == 0) wert = null;
  pruefeVonBisFuerZeile(zeile, wert, von, bis);
}

function filtereZeileDatum(filterId, zeile, suchbegriffe) {
  var von = erzeugeDateObjekt(suchbegriffe["von"].prop("value"));
  var bis = erzeugeDateObjekt(suchbegriffe["bis"].prop("value"));
  var zelleninhalt = $(zeile.cells[aktiveFilter[filterId].spaltennummer]).text().split(" - ");
  var wert = erzeugeDateObjekt(zelleninhalt[0]);
  pruefeVonBisFuerZeile(zeile, wert, von, bis);
}

function filtereZeileCheckbox(filterId, zeile, suchbegriffe) {
  var regex = "";
  for (begriff in suchbegriffe) regex = regex + suchbegriffe[begriff] + "|";
  regex = regex.replace(/\|$/, "");
  var wert = $(zeile.cells[aktiveFilter[filterId].spaltennummer]).text();
  if (wert == null || regex == "") zeile.style.display = "none";
  else if (!wert.match(regex)) zeile.style.display = "none";
}

function pruefeVonBisFuerZeile(zeile, wert, von, bis) {
  if (wert == null) zeile.style.display = "none";
  else {
    if ((von && bis) && (wert < von || wert > bis)) zeile.style.display = "none";
    if ((von && !bis) && (wert < von)) zeile.style.display = "none";
    if ((!von && bis) && (wert > bis)) zeile.style.display = "none";
  }
}

function deaktiviereFilter(event, tabelle, $inhalt) {
  if (!event) return;
  var spaltennummer = bestimmeSpaltennummerAusCssClass($inhalt.attr("class"));
  var divFilter = tabelle.children("thead").find("div.filter.spalte"+spaltennummer);
  $inhalt.removeClass("aktiv");
  divFilter.removeClass("angewendet");
  entferneFilter(tabelle, spaltennummer);
}

function entferneFilter(tabelle, spaltennummer) {
  var id = tabelle.attr("id");
  var zeilen = tabelle.get(0).tBodies[0].rows;
  for (var i = 0; i < zeilen.length; i++) zeilen[i].style.display = "";
  for (var i = 0; i < aktiveFilter.length; i++) {
    if (aktiveFilter[i].id == id && aktiveFilter[i].spaltennummer == spaltennummer) {
      aktiveFilter.splice(i, 1);
      anzahlFilter = anzahlFilter - 1;
    }
  }
  filtereTabelle(tabelle);
}

function bestimmeSpaltennummerAusCssClass(cssClass) {
  var regexSpalte = /spalte([0-9]+)/;
  regexSpalte.exec(cssClass);
  return RegExp.$1;
}


function reichereTabellenAn(tabellen) {
  var i = tabellen.length;
  while (i--) {
    var $tabelle = $(tabellen[i]);
    reichereTabelleAn($tabelle);
  }
}

function reichereTabelleAn($tabelle) {
  behandleKlickenAufTabellenkopf($tabelle);
  behandleMouseoverAufTabelleninhalt($tabelle);
  behandleKlickenAufTabelleninhalt($tabelle);
}

function behandleKlickenAufTabellenkopf($tabelle) {
  $tabelle.children('thead').bind('click', function(event) {
    var $ausloeser = $(event.target);
    if ($ausloeser.is('div.filter')) {
      filtere($tabelle, $ausloeser);
      return false;
    }
    if (!$ausloeser.is('th')) $ausloeser = $ausloeser.closest('th');
    if ($ausloeser.hasClass('header')) {
    	sortiere($tabelle, $ausloeser);
    }
    return false;
  });
}

function behandleMouseoverAufTabelleninhalt($tabelle) {
  if ($tabelle.closest("#terminetabelle").length == 1) return;
  $tabelle.children("tbody").bind("mouseover", function(event) {
    var $ausloeser = $(event.target);
    if ($ausloeser.attr("tagName") != "tr") $ausloeser = $ausloeser.closest("tr");
    var $zellen = $ausloeser.children("td");
    $zellen.addClass("highlight");
    var $verweise = $zellen.children("a");
    if ($verweise.length == 1) {
      $zellen.addClass("klickbar");
      $verweise.css({"text-decoration": "underline"});
    }
    $zellen.bind("mouseout", function() {
      $zellen.removeClass("highlight").removeClass("klickbar");
      $verweise.css({"text-decoration": "none"});
    });
  });
}

function behandleKlickenAufTabelleninhalt($tabelle) {
  $tabelle.find("a").bind("click", function(e) { e.stopPropagation(); });
  $tabelle.children("tbody").bind("click", function(event) {
    var $ausloeser = $(event.target);
    if ($ausloeser.attr("tagName") != "tr") $ausloeser = $ausloeser.closest("tr");
    var $anker = $ausloeser.find("td > a");
    if ($anker.length < 1) return;
    var href = $anker.attr("href");
    if ($(this).closest("div#linktabelle").length > 0) window.open(href, "_blank");
    else location.href = href;
  });
}

/***************************/
/* Sortierung für Tabellen */
/***************************/
function sortiere(table, th) {
  if (table.hasClass("tablesorterAktiviert")) {
  	return;
  }
  $.tablesorter.addParser({
        id: 'zeitpunkt',
              is: function(s) {
                return false;
              },
              format: function(s) {
                s = s.replace(/ Uhr/, "");
                var datum = s.split(" - ")[0];
                var uhrzeit = s.split(" - ")[1];
                var wert = datum.split(".")[2] + datum.split(".")[1] + datum.split(".")[0] +
                  uhrzeit.split(":")[0] + uhrzeit.split(":")[1];
                return wert;
              },
              type: 'numeric'
              });

  $.tablesorter.addParser({
        id: 'text',
              is: function(s) {
                return false;
              },
              format: function(s) {
                wert = s.toLowerCase().replace(/ä/, "ae").replace(/ö/, "oe").replace(/ü/, "ue").replace(/ß/, "ss");
                return wert;
              },
              type: 'text'
              });
  var sortierteSpalte = th.get(0).cellIndex;
  var sortierrichtung = th.hasClass("headerSortUp") ? 0 : 1;
  var eigenschaften = {};
  if (table.closest("div#einsatztabelle").length > 0) {
    eigenschaften = {
      sortList: [[sortierteSpalte, sortierrichtung]],
      headers: {
      	0:{sorter: 'numeric'},
        1:{sorter: 'zeitpunkt'},
        2:{sorter: 'text'},
        3:{sorter: 'text'},
        4:{sorter: 'text'}
      }
    }
  } else if (table.closest("div#terminetabelle").length > 0) {
    eigenschaften = {
      sortList: [[sortierteSpalte, sortierrichtung]],
      headers: {
        0:{ sorter: 'zeitpunkt' },
        1:{sorter:'text'},
        2:{sorter:'text'},
        3:{sorter:'text'}
      }
    }
  } else if (table.closest("div#linktabelle").length > 0) {
    eigenschaften = {
      sortList: [[sortierteSpalte, sortierrichtung]],
      headers: {
        0:{ sorter: 'text' }
      }
    }
  }
  table.tablesorter(eigenschaften);
  table.children('thead').find('th.fahrzeuge').removeClass('header');
}

/*************************************/
/* Spaltenbreiten für Tabelle setzen */
/*************************************/
function bestimmeSpaltenbreiten(tabelle) {
  var spaltenbreiten = berechneSpaltenbreiten(tabelle);
  var cols = tabelle.children("colgroup").children("col").get();
  var i = cols.length;
  while (i--) cols[i].style.width = spaltenbreiten[i]+"px";
  tabelle.css("table-layout", "fixed");
}

function berechneSpaltenbreiten(tabelle) {
  var spaltenbreiten = new Array();
  var trs = tabelle.get(0).tHead.rows;
  var i = trs.length;
  while (i--) {
    var ths = trs[i].cells;
    var j = ths.length;
    while (j--) spaltenbreiten.push(ths[j].clientWidth);
  }
  return spaltenbreiten.reverse();
}


