/**
 * ux.js is a wrapper for jQuery.CbWidget.message_window and the loader
 *  CbUx.App  must be overwritten to specific application needs
 *  CbUx.translate must be overwritten to specific application needs
 */
var CbUx = CbUx || {

    language: 'de_DE',
    projects: ['cb-framework'],
    mlBricks: {},
    setProjects: function (projects) {
        CbUx.projects = projects;
    },

    /**
     *
     * @param {type} labels
     * @param {type} callback
     * @returns {undefined}
     */
    setMlBricks: function (labels, callback) {
        $.getJSON('/module/lib/framework/getMlBricks.php', {
            "projects": CbUx.projects,
            "language": CbUx.language,
            "labels[]": labels
        }, function (bricks) {
            CbUx.mlBricks = bricks;
            if (typeof callback === 'function') {
                callback();
            }
        });
    },

    /**
     * default translation function, use setBricks beforehand or overwrite this.
     * @param {type} brick
     * @returns {String}
     */
    translate: function (brick) {
        if (typeof window.ml === 'function') {
            translation = ml(brick);
        } else {
            translation = CbUx.mlBricks[brick] ? CbUx.mlBricks[brick] : 'translation missing [ux]: ' + brick;
        }
        return translation;
    },

    /**
     * default App instead of backbone app you must overwrite this if necessary
     */
    App: {
        navigate: function (href, triggerOption, statuscode) {
            if (href == 'home') {
                //document.location.href = href
            }
            if (href == 'login') {
                //document.location.href = href
            }
        }
    },

    loading: false,

    loader: function () {
        if ($ && $.CbWidget && $.CbWidget.loader)
            return new $.CbWidget.loader();
    }(),

    showLoader: function () {
        CbUx.loader.show();
        CbUx.loading = true;
    },

    hideLoader: function () {
        CbUx.loader.hide();
        CbUx.loading = false;
    },

    serializeObject: function (obj) {
        if (JSON && JSON.stringify) {
            return JSON.stringify(obj);
        }
        var ret = typeof obj == 'object' ? '{' : '';
        console.log(obj);
        if (typeof obj == 'string')
            return obj;
        for (var i in obj) {
            ret += '"' + i + '" : ';
            if (typeof obj[i] == 'object') {
                ret += CbUx.serializeObject(obj[i]) + ',';
                continue;
            }
            if (obj[i] instanceof Array) {
                ret += '"' + i + '" : [' + CbUx.serializeObject(obj[i]) + '],';
                continue;
            }
            if (typeof obj[i] == 'string' || typeof obj[i] == 'number') {
                ret += '"' + obj[i] + '",';
                continue;
            }
            if (typeof obj[i] == 'function') {
                ret += '"' + obj[i].toString() + '",';
                continue;
            }
            ret += '"",';
        }
        ret = ret.replace(/,$/, '');
        return typeof obj == 'object' ? ret + '}' : ret + '';
    },

    requestObjects: [],

    logError: function (error) {
        if (console && console.error)
            console.error(error);
        var errorModel = {
            host: window.location.host,
            path: window.location.href,
            summary: error.message ? error.message : '',
            userAgent: navigator.userAgent.toLowerCase()
        };
        if (typeof error == 'object') {
            for (var i in error) {
                errorModel[i] = CbUx.serializeObject(error[i]);
            }
        }
        return true;
    },

    logWindowError: function (message, filename, lineno, colno, error) {
        error = {
            message: message,
            filename: filename,
            lineno: lineno,
            colno: colno !== 'undefined' ? colno : null,
            error: error ? CbUx.serializeObject(error) : null
        };
        CbUx.logError(error);
        return true;
    },

    setRequest: function (jqXHR) {
        jqXHR.fail(CbUx.ajaxError);
        CbUx.requestObjects.push(jqXHR);
    },

    ajaxErrorEvent: function (event, jqXHR, ajaxSettings, thrownError) {
        CbUx.ajaxError(jqXHR, ajaxSettings, thrownError || '', event);
    },

    ajaxError: function (model, response, options, event) {
        var errorDialog = CbUx.getErrorDialog();
        var status = 0;
        var responseText = '';
        var url = model.url || response.url || options.url;
        CbUx.hideLoader();
        if (typeof event !== 'undefined' && typeof event.stopPropagation === 'function') {
            event.stopPropagation();
        }
        // XHR abort
        if ((model && model.readyState === 0) || (response && response.readyState === 0)) {
            return;
        }
        if (model && model.readyState) {
            status = model.status;
            responseText = model.responseJSON ? model.responseJSON : model.responseText;
        }
        if (response && response.readyState) {
            status = response.status;
            responseText = response.responseText;
        }
        if (status == 403 && responseText.indexOf('_') > -1) {
            return CbUx.showMessage(responseText.replace(/^"|"$/g, ''), 'acl_restriction_caption');
        }
        if (status == 403 && responseText.indexOf('Please log in') > -1) {
            return errorDialog.handleSessionTimeOut();
        }
        if (status == 404) {
            return CbUx.showMessage(CbUx.translate('resource_not_found') + ' <br>' + url, '404_not_found', function () {
                CbUx.App.navigate('home', {
                    trigger: true
                }, status);
            });
        }
        if (status >= 500) {
            responseText = CbUx.translate('server_error') + ' <br>' + responseText;

        }
        CbUx.appError({message: responseText});
    },

    appError: function (error) {
        CbUx.logError(error);
        CbUx.getErrorDialog().handleError(error);
    },

    getErrorDialog: function () {
        CbUx.ErrorWindow = CbUx.ErrorWindow || new jQuery.CbWidget.message_window(
                {
                    template: false,
                    avoidFrame: true,
                    responsive: true
                }, {
            language: CbUx.language,
            id_prefix: '#',
            projects: CbUx.projects,
            templateString: '<div class="error-dialog-window">' +
                    '    <div class="error-dialog-padding error-dialog-heading __CbUiText">error_dialog_heading</div>' +
                    '    <div class="error-dialog-content">' +
                    '        <div class="error-dialog-message-container __CbUiText">error_dialog_description</div>' +
                    '        <div class="error-dialog-login-message-container __CbUiText">an_session_timeout_error_occurred</div>' +
                    '        <div class="error-dialog-error-container __CbUiText"></div>' +
                    '        <div class="error-abort-container"><a class="__CbUiOkButton __CbUiTextButton __CbUiText">_ok</a></div>' +
                    '    </div>' +
                    '</div>'
        },
                {}
        );
        return CbUx.ErrorWindow;
    },

    getMessageDialog: function () {
        CbUx.MessageWindow = CbUx.MessageWindow || new jQuery.CbWidget.message_window(
                {
                    template: false,
                    avoidFrame: true,
                    responsive: true
                }, {
            language: CbUx.language,
            id_prefix: '#',
            projects: CbUx.projects,
            templateString: '<div class="message-dialog-window">' +
                    '    <div class="message-dialog-padding message-dialog-heading __CbUiText __CbUiReplaceHtml">message_heading</div>' +
                    '    <div class="message-dialog-content">' +
                    '        <div class="message-dialog-message __CbUiText __CbUiReplaceHtml">message_text</div>' +
                    '        <div class="message-abort-container"><a class="__CbUiCancelButton __CbUiTextButton __CbUiText">_cancel</a> <a class="__CbUiOkButton __CbUiTextButton __CbUiText">_ok</a></div>' +
                    '    </div>' +
                    '</div>'
        },
                {}
        );
        return CbUx.MessageWindow;
    },

    getPromptDialog: function () {
        CbUx.PromptWindow = CbUx.PromptWindow || new jQuery.CbWidget.message_window(
                {
                    template: false,
                    avoidFrame: true,
                    responsive: true
                }, {
            template: false,
            templateString: '<div class="message-dialog-window">' +
                    '    <div class="message-dialog-padding message-dialog-heading __CbUiText">cbui_input_heading</div>' +
                    '    <div class="message-dialog-content">' +
                    '        <div class="message-dialog-message __CbUiText">message text</div>' +
                    '       <div class="message-dialog-input"><input type="text" name="CbUiPromptInput" id="CbUiPromptInput" autofocus></div>' +
                    '        <div class="message-abort-container"><a class="__CbUiCancelButton __CbUiTextButton __CbUiText">_cancel</a> <a class="__CbUiOkButton __CbUiTextButton __CbUiText">_ok</a></div>' +
                    '   </div>' +
                    '</div>',
            language: CbUx.language,
            id_prefix: '#',
            projects: CbUx.projects
        },
                {}
        );
        return CbUx.PromptWindow;
    },


    getPromptDialogAdditionalContent: function () {
        CbUx.PromptWindow = CbUx.PromptWindow || new jQuery.CbWidget.message_window(
                {
                    template: false,
                    avoidFrame: true,
                    responsive: true
                }, {
            template: false,
            templateString: '<div class="message-dialog-window">' +
                    '    <div class="message-dialog-padding message-dialog-heading __CbUiText">cbui_input_heading</div>' +
                    '    <div class="message-dialog-content">' +
                    '        <div class="message-dialog-message __CbUiText">message text</div>' +
                    '        <div class="message-dialog-additional-content"></div>' +
                    '        <div class="message-dialog-input"><input type="text" name="CbUiPromptInput" id="CbUiPromptInput" autofocus></div>' +
                    '        <div class="message-abort-container"><a class="__CbUiCancelButton __CbUiTextButton __CbUiText">_cancel</a> <a class="__CbUiOkButton __CbUiTextButton __CbUiText">_ok</a></div>' +
                    '   </div>' +
                    '</div>',
            language: CbUx.language,
            id_prefix: '#',
            projects: CbUx.projects
        },
                {}
        );
        return CbUx.PromptWindow;
    },

    showMessage: function (message, caption, onOkCallback, noMl) {
        CbUx.getMessageDialog().showMessage(
                noMl ? message : CbUx.translate(message),
                noMl ? caption : CbUx.translate(caption),
                onOkCallback
                );
    },

    confirm: function (caption, message, onOkCallback, cancelCallback, noMl, okText, cancelText) {
        CbUx.getMessageDialog().showConfirm(
                noMl ? caption : CbUx.translate(caption),
                noMl ? message : CbUx.translate(message),
                onOkCallback,
                cancelCallback,
                okText,
                cancelText
                );
    },

    prompt: function (heading, message, okCallback, defaultValue, noMl) {
        CbUx.getPromptDialog().prompt(
                noMl ? heading : CbUx.translate(heading),
                noMl ? message : CbUx.translate(message),
                okCallback,
                defaultValue
                );

        setTimeout(function () {
            $("input#CbUiPromptInput").focus();
        }, 500);


    },

    promptAdditionalContent: function (heading, message, okCallback, defaultValue, noMl, additionalContent) {
        CbUx.getPromptDialogAdditionalContent().promptAdditionalContent(
                noMl ? heading : CbUx.translate(heading),
                noMl ? message : CbUx.translate(message),
                okCallback,
                defaultValue,
                additionalContent
                );

        setTimeout(function () {
            $("input#CbUiPromptInput").focus();
        }, 500);


    }
};
