var ExtendedSearchNewExtendedSearch = {
    delimiter: ":",

    updateRunning: false,

    // updateThemeDependencies von mirko scharf
    // schränkt die auswahl der dropdowns in abhängigkeit zur themenauswahl ein
    updateThemeDependencies: function(force, updateMode) {
        //alert('updateThemeDependencies with force='+force+' and updateRunning='+this.updateRunning);
        if (!force) {
            if (this.updateRunning)
                return;


            this.updateRunning = true;
        }
        if ($('#ThemeNewExtendedSearch').val() == "NOCHOICE") {  // keine auswahl
            // setze alle abhängigen felder ebenfalls auf keine auswahl und disable sie
            $("#AbilityNewExtendedSearch option:first").attr('selected', 'selected');
            $('#AbilityNewExtendedSearch').attr('disabled', 'disabled');

            $("#NiveauNewExtendedSearch option:first").attr('selected', 'selected');
            $('#NiveauNewExtendedSearch').attr('disabled', 'disabled');

            $("#CourseTypeNewExtendedSearch option:first").attr('selected', 'selected');
            $('#CourseTypeNewExtendedSearch').attr('disabled', 'disabled');
        }
        else {
            // lösche zunächst alle optionsfelder, füge das erste "Bitte wählen" dran 
            // clonen notwendig, sonst verschieb er nur
            $('#AbilityNewExtendedSearch').empty().append($("#AbilityAll option:first").clone());
            $('#AbilityNewExtendedSearch').removeAttr('disabled');
            this.reloadThemeData(updateMode);
        }

        if (!force)
            this.updateRunning = false;
    },

    reloadThemeData: function(updateMode) {
        WebCore.ajaxJSON(
                        getThemeDataLink,
                        "idTheme=" + $('#ThemeNewExtendedSearch').val(),
                        function(result) {
                            if (result.success == true) {
                                //alert('alles bestens');
                                // baue die Dropdowns zusammen; leere zunächst die Struktur-Variable
                                $(result.data.Abilities).each(function(key, value) {
                                    $('#AbilityNewExtendedSearch').
                                          append($("<option></option>").
                                          attr("value", String(value.IdAbility)).
                                          text(value.Localization));
                                });
                                ExtendedSearchNewExtendedSearch.updateRunning = false;
                                ExtendedSearchNewExtendedSearch.updateAbilityDependencies(1, updateMode);
                            } else {
                                WebCore.showError(result.exceptionText);
                            }
                        },
                        true
                    );
    },

    reloadAbilityData: function(updateMode) {
        WebCore.ajaxJSON(
                        getAbilityDataLink,
                        "idAbility=" + $('#AbilityNewExtendedSearch').val(),
                        function(result) {
                            if (result.success == true) {
                                //alert('alles bestens wieder');
                                // baue die Dropdowns zusammen; leere zunächst die Struktur-Variable
                                $(result.data.CourseTypes).each(function(key, value) {
                                    $('#CourseTypeNewExtendedSearch').
                                          append($("<option></option>").
                                          attr("value", String(value.IdCourseType)).
                                          text(value.Localization));
                                });
                                $(result.data.CourseNiveaus).each(function(key, value) {
                                    $('#NiveauNewExtendedSearch').
                                          append($("<option></option>").
                                          attr("value", String(value.IdNiveau)).
                                          text(value.Localization));
                                });
                                ExtendedSearchNewExtendedSearch.updateRunning = false;
                                if (updateMode == 'ini') {
                                    $('#CourseTypeNewExtendedSearch').val($('#preselectedCourseType').val());
                                    $('#NiveauNewExtendedSearch').val($('#preselectedNiveau').val());
                                    ExtendedSearchNewExtendedSearch.updateSearchString();
                                }
                            } else {
                                WebCore.showError(result.exceptionText);
                            }
                        },
                        true
                    );
    },


    // updateAbilityDependencies von mirko scharf
    // schränkt die auswahl der dropdowns in abhängigkeit zur fähigkeitsauswahl ein
    updateAbilityDependencies: function(force, updateMode) {
        //alert('updateAbilityDependencies with force='+force+' and updateRunning='+this.updateRunning);
        if (!force) {
            if (this.updateRunning)
                return;


            this.updateRunning = true;
        }
        if (updateMode == 'ini') // lese die gewählte Option aus dem hidden preselected feld aus
            $('#AbilityNewExtendedSearch').val($('#preselectedAbility').val());

        if ($('#AbilityNewExtendedSearch').val() == "NOCHOICE") {  // keine auswahl
            // setze alle abhängigen felder ebenfalls auf keine auswahl und disable sie
            $("#NiveauNewExtendedSearch option:first").attr('selected', 'selected');
            $('#NiveauNewExtendedSearch').attr('disabled', 'disabled');

            $("#CourseTypeNewExtendedSearch option:first").attr('selected', 'selected');
            $('#CourseTypeNewExtendedSearch').attr('disabled', 'disabled');
        }
        else {
            // lösche zunächst alle optionsfelder, füge das erste "Bitte wählen" dran
            // clonen notwendig, sonst verschieb er nur
            $('#NiveauNewExtendedSearch').empty().append($("#NiveauAll option:first").clone());
            $('#NiveauNewExtendedSearch').removeAttr('disabled');

            $('#CourseTypeNewExtendedSearch').empty().append($("#CourseTypeAll option:first").clone());
            $('#CourseTypeNewExtendedSearch').removeAttr('disabled');

            this.reloadAbilityData(updateMode);
        }

        if (!force)
            this.updateRunning = false;
    },

    updateSearchString: function() {
        if (this.updateRunning)
            return;

        //alert('enter updateSearchString');

        this.updateRunning = true;

        // Aus den gewählten Werten der Inputfelder unten und den Keywords die im Suchstring stehen den neuen suchstring bilden
        var searchString = $('#extendedHiddenSearchSpec').val();

        var extractedElements = searchString.split(" ");

        var resultElements = new Array();
        var containedCodes = new Array();

        for (i = 0; i < extractedElements.length; i++) {
            var element = extractedElements[i];

            if (element == "")
                continue;

            //alert("element: " + element);

            // Erstmal nur die Doppelpunkt-freien
            var delimiterIndex = element.indexOf(this.delimiter);
            if (delimiterIndex == -1) {
                resultElements.push(element);
            }
            else {
                var controlCode = element.substring(0, delimiterIndex);

                containedCodes.push(controlCode);

                var value = element.substring(delimiterIndex + 1, element.length);
                // alert("Code: " + controlCode + " (" + delimiterIndex + ") --> " + value);

                // Verstehen wir diesen Steuercode?
                if (this.haveCode(controlCode)) {
                    // Ja, verstehen wir. Wir schauen uns den Wert im Formular an und reagieren entsprechend.
                    var defaultValue = this.codesDictionary[controlCode];

                    var elem = eval(controlCode + "NewExtendedSearch_obj");
                    var formValue = elem.getValue();

                    // Wenn die aktuelle Setzung dem Default entspricht, ziehen wir dieses Element raus aus dem String
                    if (formValue != defaultValue) {
                        if (formValue instanceof Array) {
                            formValue = formValue.join(",");
                        }

                        // Wenn nicht, dann bringen wir die entsprechende Kombination in den String rein
                        resultElements.push(controlCode + this.delimiter + formValue);
                    }
                }
                else {
                    // Wenn nicht, übernehmen wir das Teil einfach..
                    resultElements.push(element);
                }
            }
        }

        // Jetzt gehen wir noch durch alle Formularelemente und checken den Wert des Elements gegen den Default-Wert, den wir im Hash haben.
        // Alles was vom Default abweicht, knallen wir noch an den String hinten ran.
        for (var defaultCode in this.codesDictionary) {
            // Schauen ob wir so einen Code schon abgehandelt haben
            var codeAlreadyContained = false;
            for (i = 0; i < containedCodes.length; i++) {
                if (containedCodes[i] == defaultCode) {
                    codeAlreadyContained = true;
                    break;
                }
            }

            if (codeAlreadyContained)
                continue;

            var defaultValue = this.codesDictionary[defaultCode];

            var elem = eval(defaultCode + "NewExtendedSearch_obj");
            var formValue = elem.getValue();

            // Wenn der Wert vom Default abweicht, knallen wir ihn mit rein in den Suchstring
            if (defaultValue != formValue) {
                if (formValue instanceof Array) {
                    formValue = formValue.join(",");
                }

                resultElements.push(defaultCode + this.delimiter + formValue);
            }
        }

        // Den Suchstring setzen wir jetzt auf die neuen Werte
        $('#extendedHiddenSearchSpec').val(resultElements.join(" "));

        // alert( $('#extendedHiddenSearchSpec').val() );

        this.updateRunning = false;
    },

    updateFormElements: function() {
        if (this.updateRunning)
            return;

        this.updateRunning = true;

        // Aus den gewählten Werten der Inputfelder unten und den Keywords die im Suchstring stehen den neuen Suchstring bilden
        var searchString = $('#extendedHiddenSearchSpec').val();
        //alert("searchString " + searchString);

        // alert( "Suchstring vor Update: " + searchString );

        var extractedElements = searchString.split(" ");

        var resultElements = new Array();
        var containedCodes = new Array();

        // Hilfsdurchlauf, um vorselektierten Kurstyp und -Niveau zu extrahieren
        for (i = 0; i < extractedElements.length; i++) {
            var element = extractedElements[i];

            var delimiterIndex = element.indexOf(this.delimiter);
            if (delimiterIndex != -1) {
                var controlCode = element.substring(0, delimiterIndex);
                var value = element.substring(delimiterIndex + 1, element.length);

                // Anführungszeichen rausschmeißen
                if (value[0] = "'") {
                    value = value.substring(1, value.length - 1);
                }
                if (controlCode == 'Ability')
                    $("#preselectedAbility").val(value);
                if (controlCode == 'CourseType')
                    $("#preselectedCourseType").val(value);
                if (controlCode == 'Niveau')
                    $("#preselectedNiveau").val(value);
            }
        }

        for (i = 0; i < extractedElements.length; i++) {
            var element = extractedElements[i];

            //alert("aktuelles element: " + element);
            if (element == "")
                continue;

            // Erstmal nur die Doppelpunkt-freien
            var delimiterIndex = element.indexOf(this.delimiter);
            if (delimiterIndex != -1) {
                var controlCode = element.substring(0, delimiterIndex);

                containedCodes.push(controlCode);

                // alert( controlCode + "(" + $('#extendedHiddenSearchSpec').val() + ")" );

                var value = element.substring(delimiterIndex + 1, element.length);

                // Anführungszeichen rausschmeißen
                if (value[0] = "'") {
                    value = value.substring(1, value.length - 1);
                }

                //    alert("try to set " + controlCode + " to " + value);

                // Verstehen wir diesen Steuercode?
                if (this.haveCode(controlCode)) {
                    //alert("set " + controlCode + " to " + value);
                    try {
                        // Hier muss was anderes hin
                        var elem = eval(controlCode + "NewExtendedSearch_obj");

                        if (this.codesDictionary[controlCode] instanceof Array) {
                            var test = value.split(",");

                            value = test;

                        }

                        elem.setValue(value);
                    } catch (ex) {
                        alert(textSetFieldError + controlCode + " --> " + value);
                    }

                    if (controlCode == "Theme") {   // muss die abhängigen felder anpassen
                        this.updateThemeDependencies(1, "ini");
                    }

                    if (controlCode == "Ability") {   // muss die abhängigen felder anpassen
                        this.updateAbilityDependencies(1, "ini");
                    }

                }
            }
        }

        this.updateRunning = false;
    },

    haveCode: function(key) {
        return typeof (this.codesDictionary[key]) != 'undefined';
    },

    codesDictionary: {
        "NoLocationRelevance": false,
        "OnlyCertifiedCourses": false,
        "FromDate": "",
        "ToDate": "",

        "Theme": "NOCHOICE", // Das vielleicht raus
        "Ability": "NOCHOICE",

        "Language": [],

        "Niveau": "NOCHOICE",
        "CourseType": "NOCHOICE",

        "FromInstitutions": true,
        "FromCommercials": true,
        "OnRequest": true,
        "FromPrivates": true
    },

    submit: function() {
        this.updateSearchString();
        var keywords = $('#iptSearchWhat').val();
        var hiddenSpec = $('#extendedHeaderSearch input[name=hiddenSearchSpec]').val();
        var location = $('#iptSearchWhere').val();

        // nicht den dummy-wert übermitteln
        if (keywords == $('#iptSearchWhat').attr("DummyValue")) keywords = "";

        var spec = keywords;

        // alert('hiddenSpec ' + hiddenSpec);

        if (hiddenSpec != "") {
            spec += " " + hiddenSpec;
        }

        // nicht den dummy-wert übermitteln
        if (location != "" && location != $('#iptSearchWhere').attr("DummyValue")) {
            spec += " location: '" + location + "'";
        }

        //alert('spec ' + spec);
        $('#extSearchQuery').val(spec);

        SearchControl.onSearchSubmit();

        $('#ExtendedSearchControlForm').submit();
    },

    init: function() {
        //alert('enter init fkt');
        var latitude = "";
        var longitude = "";

        // Falls wir die Client location ermitteln konnten, nutzen wir sie
        if (google.loader.ClientLocation) {
            longitude = google.loader.ClientLocation.longitude,
                        latitude = google.loader.ClientLocation.latitude
        }

        // AutoCompletes auf den Feldern aktivieren
        $('input[name=query]').autoComplete({
            ajax: autoCompleteWhatLink,
            delay: 700,
            multiple: false
        });

        $('input[name=queryLocation]').autoComplete({
            ajax: autoCompleteWhereLink,
            delay: 700,
            multiple: false,
            postData: {
                longCur: longitude,
                latCur: latitude
            }
        });

        this.updateFormElements();

        $('.extendedSearchCheckBoxes input:checkbox').screwDefaultButtons({
            checked: "url(/Static/Images/checkboxes.jpg)",
            unchecked: "url(/Static/Images/checkboxes.jpg)",
            width: 13,
            height: 9
        });
        $('.extendedSearchCheckBoxes .WC_CHKBOXGRP_ELEM .styledCheckbox').css('height', '13px');
    }
};

// Such-Controls initalisieren
var SearchControl = {
    whereField: null,
    whatField: null,

    whereDummy: "",
    whatDummy: "",

    initialWhat: "",
    initialWhere: "",
    initialSpec: "",
    
    additionalSpec : "",
    
    animationMode: "",  // can be logo or tabBox

    init: function() {
    
        if (globalIsLandingPage && !globalIsHeadOnly)
            this.animationMode = "tabBox";
        else
            this.animationMode = "logo";
    
        this.whereField = $("#iptSearchWhere");
        this.whatField = $("#iptSearchWhat");
        
        this.initialWhat = $("#searchControlInitialWhat").val();
        this.initialWhere = $("#searchControlInitialWhere").val();
        this.initialSpec = $("#searchControlInitialSpec").val();
        
        this.additionalSpec = $("#searchControlInitialSpec").val();

        this.whereDummy = this.whereField.attr("DummyValue");
        this.whatDummy = this.whatField.attr("DummyValue");

        // Die Suchfelder mit den Dummy-Werten initialisieren
        if (this.whereField.val() == "") this.whereField.val(this.whereDummy);

        if (this.whatField.val() == "") this.whatField.val(this.whatDummy);
    
        this.whatField.removeAttr("disabled"); 
        this.whereField.removeAttr("disabled"); 
    },

    // Kümmert sich um die Dummy-Anzeigen in den Suchfeldern
    updateSearchField: function(inputElement, gotFocus) {
        if (gotFocus) { // Fokus bekommen
            if (inputElement.value == $(inputElement).attr("DummyValue")) {
                inputElement.value = "";
            }
        } else { // Fokus verloren
            if (inputElement.value == "") {
                inputElement.value = $(inputElement).attr("DummyValue");
            }
        }
    },
    checkBeforeSubmit: function() {
        var where = this.whereField.val();
        var what = this.whatField.val();

        // Wenn beide noch ungefüllt sind, gehts nicht weiter
        if (where == this.whereDummy && what == this.whatDummy) {
            WebCore.showMessage(textCriteriaToSearch);
            return false;
        }

        // Suche kann abgesetzt werden. Dummy-Werte noch duch leere Strings ersetzen vorher
        if (where == this.whereDummy) this.whereField.val("");
        if (what == this.whatDummy) this.whatField.val("");

        // lese die Suchspezifikationen aus der erweiterten Suche aus
        if( $("#extendedHiddenSearchSpec").val() ) {
            this.additionalSpec = $("#extendedHiddenSearchSpec").val();
        }
        return true;
    },
    // Setzt das Was-Feld auf einen bestimmten Wert
    setSearchWhat: function(what) {
        this.whatField.val(what);
    },
    setSearchWhere: function(where) {
        this.whereField.val(where);
    },
    performSearch: function() {
        if( !SearchControl.checkBeforeSubmit() ) {
            return;
        }
        
        // Jetzt stellen wir schnell den Query zusammen
        var query = this.whatField.val();
        this.onSearchSubmit();
        
        var currWhereField = this.whereField.val();
        var currAdditionalSpec = this.additionalSpec;
        
        var timeoutID = window.setTimeout(
            function() {
                if( currWhereField != "" ) {
                    query += " location: '" + currWhereField + "'";
                }
                
                if( currAdditionalSpec != "" ) {
                    query += " " + currAdditionalSpec;
                }

                $('#SearchControlForm input[name=query]').val( query );
                $('#SearchControlForm')[0].submit();
                
                window.clearTimeout(timeoutID);
            }, 500
        );
        
    },
    onSearchSubmit: function() {
        if (this.animationMode == 'tabBox') {
            LessonFish.tabHelpGraphic.tabs('select', '#waitingWhileSearching');
            var tabPanels = $('#'+LessonFish.tabHelpGraphic.attr('id')+' .ui-tabs-panel' );
            var indizes = [];
            for ( var i = 0; i < tabPanels.size() -1; i++ ) {
                indizes.push(i);
            }
            LessonFish.tabHelpGraphic.tabs("option","disabled", indizes)
        }
        else {
            setLogoToSearching();
        }
    },
    performOldSearch: function(startAt) {
        $('#iptSearchStartAt').val(startAt);
        this.whereField.val(this.initialWhere);
        this.whatField.val(this.initialWhat);
        this.additionalSpec = this.initialSpec;
        this.performSearch();
    },
    setSearchType: function(type) {
        $('#searchType').val(type);
        //alert('vorher: '+SearchControl.additionalSpec)
        if (type == "All") {
            if( this.extendedSearchVisible ){
                FromInstitutionsExtended_obj.setValue(true);
                FromCommercialsExtended_obj.setValue(true);
                FromPrivatesExtended_obj.setValue(true);
            }
            
            SearchControl.additionalSpec = SearchControl.initialSpec;
            // FromPrivates:false; FromInstitutions:false; FromCommercials:false entfernen
            SearchControl.additionalSpec = SearchControl.additionalSpec.replace(/FromPrivates:'?false'?/g, "");
            SearchControl.additionalSpec = SearchControl.additionalSpec.replace(/FromInstitutions:'?false'?/g, "");
            SearchControl.additionalSpec = SearchControl.additionalSpec.replace(/FromCommercials:'?false'?/g, "");
        }

        if (type == "OnlyAcademies") {
            if( this.extendedSearchVisible ){
                FromInstitutionsExtended_obj.setValue(true);
                FromCommercialsExtended_obj.setValue(true);
                FromPrivatesExtended_obj.setValue(false);
            }

            SearchControl.additionalSpec = SearchControl.initialSpec + " FromPrivates:false";
            // FromInstitutions:false; FromCommercials:false entfernen
            SearchControl.additionalSpec = SearchControl.additionalSpec.replace(/FromInstitutions:'?false'?/g, "");
            SearchControl.additionalSpec = SearchControl.additionalSpec.replace(/FromCommercials:'?false'?/g, "");
        }

        if (type == "OnlyPrivates") {
            if( this.extendedSearchVisible ){
                FromInstitutionsExtended_obj.setValue(false);
                FromCommercialsExtended_obj.setValue(false);
                FromPrivatesExtended_obj.setValue(true);
            }

            SearchControl.additionalSpec = SearchControl.initialSpec + " FromInstitutions:false FromCommercials:false";
            // FromPrivates:false
            SearchControl.additionalSpec = SearchControl.additionalSpec.replace(/FromPrivates:'?false'?/g, "");
        }
    }
};



$(document).ready(function() {
    $(".rc-allExtendedHeaderSearchElem").cornerz({ radius: 6, borderWidth: 1, borderColor: "#9cb5ca", background: "#dce5ee" });
    $(".rc-ExtendedHeaderSearch").cornerz({ radius: 6, corners: "tl", background: "#FFFFFF" });
    $(".rc-ExtendedHeaderSearch").cornerz({ radius: 6, corners: "tr", background: "#FFFFFF" });
    $(".rc-ExtendedHeaderSearch").cornerz({ radius: 6, corners: "bl", background: "#FFFFFF" });
    $(".rc-ExtendedHeaderSearchHidingButton").cornerz({ radius: 6, background: "#FFFFFF" });

    $('#toggleExtendedHeaderSearchButton button').click(function() {
        var extendedHeaderSearch = $('#extendedHeaderSearch');
        extendedHeaderSearch.slideToggle('fast');
        if (extendedHeaderSearch.hasClass('activated')) {
            $(this).parent('.rc-ExtendedHeaderSearchHidingButton').addClass('toggledIn');
            extendedHeaderSearch.removeClass('activated');
            $(this).html(textBtnFadeInExtendedSearch);

        } else {
            $(this).parent('.rc-ExtendedHeaderSearchHidingButton').removeClass('toggledIn');
            extendedHeaderSearch.addClass('activated');
            $(this).html(textBtnFadeOutExtendedSearch);

        }
    });

    // initialisiere die erweiterte Suche
    ExtendedSearchNewExtendedSearch.init();

    google.setOnLoadCallback(function() {
        var latitude = "";
        var longitude = "";

        // Falls wir die Client location ermitteln konnten, nutzen wir sie
        if (google.loader.ClientLocation) {
            longitude = google.loader.ClientLocation.longitude,
            latitude = google.loader.ClientLocation.latitude
        }

        // AutoCompletes auf den Feldern aktivieren, aber nur im Normal-Modus (also nicht nur Kopfbereich), warum nicht? jetzt doch
        // if(!headOnly)
        // {
        $('input[name=query]').autoComplete({
            ajax: autoCompleteWhatLink,
            multiple: false
        });

        $('input[name=queryLocation]').autoComplete({
            ajax: autoCompleteWhereLink,
            multiple: false,
            postData: {
                longCur: longitude,
                latCur: latitude
            }
        });
        //}

        SearchControl.init();
    });
});

