var tx_bsaregistration_noCacheHeaders = {
    'Expires': 'Thu, 19 Nov 1981 08:52:00 GMT',
    'Cache-Control': 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0',
    'Pragma': 'no-cache'};

var moduleGroups = 1;

function tx_bsaregistration_getModuleGroupNames() {
    return $R(1, moduleGroups).map(function(i) { return 'FE[fe_users][tx_bsaregistration_modules' + (1 < i ? i : '') + '][]'; });
}

function tx_bsaregistration_getModuleItems() {
    var items = [];
    tx_bsaregistration_getModuleGroupNames().each(function(moduleGroupName) { items = items.concat($$('input[name="' + moduleGroupName + '"]')); });
    return items;
}

function tx_bsaregistration_getProjectTeachingItems() {
    return $$('input[name="FE[fe_users][tx_bsaregistration_projectteaching][]"]');
}

Event.observe(window, 'load',
    function() {
        if (!$('tx-srfeuserregister-pi1-tx_bsaregistration_status-0'))
            return;

        tx_bsaregistration_moveAdditionalText('tx_bsaregistration_additionalstatus', 1, $('tx-bsaregistration-additionalstatus_graduationyear'));
        tx_bsaregistration_moveAdditionalText('tx_bsaregistration_additionalstatus', 2, $('tx-bsaregistration-additionalstatus_participationyear'));

        tx_bsaregistration_insertAmountDivs('tx_bsaregistration_language');
        tx_bsaregistration_insertAmountDivs('tx_bsaregistration_architecture_art_design');
        tx_bsaregistration_insertAmountDivs('tx_bsaregistration_culture_media');
        tx_bsaregistration_insertAmountDivs('tx_bsaregistration_engineering_environment');
        tx_bsaregistration_insertAmountDivs('tx_bsaregistration_accommodation', true);
        tx_bsaregistration_insertAmountDivs('tx_bsaregistration_modules');
        tx_bsaregistration_insertAmountDivs('tx_bsaregistration_excursions');
        tx_bsaregistration_insertAmountDivs('tx_bsaregistration_accommodation');
        tx_bsaregistration_insertAmountDivs('tx_bsaregistration_accommodation_options');

        tx_bsaregistration_observeMultiple('FE[fe_users][tx_bsaregistration_accommodation]', 'click', tx_bsaregistration_updateAccommodationOptions);
        tx_bsaregistration_updateAccommodationOptions();

        tx_bsaregistration_observeMultiple('FE[fe_users][tx_bsaregistration_status]', 'click', tx_bsaregistration_updateFees);
        tx_bsaregistration_observeMultiple('FE[fe_users][tx_bsaregistration_additionalstatus][]', 'click', tx_bsaregistration_updateFees);
        tx_bsaregistration_observeMultiple('FE[fe_users][tx_bsaregistration_languagecourse][]', 'click', tx_bsaregistration_updateFees);
        tx_bsaregistration_observeMultiple('FE[fe_users][tx_bsaregistration_architecture_art_design][]', 'click', tx_bsaregistration_updateFees);
        tx_bsaregistration_observeMultiple('FE[fe_users][tx_bsaregistration_culture_media][]', 'click', tx_bsaregistration_updateFees);
        tx_bsaregistration_observeMultiple('FE[fe_users][tx_bsaregistration_engineering_environment][]', 'click', tx_bsaregistration_updateFees);
        tx_bsaregistration_observeMultiple('FE[fe_users][tx_bsaregistration_excursions][]', 'click', tx_bsaregistration_updateFees);
        tx_bsaregistration_getModuleGroupNames().each(function(moduleGroupName) { tx_bsaregistration_observeMultiple(moduleGroupName, 'click', tx_bsaregistration_updateFees); });
        tx_bsaregistration_updateFees();

        tx_bsaregistration_observeMultiple('FE[fe_users][tx_bsaregistration_languagecourse][]', 'click', tx_bsaregistration_enableCourses);
        tx_bsaregistration_observeMultiple('FE[fe_users][tx_bsaregistration_architecture_art_design][]', 'click', tx_bsaregistration_enableCourses);
        tx_bsaregistration_observeMultiple('FE[fe_users][tx_bsaregistration_culture_media][]', 'click', tx_bsaregistration_enableCourses);
        tx_bsaregistration_observeMultiple('FE[fe_users][tx_bsaregistration_engineering_environment][]', 'click', tx_bsaregistration_enableCourses);
        tx_bsaregistration_observeMultiple('FE[fe_users][tx_bsaregistration_excursions][]', 'click', tx_bsaregistration_enableCourses);
        tx_bsaregistration_enableCourses();

        tx_bsaregistration_observeMultiple('FE[fe_users][tx_bsaregistration_languagecourse][]', 'click', tx_bsaregistration_updateProjectTeachings);
        tx_bsaregistration_observeMultiple('FE[fe_users][tx_bsaregistration_language]', 'click', tx_bsaregistration_updateProjectTeachings);
        tx_bsaregistration_observeMultiple('FE[fe_users][tx_bsaregistration_architecture_art_design][]', 'click', tx_bsaregistration_updateProjectTeachings);
        tx_bsaregistration_observeMultiple('FE[fe_users][tx_bsaregistration_culture_media][]', 'click', tx_bsaregistration_updateProjectTeachings);
        tx_bsaregistration_observeMultiple('FE[fe_users][tx_bsaregistration_engineering_environment][]', 'click', tx_bsaregistration_updateProjectTeachings);
        tx_bsaregistration_updateProjectTeachings();

        tx_bsaregistration_observeMultiple('FE[fe_users][tx_bsaregistration_languagecourse][]', 'click', tx_bsaregistration_updateModules);
        tx_bsaregistration_observeMultiple('FE[fe_users][tx_bsaregistration_language]', 'click', tx_bsaregistration_updateModules);
        tx_bsaregistration_observeMultiple('FE[fe_users][tx_bsaregistration_architecture_art_design][]', 'click', tx_bsaregistration_updateModules);
        tx_bsaregistration_observeMultiple('FE[fe_users][tx_bsaregistration_culture_media][]', 'click', tx_bsaregistration_updateModules);
        tx_bsaregistration_observeMultiple('FE[fe_users][tx_bsaregistration_engineering_environment][]', 'click', tx_bsaregistration_updateModules);
        tx_bsaregistration_updateModules();

        tx_bsaregistration_observeMultiple('FE[fe_users][tx_bsaregistration_projectteaching][]', 'click', tx_bsaregistration_enableProjectTeachings);
        tx_bsaregistration_enableProjectTeachings();

        tx_bsaregistration_getModuleGroupNames().each(function(moduleGroupName) { tx_bsaregistration_observeMultiple(moduleGroupName, 'click', tx_bsaregistration_enableModules); });
        tx_bsaregistration_enableModules();
    }
);

function tx_bsaregistration_moveAdditionalText(name, i, item) {
    var itemId = 'tx-srfeuserregister-pi1-' + name + '-' + i;
    var labels = $$('label').filter(function(e) { return e.htmlFor == itemId; });
    if (0 < labels.length) {
        item.insert({ top: labels[0].replace(item) });
    }
}

function tx_bsaregistration_disableItem(e, disable) {
    e.disabled = disable;
    disable ? $(e.parentNode).addClassName('disabled') : $(e.parentNode).removeClassName('disabled');
}

function tx_bsaregistration_updateProjectTeachings() {
    var showItem = true;
    var languageCourse = tx_bsaregistration_getCheckValue('FE[fe_users][tx_bsaregistration_languagecourse][]');

    if (0 < languageCourse.length) {
        showItem = tx_bsaregistration_getRadioValue('FE[fe_users][tx_bsaregistration_language]') == 0;
    }

    if(0 < tx_bsaregistration_getCheckValue('FE[fe_users][tx_bsaregistration_architecture_art_design][]').length ||
       0 < tx_bsaregistration_getCheckValue('FE[fe_users][tx_bsaregistration_culture_media][]').length ||
       0 < tx_bsaregistration_getCheckValue('FE[fe_users][tx_bsaregistration_engineering_environment][]').length) {

       showItem = false;
    }

    var item = $('tx-bsaregistration-projectteaching');
    showItem ? item.show() : item.hide();
}

function tx_bsaregistration_updateModules() {
    var selectedModules = null;
    var languageCourse = tx_bsaregistration_getCheckValue('FE[fe_users][tx_bsaregistration_languagecourse][]');

    // abgeschaltete Module
    var disabledModules = [ ];

    if (0 < languageCourse.length) {
        var modules = [[ 1, 2, 3, 4 ], [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]];
        var duration = 0 <= languageCourse.indexOf('1') ? 1 : 0;

        selectedModules = modules[duration];
    }

    if(0 < tx_bsaregistration_getCheckValue('FE[fe_users][tx_bsaregistration_architecture_art_design][]').length ||
       0 < tx_bsaregistration_getCheckValue('FE[fe_users][tx_bsaregistration_culture_media][]').length ||
       0 < tx_bsaregistration_getCheckValue('FE[fe_users][tx_bsaregistration_engineering_environment][]').length) {

        selectedModules = [ ];
    }

    var idx = 1; tx_bsaregistration_getModuleItems().each(function(e) {
        var showItem = disabledModules.indexOf(idx) < 0 && (selectedModules == null || 0 <= selectedModules.indexOf(idx));
        if (showItem) {
            $(e.parentNode).show()
        } else {
            $(e.parentNode).hide();
            e.checked = false;
        }
        idx++;
    });

    var item = $('tx-bsaregistration-modules');
    (selectedModules == null || 0 < selectedModules.length) ? item.show() : item.hide();
}

function tx_bsaregistration_enableProjectTeachings() {
    var items = tx_bsaregistration_getProjectTeachingItems();
    tx_bsaregistration_enableItemsByMaxSelectCount(items, 2);
}

function tx_bsaregistration_enableModules() {
    var items = tx_bsaregistration_getModuleItems();
    tx_bsaregistration_enableItemsByMaxSelectCount(items, 1);
}

function tx_bsaregistration_enableItemsByMaxSelectCount(items, count) {
    var checkedItems = items.findAll(function(item) { return item && item.checked; });
    items.each(function(item) {
        if (item) tx_bsaregistration_disableItem(item, !item.checked && count <= checkedItems.length);
    });
}

function tx_bsaregistration_enableCourses() {
    var coursesAndExcursions = [
        /*  0 */ [ '2012/08/08', '2012/08/19' ], // Sprachkurse 2 Wochen
        /*  1 */ [ '2012/08/08', '2012/09/02' ], // Sprachkurse 4 Wochen

        /*  2 */ [ '2012/08/06', '2012/08/17' ], // 2D Design Basics
        /*  3 */ [ '2012/08/06', '2012/08/17' ], // Light, Design & Spacial Ambience
        /*  4 */ [ '2012/08/06', '2012/08/17' ], // Venustas
        /*  5 */ [ '2012/08/26', '2012/08/31' ], // Der Architektonische Raum im Bild

        /*  6 */ [ '2012/08/13', '2012/08/17' ], // Lichtverhältnisse
        /*  7 */ [ '2012/08/20', '2012/09/24' ], // Speicherorte der Erinnerung
        /*  8 */ [ '2012/08/27', '2012/09/31' ], // Synthesizers at Your Fingertips

        /*  9 */ [ '2012/08/06', '2012/08/17' ], // Model Validation and Simulation

        /* 10 */ [ '2012/08/11', '2012/08/11' ], // Leipzig
        /* 11 */ [ '2012/08/12', '2012/08/12' ], // Schlauchboottour
        /* 12 */ [ '2012/08/12', '2012/08/12' ], // Panorama-Museum
        /* 13 */ [ '2012/08/19', '2012/08/19' ], // Dessau
        /* 14 */ [ '2012/08/19', '2012/08/19' ], // Eisenach
        /* 15 */ [ '2012/08/24', '2012/08/26' ], // Berlin
        /* 16 */ [ '2012/08/25', '2012/08/25' ]  // Halle
    ];

    var courseCount = 10;

    coursesAndExcursions.each(function(beginEnd) {
        for (var i = 0; i < 2; i++) {
            var t = beginEnd[i].split('/');
            var year = parseInt(t[0], 10);
            var month = parseInt(t[1], 10) - 1;
            var day = parseInt(t[2], 10);
            if (0 < i) {
                day++;
            }
            beginEnd[i] = new Date(year, month, day);
        }
    });

    var matrix = [];

    for (var i = 0; i < coursesAndExcursions.length; i++) {
        var t = [];
        for (var k = 0; k < i; k++) {
            // keine Überschneidungen mit Exkursionen
            // Keine Überschneidungen von Sprachkursen und den Modulen 4, 5 und 8
            if (i < courseCount &&
                ((k != 0 && k != 1) || (i != 4 && i != 5 && i != 8)) &&
                ((coursesAndExcursions[i][0] <= coursesAndExcursions[k][0] && coursesAndExcursions[k][0] < coursesAndExcursions[i][1]) ||
                 (coursesAndExcursions[k][0] <= coursesAndExcursions[i][0] && coursesAndExcursions[i][0] < coursesAndExcursions[k][1]))) {
                t[t.length] = k;
            }
        }
        matrix[i] = t;
    }

    var descriptions = [
        { name: 'FE[fe_users][tx_bsaregistration_languagecourse][]', count: 2 },
        { name: 'FE[fe_users][tx_bsaregistration_architecture_art_design][]', count: 4 },
        { name: 'FE[fe_users][tx_bsaregistration_culture_media][]', count: 3 },
        { name: 'FE[fe_users][tx_bsaregistration_engineering_environment][]', count: 1 },
        { name: 'FE[fe_users][tx_bsaregistration_excursions][]', count: 7 }
    ];

    var items = [];
    descriptions.each(function(description) {
        var currentItems = $$('input[name="' + description.name + '"]');
        while (currentItems.length < description.count) {
            currentItems[currentItems.length] = null;
        }
        if (currentItems.length != description.count) {
            alert('Unexpected count of items for "' + description.name + '"!');
            return;
        }
        items = items.concat(currentItems);
    });

    tx_bsaregistration_disableConflicted(matrix, items);

    // abgeschaltete Kurse
    var disabledCurses = [ ];

    disabledCurses.each(function(id) {
        tx_bsaregistration_disableItem(items[id - 1], true);
    });
}

function tx_bsaregistration_disableConflicted(matrix, items) {
    var disabledItems = [];
    var checkedItems = [];

    var idx = 0; items.each(function (item) {
        var selector = matrix[idx];
        if (item && item.checked) {
            disabledItems = disabledItems.concat(selector);
            checkedItems[checkedItems.length] = idx;
        } else {
            selector.each(function(e) {
                if (0 <= checkedItems.indexOf(e)) {
                    disabledItems[disabledItems.length] = idx;
                }
            });
        }
        idx++;
    });

    var idx = 0; items.each(function(item) {
        if (item) tx_bsaregistration_disableItem(item, 0 <= disabledItems.indexOf(idx++));
    });
}

function tx_bsaregistration_observeMultiple(name, eventName, handler) {
    return $$('input[name="' + name + '"]').each(function(e) { e.observe(eventName, handler); });
}

function tx_bsaregistration_updateAccommodationOptions() {
    var accommodation = tx_bsaregistration_getRadioValue('FE[fe_users][tx_bsaregistration_accommodation]');
    var options = $$('input[name="FE[fe_users][tx_bsaregistration_accommodation_options][]"]');
    for (var i = 0; i < options.length; i++) {
        if (i == 0) {
            var option = options[i];
            tx_bsaregistration_disableItem(option, true);
            option.checked = accommodation == 2;
        }
    }
}

var tx_bsaregistration_callTime = null;

function tx_bsaregistration_updateFees() {
    //checkForAjaxRequest(true);

    modules = [];
    var idx = 0; tx_bsaregistration_getModuleGroupNames().each(function(moduleGroupName) {
        var offset = 10 * idx++;
        var temp = tx_bsaregistration_getCheckValue(moduleGroupName).map(function(value) { return parseInt(value) + offset; });
        modules = modules.concat(temp);
    });

    tx_bsaregistration_callTime = (new Date).toJSON();
    var parameters = {
        'eID': 'tx_basregistration',
        'tx_bsaregistration_ajaxResponder[status]':  tx_bsaregistration_getRadioValue('FE[fe_users][tx_bsaregistration_status]'),
        'tx_bsaregistration_ajaxResponder[additionalStatus]': tx_bsaregistration_getCheckValue('FE[fe_users][tx_bsaregistration_additionalstatus][]').toJSON(),
        'tx_bsaregistration_ajaxResponder[languageCourse]': tx_bsaregistration_getCheckValue('FE[fe_users][tx_bsaregistration_languagecourse][]').toJSON(),
        'tx_bsaregistration_ajaxResponder[architectureArtDesign]': tx_bsaregistration_getCheckValue('FE[fe_users][tx_bsaregistration_architecture_art_design][]').toJSON(),
        'tx_bsaregistration_ajaxResponder[cultureMedia]': tx_bsaregistration_getCheckValue('FE[fe_users][tx_bsaregistration_culture_media][]').toJSON(),
        'tx_bsaregistration_ajaxResponder[engineeringEnvironment]': tx_bsaregistration_getCheckValue('FE[fe_users][tx_bsaregistration_engineering_environment][]').toJSON(),
        'tx_bsaregistration_ajaxResponder[modules]': modules.toJSON(),
        'tx_bsaregistration_ajaxResponder[excursions]': tx_bsaregistration_getCheckValue('FE[fe_users][tx_bsaregistration_excursions][]').toJSON(),
        'tx_bsaregistration_ajaxResponder[callTime]': tx_bsaregistration_callTime };

    new Ajax.Request('index.php', {
        method: 'post',
        parameters: parameters,
        requestHeaders: tx_bsaregistration_noCacheHeaders,
        onComplete: function(t) {
            var json = t.responseText.evalJSON();

            if (json.callTime != tx_bsaregistration_callTime)
                return;

            var i = 0; json.languageCourse.each(function(fee) {
                var e = $('tx_bsaregistration_language_' + i++);
                if (e) e.update(fee + ' EUR');
            });
            var i = 0; json.architectureArtDesignCourse.each(function(fee) {
                var e = $('tx_bsaregistration_architecture_art_design_' + i++);
                if (e) e.update(fee + ' EUR');
            });
            var i = 0; json.cultureMediaCourse.each(function(fee) {
                var e = $('tx_bsaregistration_culture_media_' + i++);
                if (e) e.update(fee + ' EUR');
            });
            var i = 0; json.engineeringEnvironmentCourse.each(function(fee) {
                var e = $('tx_bsaregistration_engineering_environment_' + i++);
                if (e) e.update(0 < fee ? fee + ' EUR' : '');
            });
            var i = 0; json.modules.each(function(fee) {
                var e = $('tx_bsaregistration_modules_' + i++);
                if (e) e.update(fee + ' EUR');
            });
            var i = 0; json.excursions.each(function(fee) {
                var e = $('tx_bsaregistration_excursions_' + i++);
                if (e) e.update(fee + ' EUR');
            });
            var i = 0; json.accommodation.each(function(fee) {
                var e = $('tx_bsaregistration_accommodation_' + i++);
                if (e && 0 < fee) e.update(fee + ' EUR');
            });
            var i = 0; json.accommodationOptions.each(function(fee) {
                var e = $('tx_bsaregistration_accommodation_options_' + i++);
                if (e) e.update(fee + ' EUR');
            });

            //checkForAjaxRequest(false);
        }
    });
}

function tx_bsaregistration_getCheckValue(name) {
    return $$('input[name="' + name + '"]').filter(function(e) { return e.checked; }).map(function(e) { return e.value; });
}

function tx_bsaregistration_getRadioValue(name) {
    var checked = $$('input[name="' + name + '"]').filter(function(e) { return e.checked; });
    if (1 == checked.length) {
        return checked[0].value;
    }
}

function tx_bsaregistration_insertAmountDivs(name) {
    var prefix = 'tx-srfeuserregister-pi1-' + name + '-';
    for (var i = 0; ; i++) {
        var item = $(prefix + i);
        if (!item)
            break;
        item.insert({ before:'<div style="float:right;padding-left:2em;" id="' + name + '_' + i + '"></div>' });
    }
}

