﻿/**
 * Konstruktor
 */
var GerichteControl = new function() {
    this.timerId = null;
}

/** Das JSON-Objekt */
GerichteControl.json = null;

/** Nach dem Selektieren eines Element über eine Checkbox in den Facetten, muss unterbunden werden, dass diese als Filter gesetzt werden (event canceling) */
GerichteControl.setSelectionAllowed = true;

/******************************************************************************
***                              Hauptfunktionen                            ***
******************************************************************************/

/**
 * Fügt eine Gerichtsbarkeit der Auswahl hinzu bzw. entfernt diese wieder daraus
 * @param integer indexGerichtbarkeit Der Index der Gerichtbarkeit
 * @param boolean checked Gibt an, ob das Gericht selektiert oder deselektiert wurde
 * @param string value Die ausgewählte Gerichtsbarkeit
 */
GerichteControl.toogleSelectedFullGerichtbarkeit = function(indexGerichtbarkeit, checked, value) {
    if (checked) {
        if (!Array.contains(this.json.AlleGerichtbarkeit, indexGerichtbarkeit)) {
            Array.enqueue(this.json.AlleGerichtbarkeit, indexGerichtbarkeit);
        }
        if (!Array.contains(this.json.ValuesFacette, value)) {
            Array.enqueue(this.json.ValuesFacette, value);
        }
    } else {
        if (Array.contains(this.json.AlleGerichtbarkeit, indexGerichtbarkeit)) {
            Array.remove(this.json.AlleGerichtbarkeit, indexGerichtbarkeit);
        }
        if (Array.contains(this.json.ValuesFacette, value)) {
            Array.remove(this.json.ValuesFacette, value);
        }
    }
    this.refresh();
}

/**
 * Fügt einen Gerichttyp der Auswahl hinzu bzw. entfernt ihn wieder daraus
 * @param integer indexGerichttyp Der Index des Gerichttyps
 * @param boolean checked Gibt an, ob das Gericht selektiert oder deselektiert wurde
 * @param string value Der ausgewählte Gerichttyp
 */
GerichteControl.toggleSelectedFullGerichttyp = function(indexGerichttyp, checked, value) {
    if (checked) {
        if (!Array.contains(this.json.AlleGerichttyp, indexGerichttyp)) {
            Array.enqueue(this.json.AlleGerichttyp, indexGerichttyp);
        }
        if (!Array.contains(this.json.ValuesFacette, value)) {
            Array.enqueue(this.json.ValuesFacette, value);
        }
    } else {
        if (Array.contains(this.json.AlleGerichttyp, indexGerichttyp)) {
            Array.remove(this.json.AlleGerichttyp, indexGerichttyp);
        }
        if (Array.contains(this.json.ValuesFacette, value)) {
            Array.remove(this.json.ValuesFacette, value);
        }
    }
    this.refresh();
}

/**
 * Selektiert bzw. deselektiert die übergebene Gerichtbarkeit und aktiviert ggf. den Filter
 * @param integer indexGerichtbarkeit Der Index der Gerichtbarkeit
 */
GerichteControl.setSelectedGerichtbarkeit = function(indexGerichtbarkeit) {
    if (!this.setSelectionAllowed) {
        this.setSelectionAllowed = true;
        return;
    }
    if (this.json.SelectedGerichttyp != -1) {
        this.json.SelectedGerichttyp = -1;
        this.json.SelectedGerichtbarkeit = indexGerichtbarkeit;
    } else {
        this.json.SelectedGerichtbarkeit = (this.json.SelectedGerichtbarkeit == -1 || this.json.SelectedGerichtbarkeit != indexGerichtbarkeit) ? indexGerichtbarkeit : -1;
    }

    this.refresh();
}

/**
 * Selektiert bzw. deselektiert den übergebenen Gerichttyp und aktiviert ggf. den Filter
 * @param integer indexGerichttyp Der Index des Gerichttyps
 */
GerichteControl.setSelectedGerichttyp = function(indexGerichttyp) {
    if (!this.setSelectionAllowed) {
        this.setSelectionAllowed = true;
        return;
    }
    this.json.PageNr = 1;
    this.json.SelectedGerichttyp = (this.json.SelectedGerichttyp == -1 || this.json.SelectedGerichttyp != indexGerichttyp) ? indexGerichttyp : -1;
    this.refresh();
}

/**
 * Fügt ein Gericht der Auswahl hinzu bzw. entfernt es wieder daraus
 * @param string value Das ausgewählte Gericht
 * @param boolean checked Gibt an, ob das Gericht selektiert oder deselektiert wurde
 */
GerichteControl.addItem = function(value, checked) {
    if (checked == true) {
        // In der Aktenverwaltung darf immer nur ein Gericht ausgewählt sein        
        if (this.json.SelectSingleCourt) {
            Array.clear(this.json.Values);
        }
        
        if (!Array.contains(this.json.Values, value)) {
            Array.enqueue(this.json.Values, value);
        }
    }
    else {
        if (Array.contains(this.json.Values, value)) {
            Array.remove(this.json.Values, value);
        }
    }
    
    this.refresh();
}

/******************************************************************************
***                          Funktionen der Buttons                         ***
******************************************************************************/

/**
 * Der Hilfe Button
 */
GerichteControl.showHelp = function() {
    ShowHelp('GerichtControl');
}

/**
* Der Reset Button
*/
GerichteControl.reset = function() {
    if ($get(this.json.ZielFeld) != null) {
        $get(this.json.ZielFeld).value = "";
    }

    var zielFeld = this.json.ZielFeld;
    var zeigeBehoerden = this.json.ZeigeBehoerden;
    this.resetJson();
    this.refresh(undefined, zielFeld, zeigeBehoerden);
}

/**
 * Der Schließen Button
 */
GerichteControl.close = function() {
    RemoveAllChilds('GerichteControl');    
    this.resetJson();
}

/**
 * Der Übernehmen Button
 */
GerichteControl.uebernehmen = function() {
    if ($get(this.json.ZielFeld) != null) {
        var facetten = SerializeArray(this.json.ValuesFacette);  
        var courts = SerializeArray(this.json.Values);      
        $get(this.json.ZielFeld).value = facetten + (facetten != '' && courts != '' ? ', ' : '') + courts;
    }
    
    // Spezialbehandlung im RSPRSummaryControl
    if ($get('Suchtext') != null) {
        RSPRSummaryControl.DoAjax();
    }
    
    // Spezialbehandlung im VerwanSummaryControl
    if ($get('AgencyCondition') != null) {
        VerwanSummaryControl.DoAjax();
    }
    RemoveAllChilds('GerichteControl');
    this.resetJson();
}

/******************************************************************************
***                              Hilfsmethoden                              ***
******************************************************************************/

/**
 * Zeigt das Control erstmalig an
 * @param string zielFeld Die ID des Inputfeldes, in dass die selektieten Werte übernommen werden sollen
 * @param boolean zeigeBehoerden Gibt an, ob Behörden statt Gerichte angezeigt werden sollen
 */
GerichteControl.init = function(zielFeld, zeigeBehoerden) {
    this.refresh(undefined, zielFeld, zeigeBehoerden);
}

/**
 * Aktualisiert die Liste
 * @param integer time Wird eine Zeitspanne angegeben, so wird das Laden der Liste verzögert
 * @param string zielFeld Die ID des Inputfeldes, in dass die selektieten Werte übernommen werden sollen
 * @param boolean zeigeBehoerden Gibt an, ob Behörden statt Gerichte angezeigt werden sollen
*/
GerichteControl.refresh = function(time, zielFeld, zeigeBehoerden) {
    if (this.timerId != null) {
        clearTimeout(this.timerId);
        this.timerId = null;
    }

    if (typeof time != "undefined") {
        this.timerId = LoadXmlWithTimer('5', null, null, null, this.json, true, GerichteControl.onLoadedXml, time);
    } else {
        LoadXml('5', (zielFeld == null ? null : zielFeld), (zeigeBehoerden ? 'behoerden=true' : null), null, this.json, true, GerichteControl.onLoadedXml);
    }
}

/**
 * Setzt das JSON-Objekt zurück
 */
GerichteControl.resetJson = function() {
    this.json = null;
}

/**
 * Wird nach dem fertig ausgeführten Ajax-Request ausgeführt
 */
GerichteControl.onLoadedXml = function(executor, eventArgs) {
    this.timerId = null;
    OnLoadedXml(executor, eventArgs);
    if ($get('json') != null) {
        try {
            var value = $get('json').value;
            value = unescape(value);
            GerichteControl.json = Sys.Serialization.JavaScriptSerializer.deserialize(value);
        }
        catch (e) {
            alert(e.message);
        }
    }
    SetFocus('txtgerichtesearch');
}

/**
 * Wird aufgerufen, um die DRUCK-Taste abzufangen (Firefox-Bug)
 */
GerichteControl.handleKeyUp = function(event) {
    if (!event)
        event = window.event;

    if (event.keyCode == 44)
        return;

    GerichteControl.json.Suchtext = (event.originalTarget != null) ? event.originalTarget.value : event.srcElement.value;
    GerichteControl.refresh(1500);
}