(function (window) {
    var _self = null;
    var Asocfile = {
        validEvents: ['click', 'hover'],
        init: function () {
            _self = this;
            _self.methods.bindEvents(); // bind global.
            _self.upload.init();
        },
        upload: {
            init: function () {
                // Habilitar botones de asocfile con archivos.
                $('.asocfile-container').each(function () {
                    var $elem = $(this);
                    var id = $elem.attr("id");
                    var name = $elem.find('.asocfile-label').text();
                    var asocfile_name = $elem.attr("data-name");

                    if (!mainFidJs.TS) {
                        $('#' + id + ' .selectAsocFile').off('click').on('click', function () {
                            $('#' + asocfile_name).click();
                            $('#' + asocfile_name).off('change').on('change', function () {
                                var localfile = $('#' + asocfile_name).val();
                                localfile = localfile.replace('C:\\fakepath\\', '');
                                $elem.find('.asocfile-filename').html(localfile);
                                if (localfile) {
                                    // permitimos al usuario eliminar el archivo antes de guardar el artículo.
                                    $('#' + id + ' button[data-method="actions.deleteAsocFile"]').prop('disabled', false);
                                    $('#' + id + ' button[data-method="actions.deleteAsocFile"]').on('click', function () {
                                        $elem.find('.asocfile-filename').html('');
                                        $('#'+asocfile_name).val('');
                                    });
                                } else {
                                    $('#' + id + ' button[data-method="actions.deleteAsocFile"]').prop('disabled', 'disabled');
                                }
                            });
                        });
                    } else {
                        $elem.dropzone({
                            url: '/{0}/prontus_art_upload.cgi'.format(Admin.dir_cgi_cpn),
                            paramName: '_archivo',
                            previewTemplate: '',
                            clickable: '#' + id + ' .selectAsocFile',
                            autoProcessQueue: false,
                            autoQueue: true,
                            maxFiles: 1,
                            maxFilesize: Admin.maxFileSizeM,
                            timeout: null,
                            parallelUploads: 1,
                            params: {_ts: mainFidJs.TS, _type: 'archivo', _prontus_id: Admin.prontus_id, _archivo_campo: asocfile_name},
                            success: function (data) {
                                if (data.status == 'success') {
                                    var response = JSON.parse(data.xhr.response);
                                    if (response.status == 1) {
                                        var info = response.msg.split(';');

                                        _self.actions.updateAsocFile(id, asocfile_name, info[0], info[1], data.size);

                                        $('#modal_upload_asocfile').find('[data-method="actions.closeModal"]').removeAttr("disabled");
                                        $('#modal_upload_asocfile').find('[data-method="upload.actions.processQueue"] span').removeClass('glyphicon-refresh spinning').addClass('glyphicon-ok');
                                        $('#modal_upload_asocfile').find('[data-method="upload.actions.processQueue"]').hide();
                                        Fid.clearS3Status();
                                    }
                                }
                            },
                            error: function(file, errorMessage, xhrObject) {
                                if (xhrObject && xhrObject.status == '413') {
                                    showModalAlert({
                                        title: 'Error',
                                        type: 'red',
                                        msg: 'El tamaño del archivo que intentas subir es demasiado grande.'
                                    });

                                    $('#modal_upload_asocfile').find('[data-method="actions.closeModal"]').removeAttr("disabled");
                                    $('#modal_upload_asocfile').find('[data-method="upload.actions.processQueue"] span').removeClass('glyphicon-refresh spinning').addClass('glyphicon-error');
                                    $('#modal_upload_asocfile').find('[data-method="upload.actions.processQueue"]').hide();
                                    $('#modal_upload_asocfile').find('.upload-asocfile-progress').css('width', '0%');
                                    $('#modal_upload_asocfile').find('.upload-asocfile-progress').text('0%');
                                } else {
                                    var msg = 'Ha ocurrido un error. No puedes subir el archivo seleccionado';
                                    if (this.options.maxFilesize && file.size > this.options.maxFilesize * 1048576) {
                                        msg = 'El tamaño del archivo que intentas subir es demasiado grande.'
                                    }
                                    showModalAlert({
                                        title: 'Error',
                                        type: 'red',
                                        msg: msg
                                    });
                                }
                                _self.actions.closeModal();
                            },
                            addedfile: function (file) {
                                var size = bytesToKbytes(file.size);
                                $('#modal_upload_asocfile').find('.upload-asocfile-label').text(name);
                                $('#modal_upload_asocfile').find('.upload-asocfile-filename .filename').text(file.name);
                                $('#modal_upload_asocfile').find('.upload-asocfile-filename .size').text(size);
                                $('#asocfile-id').val(id);

                                _self.methods.clearUploadProgress();

                                $('#modal_upload_asocfile').modal('show');
                            },
                            queuecomplete: function (data) {
                            },
                            totaluploadprogress: function (a, b) {
                                a = Math.round(a);

                                $('#modal_upload_asocfile').find('.upload-asocfile-progress').css('width', a + '%');
                                $('#modal_upload_asocfile').find('.upload-asocfile-progress').text(a + '%');

                                if (a == 100) {
                                    $('#modal_upload_asocfile').find('.upload-asocfile-progress').addClass('progress-bar-success');
                                }
                            }
                        });

                        $elem.find('input[name^="_HIDD_asocfile"]').each(function () {
                            if ($(this).val() !== '') {
                                if (!window.isSecureContext) {
                                    $elem.find('.asocfile-botones button[data-method="actions.copyUrlAsocFile"]').show();
                                }
                                $elem.find('.asocfile-botones button[data-method="actions.downloadAsocFile"]').removeAttr("disabled");
                                $elem.find('.asocfile-botones button[data-method="actions.deleteAsocFile"]').removeAttr("disabled");
                            }
                        });
                    }
                });
            },
            actions: {
                processQueue: function () {
                    var id = $('#asocfile-id').val();

                    if (id) {
                        var mydz = Dropzone.forElement('#' + id);

                        if (mydz.getQueuedFiles().length > 0) {
                            $('#modal_upload_asocfile').find('.upload-asocfile-progress').css('width', '0%').text('0%');
                            $('#modal_upload_asocfile').find('.upload-asocfile-progress').removeClass('progress-bar-success');
                            $('#modal_upload_asocfile').find('[data-method="upload.actions.processQueue"]').attr("disabled", "disabled");
                            $('#modal_upload_asocfile').find('[data-method="actions.closeModal"]').attr("disabled", "disabled");
                            $('#modal_upload_asocfile').find('[data-method="upload.actions.processQueue"] span').removeClass('glyphicon-upload').addClass('glyphicon-refresh spinning');
                            mydz.processQueue();
                        }
                    } else {
                        console.log('ERROR: id not found.');
                    }
                }
            }
        },
        actions: {
            copyUrlAsocFile: function (ui) {
                navigator.clipboard.writeText(ProntusConf['front-protocol'] +'://' + ProntusConf['public-host'] + ui.helper.parents('.asocfile-box').find('.asocfile-filename a').attr("href"));
            },
            downloadAsocFile: function (ui) {
                window.open(ui.helper.parents('.asocfile-box').find('.asocfile-filename a').attr("href"));
            },
            deleteAsocFile: function (ui) {
                var $input_borr = ui.helper.parents('.asocfile-box').find('.asocfile-filename input[name^="_BORR_"]');

                if ($input_borr.is(':checked')) {
                    $input_borr.removeAttr("checked");
                    ui.helper.removeClass('btn-danger').addClass('btn-default');
                } else {
                    $input_borr.attr("checked", "checked");
                    ui.helper.removeClass('btn-default').addClass('btn-danger');
                }

            },
            closeModal: function () {
                var id = $('#asocfile-id').val();
                $('#modal_upload_asocfile').modal('hide');
                $('#asocfile-id').val('');

                if (id) {
                    var mydz = Dropzone.forElement('#' + id);
                    mydz.files = [];
                    mydz.disable();
                    mydz.enable();
                }
            },
            updateAsocFile: function (elem_id, nom_campo, valor_campo, relpath, size) {
                var template = $('#asocfile_inputs').html();
                var $elem = $('#' + elem_id);

                template = template.replace(/__nom_campo__/g, nom_campo);
                template = template.replace(/__relpath_file__/g, relpath);
                template = template.replace(/__valor_campo__/g, valor_campo);
                template = template.replace(/__bytes__/g, size);

                size = bytesToKbytes(size);
                template = template.replace(/__tamano__/g, size);

                $elem.find('.asocfile-filename').html(template);

                if (!window.isSecureContext) {
                    $elem.find('.asocfile-botones button[data-method="actions.copyUrlAsocFile"]').show();
                }
                $elem.find('.asocfile-botones button[data-method="actions.downloadAsocFile"]').removeAttr("disabled");
                $elem.find('.asocfile-botones button[data-method="actions.deleteAsocFile"]').removeAttr("disabled");
            }
        },
        methods: {
            clearUploadProgress: function () {
                $('#modal_upload_asocfile').find('.upload-asocfile-progress').css('width', '0%').text('0%');
                $('#modal_upload_asocfile').find('.upload-asocfile-progress').removeClass('progress-bar-success');
                $('#modal_upload_asocfile').find('[data-method="upload.actions.processQueue"]').removeAttr("disabled");
                $('#modal_upload_asocfile').find('[data-method="actions.closeModal"]').removeAttr("disabled");
                $('#modal_upload_asocfile').find('[data-method="upload.actions.processQueue"] span').removeClass('glyphicon-refresh spinning').addClass('glyphicon-upload');
                $('#modal_upload_asocfile').find('[data-method="upload.actions.processQueue"]').show();
            },
            // Bindea todos las acciones a sus respectivos metodos.
            bindEvents: function (force) {
                var selector;

                if (typeof force == 'undefined') force = 0;

                if (!force) {
                    selector = '[data-namespace="asocfile"][data-event]:not([data-bind])';
                } else {
                    selector = '[data-namespace="asocfile"][data-event]';
                }

                $(selector).each(function () {
                    var method = $(this).attr("data-method");
                    var event = $(this).attr("data-event");

                    // Validar si es un evento válido.
                    if ($.inArray(event, _self.validEvents) >= 0) {
                        $(this).attr("data-bind", "true");
                        $(this).off(event).on(event, function (e) {
                            e.preventDefault();
                            _self.helper.execFunction(method, Asocfile, {e: e, helper: $(this)});
                        });
                    }
                });
            }
        },
        helper: {
            execFunction: function (functionName, context) {
                var args = Array.prototype.slice.call(arguments, 2);
                var namespaces = functionName.split(".");
                var func = namespaces.pop();

                for(var i = 0; i < namespaces.length; i++) {
                    context = context[namespaces[i]];
                }

                if (typeof context[func] == 'undefined') {
                    showModalAlert({
                        title: 'Error',
                        type: 'red',
                        msg: 'El método ' + functionName + ' no existe.'
                    });
                    return;
                }

                return context[func].apply(context, args);
            }
        }
    };
    window.Asocfile = Asocfile;
})(this);
