  var JSONKategorien;
  var JSONProdukte;
  var lastUpdate;
  var minZeitraum = 9999;
  var maxZeitraum = 0;
  var oldMinJahr;
  var oldMaxJahr;
  var oldExplorer = ($.browser.msie && ($.browser.version <= 7.0));

  //
  // Initialisierung
  //
  $(document).ready(function(){
	// Datum des letzten Updates
    $.getJSON("RenditeController?action=getLastUpdate&mandant=" + mandant, function(data){
      lastUpdate = data.lastUpdate;
    });  
	  
    // Die Kategorien werden als JSON-Objekt via AJAX vom Server geholt
    $.getJSON("RenditeController?action=getKategorien&mandant=" + mandant, function(data){
      JSONKategorien = data;

      // Die Produkte werden als JSON-Objekt via AJAX vom Server geholt
      $.getJSON("RenditeController?action=getProdukte&mandant=" + mandant, function(data){
        JSONProdukte = data;

        // Die Produktliste wird einmalig nach dem Laden der JSONKategorien und JSONProdukte aufgebaut
        var kategorieHTML = '';
        var kategorieIndex = 0;
        var kategorie = null;
        var produktCounter = 0;

        $.each(JSONKategorien.kategorien, function(){
          kategorie = this;
          kategorieHTML += '<div class="topic" ' +
          'id="topic' +
          kategorie.id +
          '" title="' +
          kategorie.beschreibung +
          '">' +
          '<span onmouseover="this.style.cursor = \'pointer\'" ' +
          'onclick="$(\'#kategorie' +
          kategorie.id +
          '\').slideToggle(\'fast\', function () { showTopicSymbol(' +
          kategorie.id +
          ', true) })">' +
          '&nbsp;&nbsp;&nbsp;' +
          kategorie.name +
          '</span></div>' +
          '<div id="kategorie' +
          kategorie.id +
          '" style="display: ' +
          (kategorie.expanded ? 'block' : 'none') +
          '">';

          $.each(JSONProdukte.produkte, function(){
            var produkt = this;
            if (kategorie.id == produkt.kategorie) {
              var beschreibung = this.beschreibung;
              if (this.auflegungsdatum) {
            	  beschreibung += ' (Auflegungsdatum: ' + this.auflegungsdatum + ')';
              }
              var produktCheckbox = '<div class="item" title="' +
	              beschreibung +
	              '">' +
	              '<label><input type="checkbox" class="itemCheckbox" name="produkt" value="' +
	              this.id +
	              '"' +
	              (this.selected ? ' checked="checked"' : '') +
	              '> ' +
	              '<span class="itemname">' +
	              this.name +
	              ' (' +
	              this.start +
	              '-' +
	              this.ende +
	              ')</span></label></div>';
              kategorieHTML += produktCheckbox;
              if (this.selected) {
                appendProdukt(this, false);
                produktCounter++;
              }

            // Globalen Zeitraum bestimmen
            minZeitraum = Math.min(minZeitraum, this.start);
            maxZeitraum = Math.max(maxZeitraum, this.ende);
            }
          });

          kategorieHTML += '</div>';
        });

        // Produktliste einfuegen
        $('#produkte').append(kategorieHTML);

        // Die Pfeile der Kategorien werden initialisiert
        $.each(JSONKategorien.kategorien, function(){
          showTopicSymbol(this.id, false);
        });

        // Slider fuer den Zeitraum einfuegen und Handler setzen
        $('#zeitraum').slider({ animate: true, min: minZeitraum, max: maxZeitraum, step: 1, range: true, values: [minZeitraum, maxZeitraum] });
        $('#zeitraum').bind('slide', function(event, ui) {
          var minJahr = getSelectedStartJahr();
          var maxJahr = getSelectedEndeJahr();
          if ((maxJahr - minJahr) < 2) {
            return false;
          }
		  if (minJahr < minZeitraum) {
			return false;
		  }
		  if (maxJahr > maxZeitraum) {
			return false;
		  }
          updateAktuellenZeitraum();
        });
        $('#zeitraum').bind('slidestart', function(event, ui) {
          oldMinJahr = getSelectedStartJahr();
          oldMaxJahr = getSelectedEndeJahr();
        });
        $('#zeitraum').bind('slidestop', function(event, ui) {
          var minJahr = Math.max(minZeitraum, getSelectedStartJahr());
          var maxJahr = Math.min(maxZeitraum, getSelectedEndeJahr());
          if (maxJahr - minJahr < 2) {
            if (oldMinJahr == minJahr) {
              maxJahr = minJahr + 2;
            } else {
              minJahr = maxJahr - 2;
            }
          }
          $('#zeitraum').slider('option', 'values', [minJahr, maxJahr]);
          updateChart();
        });

        // Initialisierung der Optionen und Anteile
        $('#optionen').css('display', (produktCounter > 0) ? 'block' : 'none');
        $('#anteile').css('display', (produktCounter > 1) ? 'block' : 'none');
        if (produktCounter > 0) {
          updateMoeglichenZeitraum();
        }

        // Chart anzeigen
        updateChart();

        // Wenn Anlageprodukte an- oder abgewaehlt werden, muss die Liste der aktuellen Produkte aktualisiert werden
        $("input[name=produkt]").click(function(){
          // Gewaehltes Produkt finden
          var produkt = getProduktById(this.value);

          // Produkteigenschaft initialisieren
          produkt.selected = this.checked;
          produkt.anteil = 0.0;

          // Optionen ein- oder ausblenden
          var count = getSelectedProduktCount();
          if (count == 0) {
            $('#optionen').slideUp();
          }
          if (count == 1 && $('#optionen').is(':hidden')) {
            $('#optionen').slideDown();
          }

          // Anteile ein- oder ausblenden
          if (count < 2) {
            if (oldExplorer) {
              $('.slider').hide();
            }
            $('#anteile').slideUp();
          }
          if (count > 1 && $('#anteile').is(':hidden')) {
            if (oldExplorer) {
              $('.slider').show();
            }
            $('#anteile').slideDown();
          }

          // Maximal moeglichen Zeitraum der gewaehlen Produkte bestimmen
          if (count > 0) {
            updateMoeglichenZeitraum();
          }

          // Produkt hinzufuegen oder entfernen
          if (this.checked) {
            appendProdukt(produkt, true);
          }
          else {
            removeProdukt(produkt);
          }

          // Anteil des ersten bzw. des letzten verbliebenen Produkts auf 100% setzen
          if (count == 1) {
            verteileProduktanteile();
          }

          if (count >= 1) {
            updateChart();
          }
        });

        // Wenn das Startjahr geaendert wird, muss ggf. das Endejahr angepasst werden
        $('select[name=startJahr]').click(function(){
          var minJahr = getSelectedStartJahr();
          var maxJahr = getSelectedEndeJahr();
          if ((maxJahr - minJahr) < 2) {
            $('select[name=endeJahr]').val(minJahr + 2);
          }
          updateChart();
        });

        // Wenn das Endejahr geaendert wird, muss ggf. das Startjahr angepasst werden
        $('select[name=endeJahr]').click(function(){
          var minJahr = getSelectedStartJahr();
          var maxJahr = getSelectedEndeJahr();
          if ((maxJahr - minJahr) < 2) {
            $('select[name=startJahr]').val(maxJahr - 2);
          }
          updateChart();
        });
      });
    });
  });

  //
  // Zeigt je nach Zustand des Topics das passende, vorangestellte Dreieck
  //
  function showTopicSymbol(id, scroll){
    var expanded = $('#kategorie' + id).css('display') != 'none';
    $('#topic' + id).css('background', 'url("images/topic-' + (expanded ? 'open' : 'close') + '.png") center left no-repeat');
    if (scroll && expanded) {
      //$('#topic' + id)[0].scrollIntoView(false);
    }
  }

  //
  // Fuegt ein Produkt der Auswahl hinzu
  //
  function appendProdukt(produkt, animate){
    var produktHTML = '';
    produktHTML += '<div class="item" id="produkt' + produkt.id + '" style="width: 99%; display: ' + (animate ? 'none' : 'block') + '">'
    produktHTML += '<table width="100%">';
    produktHTML += '<tr>';
    produktHTML += '<td width="99%">' + produkt.name + '</td>';
    produktHTML += '<td align="right" style="padding:0 12px">';
    produktHTML += '<div class="slider" id="slider' + produkt.id + '""></div>';
    produktHTML += '</td>';
    produktHTML += '<td align="right" style="white-space:nowrap">';
    produktHTML += '<input type="text" name="gewichtwert" size="6" value="' + formatNumber(produkt.anteil);
    produktHTML += '" id="anteil' + produkt.id + '" onchange="updateProduktanteil(' + produkt.id + ')">%';
    produktHTML += '</td>';
    produktHTML += '</tr>';
    produktHTML += '</table>';
    produktHTML += '</div>';
    $('#gewichtungen').prepend(produktHTML);
    $('#slider' + produkt.id).slider({
      animate: true,
      min: 0,
      max: 100,
      step: 1,
      value: produkt.anteil
    });
    $('#produkt' + produkt.id).slideDown('fast');
    $('#slider' + produkt.id).bind('slide', function(event, ui){
      $('#anteil' + produkt.id).val(formatNumber(ui.value));
      updateProduktanteile();
    });
    $('#slider' + produkt.id).bind('slidestop', function(event, ui){
      updateChart();
    });
  }

  //
  // Entfernt ein ausgewaehltes Produkt
  //
  function removeProdukt(produkt){
    $('#slider' + produkt.id).hide();
    $('#produkt' + produkt.id).slideUp('fast', function(){
      if (!produkt.selected) {
        $('#produkt' + produkt.id).remove();
        updateProduktanteile();
      }
    });
  }

  //
  // Liefert ein Produkt fuer die uebergebene Id
  //
  function getProduktById(id){
    var count = JSONProdukte.produkte.length;
    for (var i = 0; i < count; i++) {
      var produkt = JSONProdukte.produkte[i];
      if (produkt.id == id) {
        return produkt;
      }
    }
    return null;
  }

  //
  // Liefert die Anzahl der selektierten Produkte
  //
  function getSelectedProduktCount(){
    var count = JSONProdukte.produkte.length;
    var result = 0;
    for (var i = 0; i < count; i++) {
      var produkt = JSONProdukte.produkte[i];
      if (produkt.selected) {
        result++;
      }
    }
    return result;
  }

  //
  // Liefert das gewaehlte Startjahr als Integerwert
  //
  function getSelectedStartJahr(){
    return $('#zeitraum').slider('option', 'values')[0];
  }

  //
  // Liefert das gewaehlte Endejahr als Integerwert
  //
  function getSelectedEndeJahr(){
    return $('#zeitraum').slider('option', 'values')[1];
  }

  //
  // Aktualisiert die Zeitrauminformation
		//
  function updateAktuellenZeitraum() {
	$('#zeitraumAktuellMin').html("31.12." + getSelectedStartJahr());
	if (getSelectedEndeJahr() == lastUpdate.substr(6, 4)) {
	  $('#zeitraumAktuellMax').html(lastUpdate);
	} else {
	  $('#zeitraumAktuellMax').html("31.12." + getSelectedEndeJahr());
	}
  }

  //
  // Aktualisiert den moeglichen Zeitraum
  //
  function updateMoeglichenZeitraum(){
    var minJahr = 0;
    var maxJahr = 9999;
    $.each(JSONProdukte.produkte, function(){
      if (this.selected) {
        minJahr = Math.max(minJahr, this.start);
        maxJahr = Math.min(maxJahr, this.ende);
      }
    });
	//$('#zeitraumMoeglichMin').html("31.12." + minJahr);
	//$('#zeitraumMoeglichMax').html(maxJahr);
    minZeitraum = minJahr;
    maxZeitraum = maxJahr;

    var oldMinJahr = getSelectedStartJahr();
    var oldMaxJahr = getSelectedEndeJahr();
    var newMinJahr = Math.max(minJahr, oldMinJahr);
    var newOldJahr = Math.min(Math.max(newMinJahr + 2, oldMaxJahr), maxJahr);
    $('#zeitraum').slider('option', 'values', [newMinJahr, newOldJahr]);
    $('#zeitraum').slider('enable');
    updateAktuellenZeitraum();
  }

  //
  // Erzeugt die Optionen fuer die Jahresauswahlliste
  //
  function createJahrOptionen(startJahr, endeJahr){
    var options = '';
    for (var jahr = startJahr; jahr <= endeJahr; jahr++) {
      options += '<option value="' + jahr + '">' + jahr + '</option>';
    }
    return options;
  }

  //
  // Verteilt die Produkte gleichmaessig
  //
  function verteileProduktanteile(){
    var anteil = (100.0 / getSelectedProduktCount()).toFixed(2);
    for (var i = 0; i < JSONProdukte.produkte.length; i++) {
      var produkt = JSONProdukte.produkte[i];
      if (JSONProdukte.produkte[i].selected) {
        produkt.anteil = anteil;
        $('#anteil' + produkt.id).val(formatNumber(anteil));
        $('#slider' + produkt.id).slider('option', 'value', anteil);
      }
    }
    $('#normalisiereProduktanteile').css("color", disabledLinkColor);
    if (JSONProdukte.produkte.length > 0) {
      updateChart();
    }
  }

  //
  // Normalisiert die Produktanteile auf 100%
  //
  function normalisiereProduktanteile(){
    var amount = 0.0;
    for (var i = 0; i < JSONProdukte.produkte.length; i++) {
      var produkt = JSONProdukte.produkte[i];
      if (JSONProdukte.produkte[i].selected) {
        amount += produkt.anteil;
      }
    }
    if (amount == 0.0) {
      return;
    }
    for (var i = 0; i < JSONProdukte.produkte.length; i++) {
      var produkt = JSONProdukte.produkte[i];
      if (JSONProdukte.produkte[i].selected) {
        produkt.anteil = produkt.anteil * 100.0 / amount;
        $('#anteil' + produkt.id).val(formatNumber(produkt.anteil));
        $('#slider' + produkt.id).slider('option', 'value', produkt.anteil);
      }
    }
    $('#anteilSumme').val(formatNumber(100));
    $('#normalisiereProduktanteile').css("color", disabledLinkColor);
  }

  //
  // Update der Produktanteil
  //
  function updateProduktanteil(id){
    var value = parseNumber($('#anteil' + id).val());
    value = Math.max(0, Math.min(100, value));
    $('#slider' + id).slider('option', 'value', value);
    updateProduktanteile();
  }

  //
  // Update der Produktanteile
  //
  function updateProduktanteile(){
    var amount = 0;
    $.each($('input[name=gewichtwert]'), function(i, val){
      var value = parseNumber(val.value).toFixed(2);
      value = Math.max(0, Math.min(100, value));
      var produkt = getProduktById(val.id.substr(6));
      produkt.anteil = parseFloat(value);
      val.value = formatNumber(value);
      amount += parseFloat(value);
    });
    $('#anteilSumme').val(formatNumber(amount));
    if (Math.round(amount) != 100) {
      $('#normalisiereProduktanteile').css("color", enabledLinkColor);
    } else {
      $('#normalisiereProduktanteile').css("color", disabledLinkColor);

    }
  }

  //
  // Formatiert einen numerischen Wert mit dem Komma als Dezimalzeichen
  //
  function formatNumber(value){
    return (1 * value).toFixed(2).toString().replace(".", ",");
  }

  //
  // Parst einen String und wandelt ihn in einen numerischen Wert
  //
  function parseNumber(string){
    if (string == null) {
      return 0;
    }
    var value = "0";
    var point = false;
    var length = string.length;
    for (i = 0; i < length; i++) {
      var c = string.charAt(i);
      if (c >= '0' && c <= '9') {
        value += c;
      }
      else
        if (!point && (c == '.' || c == ',')) {
          value += '.';
          point = true;
        }
    }
    return parseFloat(value);
  }

  //
  // Erzeugt den PDF-Ausdruck und zeigt ihn in einem neuen Fenster an
  //
  function createPDF(obj){
    updateProduktanteile();
    var produkte = '';
    var anteile = '';
    var comma = false;
    $.each(JSONProdukte.produkte, function(){
      if (this.selected) {
        if (comma) {
          produkte += ',';
          anteile += ',';
        }
        produkte += this.id;
        anteile += this.anteil;
        comma = true;
      }
    });
    obj.target = '_blank';
    obj.href = 'RenditeController?action=createPDF' +
      '&mandant=' +
      mandant +
      '&start=' +
      getSelectedStartJahr() +
      '&ende=' +
      getSelectedEndeJahr() +
      '&produkte=' +
      produkte +
      '&anteile=' +
      anteile +
      '&colorNeutral=' +
      colorNeutral +
      '&colorPositiv=' +
      colorPositiv +
      '&colorNegativ=' +
      colorNegativ +
      '&random=' +
      Math.random();
  }

  //
  // Erzeugt das Chart als PNG-Image
  //
  function updateChart(){
    updateProduktanteile();
    var produkte = '';
    var anteile = '';
    var comma = false;
    $.each(JSONProdukte.produkte, function(){
      if (this.selected) {
        if (comma) {
          produkte += ',';
          anteile += ',';
        }
        produkte += this.id;
        anteile += this.anteil;
        comma = true;
      }
    });
    //var width = 480;
    //var height = 360;
    var url = 'RenditeController?action=createChart' +
      '&mandant=' +
      mandant +
      '&start=' +
      getSelectedStartJahr() +
      '&ende=' +
      getSelectedEndeJahr() +
      '&produkte=' +
      produkte +
      '&anteile=' +
      anteile +
      '&width=' +
      chartWidth +
      '&height=' +
      chartHeight +
      '&colorNeutral=' +
      colorNeutral +
      '&colorPositiv=' +
      colorPositiv +
      '&colorNegativ=' +
      colorNegativ +
      '&random=' +
      Math.random();
    $.get(url, function(data){
      $('#chart-dreieck').html(data);
      $('#chart').css('height', $('#chart-dreieck').height() + 8);
      if (oldExplorer) {
        $('#chart-dreieck').css('text-size', 9);
      }
    });
  }


