/* Funções de ligação com o react*/
function createSummary(summaryObjData, autoUpdate, id) {
    // docass.summary($('#summary-react')[0], summaryObjData, autoUpdate);
    // $('.collapsible').collapsible();
    //buildTooltip();

    // docass.leftArea(
    //     document.getElementById("editors-preview"),
    //     summaryObjData,
    //     null,
    //     id
    // );
}

function createRestoreHistoric(restore_history) {
    restoreHistory.historic($('#search-comp')[0], restore_history);
}

// function sendChangePageMapToRestoreHistory(data) {
//     restoreHistory.changePageMap(data);
// }

function createCard(cardData) {
    docass.card($("#card-react")[0], cardData);
}

function createOperand(cardData, locale) {
    docass.operand($("#card-react")[0], cardData, locale);
}

function removeOperand() {
    $card = $("#card-react");
    if ($card.size() > 0)
        docass.removeOperand($card[0]);
}


function createHeaderTitle(text) {
    $("#breadcrumbs").html("<div class='white-text' style='vertical-align: middle; font-size: 16px; margin-top: 8px'>" + text + "</div>")
}

function refreshItemTemplateList(data) {
    $("#templateID").html(data);
    $("#templateID").select2().change();
}

function reloadTemplateOptions(msgFunc) {
    callServiceWithFullLock(
        "POST",
        {
            "template-list": 1 //$("#output").val(),
        },
        function (data) {
            refreshItemTemplateList(data);
        },
        function (data) {
            try {
                var json = JSON.parse(data.responseText);
                toastyWithClose(json.detail, "red");
            } catch (e) {
                console.log(data.responseText);
                toastyWithClose(e, "red");
            }
        },
        function (data) {
            if (msgFunc)
                msgFunc();
        }
    );
}

/* Mensagem de espera */
var vectMsg = [
    "Processando informações, aguarde.",
    "Acessando o banco de dados.",
    "Renderizando objetos complexos.",
    "Paginando os cards de vetores do tipo Struct.",
    "Montando respostas padrão dos cards.",
    "Estruturando o documento jurídico.",
    "Carregando árvore de decisão dos inputs.",
    "Estabelecendo conexões entre Nós e Structs.",
    "Tentando encontrar erros na montagem do Template.",
    "Estamos quase prontos.",
    "Requisitando dados adicionais.",
    "Dentro de alguns segundos sua requisição estará completa.",
    "Lentidão no fluxo de transferência foi identificado.",
    "Estamos tentando solucionar esse problema.",
    "Aguarde por favor mais alguns segundos",
    "Verifique se existe algum problema de conexão com a internet",
    "Verifique se existe firewall que bloqueia o acesso à Looplex",
    "Lamentamos por detectarmos a causa da lentidão",
    "Reiniciando o processo."
];

function buildTooltip() {
    $(".ellipsis").mouseover(function () {
        if (this.offsetWidth < this.scrollWidth)
            $(this).attr("data-tooltip", $(this).text());
        else
            $(this).attr("data-tooltip", "");
    });
    $('.tooltipped').tooltip({delay: 50});
}

function executeScripts(data) {
    if (data) {
        var scripts = [];
        if (typeof(data) == "object" && data.responseText)
            data = data.responseText;
        if (data && data.replace) {
            var elements = data.replace(/<script>([\s\S]*?)<\/script>/g, function (match) {
                scripts.push(match);
                return "";
            });
            for (var i = 0; i < scripts.length; i++) {
                $("body").append(scripts[i]);
            }
            return elements;
        }

    }
    return "";
}

function buildFormAndValidate($div, formId) {
    // var $form = $("#" + formId);
    // var classes = $form.attr("class");
    // var name = $form.attr("name");
    //$("#" + formId).children().first().unwrap();
    //$div.wrap("<form id='" + formId + "' class='" + classes + "' method='POST' name='" + name + "'>");
    return $("#" + formId)[0].checkValidity();
}

function toastyWithClose(message, color) {
    Materialize.toast('<span style="width:100%">' + message + '</span><a class="btn-flat white-text" onclick="this.parentElement.parentElement.parentElement.removeChild(this.parentElement.parentElement)"><i class="material-icons" style="flush:right">close</i><a>', 30000, color);
}

function message404() {
    toastyWithClose("<i class='material-icons' style='vertical-align: top'>warning</i> <span style='display: inline; vertical-align: middle; padding-left: 10px'>Não foi possível encontrar o servidor. Por favor, verifique sua conexão.</span>", "yellow lighten-2 black-text");
}


function ajaxErrorMessage(data) {
    if (data.responseText) {
        if (data.responseText.indexOf("script") != -1)
            executeScripts(data.responseText);
        else {
            toastyWithClose("Oooooops! Ocorreu um erro... Por favor, contate nosso suporte.", "red darken-2");
        }
        if (data.status == 417) {
            var blockDiv = block_screen();
            setTimeout(function () {
                location.reload();
            }, 1000);
        }
    } else {
        //toastyWithClose("Oooooops! Ocorreu um erro... Por favor, contate nosso suporte.", "red darken-2");
    }
}

function callServiceWithNoLock(type, data, callbackSuccess, callbackError, callbackComplete, stopEvent) {
    callUnlockedService(type, data, callbackSuccess, callbackError, callbackComplete, stopEvent);
}

function callServiceWithFullLock(type, data, callbackSuccess, callbackError, callbackComplete, stopEvent) {
    callLockedService("all", type, data, callbackSuccess, callbackError, callbackComplete, true, stopEvent);
}

function callServiceWithFullWithNoCompleteDefaultLock(type, data, callbackSuccess, callbackError, callbackComplete, stopEvent) {
    callLockedService("all", type, data, callbackSuccess, callbackError, callbackComplete, false);
}

function callServiceWithLeftLock(type, data, callbackSuccess, callbackError, callbackComplete, stopEvent) {
    callLockedService("left", type, data, callbackSuccess, callbackError, callbackComplete, true, stopEvent);
}

function callServiceWithRightLock(type, data, callbackSuccess, callbackError, callbackComplete, stopEvent) {
    callLockedService("right", type, data, callbackSuccess, callbackError, callbackComplete, true, stopEvent);
}

function callUnlockedService(type, data, callbackSuccess, callbackError, callbackComplete, stopEvent) {
    try {
        $.ajax({
            type: type,
            url : window.bearer == null ? (window.embedded != true ? "?refresh=false" : "") : (`?refresh=true&bearer=${window.bearer}`),
            data: data,
            statusCode: {
                404: function (response) {
                    message404();
                    return;
                },
                0: function (response) {
                    message404();
                    return;
                }
            },
            success: function (data) {
                if (callbackSuccess != null)
                    callbackSuccess(data);
            },
            error: function (data) {
                if (callbackError != null)
                    callbackError(data);
                else
                    ajaxErrorMessage(data);
            },
            complete: function () {
                if (callbackComplete != null)
                    callbackComplete(data);
                window.bearer = null;
            }
        });
    } catch (err) {
        ajaxErrorMessage("Ocorreu um erro. Contacte nosso suporte técnico.");
    }

    if (stopEvent == undefined || stopEvent == true)
        stopEventPropagation(event);
}

function submitImageAndFile(that, event) {
    startLoadAnimation("right");

    var formData = new FormData(that);
    var sendFunc = function() {
        $.ajax({
            url : window.bearer == null ? (window.embedded == true ? "?refresh=false" : "") : (`?refresh=true&bearer=${window.bearer}`),
            type: "POST",
            data: formData,
            contentType: false,
            cache: false,
            processData:false,
            success: function( data ) {
                $(".flatpickr-wrapper").remove();
                removeOperand();
                $('#card-all').replaceWith(data).after(function(){
                    $("#btn-save").hide();
                    updateSummary(true, true);
                });
            },
            error: function(data) {
                var response = data.responseText;
                executeScripts(response);
                updateSummary(true, true);
            },
            complete: function( data ) {
                var cardid = $('#card-all').find('input[name="cardid"]').val();
                //summaryPreview(cardid);
                reloadEventsJS("#card-form-upload", true);
                $(".progress").hide();
                endLoadAnimation("right");
                window.bearer = null;
            }
        });
    }
    
    if($("#showImage").length > 0) {
        formData.delete("input-upload");
        var addImageToFormData = function() {
            var extension = $("#fileExtension").val();
            if(extension == "jpg")
                extension = "jpeg";
            var cropperCanvas = $("#showImage").cropper('getCroppedCanvas', {fillColor: "#FFF" });
            if (cropperCanvas)
                formData.append("crop", cropperCanvas.toDataURL('image/' + extension));
        }

        if($("#imageCropper").is(":visible")) {
            addImageToFormData();
        }
        //FIXME: Não funciona: Por enquanto, bloquear o save quando em marker mode
        else if($("#imageMarker").is(":visible")) {
            $("#imageCropperBtn")[0].fabricToCropper(function() {addImageToFormData(); sendFunc();});
            return false;
        }
    }
    sendFunc();

    return false;
} 

function stopEventPropagation(event) {
    if (event != undefined) {
        event.preventDefault();
        event.stopImmediatePropagation();
    }
}

function callLockedService(lockside, type, data, callbackSuccess, callbackError, callbackComplete, withTailComplete, stopEvent) {
    try {
        startLoadAnimation(lockside);
        $.ajax({
            type: type,
            url : window.bearer == null ? (window.embedded == true ? "?refresh=false" : "") : (`?refresh=true&bearer=${window.bearer}`),
            data: data,
            statusCode: {
                404: function (response) {
                    message404();
                    return;
                },
                0: function (response) {
                    message404();
                    return;
                }
            },
            success: function (data) {
                callbackSuccess(data);
            },
            error: function (data) {
                if (callbackError != null)
                    callbackError(data);
                else
                    ajaxErrorMessage(data);
            },
            complete: function (a, b, c) {
                if (callbackComplete != null)
                    callbackComplete(data);
                if (withTailComplete)
                    tailComplete(lockside);
                window.bearer = null;
            }
        });
    }
    catch (err) {
        ajaxErrorMessage("Ocorreu um erro. Contacte nosso suporte técnico.");
        endLoadAnimation(lockside);
    }

    if (stopEvent == undefined || stopEvent == true)
        stopEventPropagation(event);
}

function tailComplete(lockside) {
    endLoadAnimation(lockside);
    Materialize.updateTextFields();
    if (typeof flatpickr !== 'undefined')
        flatpickr('.calendar');
    buildTooltip();
}

function fastActions() {
    $('.doc-info').hover(function () {
        $(this).children(".doc-date").hide();
        $(this).children(".doc-fast-actions").show();
    }, function () {
        $(this).children(".doc-date").show();
        $(this).children(".doc-fast-actions").hide();
    });
}

function modalTrigger() {
    $('.modal-trigger').leanModal({
        opacity: 0,
        complete: function () {
            $("#share-doc-area").css({'display': 'none'});
        }
    });
}

function setModified(input) {
    $cardAll = $('#card-all');
    if ($cardAll.size() > 0) {
        $cardAll.find('input[name="hasmodified"]')[0].value = "yes";
        if($(input).prop("type") === "radio")
            $(input).closest(".input-boolean").find(":input").data("hasModified", true);
        else
            $(input).data("hasModified", true);
    } 
}

function isModifiedInput($input) {
    return $input.data("hasModified") == undefined ? false : $input.data("hasModified");
}

function hasModified() {
    if (!$('#card-all').find('input[name="hasmodified"]')[0])
        return false;
    return $('#card-all').find('input[name="hasmodified"]')[0].value == "yes";
}

/*************************************************************************************/
/*                                 Load Animation                                    */

/*************************************************************************************/
function block_screen() {
    var $blockDiv = $('<div></div>');
    $blockDiv.css({
        opacity: 0,
        width: $(document).width(),
        height: $(document).height(),
        "background-color": "#FFF",
        "z-index": 999,
        position: "absolute",
        top: "0px",
        left: "0px"
    });
    $blockDiv.appendTo('body');
    $blockDiv.animate({opacity: 0.5}, 200);
    return $blockDiv;
}

function unblock_screen($blockDiv) {
    $blockDiv.animate({opacity: 0}, 200, function () {
        $blockDiv.remove();
    });
}

var timeFadein = 1000, timeStand = 10000, timeWait = 2000;
var stopMarquee = false;
var sem_loadanimation = {};
sem_loadanimation["all"] = 0;
sem_loadanimation["right"] = 0;
sem_loadanimation["left"] = 0;

function showMSG(vectMsg, i) {
    if (stopMarquee)
        return;
    $("#marquee").text(vectMsg[i]);
    $("#marquee").animate({opacity: 1});
    setTimeout(function () {
        $('#marquee').animate({opacity: 0});
        setTimeout(function () {
            showMSG(vectMsg, (i + 1) % vectMsg.length);
        }, timeWait);
    }, timeStand);
}


function startLoadAnimation(opt) {
    if (opt == undefined) {
        opt = "left";
    }
    if (opt == "all" && sem_loadanimation["all"] == 0) {
        stopMarquee = false;
        showMSG(vectMsg, 0);
        $("#loading-image-all").show();
    } else if (opt == "right" && sem_loadanimation["right"] == 0) {
        $("#loading-image").show();
    } else if (opt == "left" && sem_loadanimation["left"] == 0) {
        $("#loading-image-preview").show();
        $("#switch-summary-preview").attr('disabled', '');
    }
    sem_loadanimation[opt]++;
    $("#loading-image-preview .preloader-wrapper").hide();
    $("#loading-image-preview .center-align").hide();
    disableSaveButton();
}

function resetLoadAnimation(opt) {
    var sems = [];
    if (opt)
        sems = [opt];
    else
        sems = Object.keys(sem_loadanimation);

    sems.forEach(function (key) {
        sem_loadanimation[key] = 0;
        endLoadAnimation(key);
    })
}

function endLoadAnimation(opt) {
    if (opt == undefined) {
        opt = "left";
    }
    stopMarquee = true;
    if (sem_loadanimation[opt] > 0)
        sem_loadanimation[opt]--;
    //enableSaveButton();
    if (sem_loadanimation[opt] == 0) {
        changeSaveCardButtonAvailability();
        if (opt == "all") {
            $("#loading-image-all").hide();
        } else if (opt == "right") {
            $("#loading-image").hide();
        } else {
            $("#loading-image-preview").hide();
            $("#switch-summary-preview").removeAttr('disabled');
        }
    }

    $("#loading-image-preview .center-align").show();
    $("#loading-image-preview .preloader-wrapper").show();
    $(".progress").hide();
}

/*************************************************************************************/
/*                                 save card button                                  */

/*************************************************************************************/

function disableSaveButton() {
    $("#btn-save").attr('disabled', '');
    $("#btn-save").addClass('align-btn-salvar-locked lawsoft-text text-darken-3');
    $("#btn-save").removeClass('align-btn-salvar white-text');
}

function enableSaveButton() {
    $("#btn-save").removeAttr('disabled');
    $("#btn-save").addClass('align-btn-salvar white-text');
    $("#btn-save").removeClass('align-btn-salvar-locked lawsoft-text text-darken-3');
}

function changeSaveCardButtonAvailability() {
    enableSaveButton();
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////

// change arrow on click of accordion
function changeArrow(element) {
    $(element).find('.arrow').find('i').toggle();
}

var sumaryOrPreview = true;
var caridSt = null;
var successSt = null;

function loadPreview(cardid, success) {
    // // document.getElementById('card-summary').style.display = "none";
    // // document.getElementById('card-preview').style.display = "block";

    // document.getElementById('editors-preview-card').style.background = "#ffffff";
    // // document.getElementById('card-preview').style.transform = "translateY(-100%)";
    // document.getElementById('card-summary-preview-title').innerHTML = "Preview";
    // // callServiceWithLeftLock(
    // //     "POST",
    // //     {'preview': 'true'},
    // //     function(data) {
    // //         document.getElementById('card-preview').innerHTML=data;
    // //         $('.collapsible').collapsible();
    // //         if (success != undefined) {
    // //             success();
    // //         }
    // //     }
    // // );

    // //document.getElementById('card-preview-iframe').contentWindow.location.reload(true);
    // var iframe = document.getElementById('card-preview-iframe');
    // //iframe.src = iframe.src;
    // //iframe.contentWindow.location.reload();

    // //$(iframe).data("position", $(iframe).contents().scrollTop());
    // iframe.src = "./preview_screen.php";
    // sumaryOrPreview = false;
    // caridSt = cardid;
    // successSt = success;
}

function loadSummary(cardid) {
    // document.getElementById('card-preview').style.display = "none";
    // document.getElementById('card-summary').style.display = "block";
    // document.getElementById('editors-preview-card').style.background = "#595d6b";
    // document.getElementById('card-preview').style.transform = "";
    // document.getElementById('card-summary-preview-title').innerHTML = "Sumário";
    // callServiceWithLeftLock(
    //     "POST",
    //     {'summaryJSON': 'true'},
    //     function (data) {
    //         createSummary(JSON.parse(data), null, cardid);
    //         $('.summary-call-card').unbind('submit').bind('submit', callCard);
    //         if (typeof updateSumaryState == "function") {
    //             updateSumaryState();
    //         }
    //     },
    //     function (data) {
    //         ajaxErrorMessage(data);
    //     }
    // );
    // caridSt = cardid;
}

function showSearchComp(restore_history) {
    hideSumaryPreview();
    showSearch();
    createRestoreHistoric(restore_history)
}

function hideSumaryPreview() {
    hideSumaryPreviewTitle();
    hideSwitchSumaryPreview();
    if (sumaryOrPreview)
        hidePreview();
    else
        hideSumary();
}

function hideSumaryPreviewTitle() {
    document.getElementById('card-summary-preview-title').style.display = "none";
}

function hideSwitchSumaryPreview() {
    $elem = document.getElementById('switch-summary-preview-div');
    // if ($elem)
        $elem.style.display = "none";
}

function hidePreview() {
    document.getElementById('card-summary').style.display = "none";
}

function hideSumary() {
    document.getElementById('card-preview').style.display = "none";
}

var summaryOrSearch = false

function showSearch() {
    console.log(summaryOrSearch)
    summaryOrSearch = true;
    document.getElementById('search-comp-title').style.display = "block";
    document.getElementById('search-comp-butclose').style.display = "block";
    document.getElementById('search-comp').style.display = "block";
}

function hideSearchComp() {
    if (summaryOrSearch === true) {
        showSumaryPreview();
        hideSearch();
    }
}

function showSumaryPreview() {
    summaryOrSearch = false
    showSumaryPreviewTitle()
    showSwitchSumaryPreview()
    if (sumaryOrPreview)
        loadSummary(caridSt);
    else
        loadPreview(caridSt, successSt);
}

function showSumaryPreviewTitle() {
    document.getElementById('card-summary-preview-title').style.display = "block";
}

function showSwitchSumaryPreview() {
    document.getElementById('switch-summary-preview-div').style.display = "block";
}

function hideSearch() {
    document.getElementById('search-comp-title').style.display = "none";
    document.getElementById('search-comp-butclose').style.display = "none";
    document.getElementById('search-comp').style.display = "none";
}

// change between summary preview
function summaryPreview(cardid) {
    // upgradeDocumentData();
    // var doc = document.getElementById("switch-summary-preview");
    // if (doc) {    
    //     var x = doc.checked;
    //     if (x == true) {
    //         loadPreview(cardid);
    //     } else {
    //         loadSummary(cardid);
    //     }
    // }
}

function upgradeDocumentData() {
    callServiceWithNoLock(
        "POST",
        {'document-name': 'true'},
        function (data) {
            //document.getElementById('documentCost').innerHTML=data;
            $('#document-name').val(data);
        }
    );
}

function callCardFromReview(id) {
    var myForm = document.createElement("form");
    $(myForm).html(
        '<input type="hidden" name="operandId" value="'+ id +'" />'
        + '<input type="hidden" name="cardsummary" value="cardsummary" />'
    );
    callCard.apply(myForm);
}

// Summary call card
function callCard() {
    var dados = $(this).serialize();
    disableSaveButton();
    $("#loading-image").show();
    startLoadAnimation();
    $('.toast').find("a.btn-flat.white-text").click();
    $.ajax({
        type: "POST",
        url : window.bearer == null ? (window.embedded == true ? "?refresh=false" : "") : (`?refresh=true&bearer=${window.bearer}`),
        data: dados,
        statusCode: {
            404: function (response) {
                message404();
                return;
            },
            0: function (response) {
                message404();
                return;
            }
        },
        success: function (data) {
            removeOperand();
            $("#card-all").empty();
            $(".flatpickr-wrapper").remove();

            $('#card-all').replaceWith(data).after(function () {
                //$('select').material_select();
                $('.collapsible').collapsible({accordion: false});
                $("#btn-save").hide();
                updateSummary(false);
            });
        },
        error: function (data) {
            ajaxErrorMessage(data);
            updateSummary(true, true);
        },
        complete: function (data) {
            $(".locked-card").hide();
            endLoadAnimation();
            reloadEventsJS("callCard", true);
            buildTooltip();
            window.bearer = null;
            
        }
    });
    event.preventDefault();
    event.stopImmediatePropagation();
}

// Preview call card
function previewCallCard(e) {
    callServiceWithRightLock(
        "POST",
        {'operandId': e, 'cardsummary': 'cardsummary', 'cardsend': 'cardsend'},
        function (data) {
            removeOperand();
            $('#card-all').replaceWith(data).after(function () {
                $('select').material_select();
            });
        },
        null,
        function (data) {
            reloadEventsJS("previewCallCard", false);
        }
    );
}

function reloadEventsJS(callerName, withSaveButton) {
    if (withSaveButton) {
        $.getScript("js/events.js", function () {
            $("#btn-save").show();
        }).fail(function (jqxhr, settings, exception) {
            console.log("Erro ao carregar script em " + callerName + ".");
            location.reload();
        });
    } else {
        $.getScript("js/events.js").fail(function (jqxhr, settings, exception) {
            console.log("Erro ao carregar script em " + callerName + ".");
            location.reload();
        });
    }
}

// Review call card
function reviewCallCard() {
    callServiceWithRightLock(
        "POST",
        {'callReviewCard': 'true'},
        function (data) {
            removeOperand();
            $('#card-all').replaceWith(data).after(function () {
                $('select').material_select();
            });
        },
        null,
        function (data) {
            reloadEventsJS("reviewCallCard", false);
        }
    );
}

// signup type
function signupType() {
    var x = document.getElementById("switch-signup-type").checked;
    if (x == true) {
        document.getElementById("accountPersonal").style.display = 'none';
        document.getElementById("accountCorporat").style.display = 'block';
    } else {
        document.getElementById("accountPersonal").style.display = 'block';
        document.getElementById("accountCorporat").style.display = 'none';
    }
}

/*************************************************************/
/*                    administrator                          */
/*************************************************************/

// New team card
function newTeamCallCard() {
    callServiceWithRightLock(
        "POST",
        {'team': 'true', 'teamAction': 'new', 'teamID': ''},
        function (data) {
            $('#card-all').replaceWith(data).after(function () {
                $('select').material_select();
            });
        }
    );
}

// Edit team card
function editTeamCallCard(e) {
    callServiceWithRightLock(
        "POST",
        {'team': 'true', 'teamAction': 'edit', 'teamID': $(e).attr('value')},
        function (data) {
            $('#card-all').replaceWith(data).after(function () {
                $('select').material_select();
            });
            //listsAdmin('teams');
        }
    );
}

function deleteTeamCallCard(e) {
    callServiceWithLeftLock(
        "POST",
        {'team': 'true', 'teamAction': 'delete', 'teamID': $(e).attr('value')},
        function (data) {
            listsAdmin('teams');
            $("#teamform .align-btn-salvar").remove();
            $("input:checkbox").attr("disabled", true);
            $("input#team-name").attr("disabled", true);
        },
        function (data) {
            ajaxErrorMessage(data);
        }
    );
}

// Change Team Status
function teamStatus(id) {
    callServiceWithRightLock(
        "POST",
        {'teamStatus': 'true', 'teamID': id},
        function (data) {
            listsAdmin('teams');
        }
    );
}

// Rename team name
function newTeamName(name, id) {
    callServiceWithRightLock(
        "POST",
        {'newTeamName': name, 'teamID': id},
        function (data) {
            listsAdmin('teams');
        }
    );
}


// Create New Team
function newTeamCreation() {
    callServiceWithRightLock(
        "POST",
        $("#teamform").serialize(),
        function (data) {
            $('#card-all').replaceWith(data).after(function () {
                $('select').material_select();
            });
            listsAdmin('teams');
        }
    );
}

function newTeam() {
    var data = {}
    data["newTeam"] = true;
    data["teamName"] = "Nova área";

    callServiceWithRightLock(
        "POST",
        data,
        function (data) {
            $('#card-all').replaceWith(data).after(function () {
                $('select').material_select();
            });
            listsAdmin('teams');
        }
    );
}

// Edit group card
function editTeamGroupCard(e) {
    callServiceWithRightLock(
        "POST",
        {'group': 'true', 'groupAction': 'edit', 'groupID': $(e).attr('value')},
        function (data) {
            $('#card-all').replaceWith(data).after(function () {
                $('select').material_select();
            });
        }
    );
}

// New group card
function newGroup() {
    callServiceWithRightLock(
        "POST",
        {'group': 'true', 'groupAction': 'new', 'groupID': ''},
        function (data) {
            $('#card-all').replaceWith(data).after(function () {
                $('select').material_select();
            });
            listsAdmin('groups');
        }
    );
}

// Edit team card
function editGroupCallCard(e) {
    callServiceWithRightLock(
        "POST",
        {'group': 'true', 'groupAction': 'edit', 'groupID': $(e).attr('value')},
        function (data) {
            $('#card-all').replaceWith(data).after(function () {
                $('select').material_select();
            });
            //listsAdmin('groups');
        }
    );
}

function deleteGroupCallCard(e) {
    callServiceWithRightLock(
        "POST",
        {'group': 'true', 'groupAction': 'delete', 'groupId': $(e).attr('value')},
        function (data) {
            listsAdmin('groups');
            $("#groupformupdate .align-btn-salvar").remove();
            $("input:checkbox").attr("disabled", true);
            $("input#group-name").attr("disabled", true);
        },
        function (data) {
            ajaxErrorMessage(data);
        }
    );
}

// Rename group name
function newGroupName(name, id) {
    callServiceWithRightLock(
        "POST",
        {'newGroupName': name, 'groupID': id},
        function (data) {
            listsAdmin('groups');
        }
    );
}

// Change Action Group Status
function groupActions(groupId, actionId) {
    callServiceWithRightLock(
        "POST",
        {'groupActions': 'true', 'groupId': groupId, 'actionId': actionId},
        function (jqXHR) {
            for (var i = 0; i < jqXHR.data.length; i++)
                $("#permission-" + jqXHR.data[i].id).prop('checked', jqXHR.data[i].permission);
        },
        function (data) {
            $("#permission-" + actionId).prop('checked', !$("#permission-" + actionId).prop('checked'));
            ajaxErrorMessage(data);
        }
    );
}

// Update Group Member
function updateGroupMembers() {
    callServiceWithRightLock(
        "POST",
        $('#groupformupdate').serialize(),
        function (data) {
            $('#card-all').replaceWith(data).after(function () {
                $('select').material_select();
            });
            listsAdmin('groups');
        }
    );
}

// Edit user card
function editUserCallCard(e) {
    callServiceWithRightLock(
        "POST",
        {'user': 'true', 'userAction': 'edit', 'userID': $(e).attr('value')},
        function (data) {
            $('#card-all').replaceWith(data).after(function () {
                $('select').material_select();
            });
        }
    );
}

// New user card
function newUser() {
    callServiceWithRightLock(
        "POST",
        {'user': 'true', 'userAction': 'new', 'userID': ''},
        function (data) {
            $('#card-all').replaceWith(data).after(function () {
                $('select').material_select();
            });
        }
    );
}

function deleteUser(e) {
    callServiceWithLeftLock(
        "POST",
        {'user': 'true', 'userAction': 'delete', 'userID': $(e).attr('value')},
        function (data) {
            listsAdmin('users');
            $("#userform .align-btn-salvar").remove();
            $("#userform .switch").remove();
            $("#userform input").attr("disabled", true);
        },
        function (data) {
            ajaxErrorMessage(data);
        }
    );
}

// Create New User
function newUserCreation() {
    callServiceWithRightLock(
        "POST",
        $("#userform").serialize(),
        function (data) {
            $('#card-all').replaceWith(data).after(function () {
                $('select').material_select();
            });
            listsAdmin('users');
        }
    );
}

function userStatus(id, that) {
    // if (parseInt($("#license-number").text()) > 0 || !$(that).prop("checked")) {
        callServiceWithRightLock(
            "POST",
            {'userStatus': 'true', 'userID': id},
            function (data) {
                listsAdmin('users');
                $("#license-number").text(data.licenses);
            },
            function (data) {
                setTimeout(function () {
                    location.reload();
                }, 20);
                $(that).prop("checked", !$(that).prop("checked"));
            }
        );
    // }
    // else {
    //     toastyWithClose("Número de licenças é insuficiente.", "red darken-2");
    //     $(that).prop("checked", !$(that).prop("checked"));
    // }
}

// Lists Admin
function listsAdmin(listIdentifier) {
    callServiceWithLeftLock(
        "POST",
        {'adminLists': 'true', 'listIdenfier': listIdentifier},
        function (data) {
            switch (listIdentifier) {
                case "groups":
                    document.getElementById('listGroups').innerHTML = data;
                    break;
                case "teams":
                    document.getElementById('listTeams').innerHTML = data;
                    break;
                case "users":
                    document.getElementById('listUsers').innerHTML = data;
                    break;
            }
            $('.collapsible').collapsible();
            statusFilterAdmin();
        }
    );
}

//status filter
function statusFilterAdmin() {
    var statusClass = document.getElementById("statusAdminFilter").value;
    switch (statusClass) {
        case "statusAdmin-ALL":
            $('.statusActive,.statusInactive').css({'display': 'block'});
            break;
        case "statusAdmin-ACTIVE":
            $('.statusActive').css({'display': 'block'});
            $('.statusInactive').css({'display': 'none'});
            break;
        case "statusAdmin-INACTIVE":
            $('.statusActive').css({'display': 'none'});
            $('.statusInactive').css({'display': 'block'});
            break;

    }
}

/*************************************************************************************/
/*                                    document                                       */
/*************************************************************************************/

//status filter
function flipStatusFilter(vartoshow, vartohide) {
    $(".doc-group-by-date").css({'display': 'none'});
    //$(".col-description").css({'display':'none'});
    vartoshow.css({'display': 'block'});
    vartoshow.prevAll('.col-description').first().css({'display': 'block'});
    vartoshow.prevAll('.doc-group-by-date').first().css({'display': 'block'});
    vartohide.css({'display': 'none'});
}

function applyOrder(id) {
    column = "MODIFIED";
    order = "DESC";
    switch (id) {
        case 'author-column':
            column = "AUTHOR";
            order = flipSorting("author-column");
            changeToSortingClass("modified-column");
            changeToSortingClass("name-column");
            break;
        case 'name-column':
            column = "NAME";
            order = flipSorting("name-column");
            changeToSortingClass("author-column");
            changeToSortingClass("modified-column");
            break;
        case 'modified-column':
            column = "MODIFIED";
            order = flipSorting("modified-column");
            changeToSortingClass("author-column");
            changeToSortingClass("name-column");
            break;
    }
    applyFilters(order, column);
}

function changeToSortingClass(id) {
    $("#" + id).removeClass("sorting_desc");
    $("#" + id).removeClass("sorting_asc");
    $("#" + id).addClass("sorting");
}

function flipSorting(id) {
    order = "";
    if ($("#" + id).hasClass("sorting")) {
        $("#" + id).removeClass("sorting");
        $("#" + id).addClass("sorting_asc");
        order = "ASC";
    } else if ($("#" + id).hasClass("sorting_asc")) {
        $("#" + id).removeClass("sorting_asc");
        $("#" + id).addClass("sorting_desc");
        order = "DESC";
    } else {
        $("#" + id).removeClass("sorting_desc");
        $("#" + id).addClass("sorting_asc");
        order = "ASC";
    }
    return order;
}

function getOrderAndColumn(order, columnOrder) {
    order = "ASC";
    if ($("#author-column").hasClass("sorting_asc")) {
        columnOrder = "AUTHOR";
    } else if ($("#name-column").hasClass("sorting_asc")) {
        columnOrder = "NAME";
    } else if ($("#modified-column").hasClass("sorting_asc")) {
        columnOrder = "MODIFIED";
    } else if ($("#author-column").hasClass("sorting_desc")) {
        columnOrder = "AUTHOR";
    } else if ($("#name-column").hasClass("sorting_desc")) {
        order = "DESC";
        columnOrder = "NAME";
    } else if ($("#modified-column").hasClass("sorting_desc")) {
        order = "DESC";
        columnOrder = "MODIFIED";
    } else {
        order = "DESC";
        columnOrder = "MODIFIED";
    }
    return [order, columnOrder];
}

function applyFiltersAndResetPageNumber(order, columnOrder, moveToNextPage) {
    $("html, body").animate({scrollTop: 0}, 300);
    $("#load-docs").attr("data-page", 1);
    applyFilters(order, columnOrder, moveToNextPage);
}

function getStatus() {
    var status = $("#status-filter").val();
    if (status == null)
        status = "ALL";
    else
        status = status.substring(7, status.length);
    return status;
}

function getMarkedDocuments() {
    var docsId = [];
    markedDocs = $(".doc-markers").children(".check-closed");
    for (var i = 0; i < markedDocs.length; i++) {
        docsId[i] = $(markedDocs[i]).parent().parent().parent().attr('id');
    }
    return docsId;
}

function applyFilters(order, columnOrder, moveToNextPage) {
    if (order == null || columnOrder == null) {
        values = getOrderAndColumn(order, columnOrder);
        order = values[0];
        columnOrder = values[1];
    }

    var page = parseInt($("#load-docs").attr("data-page")) + (moveToNextPage ? 1 : 0);
    var docsPerPage = parseInt($("#load-docs").attr("data-docs"));
    var status = getStatus();
    var docsId = getMarkedDocuments();
    var query = $("#document-search").val();
    if (query.indexOf(":") != -1)
        query = query + " ";
    callServiceWithFullLock("POST",
        {
            "getDocuments": true,
            "page": page,
            "docs": docsPerPage,
            "order": order,
            "colOrder": columnOrder,
            "status": status,
            "query": query
        },
        function (data) {
            if (!data || 0 === data.length) {
                $('#documentsList').hide();
                $('#noDocs').show();
            } else {
                $('#noDocs').hide();
                $('#documentsList').show();
                $('#document-lines').empty();
                $('#document-lines').append(data);
                if (moveToNextPage && $('#document-lines').children().size() >= docsPerPage * page)
                    $("#load-docs").attr("data-page", parseInt($("#load-docs").attr("data-page")) + 1);
            }
            $('.tooltipped').tooltip({delay: 50});
            fastActions();
            modalTrigger();
            for (var i = 0; i < docsId.length; i++) {
                $("#" + docsId[i]).children(".doc-markers").children(".status-icon").hide();
                $("#" + docsId[i]).children(".doc-markers").children(".check-open").show();
                $("#" + docsId[i]).children(".doc-markers").children(".check-open").click();
            }
            $(".doc-markers").on({
                mouseenter: function () {
                    $(this).children(".status-icon").hide();
                    $(this).children(".check-open").show();
                },
                mouseleave: function () {
                    if (!$(this).children("div").hasClass("check-closed")) {
                        $(this).children(".status-icon").show();
                        $(this).children(".check-open").hide();
                    }
                }
            });
        },
        undefined,
        function () {
        }
    );
}

function deleteDocumentsBatch() {
    documents = $(".doc-markers").children(".check-closed");
    var documentIds = [];
    for (var i = 0; i < documents.length; i++) {
        docId = $(documents[i]).parent().parent().parent().attr('id');
        documentIds[i] = docId.substring(4, docId.length);
    }
    callServiceWithFullLock("POST",
        {
            "deleteDocumentsBatch": true,
            "docIds": documentIds
        },
        function (data) {
            hideFastActionButtons();
            applyFilters();
        },
        undefined,
        function () {
            hideFastActionButtons();
        }
    );
    $('#modalDeleteBatch').closeModal();
}

function hideFastActionButtons() {
    $(".doc-markers").children(".status-icon").show();
    $(".doc-markers").children(".check-closed").addClass("check-open").removeClass("check-closed").hide();
    $("#file-doc-fast-button").hide();
    $("#delete-doc-fast-button").hide();
}

function fileDocumentsBatch() {
    documents = $(".doc-markers").children(".check-closed");
    var documentIds = [];
    var method = "file";
    for (var i = 0; i < documents.length; i++) {
        if ($(documents[i]).parent().parent().parent().hasClass("status-HIDE"))
            method = "restore";
        docId = $(documents[i]).parent().parent().parent().attr('id');
        documentIds[i] = docId.substring(4, docId.length);
    }

    if (method == "restore") {
        callServiceWithFullLock("POST",
            {
                "restoreFiledDocumentsBatch": true,
                "docIds": documentIds
            },
            function (data) {
                hideFastActionButtons();
                applyFilters();
            },
            undefined,
            function () {
                hideFastActionButtons();
            }
        );
    } else {
        callServiceWithFullLock("POST",
            {
                "fileDocumentsBatch": true,
                "docIds": documentIds
            },
            function (data) {
                hideFastActionButtons();
                applyFilters();
            },
            undefined,
            function () {
                hideFastActionButtons();
            }
        );
    }

}

function statusFilter() {
    var statusClass = document.getElementById("status-filter").value;
    $('.status input, .status i').css({'color': '#3C90D2', 'border-color': '#3C90D2'});
    $('.markers input, .markers i').css({'color': '', 'border-color': ''});
    switch (statusClass) {
        case "status-OPEN":
            flipStatusFilter($('.status-OPEN'), $('.status-CLOSED,.status-SIGNATURE_PENDING,.status-COMPLETED,.status-HIDE,.status-LOCKED'));
            break;
        case "status-SIGNATURE_PENDING":
            flipStatusFilter($('.status-SIGNATURE_PENDING'), $('.status-CLOSED,.status-OPEN,.status-COMPLETED,.status-HIDE,.status-LOCKED'));
            break;
        case "status-COMPLETED":
            flipStatusFilter($('.status-COMPLETED'), $('.status-CLOSED,.status-OPEN,.status-SIGNATURE_PENDING,.status-HIDE,.status-LOCKED'));
            break;
        case "status-CLOSED":
            flipStatusFilter($('.status-CLOSED'), $('.status-COMPLETED,.status-OPEN,.status-SIGNATURE_PENDING,.status-HIDE,.status-LOCKED'));
            break;
        case "status-HIDE":
            flipStatusFilter($('.status-HIDE'), $('.status-COMPLETED,.status-OPEN,.status-SIGNATURE_PENDING,.status-CLOSED,.status-LOCKED'));
            break;
        case "status-LOCKED":
            flipStatusFilter($('.status-LOCKED'), $('.status-COMPLETED,.status-OPEN,.status-SIGNATURE_PENDING,.status-CLOSED,.status-HIDE'));
            break;
        case "status-ALL":
            flipStatusFilter($('.status-COMPLETED,.status-OPEN,.status-SIGNATURE_PENDING,.status-CLOSED,.status-LOCKED'), $('.status-HIDE'));
            break;
    }
}

// Edit document
function callEditor(e, action) {
    var docId = $(e).attr('value');
    callServiceWithFullWithNoCompleteDefaultLock(
        "POST",
        {'callEditor': docId, 'docAc': action},
        function (data) {
            window.location = window.location.pathname;
        },
        function (data) {
            endLoadAnimation("all");
            ajaxErrorMessage(data);
        }
    );
}

// Set language
function setLanguage(e) {
    $('#set-language i').toggle();
    $('#set-language i').each(function () {
        if ($(this).css('display') == 'block') {
            callServiceWithRightLock(
                "POST",
                {'documentLanguage': $(this).attr('value')},
                function () {
                    if ($('#card-preview').css('display') == 'block') {
                        //summaryPreview();
                        upgradeDocumentData();
                        updateSummary(true, true);
                    }
                }
            );
        }
    });
}

function changeLanguage(value) {
    callServiceWithLeftLock(
        "POST",
        {'documentLanguage': value},
        function () {
            if ($('#card-preview').css('display') == 'block') {
                // summaryPreview();
                upgradeDocumentData();
                updateSummary(true, true);
            }
        }
    );
}

/*************************************************************************************/
/*                              Form Send Index Page                                 */

/*************************************************************************************/

function sendFormInIndexPage(that, buttonName, reload) {
    var formData = $(that).serializeArray();
    formData.push({name: buttonName, value: true});
    callServiceWithFullWithNoCompleteDefaultLock(
        "POST",
        formData,
        function (data) {
            $("body").append(data);
        },
        function (data) {
            $("body").append(executeScripts(data.responseText));
        },
        function (data) {
            endLoadAnimation("all");
            $(that)[0].reset();
            $(that).closest(".modal").closeModal();
            if (typeof grecaptcha !== 'undefined') {
                if (typeof(signuppersonalCaptcha) != "undefined") grecaptcha.reset(signuppersonalCaptcha);
                if (typeof(signupcorpCaptcha) != "undefined") grecaptcha.reset(signupcorpCaptcha);
            }
            Materialize.updateTextFields();
            if (reload != undefined && reload == true) {
                setTimeout(function () {
                    window.location.replace(window.location.pathname);
                }, 5000);
            }
        }
    );
}

function sendFormInRestorePass(that, buttonName) {
    var formData = $(that).serializeArray();
    formData.push({name: buttonName, value: true});
    callServiceWithFullWithNoCompleteDefaultLock(
        "POST",
        formData,
        function (data) {
            $("body").append(data);
            $(that)[0].reset();
            $(that).closest(".modal").closeModal();
        },
        function (data) {
            $("body").append(executeScripts(data.responseText));
        },
        function (data) {
            endLoadAnimation("all");
            if (typeof grecaptcha !== 'undefined') {
                grecaptcha.reset(signuppersonalCaptcha);
                grecaptcha.reset(signupcorpCaptcha);
            }
            Materialize.updateTextFields();
        }
    );
}


function checkDocument(val) {
    if ($(val).hasClass("check-open")) {
        $(val).removeClass("check-open");
        $(val).addClass("check-closed");
    } else {

        $(val).removeClass("check-closed");
        $(val).addClass("check-open");

    }

    var markedDocs = $(".doc-markers").children(".check-closed");
    if (markedDocs.length > 0) {
        $("#delete-doc-fast-button").show();
        $("#file-doc-fast-button").show();
    } else {
        $("#delete-doc-fast-button").hide();
        $("#file-doc-fast-button").hide();
    }

}

function restoreFields() {
    $.each(notDisableOperandInsideIfStruct, function (key, value) {
        if ($("#" + value.id) != undefined)
            $("#" + value.id).prop("disabled", false);
    });
    notDisableOperandInsideIfStruct = [];
}

function unvalidatedSave(form, event) {
    function goToNextCard() {
        if (form != null) {
            $('#card-all').find('input[name="hasmodified"]')[0].value = "no";
            $(form).find("button").click();
        }
    }

    function title() {
        return "<i class='material-icons' style='vertical-align: bottom;'>error</i> O formulário foi editado!";
    }

    function content() {
        return "Existem algumas respostas que serão perdidas caso não sejam salvas. Deseja salvar suas alterações?";
    }

    event.preventDefault();
    event.stopPropagation();
    if ($("#card-form").size() == 1) {

        if (hasModified()) {
            $.confirm({
                title: title(),
                draggable: false,
                type: "dark",
                content: content(),
                typeAnimated: true,
                columnClass: 'col',
                alignMiddle: true,
                useBootstrap: false,
                buttons: {
                    "Sim, salve": function () {
                        if ($("#card-form-upload").size() != 1)
                            buildFormAndValidate($("#form-pointer"), "card-form");
                        operandSubmit($("#card-form"), goToNextCard, true);
                    },
                    "Não, ignore": function () {
                        goToNextCard();
                    },
                    "Cancelar": function () {
                    }
                }

            });
            return;
        }
    }
    callCard.apply(form);
}

function validatedSave() {
    if ($("#card-form").size() == 1) {
        docass.showAll(function() {
            if ($("#card-form")[0].checkValidity()) {
                //$('#card-all').find('input[name="savemode"]')[0].value = "save";
                operandSubmit($("#card-form"));
            } else if (navigator.vendor && navigator.vendor.indexOf('Apple') > -1 && navigator.userAgent && !navigator.userAgent.match('CriOS')) {
                var input = $("#card-form").find(":invalid").first()[0];
                if (input.validity.customError)
                    alert(input.validationMessage);
                else
                    alert("Existem dados inconsistentes!");
                input.focus();
            }
        });
    }
}

function operandSubmit($form, nextFunc, partial) {
    var files = docass.files();
    if (files && files.length > 0) {
        submitAllAnswers($form, nextFunc, partial, files);
    }
    else {
        submitStringAnswers($form, nextFunc, partial);
    }
}

function getDataAsArray(data, defaultText) {
    let currData = (data);
    if (typeof currData === "object") {
        if (currData.errors) currData = currData.errors.map((error) => error.message);
        else if (currData.alerts) currData = currData.alerts.map((error) => error.message);
        else if (currData.message) currData = currData.message;
    }
    else if (currData)
        currData = [defaultText];
    else if (!Array.isArray(currData))
        currData = [currData];
    return currData;
}

function submitAllAnswers($form, nextFunc, partial, files) {
    const createFormData = function(files) {
        var formData = new FormData();
        files.forEach((file) => {
            formData.append(file.operandId, file.value.file);
            formData.append("filenames[]", file.value.name);
            formData.append("operandIds[]", file.operandId);
            formData.append("types[]", file.type);
        });
        return formData;
    }
    var formData = createFormData(files);
    formData.append("save-file-card", true);
    formData.append("partial", true);

    startLoadAnimation("right");
    $.ajax({
        url : window.bearer == null ? (window.embedded == true ? "?refresh=false" : "") : (`?refresh=true&bearer=${window.bearer}`),
        type: "POST",
        data: formData,
        contentType: false,
        cache: false,
        processData:false,
        success: function( data ) {
            submitStringAnswers($form, nextFunc, partial);
        },
        error: function(originalData) {
            var data = originalData;
            if (typeof data === "object")
                data = originalData.responseText;
            if (/^[\{\[]/.test(data)) {
                const jsonData = JSON.parse(data);
                let dataArray = getDataAsArray(jsonData);
                for (let i = 0; i < dataArray.length; i++)
                    toastyWithClose(dataArray[i], "red");
            }
            else {
                // TODO: Mudar a forma como é devolvida a mensagem
                // TODO: Usando função de js/functions.js
                executeScripts(data);
            }
        },
        complete: function( data ) {
            endLoadAnimation("right");
            window.bearer = null;
        }
    })

}

function submitStringAnswers($form, nextFunc, partial) {
    var senddata = {};
    senddata["send-docass-answers"] = true;
    senddata["docass-answers"] = docass.answers();
    senddata["partial"] = partial;

    if (senddata["docass-answers"]) {
        if (!partial)
            $('.toast').find("a.btn-flat.white-text").click();
        callServiceWithFullLock(
            "POST",
            senddata,
            function (data) {
                docass.clearValidation();
                $(".flatpickr-wrapper").remove();
                // var cardid = $('#card-all').find('input[name="cardid"]').val();
                // summaryPreview(cardid);
                upgradeDocumentData();
                
                if (nextFunc != undefined) {
                    nextFunc();
                }
                else {
                    if (/card-all/.test(data)) {
                        removeOperand();
                        $('#card-all').replaceWith(data).after(function () {
                            $("#btn-save").hide();
                            updateSummary(true, true);
                        });
                    }
                    else {
                        updateSummary(true, true);
                        executeScripts(data);
                    }
                }
            },
            function(data) { updateSummary(true, true); ajaxErrorMessage(data); },
            function (data) {
                if (nextFunc == undefined)
                    reloadEventsJS("operandSubmit", true);
                //colorFieldsUsingData();
            }
        );
    }
    else
        updateSummary(true);

    return false;
}

function updateSummary(update, force, altIcons) {
    let div = document.getElementById("editors-preview-card");
    let opId = $("#card-all").data("id");

    if (update === undefined) update = true;

    if (force)
        opId = opId + "-" + Math.random();

    docass.leftArea({
        div: div,
        operandId: opId? opId:-1,
        action: $(div).data("action"),
        output: $(div).data("output"),
        update: update,
        altIcons: altIcons,
        previewQS: $(div).data("qs")
    });
}

function refreshBearerToken(){
    setInterval(function() {
        console.log('Executing postMessage to update bearer.')
        parent.postMessage('UpdateBearer','*')
    },60000);
    window.addEventListener("message", (event) => {
        if(event.data){
            window.bearer=event.data
            window.embedded=true
            console.log(`Bearer token refreshed successfully.`)
        }

    }, false);
}

refreshBearerToken()