function CertificateConstants() {
    this.dialogCertificateBuildingAgeHeadlineOwner = 'Hauseigentümer';
    this.dialogCertificateBuildingAgeTextOwner = 'Für Ihr selbst genutztes Eigenheim brauchen Sie laut Gesetzgeber keinen Energieausweis – allerdings ist die bedarfsorientierte Variante aufschlussreich, um energetische Optimierungen am Gebäude zu planen. Wenn Sie Ihr Haus verkaufen möchten, müssen Sie einen Energieausweis auf Nachfrage des Käufers vorlegen. Welchen Ausweis Sie benötigen, hängt von Ihrer Immobilie ab. Wann wurde Ihr Wohnhaus gebaut?';
    this.dialogCertificateBuildingAgeHeadlineLandlord = 'Vermieter';
    this.dialogCertificateBuildingAgeTextLandlord = 'Wenn Sie Ihr Wohnhaus vermieten, müssen Sie die Energieausweis-Pflicht berücksichtigen.';
    
    this.dialogCertificateResultHeadlineBuilder = 'Eigentümer';
    this.dialogCertificateResultTextBuilder = 'Für Neubauten ist der bedarfsorientierte Energieausweis Pflicht. Dieser dient dazu, die energetische Qualität des Gebäudes differenziert bewerten zu können.';
    
    this.dialogCertificateResultHeadlineOwner = 'Eigentümer';
    this.dialogCertificateResultTextOwner = new Array(
        'Sie benötigen beim Verkauf der Immobilie einen bedarfsorientierten Energieausweis.',
        'Sie benötigen beim Verkauf der Immobilie entweder einen bedarfs- oder verbrauchsorientierten Energieausweis.',
        'Sie benötigen beim Verkauf der Immobilie entweder einen bedarfs- oder verbrauchsorientierten Energieausweis.'
    );
    
    this.dialogCertificateResultHeadlineLandlord = 'Vermieter';
    this.dialogCertificateResultTextLandlord = new Array(
        new Array(
            'Für Ihr Gebäude benötigen Sie einen bedarfsorientierten Energieausweis.',
            'Für Ihr Gebäude benötigen Sie einen bedarfs- oder verbrauchsorientierten Energieausweis.'
        ),
        new Array(
            'Für Ihr Gebäude benötigen Sie einen bedarfs- oder verbrauchsorientierten Energieausweis.',
            'Für Ihr Gebäude benötigen Sie einen bedarfs- oder verbrauchsorientierten Energieausweis.'
        ),
        'Für Ihr Gebäude benötigen Sie einen bedarfs- oder verbrauchsorientierten Energieausweis.'
    );
    
    this.dialogCertificateResultHeadlineTenant = 'Mieter';
    this.dialogCertificateResultTextTenant = new Array(
        'Ihr Vermieter ist nur bei neuen Mietverhältnissen zur Vorlage des Energieausweises verpflichtet, nicht jedoch für bestehende Verträge.',
        'Ihr Vermieter ist bei neuen Mietverhältnissen zur Vorlage des Energieausweises verpflichtet.'
    );
}

function CertificateCheck() {

    var content = document.getElementById('certificateCheckContent');
    var displayState = false;
    var userType = null;
    var buildingAge = 0;
    var self = this;
    
    this.close = function() {
        hideDialogs();
        self.displayState = false;
    }
    
    this.start = function() {
        showDialog('dialogCertificateCheckStart');
        self.displayState = true;
    }

    this.showUserTypeDialog = function() {
        showDialog('dialogCertificateUserType');
    }
    
    this.formCertificateUserTypeSubmitted = function() {
        this.userType = getOptionValue('formCertificateUserType', 'userType');
        if (this.userType == null) {
            showErrorMessages(new Array('Bitte wählen Sie die zutreffende Option aus!'));
            return;
        }
        switch (this.userType) {
            case 'builder':
                document.getElementById('dialogCertificateResultHeadline').firstChild.nodeValue = new CertificateConstants().dialogCertificateResultHeadlineBuilder;
                document.getElementById('dialogCertificateResultText').firstChild.nodeValue = new CertificateConstants().dialogCertificateResultTextBuilder;
                showDialog('dialogCertificateResult');
                break;
            case 'owner':
                document.getElementById('dialogCertificateBuildingAgeHeadline').firstChild.nodeValue = new CertificateConstants().dialogCertificateBuildingAgeHeadlineOwner;
                document.getElementById('dialogCertificateBuildingAgeText').firstChild.nodeValue = new CertificateConstants().dialogCertificateBuildingAgeTextOwner;
                showDialog('dialogCertificateBuildingAge');
                break;
            case 'landlord':
                document.getElementById('dialogCertificateBuildingAgeHeadline').firstChild.nodeValue = new CertificateConstants().dialogCertificateBuildingAgeHeadlineLandlord;
                document.getElementById('dialogCertificateBuildingAgeText').firstChild.nodeValue = new CertificateConstants().dialogCertificateBuildingAgeTextLandlord;
                showDialog('dialogCertificateBuildingAge');
                break;
            case 'tenant':
                showDialog('dialogCertificateTenant');
                break;
            default:
                alert('Es wurde keine gültige Option gewählt!');
                break;
        }
    }
    
    this.formCertificateBuildingAgeSubmitted = function() {
        this.buildingAge = parseInt(getOptionValue('formCertificateBuildingAge', 'buildingAge'));
        if (isNaN(this.buildingAge)) {
            showErrorMessages(new Array('Bitte wählen Sie die zutreffende Option aus!'));
            return;
        }
        switch (this.userType) {
            case 'owner':
                switch (this.buildingAge) {
                    case 0:
                    case 1:
                    case 2:
                        document.getElementById('dialogCertificateResultHeadline').firstChild.nodeValue = new CertificateConstants().dialogCertificateResultHeadlineOwner;
                        document.getElementById('dialogCertificateResultText').firstChild.nodeValue = new CertificateConstants().dialogCertificateResultTextOwner[this.buildingAge];
                        showDialog('dialogCertificateResult');
                        break;
                    default:
                        alert('Es wurde keine gültige Option gewählt!');
                        break;
                }
                break;
            case 'landlord':
                switch (this.buildingAge) {
                    case 0:
                    case 1:
                        showDialog('dialogCertificateLandlord');
                        break;
                    case 2:
                        document.getElementById('dialogCertificateResultHeadline').firstChild.nodeValue = new CertificateConstants().dialogCertificateResultHeadlineLandlord;
                        document.getElementById('dialogCertificateResultText').firstChild.nodeValue = new CertificateConstants().dialogCertificateResultTextLandlord[this.buildingAge];
                        showDialog('dialogCertificateResult');
                        break;
                    default:
                        alert('Es wurde keine gültige Option gewählt!');
                        break;
                }
                break;
            default:
                alert('Es wurde keine gültige Option gewählt!');
                break;
        }
    }
    
    this.formCertificateLandlordSubmitted = function() {
        var answer = parseInt(getOptionValue('formCertificateLandlord', 'answer'));
        if (isNaN(answer)) {
            showErrorMessages(new Array('Bitte wählen Sie die zutreffende Option aus!'));
            return;
        }
        switch (answer) {
            case 0:
            case 1:
            case 2:
                document.getElementById('dialogCertificateResultHeadline').firstChild.nodeValue = new CertificateConstants().dialogCertificateResultHeadlineLandlord;
                document.getElementById('dialogCertificateResultText').firstChild.nodeValue = new CertificateConstants().dialogCertificateResultTextLandlord[this.buildingAge][answer];
                showDialog('dialogCertificateResult');
                break;
            default:
                alert('Es wurde keine gültige Option gewählt! Antwort war ' + answer);
                break;
        }
    }
    
    this.formCertificateTenantSubmitted = function() {
        var answer = parseInt(getOptionValue('formCertificateTenant', 'answer'));
        if (isNaN(answer)) {
            showErrorMessages(new Array('Bitte wählen Sie die zutreffende Option aus!'));
            return;
        }
        switch (answer) {
            case 0:
            case 1:
                document.getElementById('dialogCertificateResultHeadline').firstChild.nodeValue = new CertificateConstants().dialogCertificateResultHeadlineTenant;
                document.getElementById('dialogCertificateResultText').firstChild.nodeValue = new CertificateConstants().dialogCertificateResultTextTenant[answer];
                showDialog('dialogCertificateResult');
                break;
            default:
                alert('Es wurde keine gültige Option gewählt! Antwort war ' + answer);
                break;
        }
    }
    
    /* --------------------------- */
    /* ---- private functions ---- */
    /* --------------------------- */
    
    function getOptionValue(formName, optionName) {
        var i = 0;
        while (i < document.forms[formName].elements[optionName].length) {
            if (document.forms[formName].elements[optionName][i].checked == true) {
                return document.forms[formName].elements[optionName][i].value;
            }
            i++;
        }
        return null;
    }
    
    function showDialog(dialogId) {
        hideDialogs();
        closeErrorMessages();
        if (! displayState) {
            displayState = true;
        }
        document.getElementById(dialogId).style.display = 'block';
    }
    
    function hideDialogs() {
        for (var i = 0; i < content.childNodes.length; i++) {
            if (content.childNodes[i].nodeName.toLowerCase() == 'div') {
                content.childNodes[i].style.display = 'none';
            } else {
                content.removeChild(content.childNodes[i]);
            }
        }
    }
    
    function showErrorMessages(errorMessages) {
        closeErrorMessages();
        var errorMsgDiv = document.getElementById('certificateErrorMessage');
        for (var i = 0; i < errorMessages.length; i++) {
            var errorMsg = document.createElement('p');
            errorMsg.style.display = 'block';
            errorMsg.appendChild(document.createTextNode(errorMessages[i]));
            errorMsgDiv.appendChild(errorMsg);
        }
        errorMsgDiv.style.display = 'block';
    }
    
    function closeErrorMessages() {
        var errorMsgDiv = document.getElementById('certificateErrorMessage');
        errorMsgDiv.style.display = 'none';
        removeChildren(errorMsgDiv);
    }
    
    function removeChildren(element) {
        if (element == null) {
            return;
        }
        while (element.childNodes.length > 0) {
            element.removeChild(element.firstChild);
        }
    }
}