var versaoRadarWebJs = "16:01 14/02/2014";
// TODO: remover em produção

kendo.culture("pt-BR");

var vok = "";
var verro = "";
var verror = "";
var vsuccess = "";
var vcomplete = "";
var v1 = "naoini"; v2 = "naoini"; v3 = "naoini"; v4 = "naoini";
var lst = [];
var g = {};

function sleep(milliseconds) {
    if (milliseconds === undefined || milliseconds === null || typeof milliseconds !== "number")
        milliseconds = 1000;

    $.ajaxSetup({
        async: false
    });

    $.getJSON(window.baseUrl + "util/sleep?milliseconds=" + milliseconds.toString(), null, function (data) {
    });

    $.ajaxSetup({
        async: true
    });
}

function User(login, base) {
    this.login = login || "";
    this.base = base || "";
};

User.prototype.update = function (user) {
    "use strict";
    this.login = user.Nome;
    this.base = user.NomeBase;
};

User.prototype.getCustomData = function (key) {
    "use strict";
    var self = this;
    if (localStorage) {
        return localStorage.getItem(self.login + "_" + key + "_" + self.base);
    }
    return null;
};

User.prototype.setCustomData = function (key, value) {
    "use strict";
    var self = this;
    if (localStorage) {
        localStorage.setItem(self.login + '_' + key + '_' + self.base, value);
    }
};

User.prototype.getSessionData = function (key) {
    "use strict";
    var self = this;
    if (window.sessionStorage) {
        return window.sessionStorage.getItem(self.login + "_" + key + "_" + self.base);
    }
    return null;
};

User.prototype.setSessionData = function (key, value) {
    "use strict";
    var self = this;
    if (window.sessionStorage) {
        window.sessionStorage.setItem(self.login + '_' + key + '_' + self.base, value);
    }
};

var currentUser = new User();
/*
$(window).on('keydown', function (ev) {
    var keyCode = ev.keyCode || ev.which;

    if(keyCode == 112 && ev.ctrlKey) {
        $('.radar-help').toggle();
        
        
    }
});
*/

var s_data, s_textStatus, s_jqXHR,
    e_jqXHR, e_textStatus, e_errorThrown;
// TODO: fim

// linq js
//Array.prototype.where = Array.prototype.filter || function (predicate, context) {
//    context = context || window;
//    var arr = [];
//    var l = this.length;
//    for (var i = 0; i < l; i++)
//        if (predicate.call(context, this[i], i, this) === true) arr.push(this[i]);
//    return arr;
//};

// extend string
if (typeof String.prototype.format !== 'function') {
    String.prototype.format = function () {
        var args = arguments;
        return this.replace(/{(\d+)}/g, function (match, number) {
            return typeof args[number] != 'undefined'
              ? args[number]
              : match
            ;
        });
    };
}

if (typeof String.prototype.toDate !== 'function') {
    String.prototype.toDate = function () {
        var mes = this.substr(3, 3);
        var dia = this.substr(0, 3);
        var ano = this.substr(6, 4);
        return new Date(mes + dia + ano);
    };
}

if (typeof String.prototype.toFloat !== 'function') {
    String.prototype.toFloat = function () {
        return parseFloat(this.replace('.', '').replace(',', '.'));
    };
}

if (typeof String.prototype.toInt !== 'function') {
    String.prototype.toInt = function () {
        return parseInt(this.replace('.', '').replace(',', '.'));
    };
}

if (typeof String.prototype.asFloat !== 'function') {
    String.prototype.asFloat = function () {
        return parseFloat(this);
    };
}

if (typeof String.prototype.asInt !== 'function') {
    String.prototype.asInt = function () {
        return parseInt(this);
    };
}

if (typeof String.prototype.toCasasDecimais !== 'function') {
    String.prototype.toCasasDecimais = function (casasDecimais) {
        var value = this.replace(',', '');
        value = value.replace('.', '');
        var arr = value.split('');
        arr.reverse();
        arr.splice(casasDecimais, 0, ',');
        arr.reverse();
        value = arr.join('');
        return value;
    };
}

if (typeof String.prototype.startsWith !== 'function') {
    String.prototype.startsWith = function (str) {
        return this.indexOf(str) == 0;
    };
}

if (typeof String.prototype.endsWith !== 'function') {
    String.prototype.endsWith = function (str) {
        return this.slice(-str.length) == str;
    };
}

if (typeof String.prototype.isValidDate !== 'function') {
    String.prototype.isValidDate = function () {
        var dateRegExp = /^(?:(?:31(\/|-|\.))(?:0?[13578]|1[02])\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$/;
        var matched = this.match(dateRegExp);
        return matched != null;
    };
}

if (typeof String.prototype.leftPad !== 'function') {
    String.prototype.leftPad = function (length, padString) {
        var str = this;
        if (str.length >= length) {
            return str.toString();
        }
        else {
            if (padString === undefined)
                padString = " ";
            while (str.length < length)
                str = padString + str;
            return str;
        }
    };
}

if (typeof String.prototype.empty !== 'function') {
    String.prototype.empty = function () {
        return this.trim() === '';
    };
}

if (typeof String.prototype.removeOccurrencesOf !== 'function') {
    String.prototype.removeOccurrencesOf = function (regExp) {
        return this.replace(regExp, '');
    };
}

if (typeof Date.prototype.compare !== 'function') {
    Date.prototype.compare = function () {
        if (arguments.length == 0 || typeof arguments[0] !== 'object') {
            throw new Error('Invalid Argument!');
        } else {
            if (this > arguments[0]) {
                return "greater";
            } else if (this < arguments[0]) {
                return "less";
            } else {
                return "equal";
            }
        }
    };
}

if (typeof document.getElementsByClassName !== 'function') {
    document.getElementsByClassName = function () {
        var elms = document.getElementsByTagName('*');
        var ei = new Array();
        var ecl;
        for (var i = 0; i < elms.length; i++) {
            if (elms[i].getAttribute('class')) {
                ecl = elms[i].getAttribute('class').split(' ');
                for (j = 0; j < ecl.length; j++) {
                    if (ecl[j].toLowerCase() == arguments[0].toLowerCase()) {
                        ei.push(elms[i]);
                    }
                }
            } else if (elms[i].className) {
                ecl = elms[i].className.split(' ');
                for (var j = 0; j < ecl.length; j++) {
                    if (ecl[j].toLowerCase() == arguments[0].toLowerCase()) {
                        ei.push(elms[i]);
                    }
                }
            }
        }
        return ei;
    };
}

if (typeof Number.prototype.compare !== 'function') {
    Number.prototype.compare = function () {
        if (arguments.length == 0 || typeof arguments[0] !== 'number') {
            throw new Error('Invalid Argument!');
        }
        if (this > arguments[0]) {
            return "greater";
        } else if (this < arguments[0]) {
            return "less";
        } else {
            return "equal";
        }
    };
}

if (typeof String.prototype.formatMoney !== 'function') {
    Number.prototype.formatMoney = function (c, d, t) {
        var n = this,
            c = isNaN(c = Math.abs(c)) ? 2 : c,
            d = d == undefined ? "," : d,
            t = t == undefined ? "." : t,
            s = n < 0 ? "-" : "",
            i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "",
            j = (j = i.length) > 3 ? j % 3 : 0;
        return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : "");
    };
}

if (!Date.now) {
    Date.now = function () {
        return new Date();
    };
}

var log = (function (msg) {
    if (window.console && window.console.log)
        console.log(msg);
});

function ValidateInteger(evt) {
    var theEvent = evt || window.event;
    var key = theEvent.keyCode || theEvent.which;
    key = String.fromCharCode(key);
    var regex = /[0-9]/;
    if (!regex.test(key)) {
        theEvent.returnValue = false;
        if (theEvent.preventDefault) theEvent.preventDefault();
    }
}

function ValidateCurrency(evt) {
    var field = $("#" + evt.target.id);
    var regex;
    if (field.val().indexOf(",") >= 0 || field.val().indexOf(".") >= 0)
        regex = /[0-9]/;
    else
        regex = /[0-9]|\.|,/;

    var theEvent = evt || window.event;
    var key = theEvent.keyCode || theEvent.which;
    key = String.fromCharCode(key);
    if (!regex.test(key)) {
        theEvent.returnValue = false;
        if (theEvent.preventDefault) theEvent.preventDefault();
    }
}

var ping = {
    when: "ping",
    time: 10000,
    showConsole: false,
    stop: false,
    start: (function () {
        // fixar manualmente o "timeout" no ajax para evitar usar um valor padão pequeno
        // usar cache=false no ajax para ter certeza que vai cair no aplicativo
        window.setTimeout(function () {
            $.ajax({
                type: "POST",
                url: window.baseUrl + ping.when,
                cache: false,
                timeout: 50000,
                beforeSend: function () {
                    if (ping.showConsole) log("send ping url={0}".format(window.baseUrl + ping.when));
                },
                error: function (jqxhr, textStatus, errorThrown) {
                    if (ping.showConsole) log("    error ping, textStatus=\"{6}\", errorThrown=\"{7}\", readyState=\"{0}\", status=\"{1}\", statusText=\"{2}\", responseText=\"{3}\", isResolved=\"{4}\", isRejected=\"{5}\", "
                        .format(jqxhr.readyState, jqxhr.status, jqxhr.statusText, jqxhr.responseText, jqxhr.isResolved(), jqxhr.isRejected(), textStatus, errorThrown));
                    if (jqxhr.status === 0) {
                        //alert("Error, sem conexão."); // ???
                        // se ocorrer erro de rede, nao fazer o ping novamente, pq pode ocorrer erros de rede seguido,
                        // e essa rotina executar 100mil veses direto, colocar algum tipo de sleep // ???
                    } else if (jqxhr.status == 503) {
                        //alert("Error, limite de conexões do servidor excedido.");
                        if (!ping.stop) window.setTimeout(ping.start, ping.time);
                    } else {
                        //alert("Error: " + jqxhr.status + "-" + jqxhr.responseText);
                        if (!ping.stop) window.setTimeout(ping.start, ping.time);
                    }
                },
                complete: function (jqxhr) {
                    // não usar setInteval, pois pode sobrecarregar o servidor ou o client, só agendar o próximo ping,
                    // quando o anterior terminou
                    if (!ping.stop) window.setTimeout(ping.start, ping.time);
                    if (ping.showConsole) log("    complete ping, readyState=\"{0}\", status=\"{1}\", statusText=\"{2}\", responseText=\"{3}\", isResolved=\"{4}\", isRejected=\"{5}\", "
                        .format(jqxhr.readyState, jqxhr.status, jqxhr.statusText, jqxhr.responseText, jqxhr.isResolved(), jqxhr.isRejected()));
                }
            });
        }, ping.time);
    })
};
ping.start();

var selectDisable = (function (id) {
    $(id).css({
        "-webkit-user-select": "none",
        "-khtml-user-select": "none",
        "-moz-user-select": "none",
        "-ms-user-select": "none",
        "-o-user-select": "none",
        "user-select": "none",
        "-webkit-touch-callout": "none"
    });
    $(id).attr("onselectstart", "return false;");
    $(id).attr("unselectable", "on;");
});

var generateId = (function (pre) {
    try {
        var dt = (new Date()).getTime();
        var ram = Math.random().toString().replace(".", "");
        var id = pre + "-" + dt + "-" + ram;
        var count = $("#" + id).length;
        if (count > 0)
            throw new Error("generateId Exception: Id duplicado.");
        return id;
    }
    catch (err) {
        throw new Error("generateId Exception: {0}".format(err.message));
    }
});

var msgWait = ({
    show: (function (msg, showImage) {
        if (!msg) msg = "Aguarde, processando...";
        if (showImage === undefined || showImage === null) showImage = true;
        if ($("body > #msgWait_loading_overlay").length > 0)
            msgWait.hide();
        var msgWait_loading_overlay = $("<div id='msgWait_loading_overlay'>");
        msgWait_loading_overlay.css({
            "position": "absolute",
            "top": "0",
            "left": "0",
            "right": "0",
            "bottom": "0",
            "background-color": "#000",
            "opacity": "0.7",
            "filter": "alpha(opacity=70)"
        });
        msgWait_loading_overlay.appendTo("body");

        var msgWait_loading_message = $("<div id='msgWait_loading_message'>");
        msgWait_loading_message.css({
            "position": "absolute",
            "width": "400px",
            "height": "100px",
            "left": "50%",
            "top": "50%",
            "margin-left": "-200px",
            "margin-top": "-50px",
            "line-height": "100px",
            "text-align": "center",
            "font-size": "1.2em",
            "background-color": "#fff",
            "border": "1px solid #cccccc",
            "-webkit-border-radius": "9px",
            "-moz-border-radius": "9px",
            "-o-border-radius": "9px",
            "-khtml-border-radius": "9px",
            "border-radius": "9px"
        });
        msgWait_loading_message.html("{0} {1}".format(msg, showImage ? "<img src='" + window.baseUrl + "Libs/Kendo-2013.2.716/styles/Uniform/loading-image.gif' />" : ""));
        msgWait_loading_message.appendTo("body");

        selectDisable("body");
        selectDisable("#msgWait_loading_overlay");
        selectDisable("#msgWait_loading_message");

        msgWait_loading_overlay.css("cursor", "wait");
        msgWait_loading_message.css("cursor", "wait");
    }),

    hide: (function () {
        $("#msgWait_loading_message").remove();
        $("#msgWait_loading_overlay").remove();

        $("#msgWait_loading_message").css("cursor", "");
        $("#msgWait_loading_overlay").css("cursor", "");
    })
});

(function ($) {
    $.fn.viewModel = function (viewModelName) {
        var viewModel = this[0], selector = this.selector;

        if (viewModelName !== undefined && viewModel !== undefined) {
            set(viewModelName, viewModel);
        } else if (selector !== undefined) {
            return get(selector);
        }
        return this;
    };

    var InputType = {
        CHECKBOX: 'checkbox'
    };

    function set(viewModelName, viewModel) {
        var $bindedViewModel = $('[vm-model=' + viewModelName + ']');
        for (var prop in viewModel) {
            if (viewModel.hasOwnProperty(prop)) {
                var $field = $bindedViewModel.filter('[vm-field=' + prop + ']')
				   , type = $field.attr('type');
                setDataForType($field, type, viewModel[prop]);
            }
        }
    }

    function setDataForType($el, type, data) {
        switch (type) {
            case InputType.CHECKBOX:
                $el[0].checked = data;
                break;
            default:
                $el.val(data);
                break;
        }
    }

    function get(viewModelName) {
        var model = {}, $bindedViewModel = $('[vm-model=' + viewModelName + '][vm-field]');

        $bindedViewModel.each(function (i, el) {
            var $el = $(el)
			   , field = $el.attr('vm-field')
			   , type = $el.attr('type')
			   , data = getValueForType($el, type);

            model[field] = getValueForType($el, type);
        });
        return model;
    }

    function getValueForType($el, type) {
        switch (type) {
            case InputType.CHECKBOX:
                return $el[0].checked;
                break;
            default:
                return $el.val();
                break;
        }
    }
})(jQuery);
(function ($) {
    $.fn.template = function () {
        var model = this.selector;
        if (model)
            return $('.template[data-template=' + model + ']').html();
        return null;
    };
})(jQuery);

// TODO ??? orgnizar melhor

function getDateNowDDMMYYYY() {
    var today = new Date();

    var yyyy = today.getFullYear();

    var mm = today.getMonth() + 1;
    if (mm < 10) {
        mm = "0" + mm;
    }

    var dd = today.getDate();
    if (dd < 10) {
        dd = "0" + dd;
    }

    today = dd + "/" + mm + "/" + yyyy;
    return today;
}

function getDateNowMMYYYY() {
    var today = new Date();

    var yyyy = today.getFullYear();

    var mm = today.getMonth() + 1;
    if (mm < 10) {
        mm = "0" + mm
    }

    today = mm + "/" + yyyy;
    return today;
}

function getDateJsonMS(value) {
    return new Date(parseInt(value.replace("/Date(", "").replace(")/", ""), 10));
}

function getDateJsonMSDay(value) {
    return new Date(parseInt(value.replace("/Date(", "").replace(")/", ""), 10)).getDate();
}

function getDateJsonMSMonth(value) {
    return new Date(parseInt(value.replace("/Date(", "").replace(")/", ""), 10)).getMonth() + 1;
}

function getDateJsonMSYear(value) {
    return new Date(parseInt(value.replace("/Date(", "").replace(")/", ""), 10)).getFullYear();
}

function getDateJsonMSYearYY(value) {
    return new Date(parseInt(value.replace("/Date(", "").replace(")/", ""), 10)).getFullYear().toString().substr(2, 2);
}

function getDateJsonMSYearYYYY(value) {
    return new Date(parseInt(value.replace("/Date(", "").replace(")/", ""), 10)).getFullYear();
}

function getDateJsonMSStringDDMMYY(value) {
    if (value === undefined)
        throw new Error("O parametro 'value' nao foi informado. Rotina: getDateJsonMSStringDDMMYY'");
    else if (typeof value !== "string")
        throw new Error("O tipo do parametro 'value' eh invalido. Rotina: 'getDateJsonMSStringDDMMYY', value=\"{0}\", tipo=\"{1}\"".format(value, typeof value));
    else if (value === null || value === "")
        return "00/00/0000";
    else {
        var year = getDateJsonMSYearYY(value).toString();
        if (year.length < 2) year = "0" + year;

        var month = getDateJsonMSMonth(value).toString();
        if (month.length < 2) month = "0" + month;

        var day = getDateJsonMSDay(value).toString();
        if (day.length < 2) day = "0" + day;

        var data = day + "/" + month + "/" + year;
        if (data === "01/01/01") data = "00/00/00";

        return data;
    }
}

function getDateJsonMSStringDDMMYYYY(value) {
    if (value === undefined)
        throw new Error("O parametro 'value' nao foi informado. Rotina: getDateJsonMSStringDDMMYYYY'");
    else if (typeof value !== "string")
        throw new Error("O tipo do parametro 'value' eh diferente 'string'. Rotina: 'getDateJsonMSStringDDMMYYYY', value=\"{0}\", tipo=\"{1}\"".format(value, typeof value));
    else if (value === null || value === "")
        return "00/00/0000";
    else {
        var year = getDateJsonMSYearYYYY(value).toString();
        if (year.length < 2) year = "0" + year;
        if (year.length < 3) year = "0" + year;
        if (year.length < 4) year = "0" + year;

        var month = getDateJsonMSMonth(value).toString();
        if (month.length < 2) month = "0" + month;

        var day = getDateJsonMSDay(value).toString();
        if (day.length < 2) day = "0" + day;

        var data = day + "/" + month + "/" + year;
        if (data === "01/01/0001") data = "00/00/0000";

        return data;
    }
}

function convertDateToStringDDMMYYYY(value) {
    if (value === undefined)
        throw new Error("O parametro 'value' nao foi informado. Rotina: convertDateToStringDDMMYYYY'");
    else if (typeof value !== "object")
        throw new Error("O tipo do parametro 'value' eh diferente 'object'. Rotina: 'convertDateToStringDDMMYYYY', value=\"{0}\", tipo=\"{1}\"".format(value, typeof value));
    else if (value === null || value === "")
        return "00/00/0000";
    else {
        var year = value.getFullYear();

        var month = value.getMonth();
        if (month.length < 2) month = "0" + month;

        var day = value.getDate();
        if (day.length < 2) day = "0" + day;

        var data = day + "/" + month + "/" + year;
        return data;
    }
}

function convertDateStringDDMMYYYYToDate(value) {
    if (value === undefined)
        throw new Error("O parametro 'value' nao foi informado. Rotina: convertDateStringDDMMYYYYToDate'");
    else if (typeof value !== "string")
        throw new Error("O tipo do parametro 'value' eh diferente 'string'. Rotina: 'convertDateStringDDMMYYYYToDate', value=\"{0}\", tipo=\"{1}\"".format(value, typeof value));
    else if (value === null || value === "")
        return "00/00/0000";
    else {
        var dataSplit = value.split("/");
        return new Date(dataSplit[2], (parseInt(dataSplit[1]) - 1).toString(), dataSplit[0]);
    }
}

function formatDecimalPtBr(value) {
    if (value === undefined)
        throw new Error("O parametro 'value' nao foi informado. Rotina: formatDecimalPtBr'");
    else if (typeof value !== "number")
        throw new Error("O tipo do parametro 'value' eh diferente 'number'. Rotina: 'formatDecimalPtBr', value=\"{0}\", tipo=\"{1}\"".format(value, typeof value));
    else if (value === null || value === "")
        value = 0;
    return value.formatMoney().leftPad(15).replace(" ", "&nbsp");
}

function setVal(id, value) {
    var obj = document.getElementById(id);
    if (obj === null)
        throw new Error("Objeto \"{0}\" nao encontrado.".format(id));
    $(obj).val(value);
}

function isChecked(id) {
    var obj = document.getElementById(id);
    if (obj === null)
        throw new Error("Objeto \"{0}\" nao encontrado.".format(id));
    return $(obj).is(":checked");
}

function getVal(id) {
    var obj = document.getElementById(id);
    if (obj === null)
        throw new Error("Objeto \"{0}\" nao encontrado.".format(id));
    return $(obj).val();
}

function getDate(id) {
    var obj = document.getElementById(id);
    if (obj === null)
        throw new Error("Objeto \"{0}\" nao encontrado.".format(id));
    return $(obj).val() === "" ? "" : $(obj).val().substr(3, 3) + $(obj).val().substr(0, 3) + $(obj).val().substr(6, 4);
}

function setHtml(id, value) {
    var obj = document.getElementById(id);
    if (obj === null)
        throw new Error("Objeto \"{0}\" nao encontrado.".format(id));
    $(obj).html(value);
}

function getHtml(id) {
    var obj = document.getElementById(id);
    if (obj === null)
        throw new Error("Objeto \"{0}\" nao encontrado.".format(id));
    return $(obj).html();
}

function setChecked(id, op) {
    var obj = document.getElementById(id);
    if (obj === null)
        throw new Error("Objeto \"{0}\" nao encontrado.".format(id));
    obj.checked = op;
}

function requestLeg(onComplete) {
    "use strict";
    $.ajax({
        type: "GET",
        url: window.baseUrl + "Leg",
        async: true,
        cache: true,
        complete: function () {
            if (onComplete) {
                onComplete();
            }
        }
    });
}

function request(route, params, function_success) {
    msgWait.show();
    // ??? melhorar os nomes e logica
    // ??? colocar num try catch com mensage de der erro, para chamar de novo

    // ???
    //var span = $("span");
    //for (var tag in span) {
    //    if (span[tag].getAttribute && span[tag].getAttribute("id") !== null) {
    //        //log(span[tag].getAttribute("id"));
    //        $("#" + span[tag].getAttribute("id")).html("ok-span-" + tag);
    //    }
    //}

    //var input = $("input");
    //for (var tag in input) {
    //    if (input[tag].getAttribute && input[tag].getAttribute("id") !== null) {
    //        //log(input[tag].getAttribute("id"));
    //        $("#" + input[tag].getAttribute("id")).val("ok-input-" + tag);
    //    }
    //}

    if (route === undefined || typeof route !== "string" || route === "")
        throw new Error("request: Campo \"route\" nao informado.");

    if (params === null)
        params = undefined;
    if (params !== undefined && (typeof params !== "object"))
        throw new Error("request: Tipo (\"{0}\") do campo \"params\" invalido.".format(typeof params));

    if (function_success === null)
        function_success = undefined;
    if (function_success !== undefined && (typeof function_success !== "function"))
        throw new Error("request: Tipo (\"{0}\") do campo \"function_success\" invalido.".format(typeof function_success));

    $.ajax({
        url: window.baseUrl + route,
        type: "POST",
        data: params !== undefined ? JSON.stringify(params) : "",
        headers: {
            "Accept": "application/json",
            "Content-Type": "application/json"
        },
        dataType: "json",
        cache: false,
        async: true, // se colocar false nao funciona
        timeout: 90000,
        beforeSend: function () {
            //log("***request beforeSend");
        },
        error: function (jqxhr, textStatus, errorThrown) {
            //log("***request verror");
            //log("\terror, textStatus=\"{6}\", errorThrown=\"{7}\", readyState=\"{0}\", status=\"{1}\", statusText=\"{2}\", responseText=\"{3}\", isResolved=\"{4}\", isRejected=\"{5}\", "
            //    .format(jqxhr.readyState, jqxhr.status, jqxhr.statusText, jqxhr.responseText, jqxhr.isResolved(), jqxhr.isRejected(), textStatus, errorThrown));
            verror = { jqxhr: jqxhr, textStatus: textStatus, errorThrown: errorThrown };
        },
        success: function (result, textStatus, jqxhr) {
            //log("***request vsuccess: " + result);
            //log("\tcomplete, readyState=\"{0}\", status=\"{1}\", statusText=\"{2}\", responseText=\"{3}\", isResolved=\"{4}\", isRejected=\"{5}\", "
            //    .format(jqxhr.readyState, jqxhr.status, jqxhr.statusText, jqxhr.responseText, jqxhr.isResolved(), jqxhr.isRejected()));
            vsuccess = { result: result, textStatus: textStatus, jqxhr: jqxhr };
            if (function_success !== undefined)
                function_success(result);
        },
        complete: function (jqxhr) {
            //log("***request complete vcomplete:");
            vcomplete = jqxhr;
            msgWait.hide();
        }
    });

    //msgWait.hide();
}

var TreeviewAjaxNode = function (options) {
    if ($("#" + options.id).length > 0)
        throw new Error("TreeviewAjaxNode: Ja existe um componente com o Id=" + options.id);
    this.id = options.id;
    this.idContainer = options.idContainer;
    this.idButtonOK = options.idButtonOK;
    this.urlDataSource = options.urlDataSource;
    this.exibirHierarquiaParams = options.exibirHierarquiaParams;
    this.onBeforeShowChilds = options.onBeforeShowChilds;
    this.onAfterShowChilds = options.onAfterShowChilds;
    this.onClickGetItem = options.onClickGetItem;
    this.onDblClickGetItem = options.onDblClickGetItem;
    this.selectClass = options.selectClass;
    this.make();
};

TreeviewAjaxNode.prototype.CollapseAll = function () {
    "use strict";
    var self = this;

    // remove selecao de qualquer item

    // tem que setar a cor amarela no texto, porque a cor do texto quen esta selecionado eh branca, 
    // mas isso apenas para produtos, para classes de produtos e cor e preta
    if ($("#" + self.id + " .treeviewajaxnode-select").parent().data("haschilds")) {
        $("#" + self.id + " .treeviewajaxnode-select").css("color", "");
    } else {
        $("#" + self.id + " .treeviewajaxnode-select").css("color", "#808240"); // gambi! explicacao logo abaixo
    }
    $("#" + self.id + " .treeviewajaxnode-select").removeClass("treeviewajaxnode-select");

    $("#" + self.id + " .treeviewajaxnode-expand").each(function () {
        $(this).css("display", "none");
        $($(this.parentElement).children()[0]).attr("src", window.baseUrl + "Content/TreeviewAjaxNode/Images/plus.gif");
        $(this).addClass("treeviewajaxnode-collapse");
        $(this).removeClass("treeviewajaxnode-expand");
    });
};

TreeviewAjaxNode.prototype.showHideChilds = (function (id) {
    if ($("#" + id + " > ol").css("display") === "none") {
        $("#" + id + " > ol").css("display", "list-item");
        $("#" + id + " > .treeviewajaxnode-getchilds").attr("src", window.baseUrl + "Content/TreeviewAjaxNode/Images/minus.gif");
        $("#" + id + " > ol").removeClass("treeviewajaxnode-collapse");
        $("#" + id + " > ol").addClass("treeviewajaxnode-expand");
    }
    else {
        $("#" + id + " > ol").css("display", "none");
        $("#" + id + " > .treeviewajaxnode-getchilds").attr("src", window.baseUrl + "Content/TreeviewAjaxNode/Images/plus.gif");
        $("#" + id + " > ol").addClass("treeviewajaxnode-collapse");
        $("#" + id + " > ol").removeClass("treeviewajaxnode-expand");
    }
});

TreeviewAjaxNode.prototype.listen = (function () {
    var self = this;

    // listen selecionar visualmente o produto/classe
    $(".treeviewajaxnode-list > .treeviewajaxnode-getitem").unbind("click");
    $(".treeviewajaxnode-list > .treeviewajaxnode-getitem").bind("click", function (event) {
        $("#" + self.id + " .treeviewajaxnode-select").css("color", ""); // gambi! explicacao logo abaixo
        $("#" + self.id + " .treeviewajaxnode-select").removeClass("treeviewajaxnode-select");
        // seleciona o item
        $($(event.target.parentElement).children()[1]).addClass("treeviewajaxnode-select");
        // gambi! o ordem de procedencia para class e style em uma tag, eh alfabetica, entao mesmo
        // tento a class de style .treeviewajaxnode-select com color=while, o css usa o color=#808240 da
        // class de style .treeviewajaxnode-item-label, por isso tenho que forcar o color via atributo
        $($(event.target.parentElement).children()[1]).css("color", "white");

        var data = $(event.target.parentElement).attr("dados");

        if (self.onClickGetItem)
            self.onClickGetItem(event, data);
    });

    // listen para buscar o produto/classe selecionado com 2 clicks
    $(".treeviewajaxnode-list > .treeviewajaxnode-getitem").unbind("dblclick");
    $(".treeviewajaxnode-list > .treeviewajaxnode-getitem").bind("dblclick", function (event) {
        var data = $(event.target.parentElement).attr("dados");

        if (self.onDblClickGetItem) {
            // para ficar padrão como na consulta por tabela
            data = { "Codigo": data };
            self.onDblClickGetItem(event, data);
        }
    });

    // listen do botão "ok" para buscar o produto/classe selecionado
    $("#" + self.idButtonOK).unbind("click");
    $("#" + self.idButtonOK).bind("click", function (event) {
        var data = $("#" + self.id + " .treeviewajaxnode-select").parent().attr("dados");

        if (self.onDblClickGetItem) {
            // para ficar padrão como na consulta por tabela
            data = { "Codigo": data };
            self.onDblClickGetItem(event, data);
        }
    });

    // listen para buscar os childs
    $(".treeviewajaxnode-list > .treeviewajaxnode-item > .treeviewajaxnode-getchilds").unbind("click");
    $(".treeviewajaxnode-list > .treeviewajaxnode-item > .treeviewajaxnode-getchilds").bind("click", function (event) {
        if (self.onBeforeShowChilds)
            self.onBeforeShowChilds(event);
        var id = event.target.parentNode.id;

        // busca os childs somente se não buscou ainda, senão o cache
        if ($("#" + id).data("haschilds")) {
            if (!$("#" + id).data("loadchilds")) {
                self.getChilds(id, JSON.parse($("#" + id).attr("params")));
            }
            self.showHideChilds(id);
        }

        if (self.onAfterShowChilds)
            self.onAfterShowChilds(event);
    });
});

TreeviewAjaxNode.prototype.getChilds = (function (idParent, params) {
    var self = this;

    $.ajax({
        url: self.urlDataSource,
        type: "POST",
        data: JSON.stringify({
            ClassificacaoProdutoPai: params.ClassificacaoProdutoPai,
            CodigoTabelaPrecos: self.exibirHierarquiaParams.CodigoTabelaPrecos
        }),
        headers: {
            "Accept": "application/json",
            "Content-Type": "application/json"
        },
        dataType: "json",
        cache: false,
        async: true,
        timeout: 90000,
        beforeSend: function () {
            var htmlLoad = '\
                    <li class="treeviewajaxnode-item">\
                        <img src="' + window.baseUrl + 'Content/TreeviewAjaxNode/Images/loading.gif" />\
                        <label>Carregando...</label>\
                    </li>\
                    ';
            $("#" + idParent + " > ol").html(htmlLoad);
        },
        error: function (jqxhr, textStatus, errorThrown) {
            var htmlError = '\
                    <li class="treeviewajaxnode-item">\
                        <img src="' + window.baseUrl + 'Content/TreeviewAjaxNode/Images/error.gif" />\
                        <label style="color: red">' + 'Error: ' + jqxhr.status + "-" + jqxhr.statusText + '</label>\
                    </li>\
                    ';
            $("#" + idParent + " > ol").html(htmlError);
        },
        success: function (result, textStatus, jqxhr) {
            if (itens.length === 0) {
                var htmlNone = '\
                        <li class="treeviewajaxnode-item" data-haschilds="false" >\
                            <img src="' + window.baseUrl + 'Content/TreeviewAjaxNode/Images/info.gif" />\
                            <label>Nenhum item encontrado.</label>\
                        </li>\
                        ';
                $("#" + idParent + " > ol").html(htmlNone);
            }
            else {
                var htmlItens = "";
                for (var item in result.data) {
                    if (result.data[item].TemFilho) {
                        var lparams = {
                            ClassificacaoProdutoPai: result.data[item].Classificacao,
                        };

                        var getItem = self.selectClass ? "treeviewajaxnode-getitem" : "";
                        htmlItens += "\
                                <li class='treeviewajaxnode-item " + getItem + "' id='" + generateId('item') + "' params='" + JSON.stringify(lparams) + "' data-haschilds='true' data-loadchilds='false' dados='" + result.data[item].Codigo + "' >\
                                    <img class='treeviewajaxnode-getchilds' src='" + window.baseUrl + "Content/TreeviewAjaxNode/Images/plus.gif' />\
                                    <label class='treeviewajaxnode-node-label'>" + result.data[item].Codigo + '&nbsp&nbsp&nbsp' + result.data[item].Classificacao + '&nbsp&nbsp&nbsp' + result.data[item].Nome + "</label>\
                                    <ol class='treeviewajaxnode-list treeviewajaxnode-collapse' style='display: none' >\
                                    </ol>\
                                </li>\
                                ";
                    }
                    else {
                        htmlItens += '\
                                <li class="treeviewajaxnode-item treeviewajaxnode-getitem" data-haschilds="false" dados="' + result.data[item].Codigo + '">\
                                    <img src="' + window.baseUrl + 'Content/TreeviewAjaxNode/Images/none.gif" />\
                                    <label class="treeviewajaxnode-item-label">' + result.data[item].Codigo + "&nbsp&nbsp&nbsp" + result.data[item].Classificacao + "&nbsp&nbsp&nbsp" + result.data[item].Nome + '</label>\
                                </li>\
                                ';
                    }
                }
                $("#" + idParent + " > ol").html(htmlItens);
                // marca somente como carregado, quando nao ocorreu nenhum erro, e tiver registros, senao deixa desmarcado
                // para tentar carregar novamente
                $("#" + idParent).data("loadchilds", true);
            }
        },
        complete: function (jqxhr) {
            // o ajax esta com "async: true", para nõa travar a carga da tela,
            // somente depois de criar todos os htmls de todos os itens, tem que fazer bind,
            // pois se fizer bind antes, e adicionar itens depois, os novos itens nao vao tem bind,
            // e por isso que a cada ajax, tem que fazer bind novamente, pois vai ter novos itens
            self.listen();
        }
    });
});

TreeviewAjaxNode.prototype.make = (function () {
    var self = this;

    // css para formatar as tags html da lista
    var style = document.createElement("style");
    style.type = "text/css";
    style.innerHTML = "\
            /* ajusta o indent dos itens da lista */\
            .treeviewajaxnode-item {\
                margin-left: 0px;\
                padding-left: 14px;\
            }\
            /* remove numeracao dos itens da lista */\
            .treeviewajaxnode-list {\
                list-style-type: none;\
                margin-left: 0;\
                padding-left: 14px;\
            }\
            .treeviewajaxnode-select {\
                color: white;\
                background: #314A63;\
                display: inline;\
            }\
            .treeviewajaxnode-node-label {\
                display: inline;\
            }\
            .treeviewajaxnode-item-label {\
                color: #808240;\
                display: inline;\
            }\
            .treeviewajaxnode-collapse {\
            }\
            .treeviewajaxnode-expand {\
            }\
            ";
    document.getElementsByTagName("head")[0].appendChild(style);

    // cria o no pai "Produtos", expando e jah busca os dados
    var htmlTreeviewAjaxNode = document.createElement("div");
    htmlTreeviewAjaxNode.id = self.id;
    htmlTreeviewAjaxNode.innerHTML = '\
            <ol class="treeviewajaxnode-list">\
                <li class="treeviewajaxnode-item" id="itens" style="display: list-item" data-haschilds="true" data-loadchilds="false" >\
                    <img class="treeviewajaxnode-getchilds" src="' + window.baseUrl + 'Content/TreeviewAjaxNode/Images/minus.gif" />\
                    <label class="treeviewajaxnode-node-label">Produtos</label>\
                    <ol class="treeviewajaxnode-list" >\
                    </ol>\
                </li>\
            </ol>\
            ';
    document.getElementById(self.idContainer).appendChild(htmlTreeviewAjaxNode);
    self.getChilds("itens", self.exibirHierarquiaParams);

    selectDisable("#" + self.id);
});


//
// namespace principal
//

var Radar = {};

Radar.Web = (function () {
    "use strict";
    var Pedido = {},
        Pedidos = {},
        Consultas = {},
        Test = {},
        Modelos = {},
        Relatorios = {},
        Empresarial = {},
        Contabil = {},
        Estoque = {},
        Gerenciador = {},

    controlGroupBehavior = {
        normal: "control-group",
        error: "control-group error",
        warning: "control-group warning",
        success: "control-group success"
    },
        alertLevel = {
            normal: 0,
            success: 1,
            warning: 2,
            error: 3,
            question: 4
        },
        alertBehavior = {
            success: "success",
            warning: "warning",
            error: "error"
        };

    var IcmsType = {
        CONTRIBUINTE: 83,
        ISENTO: 78,
        NAO_CONTRIBUINTE: 0
    };

    var PessoaType = {
        JURIDICA: 74,
        FISICA: 70
    };
    //Helper

    function byId(id) {
        return document.getElementById(id);
    }

    function getJsonFromRoute(route, data, onSuccess, onError) {
        "use strict";
        var url = window.baseUrl + route;
        return $.ajax({
            type: "GET",
            url: url,
            async: true,
            data: data,
            succes: function (resp) {
                if (onSuccess) {
                    onSuccess(resp);
                }
            },
            error: function (resp) {
                if (onError) {
                    onError(resp);
                }
            },
            dataType: "json",
            contentType: 'application/json; charset=utf-8',
            cache: false
        });
    }

    function postJsonToRoute(route, data, onSuccess, onError) {
        "use strict";
        var url = window.baseUrl + route;
        return $.ajax({
            type: "POST",
            url: url,
            data: data,
            dataType: "json",
            succes: function (resp) {
                if (onSuccess) {
                    onSuccess(resp);
                }
            },
            error: function (resp) {
                if (onError) {
                    onError(resp);
                }
            },
            contentType: 'application/json; charset=utf-8'
        });
    }

    // ??? melhorar
    function requestNoAsync(route, params, onSuccess, onError, catchError) {
        if (route === undefined || typeof route !== "string" || route === "")
            throw new Error("request: Campo \"route\" nao informado.");

        if (params === null)
            params = undefined;
        if (params !== undefined && (typeof params !== "object"))
            throw new Error("request: Tipo (\"{0}\") do campo \"params\" invalido.".format(typeof params));

        if (onSuccess === null)
            onSuccess = undefined;
        if (onSuccess !== undefined && (typeof onSuccess !== "function"))
            throw new Error("request: Tipo (\"{0}\") do campo \"onSuccess\" invalido.".format(typeof onSuccess));

        if (onError === null)
            onError = undefined;
        if (onError !== undefined && (typeof onError !== "function"))
            throw new Error("request: Tipo (\"{0}\") do campo \"onError\" invalido.".format(typeof onError));

        $.ajax({
            url: route,
            type: "POST",
            data: params !== undefined ? JSON.stringify(params) : "",
            headers: {
                "Accept": "application/json",
                "Content-Type": "application/json"
            },
            dataType: "json",
            cache: false,
            async: false,
            timeout: 90000,
            error: function (jqxhr, textStatus, errorThrown) {
                if (catchError) {
                    log("Error: textStatus=\"{6}\", errorThrown=\"{7}\", readyState=\"{0}\", status=\"{1}\", statusText=\"{2}\", responseText=\"{3}\", isResolved=\"{4}\", isRejected=\"{5}\", ".format(jqxhr.readyState, jqxhr.status, jqxhr.statusText, jqxhr.responseText, jqxhr.isResolved(), jqxhr.isRejected(), textStatus, errorThrown));
                    var u = new Util();
                    u.alert("Erro: " + jqxhr.status + "-" + jqxhr.statusText, getAlertBehavior(alertLevel.error));
                }
                verror = { jqxhr: jqxhr, textStatus: textStatus, errorThrown: errorThrown };
                if (onError !== undefined)
                    onError(verror);
            },
            success: function (result, textStatus, jqxhr) {
                vsuccess = { result: result, textStatus: textStatus, jqxhr: jqxhr };
                if (onSuccess !== undefined)
                    onSuccess(result);
            }
        });
    }

    function getAlertBehavior(level) {
        if (level == alertLevel.success)
            return "success";
        if (level == alertLevel.warning)
            return "warning";
        if (level == alertLevel.error)
            return "error";
        return "warning";
    }

    function alterControlGroupBehavior(fieldId, behavior) {
        "use strict";
        byId(fieldId).parentNode.parentNode.className = behavior;
    }

    function isFieldControlGroupInBehavior(fieldId, behavior) {
        return byId(fieldId).parentNode.parentNode.className == behavior;
    }

    function alterTab(tabToAlterIndex) {
        var tabsLi = $("#myTab li");
        var tabPane = $(".tab-pane");
        for (var i = 0; i < tabsLi.length; i = i + 1) {
            tabsLi[i].className = "";
            tabPane[i].className = "tab-pane";
        }
        tabsLi[tabToAlterIndex].className = "active";
        tabPane[tabToAlterIndex].className = "tab-pane active in";
    }

    function enableField(id) {
        $("#" + id).removeAttr("disabled", "disabled");
    }

    function disableField(id) {
        $("#" + id).attr("disabled", "disabled");
    }

    function disableNegativePermissionsFields() {
        var inputs = $('input'),
            l = inputs.length;
        for (var i = 0; i < l; i = i + 1) {
            var input = inputs[i];
            if (input.hasAttribute('datapermission')) {
                var permission = input.getAttribute('datapermission');
                if (permission == "False") {
                    input.disabled = true;
                }
            }
        }
    }

    function disableAllInputs() {
        var inputs = $('input'),
           l = inputs.length;
        for (var i = 0; i < l; i = i + 1) {
            var input = inputs[i];
            input.disabled = true;
        }

        var textAreas = $('textarea'),
        g = textAreas.length;
        for (var j = 0; j < g; j = j + 1) {
            var textArea = textAreas[j];
            textArea.disabled = true;
        }
    }

    function makeDatePicker(idDatePicker) {
        $(function () {
            $(idDatePicker).datepicker($.extend({
                closeText: 'Fechar',
                prevText: '&#x3c;Anterior',
                nextText: 'Proximo&#x3e;',
                currentText: 'Atual',
                monthNames: ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'],
                monthNamesShort: ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'],
                dayNames: ['Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado'],
                dayNamesShort: ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sab'],
                dayNamesMin: ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],
                weekHeader: 'Semanas',
                dateFormat: 'dd/mm/yy',
                firstDay: 1,
                isRTL: false,
                showMonthAfterYear: false,
                yearSuffix: ''
            }, $.datepicker.regional['pt'])).setMask("99/99/9999");
        });
    }

    function makeDatePickerMMAAAA(idDatePicker) {
        $(idDatePicker).datepicker({
            monthNames: ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'],
            monthNamesShort: ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'],
            changeMonth: true,
            changeYear: true,
            showButtonPanel: true,
            dateFormat: 'mm/yy',
            firstDay: 1,
            isRTL: false
        })

        $(idDatePicker).focus(function () {
            var thisCalendar = $(this);
            $('.ui-datepicker-calendar').detach();
            $('.ui-datepicker-close').click(function () {
                var month = parseInt($("#ui-datepicker-div .ui-datepicker-month :selected").val());
                month++;
                if (month.toString().length === 1) month = "0" + month;
                var year = $("#ui-datepicker-div .ui-datepicker-year :selected").val();
                $(idDatePicker).val(month + "/" + year);
                $(idDatePicker).trigger("change");
            });
            $("#ui-datepicker-div > .ui-datepicker-calendar").css("display", "none");
            $("#ui-datepicker-div .ui-datepicker-current").css("display", "none");
            $("#ui-datepicker-div .ui-datepicker-close").html("OK");
        });

        $(idDatePicker).setMask("99/9999");
    }

    function setMaxPagersSize(size) {
        var pagers = $('.k-pager-numbers');
        pagers.each(function (index, pager) {
            setPagerSize(pager, size);
        });
    }

    function setPagerSize(pager, size) {
        var lis = pager.children;
        var l = lis.length;
        for (var i = size + 1; i < l; i = i + 1) {
            lis.item(size).remove();
        }
    }

    function setMask() {
        $(".masked").each(function (index, input) {
            var mask = input.attributes.radarmask.value;
            var params = mask.split('valor');

            if (params.length == 1) {
                $(input).setMask();
            } else {

                var integer = params[1].split('-')[1];
                var decimal = params[1].split('-')[2];

                $(input).autoNumeric('destroy');
                $(input).autoNumeric('init', getAutoNumericOptions(integer, decimal));
            }
        });
    }

    function getAutoNumericOptions(integer, decimal) {
        return {
            aSep: '.',
            aDec: ',',
            altDec: '.',
            vMin: toVMaskAutoNumeric(integer, decimal, '0'),
            vMax: toVMaskAutoNumeric(integer, decimal, '9')
        };
    }

    function toVMaskAutoNumeric(integer, decimal, value) {
        return "{0}.{1}".format(toVNumAutoNumeric(integer, value), toVNumAutoNumeric(decimal, value));
    }

    function toVNumAutoNumeric(qnt, value) {
        var result = "";
        for (var i = 0; i < qnt; i = i + 1) {
            result = result.concat(value);
        }
        return result;
    }

    function listenToggleProdutoGradesF4() {
        "use stric";

        // se alterar aqui, verificar se tem que alterar no ModalGrupoContas.prototype.listenToggleProdutoGradesF4

        $('#inputCodigoProduto').on('focus', function () {
            "use strict";
            $('#linkButtonModalProdutos').show();
            $('#linkButtonModalGrade1').hide();
            $('#linkButtonModalGrade2').hide();
            $('#linkButtonModalGrade3').hide();
        });
        $('#inputCodigoGrade1').on('focus', function () {
            "use strict";
            $('#linkButtonModalProdutos').hide();
            $('#linkButtonModalGrade1').show();
            $('#linkButtonModalGrade2').hide();
            $('#linkButtonModalGrade3').hide();
        });
        $('#inputCodigoGrade2').on('focus', function () {
            "use strict";
            $('#linkButtonModalProdutos').hide();
            $('#linkButtonModalGrade1').hide();
            $('#linkButtonModalGrade2').show();
            $('#linkButtonModalGrade3').hide();
        });
        $('#inputCodigoGrade3').on('focus', function () {
            "use strict";
            $('#linkButtonModalProdutos').hide();
            $('#linkButtonModalGrade1').hide();
            $('#linkButtonModalGrade2').hide();
            $('#linkButtonModalGrade3').show();
        });
    }

    function dateValidatorOnValid(validator) {
        var input = $(validator.input);
        input.prev().removeClass('radar-error');
        input.removeClass('radar-error');
    }

    function dateValidatorOnInvalid(validator) {
        var u = new Util();
        var input = $(validator.input);
        input.prev().addClass('radar-error');
        input.addClass('radar-error');
        if (!validator.v2)
            input.focus();

        if (validator.isMMAAAA) {
            if (!validator.input.value.match(/^\d{2}\/\d{4}$/)) {
                u.alert('Informe uma data com o formato MM/AAAA.', alertBehavior.error);
            } else {
                u.alert('A data: "{0}" não é uma data válida'.format(input.val()), alertBehavior.error);
            }
        }
        else {
            if (validator.input.value.match(/^\d{2}\/\d{2}\/\d{2}$/)) {
                u.alert('Informe uma data com o formato DD/MM/AAAA.', alertBehavior.error);
            } else {
                u.alert('A data: "{0}" não é uma data válida'.format(input.val()), alertBehavior.error);
            }
        }
    }

    function listendHelp() {
        $('.radar-help').on('click', function (e) {
            var basHelp = window.baseUrl + 'helps/';

            var inp = e.currentTarget;
            if (inp.hasAttribute('data-help')) {
                var help = inp.getAttribute('data-help');
                if (inp.hasAttribute('data-title')) {
                    var title = inp.getAttribute('data-title');
                    window.open(basHelp + help, title);
                } else {
                    window.open(basHelp + help, "Help");
                };
            }
        });
    }

    function setFilialDefault(validator, setTodas) {
        getJsonFromRoute("Empresarial/F4Filial/GetFilialPadrao_E_QuantidadeFiliaisAtivas").done(
            function (data) {
                if (data.IsAlert)
                    throw new Error(data.Message);
                // quando tem mas de uma Filial ativa, retorna "0 - Todas Filiais"
                if (data.QuantidadeFiliaisAtivas > 1) {
                    if (setTodas)
                        validator.setValues(data.Codigo, data.Nome);
                    validator.enable();
                }
                else {
                    validator.setValues(data.Codigo, data.Nome);
                    validator.disable();
                }
            }
        );
    }

    //Objects

    var Util = function () {
    };

    Util.prototype.addButtonHelpBreadcrumb = function (help, title) {
        if ($(".breadcrumb").length > 0) {
            var html = '\
                <div class="help-navbar-container">\
                    <a href="#" role="button" data-toggle="modal" class="radar-help help-navbar-link" data-help="' + help + '" data-title="' + title + '"><i class="sprite-help-blue"></i></a>\
                </div>\
                ';
            $(".breadcrumb").append(html);
            listendHelp();
        }
    };

    Util.prototype.alert = function (message, behavior, untilClick, pAlertId) {
        var modal = "";

        // ??? como evitar mesma mensagem aparecer mais de uma vez
        var alertId = "alert" + Date.now();
        //if (pAlertId !== undefined && pAlertId !== "")
        //    alertId = pAlertId;

        modal += '<div id="' + alertId + '" class="alert alert-' + behavior + ' " data-dismiss="alert" >';
        modal += '<a class="close" data-dismiss="alert" href="#">&times;</a>';
        modal += '<strong>' + message + '</strong></i>';
        modal += '</div>';

        if (untilClick !== true) {
            setTimeout(function () {
                $("#" + alertId).click();
            }, 5000);
        }

        //if ($("#alertMessage > #" + alertId).length === 0)
        $("#alertMessage").append(modal);
    };

    Util.prototype.dialog = function (title, message, onOk, onCancel, lastFieldFocus, v2) {
        "use strict";
        var modal = "" +
        '<div id="dialogModal" class="modal hide" style="top:20%"  tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">' +
        '<div class="modal-header" style="background-color: #314A63">' +
        '<h4 id="myModalLabel" style="color: white">' + (title != undefined && title != null && title != "" ? title : 'Confirmação') + '</h4>' +
        '</div>' +
        '<div class="modal-body">' +
        '<p>' + message + '</p>' +
        '</div>' +
        '<div class="modal-footer">' +
        '<button id="buttonConfirm" class="btn btn-inverse btn-small " data-dismiss="modal">Sim</button>' +
        '<button id="buttonCancel" class="btn btn-inverse btn-small" data-dismiss="modal" aria-hidden="true">Não</button>' +
        '</div>' +
        '</div>';
        document.getElementById('modalDiv').innerHTML = modal;

        $("#buttonConfirm").on('click', function (ev) {
            onOk(ev);
            if (v2) $('#dialogModal').modal('hide');
        });

        if (onCancel !== undefined && onCancel !== null) {
            $('#buttonCancel').on('click', function (ev) {
                onCancel(ev);
                if (v2) $('#dialogModal').modal('hide');
            });
        }

        if (lastFieldFocus !== undefined && lastFieldFocus !== null) {
            $('#cancelModal').on('hidden', function () {
                $("#" + lastFieldFocus).focus();
            });
        }

        if (v2) $('#dialogModal').modal('show');
    };

    Util.prototype.dialogOk = function (title, message, callback, v2, onHiddenExecute, behavior) {
        "use strict";

        var htmlMessage = message;
        if (v2 && behavior) {
            if (behavior === alertBehavior.success) {
                title = "Mensagem";
                htmlMessage = '<i class="sprite-warning-green"></i>&nbsp&nbsp&nbsp' + message;
            }
            else if (behavior === alertBehavior.warning) {
                title = "Aviso";
                htmlMessage = '<i class="sprite-warning-orange"></i>&nbsp&nbsp&nbsp' + message;
            }
            else if (behavior === alertBehavior.error) {
                title = "Erro";
                htmlMessage = '<i class="sprite-warning-red"></i>&nbsp&nbsp&nbsp' + message;
            }
        }

        var modal = "" +
        '<div id="dialogModalOk" class="modal hide" style="top:20%" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">' +
        '<div class="modal-header" style="background-color: #314A63">' +
        '<h4 id="myModalLabel" style="color: white">' + title + '</h4>' +
        '</div>' +
        '<div class="modal-body">' +
        '<p>' + htmlMessage + '</p>' +
        '</div>' +
        '<div class="modal-footer">' +
        '<button id="buttonOk" class="btn btn-inverse btn-small" data-dismiss="modal" aria-hidden="true">OK</button>' +
        '</div>' +
        '</div>';
        document.getElementById('modalDiv').innerHTML = modal;

        if (callback) {
            $('#buttonOk').on('click', function () {
                callback();
            });
        }

        if (v2) {
            $('#buttonOk').on('click', function () {
                $('#dialogModalOk').modal('hide');
            });
            $('#dialogModalOk').modal('show');
        }

        if (onHiddenExecute) {
            $("#dialogModalOk").on("hidden", function () {
                onHiddenExecute();
            })
        }
    };

    Util.prototype.getAlertBehavior = function (level) {
        "use strict";
        switch (level) {
            case 'success':
                return alertBehavior.success;
            case 'warning':
                return alertBehavior.warning;
            case 'error':
                return alertBehavior.error;
            default:
                return alertBehavior.warning;
        }
    };

    Util.prototype.getAlertBehaviorNumber = function (level) {
        "use strict";
        switch (level) {
            case '1':
                return alertBehavior.success;
            case '2':
                return alertBehavior.warning;
            case '3':
                return alertBehavior.error;
            default:
                return alertBehavior.warning;
        }
    };

    Util.prototype.getControlGroupBehavior = function (controlGroupLevel) {
        "use strict";
        switch (controlGroupLevel) {
            case 'normal':
                return "control-group";
            case 'success':
                return "control-group success";
            case 'error':
                return "control-group error";
            default:
                return "control-group warning";
        }
    };

    Util.prototype.required = function (inputId, descriptionId, message) {
        "use strict";
        var self = this,
            input = document.getElementById(inputId),
            value = input.value,
            description = document.getElementById(descriptionId);

        if (value === "" || parseInt(value) === 0) {
            self.alterControlGroupBehavior(inputId, self.getControlGroupBehavior(alertLevel.error));
            self.alert(message, self.getAlertBehavior(alertLevel.error));
            description.innerHTML = message;
            input.focus();
            throw new Error(message);
        } else {
            self.alterControlGroupBehavior(inputId, self.getControlGroupBehavior(alertLevel.normal));
            description.innerHTML = "";
            return value;
        }
    };

    Util.prototype.alterControlGroupBehavior = function (inputId, behavior) {
        "use strict";
        document.getElementById(inputId).parentNode.parentNode.className = behavior;
    };

    Util.prototype.alterTab = function (tabToAlterIndex) {
        var tabsLi = $("#myTab li"),
            j = tabsLi.length,
            tabPane = $(".tab-pane");
        for (var i = 0; i < j; i = i + 1) {
            tabsLi[i].className = "";
            tabPane[i].className = "tab-pane fade";
        }
        tabsLi[tabToAlterIndex].className = "active";
        tabPane[tabToAlterIndex].className = "tab-pane fade active in";
    };

    Util.prototype.changeTab = function (tabToAlterIndex) {
        var tabs = $("#tabs > li");
        var tabPanes = $(".tab-pane");
        tabs.removeClass("active");
        tabPanes.removeClass("active in");
        $(tabs[tabToAlterIndex]).addClass("active");
        $(tabPanes[tabToAlterIndex]).addClass("active in");
    };

    Util.prototype.enable = function (inputId) {
        "use strict";
        var input = document.getElementById(inputId);
        input.disabled = false;
    };

    Util.prototype.disable = function (inputId) {
        "use strict";
        var input = document.getElementById(inputId);
        input.disabled = true;
    };


    function SimpleDateComparer(options) {
        this.idA = options.idA;
        this.idB = options.idB;
        this.inputA = null;
        this.inputB = null;

        this.onLess = options.onLess;
        this.onEqual = options.onEqual;
        this.onGreater = options.onGreater;

        this.onInvalid = options.onInvalid;
        this.onEmpty = options.onEmpty;

        this.emptyInvalid = options.emptyInvalid;

        this.listen();
    };

    SimpleDateComparer.prototype.listen = function () {
        "use strict";
        var self = this;
        self.inputA = $('#' + self.idA);
        self.inputB = $('#' + self.idB);
        makeDatePicker('#' + self.idA);
        makeDatePicker('#' + self.idB);
        self.inputA.on('change', function () {
            self.compare();
        });
        self.inputA.on('blur', function () {
            self.compare();
        });
        self.inputB.on('change', function () {
            self.compare();
        });
        self.inputB.on('blur', function () {
            self.compare();
        });
    };


    SimpleDateComparer.prototype.compare = function () {
        "use strict";
        var self = this;

        var valA = self.inputA.val();
        var valB = self.inputB.val();

        if (valA === "") {
            if (self.onEmpty) {
                self.onEmpty(self.inputA[0]);
                return;
            }
            if (self.emptyInvalid)
                return;
        } else {
            if (valA.toDate() == 'Invalid Date') {
                if (self.onInvalid) {
                    self.onInvalid(self.inputA[0]);
                    return;
                } else {
                    return;
                }
            }
        }

        if (valB === "") {
            if (self.onEmpty) {
                self.onEmpty(self.inputB[0]);
            }
            if (self.emptyInvalid)
                return;
        } else {
            if (valB.toDate() == 'Invalid Date') {
                if (self.onInvalid) {
                    self.onInvalid(self.inputB[0]);
                    return;
                } else {
                    return;
                }
            }
        }

        var result = valA.toDate().compare(valB.toDate());
        switch (result) {
            case 'less':
                if (self.onLess)
                    self.onLess();
                break;
            case 'equal':
                if (self.onEqual)
                    self.onEqual();
                break;
            case 'greater':
                if (self.onGreater)
                    self.onGreater();
                break;
        }
        return;
    };

    function Table(options) {
        this.id = options.id;
        this.route = options.route;
        this.toolbar = options.toolbar;
        this.pageable = options.pageable;
        this.showFilter = options.showFilter;
        this.columns = options.columns;
        this.columnsLegend = options.columnsLegend;
        this.scrollable = options.scrollable;
        this.params = options.params;
        this.onChange = options.onChange;
        this.onDataBound = options.onDataBound;
        this.onDataBinding = options.onDataBinding;
        this.onDblClick = options.onDblClick;
        this.dataSourceType = options.dataSourceType;
        this.dataSource = options.dataSource;
        this.columnMenu = options.columnMenu;
        this.sortable = options.sortable;
        this.fieldDepende = options.fieldDepende;
        this.mixedFields = options.mixedFields;
        this.ModalGrupoContas = options.ModalGrupoContas;
        this.classePai = "";
        this.onAfterReadFilteredDataSource = null;
    }

    Table.prototype.make = function () {
        "use strict";
        var self = this;
        self.grid = $("#" + self.id).kendoGrid({
            dataSource: self.getChoosedDataSource(),

            change: function (ev) {
                var grid = this;

                var ids = grid.select().map(function () {
                    return grid.dataItem($(this)).Id;
                }).toArray();

                localStorage.setItem('settings_' + self.id + '_rows', JSON.stringify(ids));

                if (self.onChange) {
                    self.onChange(ev);
                }
            },
            dataBound: function (ev) {
                var grid = this;
                var dataSource = grid.dataSource;

                var state = kendo.stringify({
                    page: dataSource.page(),
                    pageSize: dataSource.pageSize(),
                    sort: dataSource.sort(),
                    group: dataSource.group(),
                    filter: dataSource.filter()
                });

                currentUser.setCustomData("settings_" + self.id + "_state", state);
                if (self.onDataBound) {
                    self.onDataBound(ev);
                }

                var toutId = setTimeout(function () {
                    //setMaxPagersSize(5);
                });
            },
            dataBinding: function (ev) {
                if (self.onDataBinding) {
                    self.onDataBinding(ev);
                }
            },
            columnReorder: function () {
                self.saveState(this);
                self.saveColumns(this);
            },

            toolbar: self.toolbar ? self.toolbar : self.showFilter ? self.filterCode() : "",
            reorderable: true,
            resizable: true,
            selectable: true,
            columnMenu: self.columnMenu !== undefined ? self.columnMenu : true,
            sortable: self.sortable !== undefined ? self.sortable : {
                allowUnsort: true
            },
            pageable: self.pageable !== undefined ? self.pageable : {
                refresh: true,
                numeric: true,
                pageSizes: [5, 10, 15],
                buttonCount: 5
            },
            columns: self.loadColumns()
        });

        self.grid = self.getGrid();
        self.loadSettings();
        self.listen();
    };

    Table.prototype.listen = function () {
        "use strict";
        var self = this;
        function makeFilter() {
            var filter = {};
            filter['Term'] = document.getElementById("input-filter-term-" + self.id).value;
            filter['Field'] = document.getElementById("select-filter-" + self.id).value;
            filter['Operator'] = "contains";

            if (self.dataSourceType == "Normal" || self.dataSourceType == "Parameter" || self.dataSourceType == "Mixed") {
                self.filter(filter['Field'], filter['Operator'], filter['Term']);
            } else {
                var dataSourceOptions = self.getFilteredDataSource(filter);
                var dataSource = new kendo.data.DataSource(dataSourceOptions);
                dataSource.read();

                if (self.grid != null) {
                    self.grid.setDataSource(dataSource);
                }
            }
        }

        if (self.showFilter) {
            $("#inputF4DoFilter" + self.id).on('click', function () {
                makeFilter();
            });
            $("#input-filter-term-" + self.id).on('keypress', function (ev) {
                var key = ev.keyCode || ev.which;
                if (key == 13) {
                    makeFilter();
                }
            });
        }

        $("#" + self.id).on('mousemove', function () {
            self.saveColumns();
        });

        self.loadSettings();
    };

    Table.prototype.getGrid = function () {
        "use strict";
        var self = this;
        return $("#" + self.id).data("kendoGrid");
    };

    Table.prototype.getSelectedData = function () {
        "use strict";
        var self = this;
        var grid = $("#" + self.id).data("kendoGrid");
        var row = grid.select();
        return grid.dataItem(row);
    };

    Table.prototype.getColumns = function () {
        "use strict";
        var self = this;
        if (localStorage) {
            var stringyColumns = currentUser.getCustomData("settings_" + self.id + "_columns");
            var columns = JSON.parse(stringyColumns);
            return columns;
        }
        return null;
    };

    Table.prototype.saveColumns = function (grid) {
        "use strict";
        var self = this;
        setTimeout(function () {
            if (!grid) {
                grid = self.grid;
            }
            var columns = grid.columns;
            var stringyColumns = JSON.stringify(columns);
            if (localStorage) {
                currentUser.setCustomData("settings_" + self.id + "_columns", stringyColumns);
            }
        }, 100);
    };

    Table.prototype.loadColumns = function () {
        "use strict";
        var self = this;
        var result;
        var columns = self.getColumns();
        result = columns ? columns : self.columns;
        return result;
    };

    Table.prototype.getState = function () {
        "use strict";
        var self = this;
        if (localStorage) {
            return JSON.parse(currentUser.getCustomData("settings_" + self.id + "_state"));
        }
        return null;
    };

    Table.prototype.saveState = function (grid) {
        "use strict";
        if (localStorage) {
            var self = this;
            var dataSource = grid.dataSource;
            var state = kendo.stringify({
                page: dataSource.page(),
                pageSize: dataSource.pageSize(),
                sort: dataSource.sort(),
                group: dataSource.group(),
                filter: dataSource.filter()
            });
            currentUser.setCustomData("settings_" + self.id + "_state", state);
        }
    };

    Table.prototype.loadState = function () {
        "use strict";
        var self = this;
        var dataSource = self.getDataSource();
        var state = self.getState();
        if (state) {
            if (state.filter) {
                parseFilterDates(state.filter, dataSource.options.schema.model.fields);
            }
            dataSource.query(state);
        } else {
            dataSource.read();
        }

        function parseFilterDates(filter, fields) {
            if (filter.filters) {
                for (var i = 0; i < filter.filters.length; i++) {
                    parseFilterDates(filter.filters[i], fields);
                }
            } else {
                if (fields[filter.field].type == "date") {
                    filter.value = kendo.parseDate(filter.value);
                }
            }
        }
    };

    Table.prototype.loadSettings = function () {
        "use strict";
        var self = this;
        self.loadState();
    };

    Table.prototype.getChoosedDataSource = function () {
        "use strict";
        var self = this;
        switch (self.dataSourceType) {
            case "Filtered":
                return self.getFilteredDataSource();
            case "Normal":
                return self.getNormalDataSource();
            case "Parameter":
                return self.getParameterDataSource();
            case "Object":
                return self.getObjectDataSource();
            case "Mixed":
                return self.getMixedDataSource();
            default:
                return self.getNormalDataSource();
        }
    };

    Table.prototype.getSortingOptions = function () {
        "use strict";
        var self = this;
        var data = {};
        if (self.grid) {
            if (self.grid.dataSource["_sort"]) {
                var sortingOptions = self.grid.dataSource['_sort'][0];
                if (sortingOptions) {
                    data['Field'] = sortingOptions.field;
                    data['Sort'] = sortingOptions.dir;
                }
            }
        }
        return data;
    };

    Table.prototype.getPagingOptions = function (options) {
        "use strict";
        var data = {};
        data['Page'] = options.data.page;
        data['PageSize'] = options.data.pageSize;
        data['Skip'] = options.data.skip;
        data['Take'] = options.data.take;
        return data;
    };

    Table.prototype.getFilteredDataSource = function (filter) {
        "use strict";
        var self = this;
        var u = new Util();
        var state = self.getState();
        var defaultPageSize = self.pageable ? self.pageable.pageSizes[0] : 10;
        var pageSize = state ? (state.pageSize ? state.pageSize : defaultPageSize) : defaultPageSize;
        var dataSource = {
            type: "JSON",
            transport: {
                read: function (options) {
                    var data = {};
                    data["Sorting"] = self.getSortingOptions(options);
                    data["Filter"] = filter;
                    data['Paging'] = self.getPagingOptions(options);
                    data["classePai"] = self.classePai;
                    var params = self.getParams();
                    if (params != undefined) {
                        data['Params'] = params;
                    }
                    $.ajax({
                        headers: {
                            'Accept': 'application/json',
                            'Content-Type': 'application/json'
                        },
                        url: self.route,
                        dataType: "json",
                        type: "POST",
                        data: JSON.stringify(data),
                        success: function (result) {
                            if (result.IsAlert) {
                                u.alert(result.Message, getAlertBehavior(result.Level));
                                $(".k-loading-mask").remove();
                                options.success({ data: new Array(), total: 0 });
                                if (self.onAfterReadFilteredDataSource) {
                                    self.onAfterReadFilteredDataSource(self, false);
                                }
                            } else {
                                options.success(result);
                                if (self.onAfterReadFilteredDataSource) {
                                    self.onAfterReadFilteredDataSource(self, true);
                                }
                            }
                        },
                        error: function (result) {
                            $(".k-loading-mask").remove();
                            u.alert(result.status + "-" + result.statusText, alertBehavior.error);
                            if (self.onAfterReadFilteredDataSource) {
                                self.onAfterReadFilteredDataSource(self, false);
                            }
                        }
                    });
                }
            },
            schema: {
                data: 'data',
                total: 'total'
            },
            serverPaging: true,
            serverSorting: true,
            pageSize: pageSize
        };
        return dataSource;
    };

    Table.prototype.getParameterDataSource = function () {
        "use strict";
        var self = this;
        var u = new Util();
        var dataSource = {
            type: "JSON",
            transport: {
                read: function (options) {
                    var data = {};
                    data['Params'] = self.getParams();
                    $.ajax({
                        headers: {
                            'Accept': 'application/json',
                            'Content-Type': 'application/json'
                        },
                        url: self.route,
                        dataType: "json",
                        type: "POST",
                        data: JSON.stringify(data),
                        success: function (result) {
                            if (result.IsAlert) {
                                u.alert(data.Message, getAlertBehavior(result.Level));
                                $(".k-loading-mask").remove();
                                options.success({ data: new Array(), total: 0 });
                                throw new Error(result.Message);
                            } else {
                                options.success(result);
                            }
                        },
                        error: function (result) {
                            $(".k-loading-mask").remove();
                            u.alert(result.status + "-" + result.statusText, alertBehavior.error);
                        }
                    });
                }
            },
            schema: {
                data: 'data',
                total: 'total'
            },
            pageSize: 10
        };
        return dataSource;
    };

    Table.prototype.getNormalDataSource = function () {
        "use strict";
        var self = this;
        var u = new Util();
        var dataSource = {
            type: "JSON",
            transport: {
                read: function (options) {
                    $.ajax({
                        headers: {
                            'Accept': 'application/json',
                            'Content-Type': 'application/json'
                        },
                        url: self.route,
                        dataType: "json",
                        type: "GET",
                        success: function (result) {
                            if (result.IsAlert) {
                                u.alert(data.Message, getAlertBehavior(result.Level));
                                $(".k-loading-mask").remove();
                                options.success({ data: new Array(), total: 0 });
                                throw new Error(result.Message);
                            } else {
                                options.success(result);
                            }
                        },
                        error: function (result) {
                            $(".k-loading-mask").remove();
                            u.alert(result.status + "-" + result.statusText, alertBehavior.error);
                        }
                    });
                }
            },
            pageSize: 10
        };
        return dataSource;
    };

    Table.prototype.getMixedDataSource = function (filter) {
        "use strict";
        var self = this;
        var u = new Util();
        var dataSource = {
            type: "JSON",
            transport: {
                read: function (options) {
                    var data = {};

                    var opt = {};
                    opt["Sorting"] = self.getSortingOptions(options);
                    opt["Filter"] = filter;
                    opt["Paging"] = self.getPagingOptions(options);
                    data["Options"] = opt;

                    var mixedFields = self.mixedFields;

                    if (mixedFields != undefined) {
                        var len = mixedFields.length;

                        for (var i = 0; i < len; i = i + 1) {
                            var codInput = mixedFields[i].id.replace("input", "");
                            data[codInput] = mixedFields[i].value;
                        }
                    }

                    $.ajax({
                        headers: {
                            'Accept': 'application/json',
                            'Content-Type': 'application/json'
                        },
                        url: self.route,
                        dataType: "json",
                        type: "POST",
                        data: JSON.stringify(data),
                        success: function (result) {
                            if (result.IsAlert) {
                                u.alert(result.Message, getAlertBehavior(result.Level));
                                $(".k-loading-mask").remove();
                                options.success({ data: new Array(), total: 0 });
                            } else {
                                options.success(result);
                            }
                        },
                        error: function (result) {
                            $(".k-loading-mask").remove();
                            u.alert(result.status + "-" + result.statusText, alertBehavior.error);
                        }
                    });
                }
            },
            schema: {
                data: 'data',
                total: 'total'
            },
            serverPaging: true,
            serverSorting: true,
            pageSize: 10
        };
        return dataSource;
    };

    Table.prototype.getObjectDataSource = function () {
        "use strict";
        var self = this;
        return self.dataSource;
    };

    Table.prototype.getDataSource = function () {
        "use strict";
        var self = this;
        return self.grid.dataSource;
    };

    Table.prototype.setDataSource = function (dataSource) {
        "use strict";
        var self = this;
        $("#" + self.id).data("kendoGrid").setDataSource(dataSource);
    };

    Table.prototype.filter = function (field, operator, term) {
        "use strict";
        var self = this;
        var filter = [
            { field: field, operator: operator, value: term }
        ];

        var dataSource = self.getDataSource();
        dataSource.filter(filter);
    };

    Table.prototype.filters = function (filters) {
        "use strict";
        var self = this;
        var dataSource = self.getDataSource();
        dataSource.filter(filters);
    };

    Table.prototype.clearFilter = function () {
        "use strict";
        var self = this;
        var dataSource = self.getDataSource();
        dataSource.filter(null);
    };

    Table.prototype.filterCode = function () {
        "use strict";
        var self = this;
        var columns = self.columns;
        var j = columns.length;

        var filterCode = "";
        filterCode += "<select id='select-filter-" + self.id + "'>";
        for (var i = 0; i < j; i = i + 1) {
            filterCode += "<option value='" + columns[i].field + "'>" + columns[i].title + "</option>";
        }
        filterCode += "</select'>";
        filterCode += "<input type='text' id='input-filter-term-" + self.id + "' style='margin-bottom: 0px'/>";
        filterCode += "<a id='inputF4DoFilter" + self.id + "' role='button' style='cursor: pointer; margin-left: 5px'><i class='icon-filter'></i></a>";
        filterCode += "<span id='inputFilterLegend' class='radar-filter-legend'></span>";

        return filterCode;
    };

    Table.prototype.selectFilterLegend = function (value) {
        "use strict";
        var self = this;
        if (self.columnsLegend) {
            var legend = self.columnsLegend[value];
            var legendSpan = document.getElementById('inputFilterLegend');
            if (legend) {
                legendSpan.innerHTML = legend;
            } else {
                legendSpan.innerHTML = "";
            }
        }
    };

    Table.prototype.makeFilter = function () {
        "use strict";
        var self = this;
        $('#select-filter-' + self.id).kendoDropDownList({
            dataTextField: "title",
            dataValueField: "value",
            select: function (e) {
                var dataItem = this.dataItem(e.item.index());
                self.selectFilterLegend(dataItem.value);
            }
        });

        var value = document.getElementById('select-filter-' + self.id).value;
        self.selectFilterLegend(value);
    };

    Table.prototype.getParams = function () {
        "use strict";
        var self = this,
            search = self.params,
            result = {};
        if (search == undefined) {
            return search;
        }

        var j = search.length,
            validator;
        for (var i = 0; i < j; i = i + 1) {
            validator = search[i];
            result[validator.field] = validator.value;
            if (self.v2 && (validator.invalid || validator.isEmpty()) && self.paramsDefault[i]) {
                result[validator.field] = self.paramsDefault[i];
            }
        }

        return result;
    };

    Table.prototype.validate = function () {
        "use strict";
        var self = this,
            params = self.params,
            j = params ? params.length : 0,
            validator;

        for (var i = 0; i < j; i = i + 1) {
            validator = params[i];
            if (self.v2) {
                // somente critica se o params for obrigatorio,
                // usado na Assistencia Tecnica, F4 do campo servico, onde eh passado o parametro
                // tabela precos dos servicos, que nao eh obrigatorio, mas tem que passar por default
                // a tabela padao
                if (validator.invalid && self.paramsRequired[i]) {
                    validator.focus(controlGroupBehavior.warning);
                    validator.showValidateMessage();
                    return true;
                }
            }
            else {
                if (validator.invalid) {
                    validator.focus(controlGroupBehavior.warning);
                    validator.showValidateMessage();
                    return true;
                }
            }
        }
        return false;
    };

    Table.prototype.refresh = function () {
        "use strict";
        var self = this;

        if (self.grid !== undefined)
            self.grid.dataSource.read();
    };

    Table.prototype.clearSelectedData = function () {
        "use strict";
        var self = this;
        self.grid.clearSelection();
    };

    Table.prototype.haveDependency = function () {
        "use strict";
        var self = this;
        return self.validate();
    };

    function ModalGrupoContas(options) {
        "use strict";
        var self = this;

        self.tipo = options.tipo;
        self.id = options.id;

        self.executeOnShowAndOnHidden = true;
        self.onShow = options.onShow;
        self.onHidden = options.onHidden;

        self.u = new Util();
        self.grid = null;

        self.configValidatorConta = options.validatorConta;
        self.tableConta = options.tableConta;
        self.configModalConta = options.modalConta;

        self.makeModal();
        // carrega o grid apenas quando for visualizar, no bind-click do self.button
        // self.makeGrid();
        if (self.tipo === "Produto") {
            self.validatorInput = options.validatorInput;
            self.button = self.validatorInput[0].linkButtonModalGrupoContas;
            self.makeInputConta_Produto();
            self.listen_Produto();
        }
        else if (self.tipo === "TipoOperacao") {
            self.validatorInput = options.validatorInput;
            self.button = self.validatorInput[0].linkButtonModalGrupoContas;
            self.makeInputConta_TipoOperacao();
            self.listen_TipoOperacao();
        }
        else {
            self.validatorInput = options.validatorInput;
            self.button = self.validatorInput.linkButtonModalGrupoContas;
            self.makeInputConta();
            self.listen();
        }
    }

    ModalGrupoContas.prototype.makeModal = function () {
        "use strict";
        var self = this;

        var htmlModal = "";
        htmlModal += "<div id='ModalGrupoContas_" + self.id + "' class='modal hide' tabindex='-2' role='dialog' aria-hidden='true' style='z-index: 1450'>";

        htmlModal += "    <div class='modal-header' style='background-color: #314A63'>";
        htmlModal += "        <button type='button' class='close' data-dismiss='modal' aria-hidden='true'>&times;</button>";
        htmlModal += "        <h4 style='color: white'>Contas</h4>";
        htmlModal += "    </div>";

        htmlModal += "    <div class='modal-body'>";
        htmlModal += "        <fieldset class='radar-fieldset'>";
        htmlModal += "            <legend>Grupo de Contas</legend>";

        htmlModal += "            <div class='radar-row' style='margin-bottom: 15px;'>";
        htmlModal += "                <div class='control-group'>";
        htmlModal += "                    <div class='controls'>";
        htmlModal += "                        <div id='ModalGrupoContas_GridGrupoContas" + self.id + "'></div>";
        htmlModal += "                    </div>";
        htmlModal += "                </div>";
        htmlModal += "            </div>";

        htmlModal += "            <div class='radar-row'>";
        htmlModal += "                <div class='radar-control'>";

        if (self.tipo === "Produto") {
            htmlModal += "                <div class='control-group' style='width: 330px;'>";
            htmlModal += '                    <label for="ModalGrupoContas_inputCodigoProduto' + self.id + '" class="control-label radar-inline" style="width: 65px; text-align: left; float: left;">Produto: </label>';
            htmlModal += '                    <div class="controls" style="float: left">';
            htmlModal += '                        <input type="text" id="ModalGrupoContas_inputCodigoProduto' + self.id + '" maxlength="60" style="width: 100px; margin: 0">';
            htmlModal += '                        <input type="text" id="ModalGrupoContas_inputCodigoGrade1' + self.id + '" maxlength="5" style="width: 30px; margin: 0" disabled>';
            htmlModal += '                        <input type="text" id="ModalGrupoContas_inputCodigoGrade2' + self.id + '" maxlength="5" style="width: 30px; margin: 0" disabled>';
            htmlModal += '                        <input type="text" id="ModalGrupoContas_inputCodigoGrade3' + self.id + '" maxlength="5" style="width: 30px; margin: 0" disabled>';
            htmlModal += '                        <a id="ModalGrupoContas_linkButtonModalProdutos' + self.id + '" href="#ModalGrupoContas_modalProdutos' + self.id + '" role="button" data-toggle="modal"><i class="icon-search"></i></a>';
            htmlModal += '                        <a id="ModalGrupoContas_linkButtonModalGrade1' + self.id + '" href="#ModalGrupoContas_modalGrade1' + self.id + '" role="button" data-toggle="modal" hidden><i class="icon-search"></i></a>';
            htmlModal += '                        <a id="ModalGrupoContas_linkButtonModalGrade2' + self.id + '" href="#ModalGrupoContas_modalGrade2' + self.id + '" role="button" data-toggle="modal" hidden><i class="icon-search"></i></a>';
            htmlModal += '                        <a id="ModalGrupoContas_linkButtonModalGrade3' + self.id + '" href="#ModalGrupoContas_modalGrade3' + self.id + '" role="button" data-toggle="modal" hidden><i class="icon-search"></i></a>';
            htmlModal += '                        <span id="ModalGrupoContas_descriptionCodigoProduto' + self.id + '" class="help-inline" style="display: none"></span>';
            htmlModal += '                        <span id="ModalGrupoContas_descriptionCodigoGrade1' + self.id + '" class="help-inline" style="display: none"></span>';
            htmlModal += '                        <span id="ModalGrupoContas_descriptionCodigoGrade2' + self.id + '" class="help-inline" style="display: none"></span>';
            htmlModal += '                        <span id="ModalGrupoContas_descriptionCodigoGrade3' + self.id + '" class="help-inline" style="display: none"></span>';
        }
        else if (self.tipo === "TipoOperacao") {
            htmlModal += '                <div class="control-group"  style="width: 330px;">';
            htmlModal += '                    <label class="control-label" for="ModalGrupoContas_inputTipoOperacao' + self.id + '" style="width: 120px; text-align: left; float: left;">Tipo de Operação:</label>';
            htmlModal += '                    <div class="controls" style="float: left">';
            htmlModal += '                        <input type="text" id="ModalGrupoContas_inputTipoOperacao' + self.id + '" value="" style="width: 200px; padding-left: 4px;" />';
        }
        else {
            htmlModal += "                <div class='control-group'>";
            htmlModal += "                    <label for='ModalGrupoContas_InputCodigoConta" + self.id + "' class='control-label' style='display: inline-block;'>Conta: </label>";
            htmlModal += "                    <div class='controls' style='display: inline-block;'>";
            htmlModal += "                        <input type='text' id='ModalGrupoContas_InputCodigoConta" + self.id + "' maxlength='14' style='width: 115px;' />";
            htmlModal += "                        <a id='ModalGrupoContas_LinkButtonModalConta" + self.id + "' href='#ModalGrupoContas_ModalConta" + self.id + "' role='button' data-toggle='modal'><i class='icon-search'></i></a>";
            htmlModal += "                        <span id='ModalGrupoContas_DescriptionCodigoConta" + self.id + "' class='help-inline radar-inline' style='display: none'></span>";
        }

        htmlModal += "                        </div>";
        htmlModal += "                    </div>";
        htmlModal += "                </div>";
        htmlModal += "                <div class='radar-control' style='float: right;'>";
        htmlModal += "                    <div class='control-group'>";
        htmlModal += "                        <div class='controls'>";
        htmlModal += "                            <input type='button' id='ModalGrupoContas_ButtonAdicionar" + self.id + "' value='Adicionar' class='btn btn-inverse btn-small' style='width: 75px'/>";
        htmlModal += "                            <input type='button' id='ModalGrupoContas_ButtonRemover" + self.id + "' value='Remover' class='btn btn-inverse btn-small' style='width: 75px'/>";
        htmlModal += "                        </div>";
        htmlModal += "                    </div>";
        htmlModal += "                </div>";
        htmlModal += "            </div>";
        htmlModal += "        </fieldset>";
        htmlModal += "    </div>";

        htmlModal += "    <div class='modal-footer'>";
        htmlModal += "        <input type='button' id='ModalGrupoContas_ButtonOk" + self.id + "' value='OK' class='btn btn-inverse btn-small' data-dismiss='modal' aria-hidden='true' style='width: 75px'/>";
        htmlModal += "        <input type='button' id='ModalGrupoContas_ButtonCancel" + self.id + "'  value='Cancelar' class='btn btn-inverse btn-small' data-dismiss='modal' aria-hidden='true' style='width: 75px'/>";
        htmlModal += "    </div>";

        htmlModal += "</div>";

        $("#modalDiv").append(htmlModal);
    };

    ModalGrupoContas.prototype.makeGrid = function () {
        "use strict";
        var self = this;

        var ModalGrupoContas_GridGrupoContas = new Table({
            "id": "ModalGrupoContas_GridGrupoContas" + self.id,
            "pageable": false,
            "columns": [
                { field: "Codigo", title: "Código", width: 20, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } },
                { field: "Nome", title: "Nome", width: 100, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } }
            ],
            "dataSourceType": "Object"
        });
        ModalGrupoContas_GridGrupoContas.make();
        self.grid = ModalGrupoContas_GridGrupoContas;

        // seta a altura do grid
        $("#ModalGrupoContas_GridGrupoContas" + self.id + " .k-grid-content").height(150);

        // carrega os dados
        var data = new kendo.data.DataSource({ data: [] });
        if (self.validatorInput.getVarios()) {
            // se jah tem varias contas selecionadas, apenas carrega o datasource
            var registros = self.validatorInput.getGrupoContas();
            for (var atual in registros) {
                data.options.data.push(registros[atual]);
            }
        }
        else {
            // se tem apenas uma conta selecionada, cria um datasource com apenas um item
            if (!self.validatorInput.invalid) {
                data.options.data.push({
                    Codigo: $("#" + self.validatorInput.inputId).val(),
                    Nome: $("#" + self.validatorInput.descriptionId).html()
                });
            }
        }

        $("#ModalGrupoContas_GridGrupoContas" + self.id).data("kendoGrid").setDataSource(data);
    };

    ModalGrupoContas.prototype.makeInputConta = function () {
        "use strict";
        var self = this;

        var validatorConta = new Validator({
            field: "ModalGrupoContas_InputCodigoConta" + self.id,
            fieldDescriptionId: "ModalGrupoContas_DescriptionCodigoConta" + self.id,
            fieldSearch: self.configValidatorConta.fieldSearch,
            onPendencyMessage: self.configValidatorConta.onPendencyMessage,
            route: self.configValidatorConta.route,
            v2: self.configValidatorConta.v2,
            ModalGrupoContas: true,
            grupoContasFieldNome: self.configValidatorConta.fieldNome,
            onValid: function (data) {
                $("#ModalGrupoContas_InputCodigoConta" + self.id).val(data.Codigo);
                $("#ModalGrupoContas_DescriptionCodigoConta" + self.id).html(data[self.configValidatorConta.fieldNome]);
                if (self.configValidatorConta.onValid)
                    self.configValidatorConta.onValid(data);
            },
            onInvalid: function (data) {
                validatorConta.clear({ error: true });
                validatorConta.focus();
                if (self.configValidatorConta.onInvalid)
                    self.configValidatorConta.onInvalid(data);
            },
            onEmpty: function () {
                validatorConta.clear();
                if (self.configValidatorConta.onEmpty)
                    self.configValidatorConta.onEmpty();
            }
        });
        validatorConta.listen();
        self.validatorConta = validatorConta;

        var ModalGrupoContas_TableConta = new Table({
            id: "ModalGrupoContas_TableConta" + self.id,
            route: self.tableConta.route,
            showFilter: self.tableConta.showFilter,
            ModalGrupoContas: true,
            columns: self.tableConta.columns,
            onChange: function () {
                $("#inputF4ModalOk" + this.id).on("click", function () {
                    var data = ModalGrupoContas_TableConta.getSelectedData();
                    validatorConta.onValid(data);
                    validatorConta.update();
                    $("#ModalGrupoContas_ModalConta" + self.id).modal("hide");
                });
                $("#inputF4ModalCancelar" + this.id).on("click", function () {
                    $("#ModalGrupoContas_ModalConta" + self.id).modal("hide");
                });
            },
            onDataBound: function () {
                $("#ModalGrupoContas_TableConta" + self.id + " table tr").on("dblclick", function () {
                    var data = ModalGrupoContas_TableConta.getSelectedData();
                    validatorConta.onValid(data);
                    validatorConta.update();
                    $("#ModalGrupoContas_ModalConta" + self.id).modal("hide");
                });
                $("#inputF4ModalCancelar" + this.id).on("click", function () {
                    $("#ModalGrupoContas_ModalConta" + self.id).modal("hide");
                });
            },
            dataSourceType: "Filtered"
        });

        var modalConta = new Modal("Conta",
            byId("ModalGrupoContas_LinkButtonModalConta" + self.id),
            byId("ModalGrupoContas_InputCodigoConta" + self.id),
            ModalGrupoContas_TableConta,
            function () {
                self.executeOnShowAndOnHidden = false;
                $("#ModalGrupoContas_" + self.id).modal("hide");
            },
            {
                validatorInput: self.configModalConta ? (self.configModalConta.useClassePai ? validatorConta : null) : null,
                useClassePai: self.configModalConta ? self.configModalConta.useClassePai : null,
                ClassePaiURL: self.configModalConta ? self.configModalConta.ClassePaiURL : null,
                onHidden: function () {
                    $("#ModalGrupoContas_" + self.id).modal("show");
                    self.executeOnShowAndOnHidden = true;
                }
            }
        ).listen();
    };

    ModalGrupoContas.prototype.listen = function () {
        "use strict";
        var self = this;

        $("#ModalGrupoContas_ButtonAdicionar" + self.id).bind("click", function () {
            if (getVal("ModalGrupoContas_InputCodigoConta" + self.id) === "") {
                alert("Conta deve ser informada.");
            }
            else {
                var novoCodigo = getVal("ModalGrupoContas_InputCodigoConta" + self.id);
                var registros = $("#ModalGrupoContas_GridGrupoContas" + self.id).data("kendoGrid").dataSource.data();
                var adicionado = false;
                $.each(registros, function (atual) {
                    if (registros[atual].Codigo === novoCodigo) {
                        adicionado = true;
                    }
                });
                if (!adicionado) {
                    $("#ModalGrupoContas_GridGrupoContas" + self.id).data("kendoGrid").dataSource.add({
                        Codigo: getVal("ModalGrupoContas_InputCodigoConta" + self.id),
                        Nome: getHtml("ModalGrupoContas_DescriptionCodigoConta" + self.id)
                    });
                }
            }
        });

        $("#ModalGrupoContas_ButtonRemover" + self.id).bind("click", function () {
            var registroSelecionado = self.grid.getSelectedData();
            if (registroSelecionado !== null) {
                var registros = $("#ModalGrupoContas_GridGrupoContas" + self.id).data("kendoGrid").dataSource.data();
                $.each(registros, function (atual) {
                    if (registros[atual].Codigo === registroSelecionado.Codigo) {
                        registros.splice(atual, 1);
                        return false;
                    }
                });
            }
        });

        $("#ModalGrupoContas_ButtonOk" + self.id).bind("click", function () {
            var registros = $("#ModalGrupoContas_GridGrupoContas" + self.id).data("kendoGrid").dataSource.data();
            var lista = [];
            $.each(registros, function (atual) {
                lista.push(registros[atual]);
            });
            self.validatorInput.setGrupoContas(lista);
            if (registros.length > 1) {
                self.validatorInput.setVarios(true);
            }
            else {
                self.validatorInput.setVarios(false);
            }
        });

        // quando clicar no botao modal do grupo contas do validator, limpa o campo conta e monta a grid com as contas
        $("#" + self.button).bind("click", function () {
            if (self.executeOnShowAndOnHidden && self.onShow) {
                self.onShow();
            }

            self.validatorConta.setValues("", "");
            self.makeGrid();

            // tem que ser aqui, porque o bind soh funciona quando o codigo html foi adicionado
            // entao tem que ser depois de ter mostrado
            if (self.onHidden) {
                $("#ModalGrupoContas_" + self.id).on("hidden", function () {
                    if (self.executeOnShowAndOnHidden) {
                        self.onHidden();
                    }
                });
            }
        });
    };

    ModalGrupoContas.prototype.makeGrid_Produto = function () {
        "use strict";
        var self = this;

        var ModalGrupoContas_GridGrupoContas = new Table({
            "id": "ModalGrupoContas_GridGrupoContas" + self.id,
            "pageable": false,
            "columns": [
                { field: "Classificacao", title: "Classificação", width: 58, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } },
                { field: "Codigo", title: "Código", width: 40, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } },
                { field: "Nome", title: "Nome", width: 60, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } },
                { field: "Grade1", title: "Grade 1", width: 40, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } },
                { field: "Grade2", title: "Grade 2", width: 40, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } },
                { field: "Grade3", title: "Grade 3", width: 40, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } }
            ],
            "dataSourceType": "Object"
        });
        ModalGrupoContas_GridGrupoContas.make();
        self.grid = ModalGrupoContas_GridGrupoContas;

        // seta a altura do grid
        $("#ModalGrupoContas_GridGrupoContas" + self.id + " .k-grid-content").height(150);

        // carrega os dados
        var data = new kendo.data.DataSource({ data: [] });
        if (self.validatorInput[0].getVarios()) {
            // se jah tem varias contas selecionadas, apenas carrega o datasource
            var registros = self.validatorInput[0].getGrupoContas();
            for (var atual in registros) {
                data.options.data.push(registros[atual]);
            }
        }
        else {
            // se tem apenas uma conta selecionada, cria um datasource com apenas um item
            if (!self.validatorInput[0].invalid) {
                data.options.data.push({
                    id: self.validatorInput[0].getValue() + self.validatorInput[1].getValue() + self.validatorInput[2].getValue() + self.validatorInput[3].getValue(),
                    Classificacao: self.validatorInput[0].PropertiesSpecifyField.Classificacao,
                    Codigo: self.validatorInput[0].getValue(),
                    Nome: self.validatorInput[0].getDescription(),
                    HaveGrade1: self.validatorInput[0].PropertiesSpecifyField.HaveGrade1,
                    HaveGrade2: self.validatorInput[0].PropertiesSpecifyField.HaveGrade2,
                    HaveGrade3: self.validatorInput[0].PropertiesSpecifyField.HaveGrade3,
                    CodigoGrade1: self.validatorInput[1].getValue(),
                    CodigoGrade2: self.validatorInput[2].getValue(),
                    CodigoGrade3: self.validatorInput[3].getValue(),
                    Grade1: self.validatorInput[1].getDescription().replace(" - ", ""),
                    Grade2: self.validatorInput[2].getDescription().replace(" - ", ""),
                    Grade3: self.validatorInput[3].getDescription().replace(" - ", "")
                });
            }
        }

        $("#ModalGrupoContas_GridGrupoContas" + self.id).data("kendoGrid").setDataSource(data);
    };

    ModalGrupoContas.prototype.listen_Produto = function () {
        "use strict";
        var self = this;

        $("#ModalGrupoContas_ButtonAdicionar" + self.id).bind("click", function () {
            if (self.validatorProdutos.getValue() === "") {
                alert("Informe o código do Produto");
            }
            else {
                var novoId = self.validatorProdutos.getValue() + self.validatorGrade1.getValue() + self.validatorGrade2.getValue() + self.validatorGrade3.getValue();
                var registros = $("#ModalGrupoContas_GridGrupoContas" + self.id).data("kendoGrid").dataSource.data();
                var adicionado = false;
                $.each(registros, function (atual) {
                    if (registros[atual].id === novoId) {
                        adicionado = true;
                    }
                });
                if (adicionado) {
                    if (self.validatorGrade1.getValue() === "")
                        alert("Produto já informado");
                    else
                        alert("Produto/Grade já informado");
                }
                else {
                    $("#ModalGrupoContas_GridGrupoContas" + self.id).data("kendoGrid").dataSource.add({
                        id: self.validatorProdutos.getValue() + self.validatorGrade1.getValue() + self.validatorGrade2.getValue() + self.validatorGrade3.getValue(),
                        Classificacao: self.validatorProdutos.PropertiesSpecifyField.Classificacao,
                        Codigo: self.validatorProdutos.getValue(),
                        Nome: self.validatorProdutos.getDescription(),
                        HaveGrade1: self.validatorProdutos.PropertiesSpecifyField.HaveGrade1,
                        HaveGrade2: self.validatorProdutos.PropertiesSpecifyField.HaveGrade2,
                        HaveGrade3: self.validatorProdutos.PropertiesSpecifyField.HaveGrade3,
                        CodigoGrade1: self.validatorGrade1.getValue(),
                        CodigoGrade2: self.validatorGrade2.getValue(),
                        CodigoGrade3: self.validatorGrade3.getValue(),
                        Grade1: self.validatorGrade1.getDescription().replace(" - ", ""),
                        Grade2: self.validatorGrade2.getDescription().replace(" - ", ""),
                        Grade3: self.validatorGrade3.getDescription().replace(" - ", "")
                    });
                }
            }
        });

        $("#ModalGrupoContas_ButtonRemover" + self.id).bind("click", function () {
            var registroSelecionado = self.grid.getSelectedData();
            if (registroSelecionado !== null) {
                var registros = $("#ModalGrupoContas_GridGrupoContas" + self.id).data("kendoGrid").dataSource.data();
                $.each(registros, function (atual) {
                    if (registros[atual].id === registroSelecionado.id) {
                        registros.splice(atual, 1);
                        return false;
                    }
                });
            }
        });

        $("#ModalGrupoContas_ButtonOk" + self.id).bind("click", function () {
            var registros = $("#ModalGrupoContas_GridGrupoContas" + self.id).data("kendoGrid").dataSource.data();
            var lista = [];
            $.each(registros, function (atual) {
                lista.push(registros[atual]);
            });
            self.validatorInput[0].setGrupoContas(lista);
            if (registros.length > 1) {
                self.validatorInput[0].setVarios(true, "Produto");
            }
            else {
                self.validatorInput[0].setVarios(false, "Produto", [self.validatorInput[1], self.validatorInput[2], self.validatorInput[3]]);
            }
        });

        // quando clicar no botao GrupoContas do validator, limpa o campo conta e monta a grid com as contas
        $("#" + self.button).bind("click", function () {
            if (self.executeOnShowAndOnHidden && self.onShow) {
                self.onShow();
            }

            self.validatorProdutos.setValues("", "");
            self.validatorGrade1.setValues("", "");
            self.validatorGrade2.setValues("", "");
            self.validatorGrade3.setValues("", "");

            self.makeGrid_Produto();

            // tem que ser aqui, porque o bind soh funciona quando o codigo html foi adicionado
            // entao tem que ser depois de ter adicionado
            if (self.onHidden) {
                $("#ModalGrupoContas_" + self.id).on("hidden", function () {
                    if (self.executeOnShowAndOnHidden) {
                        self.onHidden();
                    }
                });
            }
        });
    };

    ModalGrupoContas.prototype.makeInputConta_Produto = function () {
        "use strict";
        var self = this;

        // produto
        var validatorProdutos = new Validator({
            field: "ModalGrupoContas_inputCodigoProduto" + self.id,
            fieldDescriptionId: "ModalGrupoContas_descriptionCodigoProduto" + self.id,
            fieldSearch: "CodigoProduto",
            v2: "v3",
            onPendencyMessage: "Deve ser informado o código do produto.",
            route: "Empresarial/F4Produto/GetProduto",
            onValid: function (data) {
                validatorProdutos.setChange(true);
                validatorProdutos.setValues(data["Codigo"], data["Nome"]);
                validatorProdutos.PropertiesSpecifyField = {
                    Classificacao: data.Classificacao,
                    HaveGrade1: data.HaveGrade1,
                    HaveGrade2: data.HaveGrade2,
                    HaveGrade3: data.HaveGrade3
                };

                validatorGrade1.clear({ disable: true });
                validatorGrade2.clear({ disable: true });
                validatorGrade3.clear({ disable: true });

                if (validatorProdutos.PropertiesSpecifyField.HaveGrade1) {
                    validatorGrade1.enable();
                    validatorGrade1.focus();
                } else {
                    $("#ModalGrupoContas_linkButtonModalProdutos" + self.id).focus();
                }

                if (validatorProdutos.PropertiesSpecifyField.HaveGrade2)
                    validatorGrade2.enable();

                if (validatorProdutos.PropertiesSpecifyField.HaveGrade3)
                    validatorGrade3.enable();
            },
            onInvalid: function (data) {
                validatorProdutos.setChange(true);
                validatorProdutos.clear({ error: true });
                validatorProdutos.focus();
                validatorGrade1.clear({ error: true, disable: true });
                validatorGrade2.clear({ error: true, disable: true });
                validatorGrade3.clear({ error: true, disable: true });
                validatorProdutos.PropertiesSpecifyField = {};
            },
            onEmpty: function () {
                validatorProdutos.setChange(true);
                validatorProdutos.clear();
                validatorGrade1.clear({ disable: true });
                validatorGrade2.clear({ disable: true });
                validatorGrade3.clear({ disable: true });
                validatorProdutos.PropertiesSpecifyField = {};
                $("#ModalGrupoContas_linkButtonModalProdutos" + self.id).focus();
            }
        });
        self.validatorProdutos = validatorProdutos;
        validatorProdutos.listen();

        var tableProdutos = new Table({
            id: "ModalGrupoContas_tableProdutos" + self.id,
            route: window.baseUrl + "Empresarial/F4Produto/GetProdutos",
            showFilter: true,
            ModalGrupoContas: true,
            columns: [
                { title: "Código", field: "Codigo", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                { title: "Nome", field: "Nome", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                { title: "Unidade", field: "Unidade", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                { title: "Preço", field: "ValorUnitario", width: 60, headerAttributes: { style: "color: black; text-align: rigtht;" }, attributes: { style: "text-align: rigtht;" } },
                { title: "Classificação", field: "Classificacao", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
            ],
            onChange: function () {
                $("#inputF4ModalOk" + this.id).on("click", function () {
                    // refatorar e colocar em uma rotina, pois sao 3 lugares para alterar: onclick-table, dblclick-table e dblclick-hierarquia
                    var data = tableProdutos.getSelectedData(),
                        search = {};
                    search["CodigoProduto"] = data["Codigo"];
                    getJsonFromRoute("Empresarial/F4Produto/GetProduto", search).done(function (data) {
                        validatorProdutos.onValid(data);
                        validatorProdutos.update();
                    });
                });
            },
            onDataBound: function () {
                $("#" + this.id + " table  tr").on("dblclick", function () {
                    // refatorar e colocar em uma rotina, pois sao 3 lugares para alterar: onclick-table, dblclick-table e dblclick-hierarquia
                    var data = tableProdutos.getSelectedData(),
                        search = {};
                    search["CodigoProduto"] = data["Codigo"];
                    getJsonFromRoute("Empresarial/F4Produto/GetProduto", search).done(function (data) {
                        validatorProdutos.onValid(data);
                        validatorProdutos.update();
                    });
                    $("#ModalGrupoContas_modalProdutos" + self.id).modal("hide");
                });
            },
            dataSourceType: "Filtered"
        });

        var modalProdutos = new Modal("Produtos",
            byId("ModalGrupoContas_linkButtonModalProdutos" + self.id),
            byId("ModalGrupoContas_inputCodigoProduto" + self.id),
            tableProdutos,
            function () {
                $("#ModalGrupoContas_" + self.id).modal("hide");
            },
            {
                showOpcaoExibir: true,
                onHidden: function () {
                    $("#ModalGrupoContas_" + self.id).modal("show");
                },
                onDblClickGetItem: function (event, dados) {
                    // refatorar e colocar em uma rotina, pois sao 3 lugares para alterar: onclick-table, dblclick-table e dblclick-hierarquia
                    var data = dados,
                        search = {};
                    search["CodigoProduto"] = data["Codigo"];
                    getJsonFromRoute("Empresarial/F4Produto/GetProduto", search).done(function (data) {
                        validatorProdutos.onValid(data);
                        validatorProdutos.update();
                    });
                    $("#ModalGrupoContas_modalProdutos" + self.id).modal("hide");
                }
            }
        ).listen();

        // grades
        var columnsGrade = [
            { title: "Código", field: "Codigo", width: 45, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
            { title: "Descrição", field: "Descricao", width: 64, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
        ];

        // grade1
        var validatorGrade1 = new Validator({
            field: "ModalGrupoContas_inputCodigoGrade1" + self.id,
            fieldDescriptionId: "ModalGrupoContas_descriptionCodigoGrade1" + self.id,
            fieldSearch: "CodigoGrade1",
            v2: "v3",
            onPendencyMessage: "Deve ser informado a Grade 1.",
            route: "Empresarial/F4Produto/GetItemGrade1",
            pendency: [validatorProdutos],
            onValid: function (data) {
                validatorGrade1.setChange(true);
                validatorGrade1.setValues(data["Codigo"], " - " + data["Descricao"]);

                if (validatorProdutos.PropertiesSpecifyField.HaveGrade2) {
                    validatorGrade2.focus();
                }
            },
            onInvalid: function (data) {
                validatorGrade1.setChange(true);
                validatorGrade1.clear({ error: true });
                validatorGrade1.focus();
            },
            onEmpty: function () {
                validatorGrade1.setChange(true);
                validatorGrade1.clear();
                validatorGrade2.clear();
                validatorGrade3.clear();
            }
        });
        self.validatorGrade1 = validatorGrade1;
        validatorGrade1.listen();

        var tableGrade1 = new Table({
            id: "ModalGrupoContas_tableGrade1" + self.id,
            route: window.baseUrl + "Empresarial/F4Produto/List1",
            showFilter: true,
            columns: columnsGrade,
            params: [validatorProdutos],
            fieldDepende: validatorProdutos,
            onChange: function () {
                $("#inputF4ModalOk" + this.id).on("click", function () {
                    var data = tableGrade1.getSelectedData();
                    requestLeg(function () {
                        validatorGrade1.onValid(data);
                        validatorGrade1.update();
                    });
                });
            },
            onDataBound: function () {
                $("#" + this.id + " table  tr").on("dblclick", function () {
                    var data = tableGrade1.getSelectedData();
                    requestLeg(function () {
                        validatorGrade1.onValid(data);
                        validatorGrade1.update();
                    });
                    $("#ModalGrupoContas_modalGrade1" + self.id).modal("hide");
                });
            },
            dataSourceType: "Parameter"
        });

        var modalGrade1 = new Modal("Grade",
            byId("ModalGrupoContas_linkButtonModalGrade1" + self.id),
            byId("ModalGrupoContas_inputCodigoGrade1" + self.id),
            tableGrade1,
            function () {
                $("#ModalGrupoContas_" + self.id).modal("hide");
            },
            {
                onHidden: function () {
                    $("#ModalGrupoContas_" + self.id).modal("show");
                },
            }
        ).listen();

        // grade2
        var validatorGrade2 = new Validator({
            field: "ModalGrupoContas_inputCodigoGrade2" + self.id,
            fieldDescriptionId: "ModalGrupoContas_descriptionCodigoGrade2" + self.id,
            fieldSearch: "CodigoGrade2",
            v2: "v3",
            onPendencyMessage: "Deve ser informado a Grade 2.",
            route: "Empresarial/F4Produto/GetItemGrade2",
            pendency: [validatorGrade1, validatorProdutos],
            onValid: function (data) {
                validatorGrade2.setChange(true);
                validatorGrade2.setValues(data["Codigo"], " - " + data["Descricao"]);

                if (validatorProdutos.PropertiesSpecifyField.HaveGrade3) {
                    validatorGrade3.focus();
                }
            },
            onInvalid: function (data) {
                validatorGrade2.setChange(true);
                validatorGrade2.clear({ error: true });
                validatorGrade2.focus();
            },
            onEmpty: function () {
                validatorGrade2.setChange(true);
                validatorGrade2.clear();
                validatorGrade3.clear();
            }
        });
        self.validatorGrade2 = validatorGrade2;
        validatorGrade2.listen();

        var tableGrade2 = new Table({
            id: "ModalGrupoContas_tableGrade2" + self.id,
            route: window.baseUrl + "Empresarial/F4Produto/List2",
            showFilter: true,
            columns: columnsGrade,
            params: [validatorGrade1, validatorProdutos],
            fieldDepende: validatorGrade1,
            onChange: function () {
                $("#inputF4ModalOk" + this.id).on("click", function () {
                    var data = tableGrade2.getSelectedData();
                    requestLeg(function () {
                        validatorGrade2.onValid(data);
                        validatorGrade2.update();
                    });
                });
            },
            onDataBound: function () {
                $("#" + this.id + " table  tr").on("dblclick", function () {
                    var data = tableGrade2.getSelectedData();
                    requestLeg(function () {
                        validatorGrade2.onValid(data);
                        validatorGrade2.update();
                    });
                    $("#ModalGrupoContas_modalGrade2" + self.id).modal("hide");
                });
            },
            dataSourceType: "Parameter"
        });

        var modalGrade2 = new Modal("Grade",
            byId("ModalGrupoContas_linkButtonModalGrade2" + self.id),
            byId("ModalGrupoContas_inputCodigoGrade2" + self.id),
            tableGrade2,
            function () {
                $("#ModalGrupoContas_" + self.id).modal("hide");
            },
            {
                onHidden: function () {
                    $("#ModalGrupoContas_" + self.id).modal("show");
                },
            }
        ).listen();

        // grade3
        var validatorGrade3 = new Validator({
            field: "ModalGrupoContas_inputCodigoGrade3" + self.id,
            fieldDescriptionId: "ModalGrupoContas_descriptionCodigoGrade3" + self.id,
            fieldSearch: "CodigoGrade3",
            v2: "v3",
            onPendencyMessage: "Deve ser informado a Grade 3.",
            route: "Empresarial/F4Produto/GetItemGrade3",
            pendency: [validatorGrade2, validatorGrade1, validatorProdutos],
            onValid: function (data) {
                validatorGrade3.setChange(true);
                validatorGrade3.setValues(data["Codigo"], " - " + data["Descricao"]);
            },
            onInvalid: function (data) {
                validatorGrade3.setChange(true);
                validatorGrade3.clear({ error: true });
                validatorGrade3.focus();
            },
            onEmpty: function () {
                validatorGrade3.setChange(true);
                validatorGrade3.clear();
            }
        });
        self.validatorGrade3 = validatorGrade3;
        validatorGrade3.listen();

        var tableGrade3 = new Table({
            id: "ModalGrupoContas_tableGrade3" + self.id,
            route: window.baseUrl + "Empresarial/F4Produto/List3",
            showFilter: true,
            columns: columnsGrade,
            params: [validatorGrade2, validatorGrade1, validatorProdutos],
            fieldDepende: validatorGrade2,
            onChange: function () {
                $("#inputF4ModalOk" + this.id).on("click", function () {
                    var data = tableGrade3.getSelectedData();
                    validatorGrade3.onValid(data);
                    validatorGrade3.update();
                });
            },
            onDataBound: function () {
                $("#" + this.id + " table  tr").on("dblclick", function () {
                    var data = tableGrade3.getSelectedData();
                    validatorGrade3.onValid(data);
                    validatorGrade3.update();
                    $("#ModalGrupoContas_modalGrade3" + self.id).modal("hide");
                });
            },
            dataSourceType: "Parameter"
        });

        var modalGrade3 = new Modal("Grade",
            byId("ModalGrupoContas_linkButtonModalGrade3" + self.id),
            byId("ModalGrupoContas_inputCodigoGrade3" + self.id),
            tableGrade3,
            function () {
                $("#ModalGrupoContas_" + self.id).modal("hide");
            },
            {
                onHidden: function () {
                    $("#ModalGrupoContas_" + self.id).modal("show");
                },
            }
        ).listen();

        self.listenToggleProdutoGradesF4(self.id);
    };

    ModalGrupoContas.prototype.listenToggleProdutoGradesF4 = function (id) {
        "use strict";
        var self = this;

        // se alterar aqui, verificar se tem que alterar no listenToggleProdutoGradesF4

        $("#ModalGrupoContas_inputCodigoProduto" + id).on("focus", function () {
            "use strict";
            $("#ModalGrupoContas_linkButtonModalProdutos" + id).show();
            $("#ModalGrupoContas_linkButtonModalGrade1" + id).hide();
            $("#ModalGrupoContas_linkButtonModalGrade2" + id).hide();
            $("#ModalGrupoContas_linkButtonModalGrade3" + id).hide();
        });
        $("#ModalGrupoContas_inputCodigoGrade1" + id).on("focus", function () {
            "use strict";
            $("#ModalGrupoContas_linkButtonModalProdutos" + id).hide();
            $("#ModalGrupoContas_linkButtonModalGrade1" + id).show();
            $("#ModalGrupoContas_linkButtonModalGrade2" + id).hide();
            $("#ModalGrupoContas_linkButtonModalGrade3" + id).hide();
        });
        $("#ModalGrupoContas_inputCodigoGrade2" + id).on("focus", function () {
            "use strict";
            $("#ModalGrupoContas_linkButtonModalProdutos" + id).hide();
            $("#ModalGrupoContas_linkButtonModalGrade1" + id).hide();
            $("#ModalGrupoContas_linkButtonModalGrade2" + id).show();
            $("#ModalGrupoContas_linkButtonModalGrade3" + id).hide();
        });
        $("#ModalGrupoContas_inputCodigoGrade3" + id).on("focus", function () {
            "use strict";
            $("#ModalGrupoContas_linkButtonModalProdutos" + id).hide();
            $("#ModalGrupoContas_linkButtonModalGrade1" + id).hide();
            $("#ModalGrupoContas_linkButtonModalGrade2" + id).hide();
            $("#ModalGrupoContas_linkButtonModalGrade3" + id).show();
        });
    }

    ModalGrupoContas.prototype.makeGrid_TipoOperacao = function () {
        "use strict";
        var self = this;

        var ModalGrupoContas_GridGrupoContas = new Table({
            "id": "ModalGrupoContas_GridGrupoContas" + self.id,
            "pageable": false,
            "columns": [
                { field: "TipoOperacao", title: "Tipo de Operação", width: 150, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } }
            ],
            "dataSourceType": "Object"
        });
        ModalGrupoContas_GridGrupoContas.make();
        self.grid = ModalGrupoContas_GridGrupoContas;

        // seta a altura do grid
        $("#ModalGrupoContas_GridGrupoContas" + self.id + " .k-grid-content").height(150);

        // carrega os dados
        var data = new kendo.data.DataSource({ data: [] });
        if (self.validatorInput[0].getVarios()) {
            // se jah tem varias contas selecionadas, apenas carrega o datasource
            var registros = self.validatorInput[0].getGrupoContas();
            for (var atual in registros) {
                data.options.data.push(registros[atual]);
            }
        }
        else {
            // se tem apenas uma conta selecionada, cria um datasource com apenas um item
            data.options.data.push({
                id: self.validatorInput[0].getValue(),
                TipoOperacao: self.validatorInput[0].getDescription(),
            });
        }

        $("#ModalGrupoContas_GridGrupoContas" + self.id).data("kendoGrid").setDataSource(data);
    };

    ModalGrupoContas.prototype.listen_TipoOperacao = function () {
        "use strict";
        var self = this;

        $("#ModalGrupoContas_ButtonAdicionar" + self.id).bind("click", function () {
            var novoId = self.validatorTipoOperacao.getValue();
            var registros = $("#ModalGrupoContas_GridGrupoContas" + self.id).data("kendoGrid").dataSource.data();
            var adicionado = false;
            $.each(registros, function (atual) {
                if (registros[atual].id === novoId) {
                    adicionado = true;
                }
            });
            if (adicionado) {
                alert("Tipo de Operação já informada");
            }
            else {
                $("#ModalGrupoContas_GridGrupoContas" + self.id).data("kendoGrid").dataSource.add({
                    id: self.validatorTipoOperacao.getValue(),
                    TipoOperacao: self.validatorTipoOperacao.getDescription()
                });
            }
        });

        $("#ModalGrupoContas_ButtonRemover" + self.id).bind("click", function () {
            var registroSelecionado = self.grid.getSelectedData();
            if (registroSelecionado !== null) {
                var registros = $("#ModalGrupoContas_GridGrupoContas" + self.id).data("kendoGrid").dataSource.data();
                $.each(registros, function (atual) {
                    if (registros[atual].id === registroSelecionado.id) {
                        registros.splice(atual, 1);
                        return false;
                    }
                });
            }
        });

        $("#ModalGrupoContas_ButtonOk" + self.id).bind("click", function () {
            var registros = $("#ModalGrupoContas_GridGrupoContas" + self.id).data("kendoGrid").dataSource.data();
            var lista = [];
            $.each(registros, function (atual) {
                lista.push(registros[atual]);
            });
            self.validatorInput[0].setGrupoContas(lista);
            if (registros.length > 1) {
                self.validatorInput[0].setVarios(true);
            }
            else {
                self.validatorInput[0].setVarios(false);
            }
        });

        // quando clicar no botao GrupoContas do validator
        $("#" + self.button).bind("click", function () {
            self.makeGrid_TipoOperacao();
        });
    };

    ModalGrupoContas.prototype.makeInputConta_TipoOperacao = function () {
        "use strict";
        var self = this;

        var validatorTipoOperacao = new ValidatorDropDown({
            id: "ModalGrupoContas_inputTipoOperacao" + self.id,
            route: "Estoque/Relatorios/GetListTipoOperacao"
        });
        self.validatorTipoOperacao = validatorTipoOperacao;
    };

    function Modal(name, button, input, table, onShow, options) {
        this.name = name;
        this.id = button.href.split('#')[1];
        this.button = button;
        this.input = input;
        this.onShow = onShow;
        if (table instanceof Table) {
            this.table = table;
        } else {
            throw new Error("Deve ser passada uma Table como parametro no construtor.");
        }

        if (options) {
            this.showOpcaoExibir = options.showOpcaoExibir;
            this.selectClass = options.selectClass;
            this.exibirHierarquiaLista = options.exibirHierarquiaLista ? options.exibirHierarquiaLista : "H";

            if (options.exibirHierarquiaParams === undefined || options.exibirHierarquiaParams === null || options.exibirHierarquiaParams === "")
                options.exibirHierarquiaParams = {};
            if (options.exibirHierarquiaParams.CodigoTabelaPrecos === undefined || options.exibirHierarquiaParams.CodigoTabelaPrecos === null || options.exibirHierarquiaParams.CodigoTabelaPrecos === "")
                options.exibirHierarquiaParams.CodigoTabelaPrecos = "1";
            this.exibirHierarquiaParams = options.exibirHierarquiaParams;
            this.exibirHierarquiaReload = true;

            this.onDblClickGetItem = options.onDblClickGetItem;
            this.ModalGrupoContas = options.ModalGrupoContas;
            this.onHidden = options.onHidden;
            this.validatorInput = options.validatorInput;
            if (this.validatorInput)
                this.validatorInput.setModal(this);
            this.useClassePai = options.useClassePai;
            this.ClassePaiURL = options.ClassePaiURL;
        }
        else {
            this.showOpcaoExibir = false;
            this.exibirHierarquiaLista = "H";
            this.exibirHierarquiaParams = {};
            this.ModalGrupoContas = false;
            this.validatorInput = null;
        }
        this.changeOpcaoExibir = false;
        this.TreeviewAjaxNodeProdutos = null;
        // salva o link do modal para pode desabilitar/habilitar novamente, usado pelo GrupoContas
        $(this.button).data("href", $(this.button).attr("href"));
    }

    Modal.prototype.exibirHierarquia_SetParams = function (param, value) {
        "use strict";
        var self = this;

        self.exibirHierarquiaReload = true;
        self.exibirHierarquiaParams[param] = value;
        if (self.TreeviewAjaxNodeProdutos)
            self.TreeviewAjaxNodeProdutos.exibirHierarquiaParams[param] = value;
    };

    Modal.prototype.saveSettings = function (data) {
        "use strict";
        var self = this;
        var stringData = JSON.stringify(data);
        currentUser.setCustomData("modal_settings_" + self.input.id, stringData);
    };

    Modal.prototype.loadSettings = function () {
        "use strict";
        var self = this;
        var stringData = currentUser.getCustomData("modal_settings_" + self.input.id);
        if (stringData !== undefined && stringData !== null && stringData !== "") {
            var data = JSON.parse(stringData);
            return data;
        }
        else {
            return null;
        }
    };

    Modal.prototype.make = function () {
        "use strict";
        var self = this,
            modalCode = "";

        if (self.showOpcaoExibir) {
            var fields = self.loadSettings();
            if (fields !== null) {
                if (fields.radiosHierarquia) {
                    self.exibirHierarquiaLista = "H";
                }
                else {
                    self.exibirHierarquiaLista = "L";
                }
            }
        }

        modalCode += "<div id='" + self.id + "' class='modal hide' tabindex='-2' role='dialog' aria-labelledby='myModalLabel' aria-hidden='true' style='z-index: 1450'>";

        modalCode += "<div class='modal-header' style='background-color: #314A63'>";
        modalCode += "  <button type='button' class='close' data-dismiss='modal' aria-hidden='true'>&times;</button>";
        modalCode += "  <h4 style='color: white'>" + self.name + "</h4>";
        modalCode += "</div>";

        modalCode += "<div class='modal-body' style='padding: 0px;'>";

        if (self.showOpcaoExibir) {
            modalCode += "  <div id='divF4ModalExibir' style='padding: 2px;margin: 2px;'>";
            modalCode += "    <label class='inline' style='display: inline-block;'>Exibir:&nbsp&nbsp&nbsp</label>";
            modalCode += "    <label class='radio inline'>";
            modalCode += "      <input type='radio' name='optionsRadios' id='radiosHierarquia' value='option1' " + (self.exibirHierarquiaLista === "H" ? "checked" : "") + " ><span>Hierarquia&nbsp&nbsp&nbsp</span>";
            modalCode += "    </label>";
            modalCode += "    <label class='radio inline'>";
            modalCode += "      <input type='radio' name='optionsRadios' id='radiosLista' value='option2' " + (self.exibirHierarquiaLista === "L" ? "checked" : "") + " ><span>Lista</span>";
            modalCode += "    </label>";
            modalCode += "  </div>";
        }

        if (self.useClassePai) {
            modalCode += "<div id='ladoEsquerdo" + self.id + "' style='float: left; margin: 0; margin-top: 33px; padding: 0; width: 30px;'>";
            modalCode += "    <div id='divModalUseClassePai" + self.id + "'style='width: 24px; margin-rigth: 2px; margin-left: 2px; border: 1px solid #ccc; display: block; white-space: normal; text-align: center; min-height: 220px;'>";
            modalCode += "    </div>";
            modalCode += "</div>";

            modalCode += "<div id='ladoDireito" + self.id + "' style='float: right; margin: 0; padding: 0; width: 530px;'>";
        }

        if (self.exibirHierarquiaLista === "L") {
            modalCode += "  <div id='" + self.id + "divModalContentLista' style='display: block;'>";
            modalCode += "    <div id='" + self.table.id + "'></div>";
            modalCode += "  </div>";
            modalCode += "  <div id='" + self.id + "divModalContentHierarquia' style='display: none; border-top: 1px solid #ccc;'>";
            modalCode += "  </div>";
        }
        else {
            modalCode += "  <div id='" + self.id + "divModalContentLista' style='display: none;'>";
            modalCode += "    <div id='" + self.table.id + "'></div>";
            modalCode += "  </div>";
            modalCode += "  <div id='" + self.id + "divModalContentHierarquia' style='display: block; border-top: 1px solid #ccc;'>";
            modalCode += "  </div>";
        }

        if (self.useClassePai) {
            modalCode += "</div>";
        }

        modalCode += "</div>";

        modalCode += "<div class='modal-footer'>";
        modalCode += "  <input type='button' id='inputF4ModalOk" + self.table.id + "' value='OK' class='btn btn-inverse btn-small' data-dismiss='modal' aria-hidden='true' style='width: 75px'/>";
        if (self.ModalGrupoContas) {
            modalCode += "  <input type='button' id='inputF4ModalCancelar'" + self.table.id + " value='Cancelar' class='btn btn-inverse btn-small' data-dismiss='modal' aria-hidden='true' style='width: 75px'/>";
        }
        else {
            modalCode += "  <input type='button' id='inputF4ModalCancelar'  value='Cancelar' class='btn btn-inverse btn-small' data-dismiss='modal' aria-hidden='true' style='width: 75px'/>";
        }
        modalCode += "</div>";

        modalCode += "</div>";

        $("#modalDiv").append(modalCode);
        //$("#modalDiv").html(modalCode);
    };

    Modal.prototype.listenUseClassePai = function () {
        "use strict";
        var self = this;

        var style = document.createElement("style");
        style.type = "text/css";
        style.innerHTML = "\
            /* seleciona item */\
            .useclassepai-select {\
                color: white;\
                background: #314A63;\
            }\
            ";
        document.getElementsByTagName("head")[0].appendChild(style);

        // carrega classes pai
        requestNoAsync(window.baseUrl + self.ClassePaiURL, {},
            function (model) {
                for (var classePai in model) {
                    var div = $("<div />");
                    div.html(model[classePai].toString());
                    div.appendTo("#divModalUseClassePai" + self.id);
                }
            }
        );

        // bind
        $("#divModalUseClassePai" + self.id + " > div").unbind("click");
        $("#divModalUseClassePai" + self.id + " > div").bind("click", function (event) {
            $("#divModalUseClassePai" + self.id + " > div").removeClass("useclassepai-select");
            $(event.target).addClass("useclassepai-select");

            // seta nova classe pai e recarrega
            self.table.classePai = $(event.target).html();
            $("#" + self.table.id).data("kendoGrid").dataSource.read();
        });

        // somente é possível saber o height exato do grid, depois que todos os dados forrem carregados
        self.table.onAfterReadFilteredDataSource = function (table, sucess) {
            // ajusta altura do grid
            $("#" + self.table.id + " > .k-grid-content").css("min-height", "135px");
            $("#" + self.table.id + " > .k-grid-pager").css("min-height", "48px");

            var heightLadoDireito = parseFloat($("#ladoDireito" + self.id).css("height").replace("px", ""));
            var marginTopLadoEsquerdo = parseFloat($("#ladoEsquerdo" + self.id).css("margin-top").replace("px", ""));
            $("#divModalUseClassePai" + self.id).css("height", (heightLadoDireito - marginTopLadoEsquerdo - 3) + "px")
        }

        var selectFirstItem = $("#divModalUseClassePai" + self.id).children()[0];
        $(selectFirstItem).addClass("useclassepai-select");

        self.table.classePai = selectFirstItem.innerHTML;
    }

    Modal.prototype.show = function () {
        "use strict";
        var self = this;
        if (self.onShow) {
            self.onShow(self);
        }

        if (!self.isDisabled()) {
            if (!self.table.haveDependency()) {
                var el = document.getElementById(self.id);
                // somente cria o modal/grid caso o mesmo nao tenha sido criado
                if (!el) {
                    self.make();
                    if (self.useClassePai) self.listenUseClassePai();

                    if (self.showOpcaoExibir) {
                        self.listenFieldsModal();
                    }
                    if (self.showOpcaoExibir && self.exibirHierarquiaLista === "H") {
                        if (!self.TreeviewAjaxNodeProdutos || self.exibirHierarquiaReload) {
                            self.exibirHierarquiaReload = false; // se alterou o CodigoTabelaPrecos, tem que recarregar
                            setHtml(self.id + "divModalContentHierarquia", "");
                            self.TreeviewAjaxNodeProdutos = new TreeviewAjaxNode({
                                id: self.id + "TreeviewAjaxNodeProdutos",
                                selectClass: self.selectClass,
                                idContainer: self.id + "divModalContentHierarquia",
                                idButtonOK: "inputF4ModalOk" + self.table.id,
                                urlDataSource: window.baseUrl + "Empresarial/F4Produto/GetProdutosHierarquia",
                                exibirHierarquiaParams: self.exibirHierarquiaParams,
                                onDblClickGetItem: self.onDblClickGetItem
                            });
                        }
                        else {
                            self.TreeviewAjaxNodeProdutos.CollapseAll();
                        }
                        $("#" + self.id + "divModalContentHierarquia").css("display", "block");
                        $("#" + self.id + "divModalContentLista").css("display", "none");
                    }
                    else {
                        self.table.make();
                        self.table.makeFilter();
                        self.table.listen();
                        $("#" + self.id + "divModalContentLista").css("display", "block");
                        $("#" + self.id + "divModalContentHierarquia").css("display", "none");
                    }
                }
                else if ((self.table.fieldDepende && self.table.fieldDepende.haveChange()) || self.changeOpcaoExibir || self.exibirHierarquiaReload) {
                    // - apenas recarrega a grid de dados do modal
                    // usado para campos grade, pois o produto (fieldDepende) pode ter sido alterado,
                    // e a grade pode ser diferente, por isso tem que carregar novamente a grid de consulta,
                    // outra situacao eh quando alterar de opcao Exibir hierarquia/lista
                    if (self.showOpcaoExibir) {
                        self.listenFieldsModal();
                    }
                    if (self.showOpcaoExibir && self.exibirHierarquiaLista === "H") {
                        if (!self.TreeviewAjaxNodeProdutos || self.exibirHierarquiaReload) {
                            self.exibirHierarquiaReload = false; // se alterou o CodigoTabelaPrecos, tem que recarregar
                            setHtml(self.id + "divModalContentHierarquia", "");
                            self.TreeviewAjaxNodeProdutos = new TreeviewAjaxNode({
                                id: self.id + "TreeviewAjaxNodeProdutos",
                                selectClass: self.selectClass,
                                idContainer: self.id + "divModalContentHierarquia",
                                idButtonOK: "inputF4ModalOk" + self.table.id,
                                urlDataSource: window.baseUrl + "Empresarial/F4Produto/GetProdutosHierarquia",
                                exibirHierarquiaParams: self.exibirHierarquiaParams,
                                onDblClickGetItem: self.onDblClickGetItem
                            });
                        }
                        else {
                            self.TreeviewAjaxNodeProdutos.CollapseAll();
                        }
                        $("#" + self.id + "divModalContentHierarquia").css("display", "block");
                        $("#" + self.id + "divModalContentLista").css("display", "none");
                    }
                    else {
                        var divTable = $("<div id='" + self.table.id + "'></div>");
                        divTable.appendTo("#divModalContent");

                        self.table.make();
                        self.table.makeFilter();
                        self.table.listen();
                        if (self.table.fieldDepende)
                            self.table.fieldDepende.setChange(false);

                        $("#" + self.id + "divModalContentHierarquia").css("display", "none");
                        $("#" + self.id + "divModalContentLista").css("display", "block");
                    }
                    self.changeOpcaoExibir = false;
                }
                else if (self.showOpcaoExibir && self.exibirHierarquiaLista === "H") {
                    self.TreeviewAjaxNodeProdutos.CollapseAll();
                }
            }
        }
    };

    Modal.prototype.isDisabled = function () {
        "use strict";
        var self = this;
        return self.input.hasAttribute('disabled');
    };

    Modal.prototype.listenFieldsModal = function () {
        "use strict";
        var self = this;

        $("#radiosHierarquia").on('change', function () {
            var fields = {
                radiosHierarquia: $("#radiosHierarquia").attr("checked") !== undefined ? true : false,
                radiosLista: $("#radiosLista").attr("checked") !== undefined ? true : false,
            }
            self.saveSettings(fields);
            self.exibirHierarquiaLista = "H";
            self.changeOpcaoExibir = true;
            self.show();
        });

        $("#radiosLista").on('change', function () {
            var fields = {
                radiosHierarquia: $("#radiosHierarquia").attr("checked") !== undefined ? true : false,
                radiosLista: $("#radiosLista").attr("checked") !== undefined ? true : false,
            }
            self.saveSettings(fields);
            self.exibirHierarquiaLista = "L";
            self.changeOpcaoExibir = true;
            self.show();
        });

        var fields = self.loadSettings();
        if (fields !== null) {
            if (fields.radiosHierarquia) {
                $("#radiosLista").removeAttr("checked");
                $("#radiosHierarquia")[0].checked = true;
            }
            else {
                $("#radiosHierarquia").removeAttr("checked");
                $("#radiosLista")[0].checked = true;
            }
        }
    }

    Modal.prototype.listen = function () {
        "use strict";
        var self = this;

        // botao de consulta
        $(self.button).attr("href", $(self.button).data("href"));
        $(self.button).on('click', function () {
            self.show();
            // tem que ser aqui, porque o bind soh funciona quando o codigo html foi adicionado
            // entao tem que ser depois de ter mostrado
            if (self.onHidden) {
                $("#" + self.id).on("hidden", function () {
                    self.onHidden(self);
                });
            }
        });

        // dois clicks no campo
        $(self.input).on('dblclick', function () {
            self.button.click();
        });

        $(self.input).on('keydown', function (ev) {
            var evCodeKey = (ev.keyCode || ev.which);
            // F4 consulta
            if (evCodeKey == '115') {
                ev.preventDefault();
                ev.preventBubble = true;
                self.button.click();
            }
        });
    };

    Modal.prototype.unlisten = function () {
        "use strict";
        var self = this;

        $(self.button).removeAttr("href");
        $(self.button).off('click');
        $(self.input).off('dblclick');
        $(self.input).off('keydown');
    };

    var PromptDialog = function (options) {
        this.id = options.id;
        this.title = options.title;
        this.template = options.template;
        this.onOk = options.onOk;
        this.onCancel = options.onCancel;
    };

    PromptDialog.prototype.make = function () {
        "use strict";
        var self = this, finalTemplate, baseTemplate =
            "<div id='prompt-{0}' class='modal hide' tabindex='10' style='top: 15%; width: 455px; z-index: 1400' role='dialog'>\
			<div class='modal-header' style='background-color: #314A63'>\
				<button type='button' class='close' data-dismiss='modal' aria-hidden='true'>&times;</button>\
				<h4 style='color: white'>{1}</h4>\
			</div>\
		<div class='modal-body'>\
		{2}\
		</div>\
		<div class='modal-footer'>\
        <div>\
            <input type='button' id='prompt-{0}-ok' class='btn btn-inverse btn-small' value='OK' data-dismiss='modal' style='width: 75px'/>"
        if (self.onCancel) {
            baseTemplate += "<input type='button' id='prompt-{0}-cancel' class='btn btn-inverse btn-small' value='Cancelar' data-dismiss='modal' style='width: 75px'/>";
        }
        baseTemplate += "</div></div>";

        finalTemplate = baseTemplate.format(self.id, self.title, self.template);
        var same = $('#prompt-' + self.id);
        if (same.length > 0) {
            same.remove();
        }

        $('#modalDiv').append(finalTemplate);
    };

    PromptDialog.prototype.listen = function () {
        "use strict";
        var self = this;
        $('#prompt-' + self.id + '-ok').on('click', function () {
            if (self.onOk)
                self.onOk($('prompt-viewmodel').viewModel());
            self.show(false);
        });

        $('#prompt-' + self.id + '-cancel').on('click', function () {
            if (self.onOk)
                self.onCancel();
            self.show(false);
        });
    };

    PromptDialog.prototype.show = function (option) {
        "use strict";
        var self = this;
        if (option)
            $('#prompt-' + self.id).modal('show');
        else
            $('#prompt-' + self.id).modal('hide');
    };

    PromptDialog.prototype.dispose = function () {
        "use strict";
        var self = this;
        $('#prompt-' + self.id).remove();
        $('.modal-backdrop').remove();
    };

    var PromptDialogYesNo = function (options) {
        this.id = options.id;
        this.title = options.title;
        this.template = options.template;
        this.onYes = options.onYes;
        this.onNo = options.onNo;
    };

    PromptDialogYesNo.prototype.make = function () {
        "use strict";
        var self = this, finalTemplate, baseTemplate =
            "<div id='prompt-{0}' class='modal hide' tabindex='10' style='top: 15%; width: 455px; z-index: 1400' role='dialog'>\
			<div class='modal-header' style='background-color: #314A63'>\
				<button type='button' class='close' data-dismiss='modal' aria-hidden='true'>&times;</button>\
				<h4 style='color: white'>{1}</h4>\
			</div>\
		<div class='modal-body'>\
		{2}\
		</div>\
		<div class='modal-footer'>\
        <div>\
            <input type='button' id='prompt-{0}-yes' class='btn btn-inverse btn-small' value='Sim' data-dismiss='modal' style='width: 75px'/>\
            <input type='button' id='prompt-{0}-no' class='btn btn-inverse btn-small' value='Não' data-dismiss='modal' style='width: 75px'/>\
		</div>\
		</div>";

        var same = $('#prompt-' + self.id);
        if (same.length > 0) {
            same.remove();
        }

        finalTemplate = baseTemplate.format(self.id, self.title, self.template);
        $('#modalDiv').append(finalTemplate);
    };

    PromptDialogYesNo.prototype.listen = function () {
        "use strict";
        var self = this;
        $('#prompt-' + self.id + '-yes').on('click', function () {
            if (self.onYes)
                self.onYes($('prompt-viewmodel').viewModel());
            self.show(false);
        });

        $('#prompt-' + self.id + '-no').on('click', function () {
            if (self.onNo)
                self.onNo();
            self.show(false);
        });
    };

    PromptDialogYesNo.prototype.show = function (option) {
        "use strict";
        var self = this;
        if (option)
            $('#prompt-' + self.id).modal('show');
        else
            $('#prompt-' + self.id).modal('hide');
    };

    PromptDialogYesNo.prototype.dispose = function () {
        "use strict";
        var self = this;
        $('#prompt-' + self.id).remove();
        $('.modal-backdrop').remove();
    };


    function ValidatorDropDown(options) {
        "use strict";
        var self = this;

        self.id = options.id;
        self.route = options.route;
        self.idDescription = options.idDescription;
        self.linkButtonModalGrupoContas = options.linkButtonModalGrupoContas;
        self.makeDropDown();
        self.dropDown.make();
        self.Varios = false;
        self.grupoContas = [];
    }

    ValidatorDropDown.prototype.setVarios = function (op) {
        "use strict";
        var self = this;

        if (op) {
            self.Varios = true;
            $($("#" + self.id + "Disable").parent()).css("display", "inline-block");
            $($("#" + self.id).parent()).css("display", "none");
            self.dropDownDisable.enable(false);
            setHtml(self.idDescription, "Vários")
        }
        else {
            self.Varios = false;
            $($("#" + self.id + "Disable").parent()).css("display", "none");
            $($("#" + self.id).parent()).css("display", "inline-block");
            setHtml(self.idDescription, "");
            if (self.grupoContas.length > 0) {
                var dados = self.grupoContas[0];
                self.setValue(dados.id);
            }
        }
    }

    ValidatorDropDown.prototype.makeDropDown = function () {
        "use strict";
        var self = this;

        self.dropDown = new DropDown({
            id: self.id,
            route: self.route
        });

        self.dropDownDisable = $("#" + self.id + "Disable").kendoDropDownList({}).data("kendoDropDownList");
        $($("#" + self.id + "Disable").parent()).css("display", "none");
    }

    ValidatorDropDown.prototype.getVarios = function () {
        "use strict";
        var self = this;

        return self.Varios;
    }

    ValidatorDropDown.prototype.setGrupoContas = function (grupoContas) {
        "use strict";
        var self = this;

        return self.grupoContas = grupoContas;
    }

    ValidatorDropDown.prototype.getGrupoContasString = function () {
        'use strict';
        var self = this;

        var lista = "";
        for (var conta in self.grupoContas)
            lista += self.grupoContas[conta].id + ",";

        return lista;
    }

    ValidatorDropDown.prototype.getGrupoContas = function () {
        "use strict";
        var self = this;

        return self.grupoContas;
    }

    ValidatorDropDown.prototype.setValue = function (val) {
        "use strict";
        var self = this;

        return self.dropDown.set(val);
    }

    ValidatorDropDown.prototype.getValue = function () {
        "use strict";
        var self = this;

        return self.dropDown.dropDown.dataItem().Value;
    }

    ValidatorDropDown.prototype.getDescription = function () {
        "use strict";
        var self = this;

        return self.dropDown.dropDown.dataItem().Text;
    }

    function ValidatorDate(options) {
        "use strict";
        var self = this;

        for (var params in options) self[params] = options[params];

        var validatorX = new DateValidator({
            id: self.idInput,
            v2: true,
            isEmptyValid: self.isEmptyValid,
            constructInjection: function () {
                makeDatePicker("#" + this.id);
            },
            onValid: function (validator) {
                dateValidatorOnValid(validator);
                validatorX.alterBehavior(controlGroupBehavior.normal);
            },
            onInvalid: function (validator) {
                dateValidatorOnInvalid(validator);
            },
        });

        return validatorX;
    }

    function Grid(options) {
        "use strict";
        var self = this;

        for (var params in options) self[params] = options[params];

        if (!self.height) self.height = 150;
        if (!self.dados) self.dados = [];

        var gridX = new Table({
            id: self.id,
            pageable: false,
            columns: self.columns,
            dataSourceType: "Object",
            onChange: function (dados) {
                if (self.onChange) {
                    var data = gridX.getSelectedData();
                    self.onChange(data);
                }
            }
        });
        gridX.make();

        self.setValue(self.dados);
    }

    Grid.prototype.setValue = function (dados, onMapper) {
        "use strict";
        var self = this;

        // seta a altura do grid
        $("#" + self.id + " .k-grid-content").height(self.height);

        // carrega os dados
        var data = new kendo.data.DataSource({ data: [] });

        $.each(dados, function (i, el) {
            if (onMapper) {
                data.options.data.push(onMapper(el));
            }
            else {
                data.options.data.push(el);
            }
        });
        $("#" + self.id).data("kendoGrid").setDataSource(data);
    }

    Grid.prototype.getSelectedData = function () {
        "use strict";
        var self = this;

        var grid = $("#" + self.id).data("kendoGrid");
        var row = grid.select();
        return grid.dataItem(row);
    };

    Grid.prototype.getSelectedDataIndex = function () {
        "use strict";
        var self = this;

        var grid = $("#" + self.id).data("kendoGrid");
        var row = grid.select();
        return row.index();
    };

    Grid.prototype.getDataSource = function () {
        "use strict";
        var self = this;

        var registros = $("#" + self.id).data("kendoGrid").dataSource.data();
        return registros;
    }

    Grid.prototype.getDadosVM = function () {
        "use strict";
        var self = this;

        var list = [];
        var dataSource = self.getDataSource();

        $.each(dataSource, function (atual) {
            list.push(dataSource[atual].DadosVM);
        });

        return list;
    }

    Grid.prototype.deleteSelectedData = function () {
        "use strict";
        var self = this;

        var grid = $("#" + self.id).data("kendoGrid");
        var registroSelecionado = self.getSelectedData();
        if (registroSelecionado !== null) {
            var registros = $("#" + self.id).data("kendoGrid").dataSource.data();
            $.each(registros, function (atual) {
                if (registros[atual].uid === registroSelecionado.uid) {
                    registros.splice(atual, 1);
                    return false;
                }
            });
        }
    };

    Grid.prototype.add = function (val) {
        "use strict";
        var self = this;

        $("#" + self.id).data("kendoGrid").dataSource.add(val);
    };

    Grid.prototype.updateSelectedData = function (alt) {
        "use strict";
        var self = this;

        var registroSelecionado = self.getSelectedData();
        var registros = $("#" + self.id).data("kendoGrid").dataSource.data();
        $.each(registros, function (atual) {
            if (registros[atual].uid === registroSelecionado.uid) {
                alt(registros[atual]);
            }
        });
        $("#" + self.id).data("kendoGrid").refresh();
    }

    function ValidatorMask(options) {
        "use strict";
        var self = this;

        for (var params in options) self[params] = options[params];

        $("#" + self.idInput).on("focus", function () {
            $("#" + self.idInput).attr("bkp", $("#" + self.idInput).val());
        });
        $("#" + self.idInput).on("blur", function () {
            if ($("#" + self.idInput).attr("bkp") !== $("#" + self.idInput).val() && self.onChange) {
                self.onChange();
            }
        });

        self.makeMask();
    }

    ValidatorMask.prototype.changeMask = function (value) {
        "use strict";
        var self = this;

        self.mask = value;
        self.makeMask();
    }

    ValidatorMask.prototype.makeMask = function (value) {
        "use strict";
        var self = this;

        $("#" + self.idInput).attr("radarmask", self.mask);
        if (self.mask.startsWith("radar-valor")) {
            var params = self.mask.split("valor");
            if (params.length == 1) {
                $("#" + self.idInput).setMask();
            }
            else {
                var integer = params[1].split("-")[1];
                var decimal = params[1].split("-")[2];
                if (decimal === undefined)
                    $("#" + self.idInput).setMask();
                else {
                    $("#" + self.idInput).autoNumeric("destroy");
                    $("#" + self.idInput).autoNumeric("init", getAutoNumericOptions(integer, decimal));
                }
            }
        }
        else {
            $("#" + self.idInput).setMask();
        }
    }

    ValidatorMask.prototype.focus = function (value) {
        "use strict";
        var self = this;

        $("#" + self.idInput).focus();
    }

    ValidatorMask.prototype.enable = function (value) {
        "use strict";
        var self = this;

        if (value)
            $("#" + self.idInput).removeAttr("disabled");
        else
            $("#" + self.idInput).attr("disabled", "disabled");
    }

    ValidatorMask.prototype.setValue = function (val) {
        "use strict";
        var self = this;

        $("#" + self.idInput).val(val);
    }

    ValidatorMask.prototype.getValue = function () {
        "use strict";
        var self = this;

        return $("#" + self.idInput).val();
    }

    ValidatorMask.prototype.isValid = function () {
        "use strict";
        var self = this;

        if ($("#" + self.idInput).val())
            return true;
        else
            return false;
    }

    ValidatorMask.prototype.isEmptyOrZeros = function () {
        "use strict";
        var self = this;

        if (parseFloat($("#" + self.idInput).val().replace(".", "").replace(",", ".")) === 0)
            return true;
        else
            return false;
    }

    function ValidatorLookup(options) {
        "use strict";
        var self = this;

        for (var params in options) self[params] = options[params];

        if (self.abrev && !self.idInputCodigo) self.idInputCodigo = "input" + self.abrev;
        if (self.abrev && !self.idLinkButtonModal) self.idLinkButtonModal = "linkButtonModal" + self.abrev;
        if (self.abrev && !self.idInputDescription) self.idInputDescription = "description" + self.abrev;
        if (self.abrev && !self.idModal) self.idModal = "modal" + self.abrev;
        if (self.abrev && !self.idTable) self.idTable = "table" + self.abrev;

        if (!self.fieldDescription) self.fieldDescription = "Nome";

        if (!self.msgPendencyMessage && self.msgPendencyMessagePartEnd)
            self.msgPendencyMessage = "Deve ser informado o código " + self.msgPendencyMessagePartEnd;

        var validatorX = new Validator({
            field: self.idInputCodigo,
            fieldDescriptionId: self.idInputDescription,
            fieldSearch: self.fieldSearch,
            pendency: self.pendency,
            v2: "v3",
            onPendencyMessage: self.msgPendencyMessage,
            route: self.route,
            defaultValue: self.defaultValue,
            onValid: function (data) {
                // quando tiver "onValidOnly" declarado, usar somente ele, mais nenhum outro codigo,
                // feito inicialmente para o validator do Executor (Atendimento Técnico), que na verdade,
                // é uma consulta de usuário, não tem código, tem que digitar diretamente no input, no nome
                // do usuário, consequentemente, também não tem Description
                if (self.onValidOnly) {
                    self.onValidOnly(validatorX, data);
                }
                else {
                    validatorX.setValues(data["Codigo"], data[self.fieldDescription]);
                    if (self.onValid) self.onValid(data);
                }
            },
            onInvalid: function (data) {
                validatorX.clear({ error: true });
                validatorX.focus();
                if (self.onInvalid) self.onInvalid(data);
            },
            onEmpty: function () {
                validatorX.clear();
                if (self.onEmpty) self.onEmpty();
            }
        });
        validatorX.listen();
        if (self.setDefaultValueInOldValueWhereCreateValidator)
            validatorX.oldValue = validatorX.defaultValue;

        // TODO: fieldDepende eh usado para detectar quando um campo dependente foi alterado para,
        // recarrega a tabela e nao usar o cache,
        // ele aceita apenas um campo e nao uma lista de campo, mas o o params eh usa lista de campos,
        // no momento, esta pegando o primeiro campo de params, mas futuramente tem que alterar
        var tableX = new Table({
            id: self.idTable,
            route: window.baseUrl + self.routeTable,
            columns: self.columnsTable,
            showFilter: true,
            params: self.params,
            paramsRequired: self.paramsRequired,
            paramsDefault: self.paramsDefault,
            fieldDepende: self.params ? self.params[0] : null,
            v2: true,
            onChange: function () {
                byId("inputF4ModalOk" + this.id).onclick = function () {
                    var data = tableX.getSelectedData();
                    validatorX.onValid(data);
                    validatorX.update();
                };
            },
            onDataBound: function () {
                $("#" + this.id + " table tr").on("dblclick", function () {
                    var data = tableX.getSelectedData();
                    validatorX.onValid(data);
                    validatorX.update();
                    $("#" + self.idModal).modal("hide");
                });
            },
            dataSourceType: "Filtered"
        });

        var modalX = new Modal(self.titleModal,
            byId(self.idLinkButtonModal),
            byId(self.idInputCodigo),
            tableX
        ).listen();

        return validatorX;
    }

    function Validator(options) {
        this.field = options.field;

        this.isGrupoContas = options.ModalGrupoContas;
        if (options.ModalGrupoContas || options.v2 === "v3") {
            this.field = options.fieldSearch;
            this.inputId = options.field;
            this.descriptionId = options.fieldDescriptionId;
            this.defaultValue = options.defaultValue;
            this.oldValue = {};
        }
        else {
            this.inputId = 'input' + options.field;
            this.descriptionId = 'description' + options.field;
        }
        this.PropertiesSpecifyField = {};

        this.input = null;
        this.description = null;
        this.route = window.baseUrl + options.route;
        this.value = "";
        this.lastValue = "";
        this.onPendencyMessage = options.onPendencyMessage;
        this.pendency = options.pendency;
        this.onValid = options.onValid;
        this.invalid = true;
        this.onInvalid = options.onInvalid;
        this.onEmpty = options.onEmpty;
        this.alertId = "alert" + Date.now();
        this.onUpdate = options.onUpdate;
        // foi necessário fazer alterações no Validator, e para não correr o risco da alteração atual influenciar no funcionamento das rotinas atuais,
        // foi criado a flag v2, para sinalizar o Validator a usar as novas alterações
        this.v2 = options.v2;
        this.existChange = false;
        // usado em conjunto com ModalGrupoContas
        this.Varios = false;
        this.linkButton = options.linkButton;
        this.linkButtonModalGrupoContas = options.linkButtonModalGrupoContas;
        this.grupoContas = null; // objeto lista com os registros
        this.grupoContasFieldNome = options.grupoContasFieldNome;
        // objeto modal do validator, é atribuído a instancia do modal, pelo proprio
        // modal quando o mesmo eh criado
        this.modal = null;
        this.u = new Util();
    }

    Validator.prototype.setVarios = function (op, tipo, grades) {
        'use strict';
        var self = this;

        if (op) {
            self.Varios = true;
            self.modal.unlisten();

            // para limpar/desabilitar os campos grades
            if (tipo === "Produto" && self.onEmpty)
                self.onEmpty();

            self.setValues("", "Vários");
            $("#" + self.input.id).attr("readonly", true);
            $("#" + self.linkButton).css("cursor", "not-allowed");
        }
        else {
            self.Varios = false;
            self.modal.listen();
            if (self.grupoContas.length === 0) {
                self.setValues("", "");
                self.invalid = true;
            }
            else {
                var dados = self.grupoContas[0];
                if (tipo === "Produto") {
                    self.setValues(dados.Codigo, dados.Nome);
                    self.PropertiesSpecifyField.Classificacao = dados.Classificacao;
                    self.PropertiesSpecifyField.HaveGrade1 = dados.HaveGrade1;
                    self.PropertiesSpecifyField.HaveGrade2 = dados.HaveGrade2;
                    self.PropertiesSpecifyField.HaveGrade3 = dados.HaveGrade3;
                    if (dados.HaveGrade1) {
                        grades[0].enable();
                        grades[0].setValues(dados.CodigoGrade1, " - " + dados.Grade1);
                    }
                    if (dados.HaveGrade2) {
                        grades[1].enable();
                        grades[1].setValues(dados.CodigoGrade2, " - " + dados.Grade2);
                    }
                    if (dados.HaveGrade3) {
                        grades[2].enable();
                        grades[2].setValues(dados.CodigoGrade3, " - " + dados.Grade3);
                    }
                }
                else {
                    self.setValues(dados.Codigo, dados.Nome);
                }
            }
            $("#" + self.input.id).removeAttr("readonly");
            $("#" + self.linkButton).css("cursor", "auto");
        }
    }

    Validator.prototype.getVarios = function () {
        'use strict';
        var self = this;

        return self.Varios;
    }

    Validator.prototype.setModal = function (instance) {
        'use strict';
        var self = this;

        return self.modal = instance;
    }

    Validator.prototype.setGrupoContas = function (grupoContas) {
        'use strict';
        var self = this;

        return self.grupoContas = grupoContas;
    }

    Validator.prototype.setGrupoContasLista = function (lista) {
        'use strict';
        var self = this;

        var listaObjetos = [];
        for (var atual in lista) {
            var nomeConta = "Erro: Não carregado";

            var params = {};
            params[self.field] = lista[atual];

            requestNoAsync(self.route, params,
                function (model) {
                    if (model.IsAlert) {
                        nomeConta = "Erro: " + model.Message;
                    }
                    else {
                        nomeConta = model[self.grupoContasFieldNome];
                    }
                },
                function (perro) {
                    nomeConta = "Erro: " + perro.errorThrown;
                }
            );
            listaObjetos.push({
                Codigo: lista[atual],
                Nome: nomeConta
            });
        }
        self.grupoContas = listaObjetos;
    }

    Validator.prototype.getGrupoContas = function () {
        'use strict';
        var self = this;

        return self.grupoContas;
    }

    Validator.prototype.getGrupoContasString = function () {
        'use strict';
        var self = this;

        var lista = "";
        for (var conta in self.grupoContas)
            lista += self.grupoContas[conta].Codigo + ",";

        return lista;
    }

    Validator.prototype.getGrupoContasLista = function () {
        'use strict';
        var self = this;

        var lista = [];
        for (var atual in self.grupoContas) {
            lista.push(self.grupoContas[atual].Codigo);
        }
        return lista;
    }

    Validator.prototype.setValue = function (val) {
        'use strict';
        var self = this;

        self.input.value = val;
        self.update();
        self.validate();
    }

    Validator.prototype.getValue = function () {
        'use strict';
        var self = this;

        return self.input.value;
    }

    Validator.prototype.getDescription = function () {
        'use strict';
        var self = this;

        return self.description.innerHTML;
    }

    Validator.prototype.listen = function () {
        "use strict";
        var self = this;

        self.input = document.getElementById(self.inputId);
        self.description = document.getElementById(self.descriptionId);
        if (self.v2) {
            $(self.input).on("input", function () {
                self.value = self.input.value;
            });
            $(self.input).on("focus", function () {
                $(self.input).attr("bkp", $(self.input).val());
            });
            $(self.input).on("blur", function () {
                if (self.isGrupoContas && self.getVarios()) {
                    // seh eh um validator com grupo de contas, e selecionou mais de uma conta, nao limpa o campo
                    // e nem faz validacoes, pois o mesmo esta com o codigo "" e a descricao com "Varios",
                    // por causa do grupo de contas
                }
                else {
                    if ($(self.input).attr("bkp") !== $(self.input).val()) {
                        self.setChange(true);
                        self.validate();
                    }
                    else if (self.isEmpty())
                        self.clear();
                }
            });
        }
        else {
            $(self.input).on('keyup', function () {
                self.value = self.input.value;
            });

            $(self.input).on('change', function () {
                self.value = self.input.value;
            });

            $(self.input).on('blur', function () {
                self.validate();
            });

            $(self.input).on('focus', function () {
                self.lastValue = self.value;
            });
        }
    };

    Validator.prototype.changed = function () {
        "use strict";
        return this.lastValue !== this.value;
    };

    Validator.prototype.setChange = function (Change) {
        var self = this;
        // primeiro eh setado como true no Validator.prototype.listen quando o campo sofre alteracao,
        // depois no Modal.prototype.show eh setado como false,
        // usado pelo modal para detectar quando houve uma mudanca no campo
        self.existChange = Change;
    }

    Validator.prototype.haveChange = function () {
        var self = this;
        return self.existChange;
    }

    Validator.prototype.validate = function () {
        "use strict";
        var self = this,
            util = new Util();

        if (self.isEmpty()) {
            self.alterBehavior(controlGroupBehavior.normal);
            self.description.innerHTML = "";
            self.invalid = true;
            if (self.onEmpty) {
                self.onEmpty();
            }
        } else {
            if (self.v2) {
                var search = self.pendencyResult();
                if (!self.input.disabled) {
                    $.ajax({
                        url: self.route,
                        dataType: "json",
                        type: "GET",
                        data: search,
                        success: function (result) {
                            if (result.IsAlert) {
                                util.alert(result.Message, util.getAlertBehaviorNumber(result.Level));
                                self.alterBehavior(controlGroupBehavior.error);
                                self.invalid = true;
                                if (self.onInvalid) {
                                    self.onInvalid(result);
                                }
                            } else {
                                self.alterBehavior(controlGroupBehavior.normal);
                                self.invalid = false;
                                if (self.onValid) {
                                    self.onValid(result);
                                }
                            }
                        },
                        error: function (jqxhr, textStatus, errorThrown) {
                            util.alert("Erro: " + jqxhr.status + "-" + jqxhr.statusText, util.getAlertBehaviorNumber(alertLevel.error));
                            self.alterBehavior(controlGroupBehavior.error);
                            self.invalid = true;
                            if (self.onInvalid) {
                                self.onInvalid(jqxhr);
                            }
                        }
                    });
                }
            }
            else {
                var search = self.pendencyResult();
                if (!self.input.disabled) {
                    $.ajax({
                        url: self.route,
                        dataType: 'json',
                        type: 'GET',
                        data: search,
                        success: function (result) {
                            if (result.IsAlert) {
                                self.alterBehavior(controlGroupBehavior.error);
                                self.invalid = true;
                                util.alert(result.Message, util.getAlertBehavior(result.Level));
                                if (self.onInvalid) {
                                    self.onInvalid(result);
                                }
                            } else {
                                self.alterBehavior(controlGroupBehavior.normal);
                                self.invalid = false;
                                if (self.onValid) {
                                    self.onValid(result);
                                }
                                disableNegativePermissionsFields();
                            }
                        },
                        error: function (err) {
                            self.alterBehavior(controlGroupBehavior.error);
                            self.invalid = true;
                            if (self.onInvalid) {
                                self.onInvalid(err);
                            }
                        }
                    });
                }
            }
        }
    };

    Validator.prototype.forceValid = function () {
        "use strict";
        var self = this;
        self.alterBehavior(controlGroupBehavior.normal);
        self.invalid = false;
        self.value = self.input.value;
    };

    Validator.prototype.isEmpty = function () {
        "use strict";
        var self = this;
        return self.value.length === 0;
    };

    Validator.prototype.pendencyResult = function () {
        "use strict";

        var self = this,
            result = {},
            pend;

        if (self.pendency) {
            document.getElementById(self.inputId).value = "";

            var pendencies = self.pendency,
                j = pendencies.length;

            for (var i = 0; i < j; i++) {
                pend = pendencies[i];

                if (pend.isEmpty() || pend.invalid) {
                    pend.focus(controlGroupBehavior.error);
                    pend.showValidateMessage();
                    pend.onInvalid();

                    self.u.alert("Pendências a serem resolvidas", alertLevel.warning);
                    throw new Error("Pendências a serem resolvidas");// exception mantida para nao preencher o campo
                } else {
                    result[pend.field] = pend.value;
                }
            }
        }
        result[self.field] = self.value;
        return result;
    };

    Validator.prototype.focus = function (behavior) {
        "use strict";
        var self = this;
        if (behavior) {
            self.input.focus();
            self.alterBehavior(behavior);
        } else {
            self.input.focus();
        }
    };

    Validator.prototype.alterBehavior = function (behavior) {
        "use strict";
        var self = this;
        self.input.parentNode.parentNode.className = behavior;
    };

    Validator.prototype.showValidateMessage = function () {
        "use strict";
        var self = this;
        self.description.innerHTML = self.onPendencyMessage;
    };

    Validator.prototype.disable = function () {
        "use strict";
        var self = this;
        self.input.disabled = true;
    };

    Validator.prototype.enable = function () {
        "use strict";
        var self = this;
        self.input.disabled = false;
    };

    Validator.prototype.clear = function (options) {
        "use strict";
        var self = this;
        self.value = "";
        self.input.value = "";
        self.description.innerHTML = "";
        self.invalid = true;
        self.PropertiesSpecifyField = {};

        if (options === undefined) {
            options = {};
        }

        if (options.error) {
            self.alterBehavior(controlGroupBehavior.error);
        }
        else {
            self.alterBehavior(controlGroupBehavior.normal);
            if (options.disable)
                self.disable();
        }
    };

    Validator.prototype.update = function () {
        "use strict";
        var self = this;

        self.lastValue = self.value;
        self.value = self.input.value;
        if (self.isEmpty()) {
            self.invalid = true;
        } else {
            self.invalid = false;
        }
        self.alterBehavior(controlGroupBehavior.normal);
        if (self.onUpdate)
            self.onUpdate();
    };

    Validator.prototype.setValues = function (id, description) {
        "use strict";
        var self = this;

        self.value = id;
        self.input.value = id;
        self.description.innerHTML = description;
        self.invalid = false;
        self.alterBehavior(controlGroupBehavior.normal);
    };

    Validator.prototype.setValue = function (value) {
        "use strict";
        var self = this;

        self.value = value;
        self.input.value = value;
        self.invalid = false;
        self.alterBehavior(controlGroupBehavior.normal);
    };

    var baseValidatorPrototypes = function () { };
    baseValidatorPrototypes.prototype = Validator.prototype;

    function ValidatorEx(options) {
        Validator.call(this, options);
        this.inputId = options.inputId;
        this.descriptionId = options.descriptionId;
    }

    ValidatorEx.prototype = new baseValidatorPrototypes();
    ValidatorEx.prototype.constructor = ValidatorEx;

    function DateValidator(options) {
        this.id = options.id;
        this.input = null;
        this.isValid = false;
        this.isEmptyValid = options.isEmptyValid;
        this.isEmpty = true;

        this.onValid = options.onValid;
        this.onInvalid = options.onInvalid;

        // foi necessário fazer alterações no Validator, e para não correr o risco da alteração atual influenciar no funcionamento das rotinas atuais,
        // foi criado a flag v2, para sinalizar o Validator a usar as novas alterações
        this.v2 = options.v2;
        this.isMMAAAA = options.isMMAAAA;

        this.constructInjection = options.constructInjection;
        this.construct();
    }

    DateValidator.prototype.construct = function () {
        "use strict";
        var self = this;

        if (self.constructInjection) {
            if (typeof self.constructInjection !== 'function') {
                console.warn('Invalid contruct injection!');
            } else {
                self.constructInjection();
            }
        }

        self.listen();
        self.validate();
    };

    DateValidator.prototype.enable = function (value) {
        'use strict';
        var self = this;

        if (value)
            $("#" + self.id).removeAttr("disabled");
        else
            $("#" + self.id).attr("disabled", "disabled");
    }

    DateValidator.prototype.focus = function () {
        "use strict";
        var self = this;

        self.input.focus();
    };

    DateValidator.prototype.alterBehavior = function (behavior) {
        "use strict";
        var self = this;

        self.input.parentNode.parentNode.className = behavior;
    };

    DateValidator.prototype.focusError = function () {
        "use strict";
        var self = this;

        self.input.focus();
        self.isValid = false;
        self.alterBehavior(controlGroupBehavior.error);
    };

    DateValidator.prototype.setValue = function (val) {
        'use strict';
        var self = this;
        self.input.value = val;
        self.validate();
        self.execute();
    }

    DateValidator.prototype.setValueNoValidate = function (val) {
        'use strict';
        var self = this;
        self.input.value = val;
    }

    DateValidator.prototype.getValue = function () {
        'use strict';
        var self = this;
        return self.input.value;
    }

    DateValidator.prototype.getValueDate = function () {
        'use strict';
        var self = this;
        return convertDateStringDDMMYYYYToDate(self.input.value);
    }

    DateValidator.prototype.listen = function () {
        'use strict';
        var self = this;
        var input = $('#' + self.id);
        self.input = input[0];
        if (self.v2) {
            $(self.input).on("input", function () {
                self.value = self.input.value;
            });

            $(self.input).on("focus", function () {
                $(self.input).attr("bkp", $(self.input).val());
            });

            $(self.input).on("blur", function () {
                if ($(self.input).attr("bkp") !== $(self.input).val()) {
                    self.validate();
                    self.execute();
                }
                $(self.input).attr("bkp", $(self.input).val());
            });
            $(self.input).on("change", function () {
                if ($(self.input).attr("bkp") !== $(self.input).val()) {
                    self.validate();
                    self.execute();
                }
                $(self.input).attr("bkp", $(self.input).val());
            });
        }
        else {
            input.on('blur', function () {
                self.validate();
                self.execute();
            });
        }
    };

    DateValidator.prototype.validate = function () {
        "use strict";
        var self = this;

        if (self.isMMAAAA) {
            var val = self.input.value;
            if (val.match(/00\/0000/) || val == "") {
                if (self.isEmptyValid) {
                    self.isValid = true;
                } else {
                    self.isValid = false;
                }
            } else {
                if (!val.match(/^\d{2}\/\d{4}$/)) {
                    self.isValid = false;
                } else {
                    var mes = parseInt(val.split("/")[0])
                    self.isValid = mes > 0 && mes < 13;
                }
            }
        }
        else {
            var val = self.input.value;
            if (val.match(/00\/00\/0000/) || val == "") {
                if (self.isEmptyValid) {
                    self.isValid = true;
                } else {
                    self.isValid = false;
                }
            } else {
                if (val.match(/^\d{2}\/\d{2}\/\d{2}$/)) {
                    self.isValid = false;
                } else {
                    self.isValid = self.input.value.isValidDate();
                }
            }
        }

        if (self.v2) {
            if (self.getValue() !== "" && self.getValue() !== "00/00/0000") {
                self.isEmpty = false;
            }
            else {
                self.isEmpty = true;
            }
            if (self.isEmpty && self.isEmptyValid)
                self.alterBehavior(controlGroupBehavior.normal);
        }
    };

    DateValidator.prototype.execute = function () {
        "use strict";
        var self = this;
        if (self.isValid) {
            if (self.onValid) {
                self.onValid(self);
            }
        } else {
            if (self.onInvalid) {
                self.onInvalid(self);
            }
        }
    };

    function DateComparer(options) {
        this.idA = options.idA;
        this.idB = options.idB;
        this.inputA = null;
        this.inputB = null;
        this.verb = options.verb;
        this.isValid = options.valid;
        this.isListening = false;
        this.isMMAAAA = options.isMMAAAA;

        this.onValid = options.onValid;
        this.onInvalid = options.onInvalid;

        this.listen();
        this.compare();
    };

    DateComparer.prototype.listen = function () {
        "use strict";
        var self = this;
        self.inputA = $('#' + self.idA);
        self.inputB = $('#' + self.idB);
        self.inputA.on('change', function () {
            self.compare();
        });
        self.inputA.on('blur', function () {
            self.compare();
        });
        self.inputB.on('change', function () {
            self.compare();
        });
        self.inputB.on('blur', function () {
            self.compare();
        });
        self.isListening = true;
    };

    DateComparer.prototype.compare = function () {
        "use strict";
        var self = this;

        var valA = self.inputA.val();
        var valB = self.inputB.val();
        if (valA === "" || valB === "") {
            self.isValid = true;
        } else {
            if (self.isMMAAAA) {
                var result = ("01/" + valA).toDate().compare(("01/" + valB).toDate());
            }
            else {
                var result = valA.toDate().compare(valB.toDate());
            }
            self.isValid = (result == self.verb || result == 'equal');
        }
        self.execute();
        return self.isValid;
    };

    DateComparer.prototype.execute = function () {
        "use strict";
        var self = this;
        if (self.isValid) {
            if (self.onValid) {
                self.onValid(self);
            }
        } else {
            if (self.onInvalid) {
                self.onInvalid(self);
            }
        }
    };

    function CurrencyCompararer(options) {
        this.idA = options.idA;
        this.idB = options.idB;
        this.inputA = null;
        this.inputB = null;
        this.verb = options.verb;
        this.isValid = options.valid;
        this.isListening = false;

        this.onValid = options.onValid;
        this.onInvalid = options.onInvalid;

        this.construct();
    }

    CurrencyCompararer.prototype.construct = function () {
        "use strict";
        var self = this;
        self.listen();
        self.compare();
    };

    CurrencyCompararer.prototype.listen = function () {
        "use strict";
        var self = this;
        self.inputA = $('#' + self.idA);
        self.inputB = $('#' + self.idB);
        self.inputA.on('change', function () {
            self.compare();
        });
        self.inputA.on('blur', function () {
            self.compare();
        });
        self.inputB.on('change', function () {
            self.compare();
        });
        self.inputB.on('blur', function () {
            self.compare();
        });
        self.isListening = true;
    };

    CurrencyCompararer.prototype.compare = function () {
        "use strict";
        var self = this;

        var valA = self.inputA.val();
        var valB = self.inputB.val();
        if (valA === "" || valB === "") {
            self.isValid = true;
        } else {
            var result = valA.toFloat().compare(valB.toFloat());
            self.isValid = (result == self.verb || result == 'equal');
        }
        self.execute();
    };

    CurrencyCompararer.prototype.execute = function () {
        "use strict";
        var self = this;
        if (self.isValid) {
            if (self.onValid) {
                self.onValid(self);
            }
        } else {
            if (self.onInvalid) {
                self.onInvalid(self);
            }
        }
    };

    function DropDown(options) {
        this.dropDown = null;
        this.id = options['id'];
        this.route = options['route'];
        this.defaultValue = options['defaultValue'] || null;
        this.defaultValueRoute = window.baseUrl + options['defaultValueRoute'] || null;
        this.onOpen = options['onOpen'];
        this.onClose = options['onClose'];
        this.onChange = options['onChange'];
        this.onSelect = options['onSelect'];
        this.onDataBound = options['onDataBound'];
    }

    DropDown.prototype.make = function () {
        "use strict";
        var self = this;
        self.dropDown = $("#" + self.id).kendoDropDownList({
            dataTextField: "Text",
            dataValueField: "Value",
            dataSource: {
                type: "json",
                transport: {
                    read: window.baseUrl + self.route
                }
            },
            value: self.defaultValue,
            open: self.onOpen,
            close: self.onClose,
            change: self.onChange,
            select: self.onSelect,
            dataBound: function () {
                if (self.onDataBound) {
                    self.onDataBound();
                }
            }
        }).data("kendoDropDownList");
    };

    DropDown.prototype.disable = function () {
        "use strict";
        var self = this;
        self.dropDown.enable(false);
    };

    DropDown.prototype.enable = function () {
        "use strict";
        var self = this;
        self.dropDown.enable();
    };

    DropDown.prototype.set = function (value) {
        "use strict";
        var self = this;
        if (self.dropDown != null) {
            self.dropDown.value(value);
        }
    };

    DropDown.prototype.get = function () {
        "use strict";
        var self = this;
        return self.dropDown.value();
    };

    DropDown.prototype.setIndex = function (index) {
        "use strict";
        var self = this;
        self.dropDown.select(index);
    };

    DropDown.prototype.getIndex = function () {
        "use strict";
        var self = this;
        self.dropDown.select();
    };

    DropDown.prototype.setDefault = function () {
        "use strict";
        var self = this;
        if (self.defaultValue != null) {
            self.set(self.defaultValue['Value']);
        } else if (self.defaultValueRoute) {
            getJsonFromRoute(self.defaultValueRoute, '').done(function (data) {
                if (data.IsAlert) {
                    throw new Error(data.Message);
                } else {
                    self.set(data['Value']);
                }
            });
        } else {
            throw new Error('Não a registro default para este campo');
        }
    };

    DropDown.prototype.select = function (callback) {
        "use strict";
        var self = this;
        self.dropDown.select(callback);
    };

    DropDown.prototype.change = function () {
        "use strict";
        var self = this;
        self.dropDown.trigger('change');
    };

    function RadioSwitcher(options) {
        this.groupSelector = options.groupSelector;
        this.onChange = options.onChange;
        this.construct();
    }

    RadioSwitcher.prototype.construct = function () {
        "use strict";
        this.listen();
    };

    RadioSwitcher.prototype.listen = function () {
        "use strict";
        var self = this;
        $(self.groupSelector).on('click', function () {
            if (self.onChange) {
                self.onChange(this);
            }
        });
    };

    RadioSwitcher.prototype.value = function (callback) {
        "use strict";
        var self = this
           , firstValue = $(self.groupSelector + ':checked').val()
           , callType = typeof callback;


        switch (callType) {
            case 'function':
                callback(firstValue);
                break;
            case 'string':
            case 'number':
                $(self.groupSelector + '[value=' + callback + ']').click();
                break;
        }

        return firstValue;
    };

    RadioSwitcher.prototype.change = function () {
        "use strict";
        var self = this;
        if (self.onChange) {
            self.onChange(this);
        }
    };

    function msgWarning(msg) {
        Alert(msg, getAlertBehavior(alertLevel.warning));
    }

    function msgError(msg) {
        Alert(msg, getAlertBehavior(alertLevel.error));
    }

    var Alert = function (message, behavior) {
        var modal = "";
        modal += '<div class="alert alert-' + behavior + ' data-dismiss="alert" ">';
        modal += '<button type="button" class="close" data-dismiss="alert">&times;</button>';
        modal += '<strong>' + message + '</strong></i>';
        modal += '</div>';
        $("#divErrors").append(modal);
    };

    Pedidos.Manager = (function () {
        return {
            Main: (function (params) {
                return (function () {
                    var u = new Util();
                    var permissions = params.Permissoes;
                    currentUser.update(params.User);

                    u.addButtonHelpBreadcrumb("RadarWEB.htm", "Tela Inicial - Pedidos - Movimentos");

                    var routes = {};
                    routes.pedido = {};
                    routes.pedido.newPedido = window.baseUrl + "Comercial/Movimentos/NovoPedido/";
                    routes.pedido.updatePedido = window.baseUrl + "Comercial/Movimentos/Pedido/";
                    routes.pedido.getPedido = window.baseUrl + "Comercial/Movimentos/Pedido/";
                    routes.pedido.getPedidos = window.baseUrl + "Comercial/Movimentos/GetPedidos/";

                    function setPermissions() {
                        "use strict";
                        disableNegativePermissionsFields();
                        if (!permissions.PodeConsultarPedido) {
                            if (!permissions.PodeAlterarPedido) {
                                desabilitarGrid();
                            }
                        }
                    }

                    function desabilitarGrid() {
                        "use strict";
                        var tables = $('table');
                        var l = tables.length;
                        for (var i = 0; i < l; i = i + 1) {
                            var table = tables[i];
                            if (table.hasAttribute('data-role')) {
                                table.className = "";
                            }

                        }
                    }

                    function Grid(options) {
                        this.id = options.id;
                        this.route = options.route;
                        this.columns = options.columns;
                        this.onChange = options.onChange;
                        this.onDataBound = options.onDataBound;
                        this.onDataBinding = options.onDataBinding;
                        this.title = options.title;
                        this.grid = null;
                    }

                    Grid.prototype.make = function () {
                        "use strict";
                        var self = this;
                        $("#" + self.id).kendoGrid({
                            change: function (ev) {
                                var grid = this;

                                var ids = grid.select().map(function () {
                                    return grid.dataItem($(this)).Id;
                                }).toArray();

                                localStorage.setItem('settings_' + self.id + '_rows', JSON.stringify(ids));

                                if (self.onChange) {
                                    self.onChange(ev);
                                }
                                $('#waiting').show();
                            },
                            dataBound: function (ev) {
                                var grid = this;
                                var dataSource = grid.dataSource;

                                var state = kendo.stringify({
                                    page: dataSource.page(),
                                    pageSize: dataSource.pageSize(),
                                    sort: dataSource.sort(),
                                    group: dataSource.group(),
                                    filter: dataSource.filter()
                                });

                                currentUser.setCustomData("settings_" + self.id + "_state", state);
                                if (self.onDataBound) {
                                    self.onDataBound(ev);
                                }
                            },
                            dataBinding: function (ev) {
                                if (self.onDataBinding) {
                                    self.onDataBinding(ev);
                                }
                            },
                            columnReorder: function () {
                                self.saveState(this);
                                self.saveColumns(this);
                            },

                            toolbar: self.title,
                            reorderable: true,
                            resizable: true,
                            filterable: false,
                            selectable: true,
                            columnMenu: true,
                            sortable: {
                                allowUnsort: true
                            },
                            pageable: {
                                refresh: true,
                                pageSizes: [20, 30, 40, 50]
                            },
                            columns: self.loadColumns()
                        });

                        self.loadSettings();
                        self.grid = self.getGrid();
                    };

                    Grid.prototype.listen = function () {
                        "use strict";
                        var self = this;
                        $("#" + self.id).on('mousemove', function () {
                            self.saveColumns();
                        });
                    };

                    Grid.prototype.getColumns = function () {
                        "use strict";
                        var self = this;
                        if (localStorage) {
                            var stringyColumns = currentUser.getCustomData("settings_" + self.id + "_columns");
                            var columns = JSON.parse(stringyColumns);
                            return columns;
                        }
                        return null;
                    };

                    Grid.prototype.saveColumns = function (grid) {
                        "use strict";
                        var self = this;
                        setTimeout(function () {
                            if (!grid) {
                                grid = self.grid;
                            }
                            var columns = grid.columns;
                            var stringyColumns = JSON.stringify(columns);
                            if (localStorage) {
                                currentUser.setCustomData("settings_" + self.id + "_columns", stringyColumns);
                            }
                        }, 100);
                    };

                    Grid.prototype.loadColumns = function () {
                        "use strict";
                        var self = this;
                        var result;
                        var columns = self.getColumns();
                        result = columns ? columns : self.columns;
                        return result;
                    };

                    Grid.prototype.getState = function () {
                        "use strict";
                        var self = this;
                        if (localStorage) {
                            return JSON.parse(currentUser.getCustomData("settings_" + self.id + "_state"));
                        }
                        return null;
                    };

                    Grid.prototype.saveState = function (grid) {
                        "use strict";
                        if (localStorage) {
                            var self = this;
                            var dataSource = grid.dataSource;
                            var state = kendo.stringify({
                                page: dataSource.page(),
                                pageSize: dataSource.pageSize(),
                                sort: dataSource.sort(),
                                group: dataSource.group(),
                                filter: dataSource.filter()
                            });
                            currentUser.setCustomData("settings_" + self.id + "_state", state);
                        }
                    };

                    Grid.prototype.loadState = function () {
                        "use strict";
                        var self = this;
                        var dataSource = self.getDataSource();
                        var state = self.getState();
                        if (state) {
                            if (state.filter) {
                                parseFilterDates(state.filter, dataSource.options.schema.model.fields);
                            }
                            dataSource.query(state);

                        } else {
                            dataSource.read();
                        }

                        function parseFilterDates(filter, fields) {
                            if (filter.filters) {
                                for (var i = 0; i < filter.filters.length; i++) {
                                    parseFilterDates(filter.filters[i], fields);
                                }
                            } else {
                                if (fields[filter.field].type == "date") {
                                    filter.value = kendo.parseDate(filter.value);
                                }
                            }
                        }
                    };

                    Grid.prototype.loadSettings = function () {
                        "use strict";
                        var self = this;
                        self.loadState();
                    };

                    Grid.prototype.getSortingOptions = function () {
                        "use strict";
                        var self = this;
                        var data = {};
                        if (self.grid) {
                            if (self.grid.dataSource["_sort"]) {
                                var sortingOptions = self.grid.dataSource['_sort'][0];
                                if (sortingOptions) {
                                    data['Field'] = sortingOptions.field;
                                    data['Sort'] = sortingOptions.dir;
                                }
                            } else {
                                data['Field'] = "DataEmissao";
                                data['Sort'] = "desc";
                            }
                        }
                        return data;
                    };

                    Grid.prototype.getPagingOptions = function (options) {
                        "use strict";
                        var data = {};
                        data['Page'] = options.data.page;
                        data['PageSize'] = options.data.pageSize;
                        data['Skip'] = options.data.skip;
                        data['Take'] = options.data.take;
                        return data;
                    };

                    Grid.prototype.getNormalDataSource = function () {
                        "use strict";
                        var self = this;
                        var dataSource = {
                            type: "JSON",
                            transport: {
                                read: function (options) {
                                    var data = {};
                                    data["Sorting"] = self.getSortingOptions();
                                    data["Paging"] = self.getPagingOptions(options);
                                    $.ajax({
                                        headers: {
                                            'Accept': 'application/json',
                                            'Content-Type': 'application/json'
                                        },
                                        url: self.route,
                                        dataType: "json",
                                        type: "POST",
                                        data: JSON.stringify(data),
                                        success: function (result) {
                                            if (result.IsAlert) {
                                                u.alert(data.Message, getAlertBehavior(result.Level));
                                                $(".k-loading-mask").remove();
                                                options.success({ data: new Array(), total: 0 });
                                                throw new Error(result.Message);
                                            } else {
                                                options.success(result);
                                            }
                                        },
                                        error: function (result) {
                                            $(".k-loading-mask").remove();
                                            u.alert(result.status + "-" + result.statusText, alertBehavior.error);
                                        }
                                    });
                                }
                            },
                            schema: {
                                data: 'data',
                                total: 'total'
                            },
                            serverPaging: true,
                            serverSorting: true,
                            pageSize: 20
                        };
                        return dataSource;
                    };

                    Grid.prototype.getFilteredDataSource = function (filter) {
                        "use strict";
                        var self = this;
                        var dataSource = {
                            type: "JSON",
                            transport: {
                                read: function (options) {
                                    var data = {};
                                    data["Sorting"] = self.getSortingOptions();
                                    data["Filter"] = filter;
                                    data["Paging"] = self.getPagingOptions(options);
                                    $.ajax({
                                        headers: {
                                            'Accept': 'application/json',
                                            'Content-Type': 'application/json'
                                        },
                                        url: window.baseUrl + "Comercial/Movimentos/GetFilteredPedidos",
                                        dataType: "json",
                                        type: "POST",
                                        data: JSON.stringify(data),
                                        success: function (result) {
                                            if (result.IsAlert) {
                                                u.alert(result.Message, getAlertBehavior(result.Level));
                                                $(".k-loading-mask").remove();
                                                options.success({ data: new Array(), total: 0 });
                                                throw new Error(result.Message);
                                            } else {
                                                options.success(result);
                                            }
                                        },
                                        error: function (result) {
                                            $(".k-loading-mask").remove();
                                            //msgError(result.status + "-" + result.statusText);
                                            u.alert(result.status + "-" + result.statusText, alertBehavior.error);
                                        }
                                    });
                                }
                            },
                            schema: {
                                data: 'data',
                                total: 'total'
                            },
                            serverPaging: true,
                            serverSorting: true,
                            pageSize: 20
                        };
                        return dataSource;
                    };

                    Grid.prototype.refresh = function () {
                        "use strict";
                        var self = this;
                        var g = $("#" + self.id).data("kendoGrid");
                        g.dataSource.read();
                    };

                    Grid.prototype.getSelectedData = function () {
                        "use strict";
                        var self = this;
                        var grid = $("#" + self.id).data("kendoGrid");
                        var row = grid.select();
                        return grid.dataItem(row);
                    };

                    Grid.prototype.clearSelectedData = function () {
                        "use strict";
                        var self = this;
                        $("#" + self.id).data("kendoGrid").clearSelection();
                    };

                    Grid.prototype.getDataSource = function () {
                        "use strict";
                        var self = this;
                        return self.getGrid().dataSource;
                    };

                    Grid.prototype.getGrid = function () {
                        "use strict";
                        var self = this;
                        return $("#" + self.id).data("kendoGrid");
                    };

                    Grid.prototype.filters = function (filters) {
                        "use strict";
                        var self = this;
                        var dataSource = self.getDataSource();
                        dataSource.filter(filters);
                        self.refresh();
                    };

                    // pedidos
                    var titulo = "<span style='float:left; width: NaN;'><span style='font-size: large; font-weight: 800; text-align: center;'>Pedidos</span></span>";
                    var iconFilter = "<span class='k-icon k-i-funnel'>Atualiza</span>";
                    var inputFilter = "<button id='inputFilter' type='button' class='btn btn-small'>{0} Fitro</button>".format(iconFilter);
                    var incluirPedido = permissions.PodeIncluirNovoPedido ? "" : "disabled";
                    var iconPlus = "<span class='k-icon k-i-plus'>Atualiza</span>";
                    var inputNewPedido = "<button id='inputNewPedido' type='button' class='btn btn-small' style='float:right' {0}>{1} Novo</button>".format(incluirPedido, iconPlus);
                    var title = "{0}<span style='float:right'>{1}&nbsp{2}</span>".format(titulo, inputFilter, inputNewPedido);

                    var gridPedidos = new Grid({
                        "id": "gridPedidos",
                        "route": routes.pedido.getPedidos,
                        "columns": [
                            { field: "Numero", title: "Nr. Pedido", headerAttributes: { style: "color: black; font-weight: 800;" }, width: 100 },
                            { field: "Cliente", title: "Cliente", headerAttributes: { style: "color: black; font-weight: 800;" }, width: 120 },
                            { field: "DataEmissao", title: "Emissão", headerAttributes: { style: "color: black; font-weight: 800; text-align: center;" }, width: 90, attributes: { style: "text-align: center;" }, type: "date", format: "{0:dd/MM/yyyy}" },
                            { field: "DataEntrega", title: "Data Entrega", headerAttributes: { style: "color: black; font-weight: 800; text-align: center;" }, width: 90, attributes: { style: "text-align: center;" }, type: "date", format: "{0:dd/MM/yyyy}" },
                            { field: "Situacao", title: "Situação", headerAttributes: { style: "color: black; font-weight: 800;" }, width: 120 },
                            { field: "ValorTotal", title: "Valor Total&nbsp;", headerAttributes: { style: "color: black; font-weight: 800; text-align: right;" }, width: 90, attributes: { style: "text-align: right;" }, format: "{0:C}" }
                        ],
                        "onChange": function () {
                            "use strict";
                            var grid = $("#gridPedidos").data("kendoGrid");
                            var row = grid.select();
                            var data = grid.dataItem(row[0]);
                            /*
                            if (data) {
                                if(data.Situacao == "Atendido" && !permissions.PodeAlterarPedidoAtendido) {
                                    var mensagemAtendido = 'Sem permissão para alterar pedidos na situação: "Atendido"';
                                    //u.alert(mensagemAtendido, alertBehavior.warning);
                                    throw new Error(mensagemAtendido);
                                } else if(data.Situacao == "Em Analise" && !permissions.PodeAlterarPedidoEmAnalise) {
                                    var mensagemEmAnalise = 'Sem permissão para alterar pedidos na situação: "Em Analise"';
                                    //u.alert(mensagemEmAnalise, alertBehavior.warning);
                                    throw new Error(mensagemEmAnalise);
                                }
                            }
                            */
                            setTimeout(function () {
                                $('#waiting').show();
                            }, 200);
                            window.location.href = routes.pedido.getPedido + data.Id;
                        },
                        "onDataBound": function () {
                            "use strict";
                            msgWait.hide();
                            $("#gridPedidos table tbody tr").hover(function () {
                                $(this).toggleClass("k-state-hover");
                            });
                            var filter = document.getElementById('inputFilter');
                            filter.onclick = function () {
                                $('#filtroPedidosModal').modal('show');
                            };
                        },
                        "title": title
                    });

                    gridPedidos.make();
                    gridPedidos.listen();

                    /*---->Consulta Cliente*/
                    var validatorCliente = new Validator({
                        field: "inputCodigoCliente",
                        fieldDescriptionId: "descriptionCodigoCliente",
                        fieldSearch: "CodigoCliente",
                        v2: true,
                        ModalGrupoContas: true,
                        grupoContasFieldNome: "RazaoSocial",
                        linkButton: "linkButtonModalClientes",
                        linkButtonModalGrupoContas: "linkButtonModalGrupoContasClientes",
                        onPendencyMessage: 'Deve ser informado o código do cliente.',
                        route: 'Comercial/F4ClientePedido/GetCliente',
                        onValid: function (data) {
                            document.getElementById("inputCodigoCliente").value = data.Codigo;
                            document.getElementById("descriptionCodigoCliente").innerHTML = data.RazaoSocial;
                            tableCfops.refresh();
                        },
                        onInvalid: function (data) {
                            u.alert(data.Message, getAlertBehavior(data.Level));
                            validatorCliente.focus();
                            tableCfops.refresh();
                        }
                    });
                    validatorCliente.listen();
                    //validatorCliente.update();

                    var validatorProdutos = new Validator({
                        field: 'CodigoProduto',
                        onPendencyMessage: 'Deve ser informado o código do produto.',
                        route: 'Comercial/F4ProdutoPedido/GetProduto',
                        onValid: function (data) {
                            validatorProdutos.setChange(true);
                            document.getElementById('inputCodigoProduto').value = data['Codigo'];
                            document.getElementById('descriptionCodigoProduto').innerHTML = data['Nome'];
                            data['HaveGrade1'] ? validatorGrade1.enable() : validatorGrade1.disable();
                            data['HaveGrade2'] ? validatorGrade2.enable() : validatorGrade2.disable();
                            data['HaveGrade3'] ? validatorGrade3.enable() : validatorGrade3.disable();
                        },
                        onInvalid: function () {
                            validatorProdutos.setChange(true);
                            u.alert(data.Message, getAlertBehavior(data.Level));
                            validatorGrade1.disable();
                            validatorGrade2.disable();
                            validatorGrade3.disable();
                            validatorProdutos.focus();
                        },
                        onEmpty: function () {
                            validatorProdutos.setChange(true);
                            validatorGrade1.disable();
                            validatorGrade2.disable();
                            validatorGrade3.disable();
                        }
                    });
                    validatorProdutos.listen();

                    var validatorGrade1 = new Validator({
                        field: 'CodigoGrade1',
                        onPendencyMessage: 'Deve ser informada a Grade 1.',
                        route: 'Comercial/F4ProdutoPedido/GetItemGrade1',
                        pendency: [validatorProdutos],
                        onValid: function (data) {
                            validatorGrade1.setChange(true);
                            document.getElementById('inputCodigoGrade1').value = data['Codigo'];
                            document.getElementById('descriptionCodigoGrade1').innerHTML = ' - ' + data['Descricao'];

                            if (data['ValorUnitarioAtualizadoDoProduto'] !== "")
                                document.getElementById('inputValorUnitario').value = data['ValorUnitarioAtualizadoDoProduto'];
                        },
                        onInvalid: function (data) {
                            validatorGrade1.setChange(true);
                            u.alert(data.Message, getAlertBehavior(data.Level));
                            validatorGrade1.focus();
                        }
                    });
                    validatorGrade1.listen();

                    var validatorGrade2 = new Validator({
                        field: 'CodigoGrade2',
                        onPendencyMessage: 'Deve ser informada a Grade 2.',
                        route: 'Comercial/F4ProdutoPedido/GetItemGrade2',
                        pendency: [validatorGrade1, validatorProdutos],
                        onValid: function (data) {
                            validatorGrade2.setChange(true);
                            document.getElementById('inputCodigoGrade2').value = data['Codigo'];
                            document.getElementById('descriptionCodigoGrade2').innerHTML = ' - ' + data['Descricao'];

                            if (data['ValorUnitarioAtualizadoDoProduto'] !== "")
                                document.getElementById('inputValorUnitario').value = data['ValorUnitarioAtualizadoDoProduto'];
                        },
                        onInvalid: function (data) {
                            validatorGrade2.setChange(true);
                            u.alert(data.Message, getAlertBehavior(data.Level));
                            validatorGrade2.focus();
                        }
                    });
                    validatorGrade2.listen();

                    var validatorGrade3 = new Validator({
                        field: 'CodigoGrade3',
                        onPendencyMessage: "Deve ser informada a Grade 3.",
                        route: 'Comercial/F4ProdutoPedido/GetItemGrade3',
                        pendency: [validatorGrade2, validatorGrade1, validatorProdutos],
                        onValid: function (data) {
                            validatorGrade3.setChange(true);
                            document.getElementById('inputCodigoGrade3').value = data['Codigo'];
                            document.getElementById('descriptionCodigoGrade3').innerHTML = ' - ' + data['Descricao'];

                            if (data['ValorUnitarioAtualizadoDoProduto'] !== "")
                                document.getElementById('inputValorUnitario').value = data['ValorUnitarioAtualizadoDoProduto'];
                        },
                        onInvalid: function (data) {
                            validatorGrade3.setChange(true);
                            u.alert(data.Message, getAlertBehavior(data.Level));
                            validatorGrade3.focus();
                        }
                    });
                    validatorGrade3.listen();

                    /*F4 Cliente*/
                    var tableClientes = new Table({
                        'id': 'tableCliente',
                        'route': window.baseUrl + "Comercial/F4ClientePedido/GetClientes",
                        'showFilter': true,
                        'columns': [
                            { title: 'Código', field: 'Codigo', width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: 'Razão Social', field: 'RazaoSocial', width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: 'CPF/CNPJ', field: 'CnpjCpf', width: 115, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        'columnsLegend': { CnpjCpf: 'Ex: 11.222.333/4444-55' },
                        'onChange': function () {
                            "use strict";
                            var ok = document.getElementById('inputF4ModalOk' + this.id);
                            ok.onclick = function () {
                                validatorProdutos.setChange(true);
                                var cliente = tableClientes.getSelectedData();
                                document.getElementById("inputCodigoCliente").value = cliente.Codigo;
                                document.getElementById("descriptionCodigoCliente").innerHTML = cliente.RazaoSocial;
                                $('#modalCliente').modal('hide');
                                $('#filtroPedidosModal').modal('show');
                                tableCfops.refresh();
                            };
                            var cancelar = document.getElementById('inputF4ModalCancelar');
                            cancelar.onclick = function () {
                                $('#modalCliente').modal('hide');
                                $('#filtroPedidosModal').modal('show');
                            };
                        },
                        'onDataBound': function () {
                            $('#tableCliente table tr').on('dblclick', function () {
                                validatorProdutos.setChange(true);
                                var cliente = tableClientes.getSelectedData();
                                document.getElementById("inputCodigoCliente").value = cliente.Codigo;
                                document.getElementById("descriptionCodigoCliente").innerHTML = cliente.RazaoSocial;
                                validatorCliente.update();
                                $('#modalCliente').modal('hide');
                                $('#filtroPedidosModal').modal('show');
                                tableCfops.refresh();
                            });
                            var cancelar = document.getElementById('inputF4ModalCancelar');
                            cancelar.onclick = function () {
                                $('#modalCliente').modal('hide');
                                $('#filtroPedidosModal').modal('show');
                            };
                        },
                        'dataSourceType': "Filtered"
                    });
                    var linkButtonModalClientes = document.getElementById('linkButtonModalClientes');
                    var inputClientes = document.getElementById('inputCodigoCliente');

                    var options = {
                        validatorInput: validatorCliente,
                        onHidden: function () {
                            $("#filtroPedidosModal").modal("show");
                        }
                    }
                    var modalClientes = new Modal('Clientes',
                        linkButtonModalClientes,
                        inputClientes,
                        tableClientes,
                        function () {
                            $("#filtroPedidosModal").modal("hide");
                        },
                        options);
                    modalClientes.listen();

                    var modalGrupoContasClientes = new ModalGrupoContas({
                        id: "Clientes",
                        validatorInput: validatorCliente,
                        validatorConta: {
                            fieldSearch: "CodigoCliente",
                            onPendencyMessage: "Deve ser informado o código do cliente.",
                            route: "Comercial/F4ClientePedido/GetCliente",
                            fieldNome: "RazaoSocial"
                        },
                        tableConta: {
                            route: window.baseUrl + "Comercial/F4ClientePedido/GetClientes",
                            showFilter: true,
                            columns: [
                                { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                                { title: "Razão Social", field: "RazaoSocial", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                                { title: "CPF/CNPJ", field: "CnpjCpf", width: 115, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                            ]
                        },
                        onShow: function () {
                            $("#filtroPedidosModal").modal("hide");
                        },
                        onHidden: function () {
                            $("#filtroPedidosModal").modal("show");
                        }
                    });

                    /*F4 Produtos*/
                    var optionsProdutos = {
                        'id': 'tableProdutosFiltro',
                        'route': window.baseUrl + 'Comercial/F4ProdutoPedido/GetProdutos',
                        'showFilter': true,
                        'columns': [
                            { title: 'Código', field: 'Codigo', width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: 'Nome', field: 'Nome', width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: 'Unidade', field: 'Unidade', width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            //{ title: 'Preço', field: 'ValorUnitario', width: 60, headerAttributes: { style: "color: black; text-align: rigtht;" }, attributes: { style: "text-align: rigtht;" } },
                            { title: 'Classificação', field: 'Classificacao', width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        'columnsLegend': { Classificacao: "Ex: 1.101" },
                        'onChange': onChangeProdutos,
                        'onDataBound': onDataBoundProdutos,
                        'dataSourceType': "Filtered"
                    };
                    function onChangeProdutos() {
                        var ok = document.getElementById('inputF4ModalOk' + this.id);
                        var cancelar = document.getElementById('inputF4ModalCancelar');
                        ok.onclick = function () {
                            // refatorar e colocar em uma rotina, pois sao 3 lugares para alterar: onclick-table, dblclick-table e dblclick-hierarquia
                            var data = tableProdutos.getSelectedData();
                            document.getElementById('inputCodigoProduto').value = data['Codigo'];
                            document.getElementById('descriptionCodigoProduto').innerHTML = data['Nome'];
                            data['HaveGrade1'] ? validatorGrade1.enable() : validatorGrade1.disable();
                            data['HaveGrade2'] ? validatorGrade2.enable() : validatorGrade2.disable();
                            data['HaveGrade3'] ? validatorGrade3.enable() : validatorGrade3.disable();
                            validatorProdutos.update();
                            $('#modalProdutos').modal('hide');
                            $('#filtroPedidosModal').modal('show');
                        };
                        cancelar.onclick = function () {
                            $('#modalProdutos').modal('hide');
                            $('#filtroPedidosModal').modal('show');
                        };
                    }
                    function onDataBoundProdutos() {
                        $('#tableProdutosFiltro table  tr').on('dblclick', function () {
                            // refatorar e colocar em uma rotina, pois sao 3 lugares para alterar: onclick-table, dblclick-table e dblclick-hierarquia
                            var data = tableProdutos.getSelectedData();
                            document.getElementById('inputCodigoProduto').value = data['Codigo'];
                            document.getElementById('descriptionCodigoProduto').innerHTML = data['Nome'];
                            data['HaveGrade1'] ? validatorGrade1.enable() : validatorGrade1.disable();
                            data['HaveGrade2'] ? validatorGrade2.enable() : validatorGrade2.disable();
                            data['HaveGrade3'] ? validatorGrade3.enable() : validatorGrade3.disable();
                            validatorProdutos.update();
                            $('#modalProdutos').modal('hide');
                            $('#filtroPedidosModal').modal('show');
                        });
                        var cancelar = document.getElementById('inputF4ModalCancelar');
                        cancelar.onclick = function () {
                            $('#modalProdutos').modal('hide');
                            $('#filtroPedidosModal').modal('show');
                        };
                    }
                    var tableProdutos = new Table(optionsProdutos);
                    var linkButtonModalProdutos = document.getElementById('linkButtonModalProdutos');
                    var inputProdutos = document.getElementById('inputCodigoProduto');

                    // showOpcaoExibir, exibirHierarquiaLista
                    var options = {
                        showOpcaoExibir: true,
                        onHidden: function () {
                            $("#modalProdutos").modal("hide");
                            $("#filtroPedidosModal").modal("show");
                        },
                        onDblClickGetItem: function (event, dados) {
                            // refatorar e colocar em uma rotina, pois sao 3 lugares para alterar: onclick-table, dblclick-table e dblclick-hierarquia
                            var data = dados;
                            document.getElementById('inputCodigoProduto').value = data['Codigo'];

                            var search = {};
                            search['CodigoProduto'] = data['Codigo'];
                            getJsonFromRoute('Empresarial/F4Produto/GetProduto', search).done(function (produto) {
                                if (produto.IsAlert)
                                    throw new Error(produto.Message);

                                document.getElementById('descriptionCodigoProduto').innerHTML = produto['Nome'];
                                produto['HaveGrade1'] ? validatorGrade1.enable() : validatorGrade1.disable();
                                produto['HaveGrade2'] ? validatorGrade2.enable() : validatorGrade2.disable();
                                produto['HaveGrade3'] ? validatorGrade3.enable() : validatorGrade3.disable();
                                validatorProdutos.update();
                                $('#modalProdutos').modal('hide');
                                $('#filtroPedidosModal').modal('show');
                            });
                        }
                    };

                    var modalProdutos = new Modal('Produtos', linkButtonModalProdutos, inputProdutos, tableProdutos, null, options);
                    modalProdutos.listen();

                    /*F4 Grades*/
                    var columnsGrade = [
                        { title: 'Código', field: 'Codigo', width: 45, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                        { title: 'Descrição', field: 'Descricao', width: 64, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                    ];
                    var optionsGrade1 = {
                        'id': 'tableGrade1',
                        'route': window.baseUrl + 'Comercial/F4ProdutoPedido/List1',
                        'showFilter': true,
                        'columns': columnsGrade,
                        'params': [validatorProdutos],
                        "fieldDepende": validatorProdutos,
                        'onChange': function () {
                            var ok = document.getElementById('inputF4ModalOk' + this.id);
                            var cancelar = document.getElementById('inputF4ModalCancelar');
                            ok.onclick = function () {
                                validatorGrade1.setChange(true);
                                var data = tableGrade1.getSelectedData();
                                document.getElementById('inputCodigoGrade1').value = data['Codigo'];
                                document.getElementById('descriptionCodigoGrade1').innerHTML = ' - ' + data['Descricao'];
                                validatorGrade1.update();
                                $('#filtroPedidosModal').modal('show');
                            };
                            cancelar.onclick = function () {
                                $('#filtroPedidosModal').modal('show');
                            };
                        },
                        'onDataBound': onDataBoundGrade1,
                        'dataSourceType': "Parameter"
                    };
                    var optionsGrade2 = {
                        'id': 'tableGrade2',
                        'route': window.baseUrl + 'Comercial/F4ProdutoPedido/List2',
                        'showFilter': true,
                        'columns': columnsGrade,
                        'params': [validatorGrade1, validatorProdutos],
                        "fieldDepende": validatorGrade1,
                        'onChange': function () {
                            var ok = document.getElementById('inputF4ModalOk' + this.id);
                            var cancelar = document.getElementById('inputF4ModalCancelar');
                            ok.onclick = function () {
                                validatorGrade2.setChange(true);
                                var data = tableGrade2.getSelectedData();
                                document.getElementById('inputCodigoGrade2').value = data['Codigo'];
                                document.getElementById('descriptionCodigoGrade2').innerHTML = ' - ' + data['Descricao'];
                                validatorGrade2.update();
                                $('#filtroPedidosModal').modal('show');
                            };
                            cancelar.onclick = function () {
                                $('#filtroPedidosModal').modal('show');
                            };
                        },
                        'onDataBound': onDataBoundGrade2,
                        'dataSourceType': "Parameter"
                    };
                    var optionsGrade3 = {
                        'id': 'tableGrade3',
                        'route': window.baseUrl + 'Comercial/F4ProdutoPedido/List3',
                        'showFilter': true,
                        'columns': columnsGrade,
                        'params': [validatorGrade2, validatorGrade1, validatorProdutos],
                        "fieldDepende": validatorGrade2,
                        'onChange': function () {
                            var ok = document.getElementById('inputF4ModalOk' + this.id);
                            var cancelar = document.getElementById('inputF4ModalCancelar');
                            ok.onclick = function () {
                                validatorGrade3.setChange(true);
                                var data = tableGrade3.getSelectedData();
                                document.getElementById('inputCodigoGrade3').value = data['Codigo'];
                                document.getElementById('descriptionCodigoGrade3').innerHTML = ' - ' + data['Descricao'];
                                validatorGrade3.update();
                                $('#filtroPedidosModal').modal('show');
                            };
                            cancelar.onclick = function () {
                                $('#filtroPedidosModal').modal('show');
                            };
                        },
                        'onDataBound': onDataBoundGrade3,
                        'dataSourceType': "Parameter"
                    };

                    function onDataBoundGrade1() {
                        $('#filtroPedidosModal').modal('hide');
                        $('#' + this.id + ' table  tr').on('dblclick', function () {
                            validatorGrade1.setChange(true);
                            var data = tableGrade1.getSelectedData();
                            document.getElementById('inputCodigoGrade1').value = data['Codigo'];
                            document.getElementById('descriptionCodigoGrade1').innerHTML = ' - ' + data['Descricao'];
                            validatorGrade1.update();

                            $('#modalGrade1').modal('hide');
                            $('#filtroPedidosModal').modal('show');
                        });
                        var cancelar = document.getElementById('inputF4ModalCancelar');
                        cancelar.onclick = function () {
                            $('#filtroPedidosModal').modal('show');
                        };
                        $('#filtroPedidosModal').modal('hide');
                    }

                    function onDataBoundGrade2() {
                        $('#filtroPedidosModal').modal('hide');
                        $('#' + this.id + ' table  tr').on('dblclick', function () {
                            validatorGrade2.setChange(true);
                            var data = tableGrade2.getSelectedData();
                            document.getElementById('inputCodigoGrade2').value = data['Codigo'];
                            document.getElementById('descriptionCodigoGrade2').innerHTML = ' - ' + data['Descricao'];
                            validatorGrade1.update();

                            $('#modalGrade2').modal('hide');
                            $('#filtroPedidosModal').modal('show');
                        });
                        var cancelar = document.getElementById('inputF4ModalCancelar');
                        cancelar.onclick = function () {
                            $('#filtroPedidosModal').modal('show');
                        };
                    }

                    function onDataBoundGrade3() {
                        $('#filtroPedidosModal').modal('hide');
                        $('#' + this.id + ' table  tr').on('dblclick', function () {
                            validatorGrade3.setChange(true);
                            var data = tableGrade3.getSelectedData();
                            document.getElementById('inputCodigoGrade3').value = data['Codigo'];
                            document.getElementById('descriptionCodigoGrade3').innerHTML = ' - ' + data['Descricao'];
                            validatorGrade1.update();

                            $('#modalGrade3').modal('hide');
                            $('#filtroPedidosModal').modal('show');
                        });
                        var cancelar = document.getElementById('inputF4ModalCancelar');
                        cancelar.onclick = function () {
                            $('#filtroPedidosModal').modal('show');
                        };
                        $('#filtroPedidosModal').modal('hide');
                    }

                    var tableGrade1 = new Table(optionsGrade1);
                    var tableGrade2 = new Table(optionsGrade2);
                    var tableGrade3 = new Table(optionsGrade3);

                    var linkButtonModalGrade1 = document.getElementById('linkButtonModalGrade1');
                    var linkButtonModalGrade2 = document.getElementById('linkButtonModalGrade2');
                    var linkButtonModalGrade3 = document.getElementById('linkButtonModalGrade3');

                    $(linkButtonModalGrade1).on('click', function () {
                        $('#filtroPedidosModal').modal('hide');
                    });
                    $(linkButtonModalGrade2).on('click', function () {
                        $('#filtroPedidosModal').modal('hide');
                    });
                    $(linkButtonModalGrade3).on('click', function () {
                        $('#filtroPedidosModal').modal('hide');
                    });

                    var inputGrade1 = document.getElementById('inputCodigoGrade1');
                    var inputGrade2 = document.getElementById('inputCodigoGrade2');
                    var inputGrade3 = document.getElementById('inputCodigoGrade3');

                    var modalGrade1 = new Modal('Grade', linkButtonModalGrade1, inputGrade1, tableGrade1);
                    var modalGrade2 = new Modal('Grade', linkButtonModalGrade2, inputGrade2, tableGrade2);
                    var modalGrade3 = new Modal('Grade', linkButtonModalGrade3, inputGrade3, tableGrade3);

                    modalGrade1.listen();
                    modalGrade2.listen();
                    modalGrade3.listen();

                    listenToggleProdutoGradesF4();


                    var periodoInicialDateValidator = new DateValidator({
                        id: "inputPeriodoInicial",
                        constructInjection: function () {
                            makeDatePicker('#inputPeriodoInicial');
                        },
                        isEmptyValid: true,
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                            $('#inputPeriodoFinal').val(validator.input.value);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        }
                    });

                    var periodoFinalDateValidator = new DateValidator({
                        id: "inputPeriodoFinal",
                        constructInjection: function () {
                            makeDatePicker('#inputPeriodoFinal');
                        },
                        isEmptyValid: true,
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        }
                    });

                    var dataEntregaInicialDateValidator = new DateValidator({
                        id: "inputDataEntregaInicial",
                        constructInjection: function () {
                            makeDatePicker('#inputDataEntregaInicial');
                        },
                        isEmptyValid: true,
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                            $('#inputDataEntregaFinal').val(validator.input.value);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        }
                    });

                    var dataEntregaFinalDateValidator = new DateValidator({
                        id: "inputDataEntregaFinal",
                        constructInjection: function () {
                            makeDatePicker('#inputDataEntregaFinal');
                        },
                        isEmptyValid: true,
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        }
                    });


                    var comparePeriodoInicialComFinal = new DateComparer({
                        idA: 'inputPeriodoInicial',
                        idB: 'inputPeriodoFinal',
                        verb: 'less',
                        onInvalid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.error);
                            u.alert('Data inicial deve ser anterior a data final.', alertBehavior.error);
                        },
                        onValid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.normal);
                        }
                    });

                    var compareDataEntregaInicialComFinal = new DateComparer({
                        idA: 'inputDataEntregaInicial',
                        idB: 'inputDataEntregaFinal',
                        verb: 'less',
                        onInvalid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.error);
                            u.alert('Data inicial deve ser anterior a data final.', alertBehavior.error);
                        },
                        onValid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.normal);
                        }
                    });

                    var compareDataEntregaInicialComPeriodoInicial = new DateComparer({
                        idA: 'inputDataEntregaInicial',
                        idB: 'inputPeriodoInicial',
                        verb: 'greater',
                        onInvalid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.error);
                            alterControlGroupBehavior(data.idB, controlGroupBehavior.error);
                            u.alert('Data Entrega Inicial deve ser anterior ao periodo inicial.', alertBehavior.error);
                        },
                        onValid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.normal);
                            alterControlGroupBehavior(data.idB, controlGroupBehavior.normal);
                        }
                    });

                    var compareValorInicialComValorFinal = new CurrencyCompararer({
                        idA: 'inputValorInicial',
                        idB: 'inputValorFinal',
                        verb: 'less',
                        onInvalid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.error);
                            alterControlGroupBehavior(data.idB, controlGroupBehavior.error);
                            u.alert('Valor Inicial deve ser menor do que o Valor Final.', alertBehavior.error);
                        },
                        onValid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.normal);
                            alterControlGroupBehavior(data.idB, controlGroupBehavior.normal);
                        }
                    });


                    $('#inputValorInicial').on('change', function () {
                        $('#inputValorFinal').val(this.value);
                    });

                    $('#inputValorInicial').on('blur', function () {
                        $('#inputValorFinal').val(this.value);
                    });

                    $('#inputNrPedidoInicial').on('change', function () {
                        $('#inputNrPedidoFinal').val(this.value);
                    });

                    $('#inputNrPedidoInicial').on('blur', function () {
                        $('#inputNrPedidoFinal').val(this.value);
                    });

                    $("#inputNewPedido").on("click", function () {
                        setTimeout(function () {
                            $('#waiting').show();
                        }, 200);

                        window.location.href = routes.pedido.newPedido;
                    });

                    $("#removeFilter").on('click', function () {
                        "use strict";
                        document.getElementById('inputPeriodoInicial').value = "";
                        document.getElementById('inputPeriodoFinal').value = "";
                        document.getElementById('inputDataEntregaInicial').value = "";
                        document.getElementById('inputDataEntregaFinal').value = "";
                        document.getElementById('inputValorInicial').value = "";
                        document.getElementById('inputValorFinal').value = "";
                        document.getElementById('inputNrPedidoInicial').value = "";
                        document.getElementById('inputNrPedidoFinal').value = "";
                        document.getElementById('check-filter-situacao-em-analise').checked = false;
                        document.getElementById('check-filter-situacao-bloqueado').checked = false;
                        document.getElementById('check-filter-situacao-pendente').checked = false;
                        document.getElementById('check-filter-situacao-cancelado').checked = false;
                        document.getElementById('check-filter-situacao-parcialmente-faturado').checked = false;
                        document.getElementById('check-filter-situacao-faturado').checked = false;
                        document.getElementById('check-filter-situacao-parcialmente-atendido').checked = false;
                        document.getElementById('check-filter-situacao-atendido').checked = false;
                        document.getElementById('inputCodigoCliente').value = "";
                        document.getElementById('descriptionCodigoCliente').innerHTML = "";
                        document.getElementById('inputCodigoProduto').value = "";
                        document.getElementById('descriptionCodigoProduto').innerHTML = "";

                        var grade1 = document.getElementById('inputCodigoGrade1');
                        grade1.value = "";
                        grade1.disable = true;

                        var grade2 = document.getElementById('inputCodigoGrade2');
                        grade2.value = "";
                        grade2.disable = true;

                        var grade3 = document.getElementById('inputCodigoGrade3');
                        grade3.value = "";
                        grade3.disable = true;

                        document.getElementById('inputNumeroOc').value = "";
                        currentUser.setSessionData('filtro_pedidos', null);

                        var dataSource = new kendo.data.DataSource(
                            gridPedidos.getNormalDataSource()
                        );

                        dataSource.read();
                        $("#gridPedidos").data("kendoGrid").setDataSource(dataSource);
                        gridPedidos.loadSettings();
                        setMask();
                    });

                    $("#doFilter").on('click', function () {
                        "use strict";

                        if (!(compareDataEntregaInicialComFinal.isValid &&
                            comparePeriodoInicialComFinal.isValid &&
                            compareDataEntregaInicialComPeriodoInicial.isValid &&
                            periodoInicialDateValidator.isValid &&
                            periodoFinalDateValidator.isValid &&
                            dataEntregaInicialDateValidator &&
                            dataEntregaFinalDateValidator &&
                            compareValorInicialComValorFinal.isValid)) {

                            var message = 'Erros no filtro';
                            u.alert(message, alertBehavior.error);
                            throw new Error(message);
                        }

                        var filtroVM = {};

                        filtroVM['PeriodoInicial'] = document.getElementById('inputPeriodoInicial').value;
                        filtroVM['PeriodoFinal'] = document.getElementById('inputPeriodoFinal').value;

                        filtroVM['DataEntregaInicial'] = document.getElementById('inputDataEntregaInicial').value;
                        filtroVM['DataEntregaFinal'] = document.getElementById('inputDataEntregaFinal').value;

                        filtroVM['ValorInicial'] = document.getElementById('inputValorInicial').value.replace('.', '').replace(',', '.');
                        filtroVM['ValorFinal'] = document.getElementById('inputValorFinal').value.replace('.', '').replace(',', '.');

                        filtroVM['NumeroInicial'] = document.getElementById('inputNrPedidoInicial').value;
                        filtroVM['NumeroFinal'] = document.getElementById('inputNrPedidoFinal').value;

                        filtroVM['IsEmAnalise'] = document.getElementById('check-filter-situacao-em-analise').checked;
                        filtroVM['IsBloqueado'] = document.getElementById('check-filter-situacao-bloqueado').checked;
                        filtroVM['IsPendente'] = document.getElementById('check-filter-situacao-pendente').checked;
                        filtroVM['IsCancelado'] = document.getElementById('check-filter-situacao-cancelado').checked;
                        filtroVM['IsParcialmenteFaturado'] = document.getElementById('check-filter-situacao-parcialmente-faturado').checked;
                        filtroVM['IsFaturado'] = document.getElementById('check-filter-situacao-faturado').checked;
                        filtroVM['IsParcialmenteAtendido'] = document.getElementById('check-filter-situacao-parcialmente-atendido').checked;
                        filtroVM['IsAtendido'] = document.getElementById('check-filter-situacao-atendido').checked;

                        if (validatorCliente.getVarios()) {
                            // filtro GrupoContas
                            filtroVM['CodigoCliente'] = "";
                            filtroVM['CodigosClientes'] = validatorCliente.getGrupoContasLista();
                        }
                        else {
                            // filtro unico
                            filtroVM['CodigoCliente'] = document.getElementById('inputCodigoCliente').value;
                            filtroVM['CodigosClientes'] = [];
                        }

                        filtroVM['CodigoProduto'] = document.getElementById('inputCodigoProduto').value;
                        filtroVM['CodigoGrade1'] = document.getElementById('inputCodigoGrade1').value;
                        filtroVM['CodigoGrade2'] = document.getElementById('inputCodigoGrade2').value;
                        filtroVM['CodigoGrade3'] = document.getElementById('inputCodigoGrade3').value;
                        filtroVM['NumeroOcCliente'] = document.getElementById('inputNumeroOc').value;

                        currentUser.setSessionData('filtro_pedidos', JSON.stringify(filtroVM));

                        var dataSource = new kendo.data.DataSource(
                            gridPedidos.getFilteredDataSource(filtroVM)
                        );
                        //dataSource.read(); comentado para não entrar em recursão no fill da Grid;

                        $("#gridPedidos").data("kendoGrid").setDataSource(dataSource);
                        //gridPedidos.loadSettings();
                    });

                    $('.radar-drop-down').kendoDropDownList();

                    $('.radar-date-picker').setMask("99/99/9999");

                    function loadCustomFilter() {
                        var filtroVM = JSON.parse(currentUser.getSessionData('filtro_pedidos'));
                        if (filtroVM != null) {
                            document.getElementById('inputPeriodoInicial').value = filtroVM['PeriodoInicial'];
                            document.getElementById('inputPeriodoFinal').value = filtroVM['PeriodoFinal'];

                            document.getElementById('inputDataEntregaInicial').value = filtroVM['DataEntregaInicial'];
                            document.getElementById('inputDataEntregaFinal').value = filtroVM['DataEntregaFinal'];

                            document.getElementById('inputValorInicial').value = filtroVM['ValorInicial'];
                            document.getElementById('inputValorFinal').value = filtroVM['ValorFinal'];

                            document.getElementById('inputNrPedidoInicial').value = filtroVM['NumeroInicial'];
                            document.getElementById('inputNrPedidoFinal').value = filtroVM['NumeroFinal'];

                            document.getElementById('check-filter-situacao-em-analise').checked = filtroVM['IsEmAnalise'];
                            document.getElementById('check-filter-situacao-bloqueado').checked = filtroVM['IsBloqueado'];
                            document.getElementById('check-filter-situacao-pendente').checked = filtroVM['IsPendente'];
                            document.getElementById('check-filter-situacao-cancelado').checked = filtroVM['IsCancelado'];
                            document.getElementById('check-filter-situacao-parcialmente-faturado').checked = filtroVM['IsParcialmenteFaturado'];
                            document.getElementById('check-filter-situacao-faturado').checked = filtroVM['IsFaturado'];
                            document.getElementById('check-filter-situacao-parcialmente-atendido').checked = filtroVM['IsParcialmenteAtendido'];
                            document.getElementById('check-filter-situacao-atendido').checked = filtroVM['IsAtendido'];

                            if (filtroVM['CodigosClientes'].length > 1) {
                                // filtro GrupoContas
                                validatorCliente.setGrupoContasLista(filtroVM['CodigosClientes']);
                                validatorCliente.setVarios(true);
                            }
                            else {
                                // filtro unico
                                document.getElementById('inputCodigoCliente').value = filtroVM['CodigoCliente'];
                                validatorCliente.setValue(filtroVM['CodigoCliente']);
                            }

                            document.getElementById('inputCodigoProduto').value = filtroVM['CodigoProduto'];
                            document.getElementById('inputCodigoGrade1').value = filtroVM['CodigoGrade1'];
                            document.getElementById('inputCodigoGrade2').value = filtroVM['CodigoGrade2'];
                            document.getElementById('inputCodigoGrade3').value = filtroVM['CodigoGrade3'];
                            document.getElementById('inputNumeroOc').value = filtroVM['NumeroOcCliente'];
                        }

                        $('#doFilter').click();
                    }

                    loadCustomFilter();

                    kendo.culture("pt-BR");
                    setMask();
                    setPermissions();
                }(params));
            })
        };
    }());

    Pedido.Manager = (function () {
        return {
            Main: function (params) {
                return (function () {
                    var lastFieldFocus = "";
                    var alterouCampo = false;
                    var permissions = params.Pedido.Permissoes;
                    var u = new Util();
                    currentUser.update(params.User);

                    u.addButtonHelpBreadcrumb("RadarWEB.htm", "Tela Inicial - Pedidos - Movimentos");

                    function setPermissions() {
                        var message = "";
                        disableNegativePermissionsFields();

                        if (params.Pedido.IsAlteracao) {
                            $('#controlNumeroPedido').show();
                            $('#buttonGeneratePdfPedido').attr('disabled', false);

                            if (!permissions.PodeCopiarPedido) {
                                $('#buttonCopiarPedido').attr('disabled', true);
                                $('#buttonCopiarPedido').on('click');
                            } else {
                                $('#buttonCopiarPedido').attr('disabled', false);
                                $('#buttonCopiarPedido').on('click', copiarPedido);
                            }
                        } else {
                            $('#controlNumeroPedido').hide();
                            $('#buttonGeneratePdfPedido').attr('disabled', true);
                            $('#buttonCopiarPedido').attr('disabled', true);
                            $('#buttonCopiarPedido').on('click');
                        }

                        if (params.Pedido.IsAlert && params.Pedido.IsAlteracao && !params.Pedido.PodeSerAlterado &&
                            params.Pedido.Level === alertLevel.error) {
                            disablePedido();
                        }

                        if (params.Pedido.IsAlteracao) {// || !params.PodeSerAlterado)
                            if (!permissions.PodeAlterarPedido) {
                                u.alert('Este pedido não pode ser alterado.', alertBehavior.warning, true);
                                disablePedido();
                                throw new Error(message);
                            }

                            if (params.Pedido.Situacao == "Atendido" && !permissions.PodeAlterarPedidoAtendido) {
                                message = 'Este pedido não pode ser alterado.';
                                u.alert(message, alertBehavior.warning, true);
                                disablePedido();
                                throw new Error(message);
                            }

                            if (params.Pedido.Situacao == "Em Análise" && !permissions.PodeAlterarPedidoEmAnalise) {
                                message = 'Este pedido não pode ser alterado.';
                                u.alert(message, alertBehavior.warning, true);
                                disablePedido();
                                throw new Error(message);
                            }
                        }

                        if (permissions.ContemProdutosNaoLiberados) {
                            message = "Este pedido não pode ser alterado por conter produtos não liberados para uso no RadarWeb.";
                            u.alert(message, alertBehavior.warning, true);
                            disablePedido();
                            throw new Error(message);
                        }


                    }

                    function disablePedido() {
                        disableAllInputs();
                        dropDownCondicoesPagamento.disable();
                        dropDownFormasPagamento.disable();
                        dropDownQuemtransporta.disable();
                        dropDownTipoCobranca.disable();
                        dropDownViaTransporte.disable();
                    }

                    if (params.IsAlert) {
                        u.alert(params.Message, alertBehavior.error, true);
                        $("i,input,textarea,input,select,input,checkbox").attr("disabled", "disabled");
                        $("a > i").parent().attr("href", "");
                        $("#cancelarAlteracaoPedido").removeAttr("disabled");
                    }

                    function reziseGrids() {
                        "use strict";
                        var el = $('.k-grid-content');
                        el[0].style.height = "118px";
                        el[1].style.height = "108px";
                    }

                    /*----->Grids Principais<-----*/
                    var gridItens = new Table({
                        'id': 'gridItens',
                        'route': window.baseUrl + 'Comercial/Itens/GetItens',
                        'columns': [
                            { title: 'Código', field: 'CodProduto', width: 60, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } },
                            { title: 'Nome', field: 'NomeProduto', width: 100, hidden: true, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } },
                            { title: 'Descrição', field: 'DescricaoProduto', width: 100, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } },
                            { title: 'Complemento', field: 'Complemento', width: 100, hidden: true, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } },
                            { title: 'Grade 1', field: 'DescricaoItemGrade1', width: 50, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } },
                            { title: 'Grade 2', field: 'DescricaoItemGrade2', width: 50, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } },
                            { title: 'Grade 3', field: 'DescricaoItemGrade3', width: 50, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } },
                            { title: 'Quantidade', field: 'Quantidade', width: 50, headerAttributes: { style: "color: black; text-align: right;" }, attributes: { style: "text-align: right;" } },
                            { title: 'Vlr. Unit.', field: 'ValorUnitario', width: 50, headerAttributes: { style: "color: black; text-align: right;" }, attributes: { style: "text-align: right;" } },
                            { title: 'Vlr. Unit. Liquido', field: 'ValorUnitarioLiquido', width: 60, hidden: true, headerAttributes: { style: "color: black; text-align: right;" }, attributes: { style: "text-align: right;" } },
                            { title: 'Desc. Unit.', field: 'ValorDescontoUnitario', width: 50, headerAttributes: { style: "color: black; text-align: right;" }, attributes: { style: "text-align: right;" } },
                            { title: 'Alíq. IPI', field: 'AliquotaIpi', width: 50, hidden: true, headerAttributes: { style: "color: black; text-align: right;" }, attributes: { style: "text-align: right;" } },
                            { title: 'Alíq. ICMS', field: 'AliquotaIcms', width: 50, hidden: true, headerAttributes: { style: "color: black; text-align: right;" }, attributes: { style: "text-align: right;" } },
                            { title: 'Alíq. ICMS/ST', field: 'AliquotaIcmsSt', width: 60, hidden: true, headerAttributes: { style: "color: black; text-align: right;" }, attributes: { style: "text-align: right;" } },
                            { title: 'Núm. OC', field: 'NumeroOrdemCompra', width: 50, hidden: true, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } },
                            { title: 'Item Ped.', field: 'ItemPed', width: 30, hidden: true, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } },
                            { title: 'Dt.Entrega', field: 'DataEntrega', width: 50, hidden: true, headerAttributes: { style: "color: black; text-align: center;" }, attributes: { style: "text-align: center;" } }
                        ],
                        'height': 400,
                        'onChange': function () {
                            "use strict";
                            var data = gridItens.getSelectedData();

                            function returnIfDefined(param) {
                                if (param === undefined || param === null)
                                    return "";
                                else
                                    return param;
                            }

                            if (data) {
                                document.getElementById('inputCodigoTabelaPrecos').value = returnIfDefined(data['CodTabelaPrecos']);
                                document.getElementById('descriptionCodigoTabelaPrecos').innerHTML = returnIfDefined(data['DescricaoTabelaPrecos']);
                                validatorTabelaPrecos.update(returnIfDefined(data['CodTabelaPrecos']), returnIfDefined(data['DescricaoTabelaPrecos']));

                                document.getElementById('inputCodigoProduto').value = returnIfDefined(data['CodProduto']);
                                document.getElementById('descriptionCodigoProduto').innerHTML = returnIfDefined(data['DescricaoProduto']);
                                validatorProdutos.update();

                                document.getElementById('inputCodigoGrade1').value = returnIfDefined(data['CodItemGrade1']);
                                document.getElementById('descriptionCodigoGrade1').innerHTML = data['DescricaoItemGrade1'] ? ' - ' + returnIfDefined(data['DescricaoItemGrade1']) : "";
                                data['HaveGrade1'] ? validatorGrade1.enable() : validatorGrade1.disable();
                                validatorGrade1.update();

                                document.getElementById('inputCodigoGrade2').value = returnIfDefined(data['CodItemGrade2']);
                                document.getElementById('descriptionCodigoGrade2').innerHTML = data['DescricaoItemGrade2'] ? ' - ' + returnIfDefined(data['DescricaoItemGrade2']) : "";
                                data['HaveGrade2'] ? validatorGrade2.enable() : validatorGrade2.disable();
                                validatorGrade2.update();

                                document.getElementById('inputCodigoGrade3').value = returnIfDefined(data['CodItemGrade3']);
                                document.getElementById('descriptionCodigoGrade3').innerHTML = data['DescricaoItemGrade3'] ? ' - ' + returnIfDefined(data['DescricaoItemGrade3']) : "";
                                data['HaveGrade3'] ? validatorGrade3.enable() : validatorGrade3.disable();
                                validatorGrade3.update();

                                document.getElementById('fieldItemComplemento').value = returnIfDefined(data['Complemento']); //TODO: alterar para padrão
                                document.getElementById('inputQuantidade').value = returnIfDefined(data['Quantidade']);
                                document.getElementById('inputValorUnitario').value = returnIfDefined(data['ValorUnitario']);
                                document.getElementById('inputDescontoUnitario').value = returnIfDefined(data['ValorDescontoUnitario']);
                                document.getElementById('inputValorAliquotaIcms').value = returnIfDefined(data['AliquotaIcms']);
                                document.getElementById('inputValorAliquotaIpi').value = returnIfDefined(data['AliquotaIpi']);
                                document.getElementById('inputValorAliquotaIcmsSt').value = returnIfDefined(data['AliquotaIcmsSt']);
                                document.getElementById('inputNumeroOc').value = returnIfDefined(data['NumeroOrdemCompra']);
                                document.getElementById('inputItemPed').value = returnIfDefined(data['ItemPed']);
                                document.getElementById('inputDataEntrega').value = returnIfDefined(data['DataEntrega']);
                                document.getElementById('inputLivreCobranca').checked = returnIfDefined(data['LivreCobranca']);

                                u.enable('inputQuantidade');
                                u.enable('inputValorUnitario');
                                u.enable('inputDescontoUnitario');
                                u.enable('buttonAlterarItem');
                                u.enable('buttonRemoverItem');
                                u.disable('buttonAdicionarItem');
                                $("#inputValorUnitario")[0].setAttribute("radarmask", "radar-valor-16-" + data['CasasDecimaisValorUnitario'] + "-R");
                                $("#inputDescontoUnitario")[0].setAttribute("radarmask", "radar-valor-16-" + data['CasasDecimaisValorUnitario'] + "-R");
                                $("#inputQuantidade")[0].setAttribute("radarmask", "radar-valor-8-" + data['CasasDecimaisQuantidade'] + "-R");
                                setMask();
                                validatorProdutos.update();
                                setPermissions();
                            }
                        },
                        'onDataBound': function () {
                            reziseGrids();
                        },
                        'dataSourceType': "Filtered"
                    });
                    gridItens.make();

                    var gridParcelas = new Table({
                        'id': 'gridParcelas',
                        'route': window.baseUrl + 'Comercial/Faturas/GetParcelas',
                        'columns': [
                            { field: "Parcela", title: "Parcela", width: 90, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } },
                            { field: "DataVencimento", title: "Data Vencimento", width: 90, headerAttributes: { style: "color: black; text-align: center;" }, attributes: { style: "text-align: center;" } },
                            { field: "Valor", title: "Valor", width: 100, headerAttributes: { style: "color: black; text-align: right;" }, attributes: { style: "text-align: right;" } },
                            { field: "FormaPagamento", title: "Forma de Pagamento", width: 100, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } },
                            { field: "Observacao", title: "Observações", width: 100, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } }
                        ],
                        'onChange': function () {
                            "use strict";
                            var data = gridParcelas.getSelectedData();
                            document.getElementById('inputFaturamentoParcela').value = data['Numero'];
                            document.getElementById('inputDataVencimento').value = data['DataVencimento'];
                            document.getElementById('inputFaturamentoValor').value = data['Valor'];
                            document.getElementById('inputObservacao').value = data['Observacao'];

                            //if(data.IdFormaPagamento.length == 1) 
                            //    dropDownFormasPagamento.set("0" + data.IdFormaPagamento);
                            //else 
                            dropDownFormasPagamento.set(data.IdFormaPagamento);

                            u.enable('buttonAlteraParcela');
                            dropDownFormasPagamento.enable();
                            setPermissions();
                        },
                        'onDataBound': function () {
                            var el = $('.k-grid-content');
                            el[0].style.height = "118px";
                            el[1].style.height = "108px";
                        },
                        'dataSourceType': "Filtered"
                    });
                    gridParcelas.make();
                    /*----->Grids Principais<-----*/

                    /*----->Validators<-----*/
                    var validatorFilial = new Validator({
                        field: 'CodigoFilial',
                        onPendencyMessage: "Deve ser informado o código da filial.",
                        route: 'Comercial/F4FilialPedido/GetFilial',
                        onValid: function (data) {
                            if (this.changed()) {
                                validatorCfop.setValue("");
                                validatorOperacaoComercial.setValue("");

                                document.getElementById('inputCodigoFilial').value = data['Codigo'];
                                document.getElementById('descriptionCodigoFilial').innerHTML = data['Nome'];

                                document.getElementById('inputCodigoOpComercial').value = "";
                                document.getElementById('descriptionCodigoOpComercial').innerHTML = "";
                                validatorOperacaoComercial.update();
                                document.getElementById('inputCodigoCfop').value = "";
                                document.getElementById('descriptionCodigoCfop').innerHTML = "";
                                validatorCfop.update();
                                tableCfops.refresh();
                            }
                        },
                        onInvalid: function () {
                            u.alterTab(0);
                            validatorFilial.focus(controlGroupBehavior.error);
                            validatorFilial.value = "";
                            validatorFilial.input.value = "";

                            document.getElementById('inputCodigoOpComercial').value = "";
                            document.getElementById('descriptionCodigoOpComercial').innerHTML = "";
                            validatorOperacaoComercial.update();
                            document.getElementById('inputCodigoCfop').value = "";
                            document.getElementById('descriptionCodigoCfop').innerHTML = "";
                            validatorCfop.update();
                            tableCfops.refresh();
                        },
                        onEmpty: function () {
                            u.alterTab(0);
                            postJsonToRoute("Comercial/F4FilialPedido/SetEmpty", "");
                            postJsonToRoute('Comercial/F4OpComerciaisPedido/SetEmpty', "");
                            postJsonToRoute('Comercial/F4CfopPedido/SetEmpty', "");

                            document.getElementById('inputCodigoOpComercial').value = "";
                            document.getElementById('descriptionCodigoOpComercial').innerHTML = "";
                            validatorOperacaoComercial.update();
                            document.getElementById('inputCodigoCfop').value = "";
                            document.getElementById('descriptionCodigoCfop').innerHTML = "";
                            validatorCfop.update();
                            tableCfops.refresh();
                        }
                    });
                    validatorFilial.listen();
                    validatorFilial.update();

                    var validatorCliente = new Validator({
                        field: 'CodigoCliente',
                        onPendencyMessage: "Deve ser informado o código do cliente.",
                        route: 'Comercial/F4ClientePedido/GetCliente',
                        onValid: function (data) {
                            if (this.changed()) {
                                document.getElementById("inputCodigoCliente").value = data.Codigo;
                                document.getElementById("descriptionCodigoCliente").innerHTML = data.RazaoSocial;
                                document.getElementById("inputCep").value = data.Cep;
                                document.getElementById("inputCodigoMunicipio").value = data.CodMunicipio;
                                document.getElementById("descriptionCodigoMunicipio").innerHTML = data.DescricaoMunicipio;
                                document.getElementById("inputUf").value = data.Uf;
                                document.getElementById("inputLocalEntrega").value = data.LocalEntrega;
                                document.getElementById("inputCodigoTabelaPrecos").value = data.CodTabelaPrecoProduto;
                                document.getElementById("descriptionCodigoTabelaPrecos").innerHTML = data.DescricaoTabelaPrecoProduto;
                                document.getElementById("inputCodigoTransportadora").value = data.CodTransp;
                                document.getElementById("descriptionCodigoTransportadora").innerHTML = data.DescricaoTransp;
                                document.getElementById("inputCodigoTransportadoraRedespacho").value = data.CodTranspRedespacho;
                                document.getElementById("descriptionCodigoTransportadoraRedespacho").innerHTML = data.DescricaoTranspRedespacho;

                                validatorCfop.setValue("");
                                validatorOperacaoComercial.setValue("");

                                validatorTabelaPrecos.update();
                                dropDownCondicoesPagamento.set(data.IdCondicaoPagamento);
                                dropDownFormasPagamento.set(data.IdFormaPagamento);
                                dropDownTipoCobranca.set(data.IdTipoCobranca);
                                dropDownQuemtransporta.set(data.QuemTransporta);

                                document.getElementById('inputCodigoOpComercial').value = "";
                                document.getElementById('descriptionCodigoOpComercial').innerHTML = "";
                                validatorOperacaoComercial.update();
                                tableOperacoesComerciais.refresh();

                                document.getElementById('inputCodigoCfop').value = "";
                                document.getElementById('descriptionCodigoCfop').innerHTML = "";
                                validatorCfop.update();
                                tableCfops.refresh();
                            }
                        },
                        onInvalid: function () {
                            var self = this;
                            u.alterTab(0);
                            self.focus();
                            self.value = "";
                            self.input.value = "";

                            document.getElementById('inputCodigoOpComercial').value = "";
                            document.getElementById('descriptionCodigoOpComercial').innerHTML = "";
                            validatorOperacaoComercial.update();
                            tableOperacoesComerciais.refresh();

                            document.getElementById('inputCodigoCfop').value = "";
                            document.getElementById('descriptionCodigoCfop').innerHTML = "";
                            validatorCfop.update();
                            tableCfops.refresh();
                        },
                        onEmpty: function () {
                            postJsonToRoute('Comercial/F4ClientePedido/SetEmpty', "");
                            postJsonToRoute('Comercial/F4OpComerciaisPedido/SetEmpty', "");
                            postJsonToRoute('Comercial/F4CfopPedido/SetEmpty', "");

                            document.getElementById('inputCodigoOpComercial').value = "";
                            document.getElementById('descriptionCodigoOpComercial').innerHTML = "";
                            validatorOperacaoComercial.update();
                            document.getElementById('inputCodigoCfop').value = "";
                            document.getElementById('descriptionCodigoCfop').innerHTML = "";
                            validatorCfop.update();
                            tableCfops.refresh();
                        }
                    });
                    validatorCliente.listen();
                    validatorCliente.update();

                    var validatorMunicipio = new Validator({
                        field: 'CodigoMunicipio',
                        onPendencyMessage: 'Deve ser informado o código do município.',
                        route: 'Empresarial/F4Municipio/GetMunicipio',
                        onValid: function (data) {
                            document.getElementById('inputCodigoMunicipio').value = data.Codigo;
                            document.getElementById('descriptionCodigoMunicipio').innerHTML = data.Nome;
                            document.getElementById('inputUf').value = data.Uf;
                        },
                        onInvalid: function () {
                            var self = this;
                            u.alterTab(0);
                            self.focus();
                            self.value = "";
                            self.input.value = "";
                        }
                    });
                    validatorMunicipio.listen();
                    validatorMunicipio.update();

                    var validatorOperacaoComercial = new Validator({
                        field: 'CodigoOpComercial',
                        onPendencyMessage: 'Deve ser informada a operação comercial.',
                        route: 'Comercial/F4OpComerciaisPedido/GetOpComercial',
                        pendency: [validatorFilial, validatorCliente],
                        onValid: function (data) {
                            document.getElementById('inputCodigoOpComercial').value = data.Codigo;
                            document.getElementById('descriptionCodigoOpComercial').innerHTML = data.Descricao;
                            document.getElementById('inputCodigoCfop').value = "";
                            document.getElementById('descriptionCodigoCfop').innerHTML = "";
                            validatorCfop.disable();
                            setPermissions();
                        },
                        onInvalid: function () {
                            var self = this;
                            u.alterTab(0);
                            self.focus();
                            self.value = "";
                            self.input.value = "";
                            setPermissions();
                        },
                        onEmpty: function () {
                            postJsonToRoute('Comercial/F4OpComerciaisPedido/SetEmpty');
                            validatorCfop.enable();
                            setPermissions();
                        }
                    });
                    validatorOperacaoComercial.listen();
                    validatorOperacaoComercial.update();

                    var validatorCfop = new Validator({
                        field: 'CodigoCfop',
                        onPendencyMessage: 'Deve ser informada a CFOP.',
                        route: 'Comercial/F4CfopPedido/GetCfop',
                        pendency: [validatorFilial, validatorCliente],
                        onValid: function (data) {
                            document.getElementById('inputCodigoCfop').value = data.Classificacao;
                            document.getElementById('descriptionCodigoCfop').innerHTML = data.Nome;
                            setPermissions();
                        },
                        onInvalid: function () {
                            var self = this;
                            u.alterTab(0);
                            self.focus();
                            self.value = "";
                            self.input.value = "";
                            setPermissions();
                        },
                        onEmpty: function () {
                            postJsonToRoute('Comercial/F4CfopPedido/SetEmpty');
                            setPermissions();
                        }
                    });
                    validatorCfop.listen();
                    validatorCfop.update();

                    var validatorTabelaPrecos = new Validator({
                        field: 'CodigoTabelaPrecos',
                        onPendencyMessage: "Deve ser informado o código da tabela de preços",
                        route: 'Empresarial/F4TabelaPrecoProdutos/GetTabPreco',
                        onValid: function (data) {
                            document.getElementById('inputCodigoTabelaPrecos').value = data['Codigo'];
                            document.getElementById('descriptionCodigoTabelaPrecos').innerHTML = data['Nome'];
                            clearProdutoBeforeInsert();
                            tableProdutos.refresh();
                            modalProdutos.exibirHierarquia_SetParams("CodigoTabelaPrecos", validatorTabelaPrecos.value);
                        },
                        onInvalid: function () {
                            var self = this;
                            u.alterTab(1);
                            self.focus();
                            self.value = "";
                            self.input.value = "";
                            modalProdutos.exibirHierarquia_SetParams("CodigoTabelaPrecos", validatorTabelaPrecos.value);
                        },
                        onEmpty: function () {
                            modalProdutos.exibirHierarquia_SetParams("CodigoTabelaPrecos", validatorTabelaPrecos.value);
                        }
                    });
                    validatorTabelaPrecos.listen();
                    validatorTabelaPrecos.update();

                    var validatorProdutos = new Validator({
                        field: 'CodigoProduto',
                        onPendencyMessage: "Deve ser informado o código do produto.",
                        route: 'Comercial/F4ProdutoPedido/GetProduto',
                        pendency: [validatorTabelaPrecos, validatorFilial],
                        onValid: function (data) {
                            validatorProdutos.setChange(true);
                            var selected = gridItens.getSelectedData();

                            if (selected) {
                                if (selected.CodProduto != data['Codigo']) {
                                    validatorGrade1.disable();
                                    validatorGrade2.disable();
                                    validatorGrade3.disable();
                                    u.disable('inputQuantidade');
                                    u.disable('inputValorUnitario');
                                    u.disable('inputDescontoUnitario');
                                    u.disable('buttonAlterarItem');
                                    u.disable('buttonRemoverItem');
                                    u.enable('buttonAdicionarItem');
                                    gridItens.clearSelectedData();
                                }

                            }
                            clearCurrentItem();

                            document.getElementById('inputCodigoProduto').value = data['Codigo'];
                            document.getElementById('descriptionCodigoProduto').innerHTML = data['Nome'];
                            document.getElementById('inputValorUnitario').value = data['ValorUnitario'];
                            document.getElementById('inputValorAliquotaIcms').value = data['ValorAliquotaIcms'].toCasasDecimais(2);
                            document.getElementById('inputValorAliquotaIpi').value = data['ValorAliquotaIPI'].toCasasDecimais(2);
                            document.getElementById('inputValorAliquotaIcmsSt').value = data['ValorAliquotaIcmsSt'].toCasasDecimais(2);

                            if (data['HaveGrade3']) {
                                validatorGrade3.enable();
                                //validatorGrade3.focus();
                            } else {
                                validatorGrade3.disable();
                            }
                            if (data['HaveGrade2']) {
                                validatorGrade2.enable();
                                //validatorGrade2.focus();
                            } else {
                                validatorGrade2.disable();
                            }
                            if (data['HaveGrade1']) {
                                validatorGrade1.enable();
                                //validatorGrade1.focus();
                            } else {
                                validatorGrade1.disable();
                                //$('#fieldItemComplemento').focus();
                            }
                            validatorGrade1.update();
                            validatorGrade2.update();
                            validatorGrade3.update();

                            u.enable('inputQuantidade');
                            u.enable('inputValorUnitario');
                            u.enable('inputDescontoUnitario');
                            $("#inputValorUnitario")[0].setAttribute("radarmask", "radar-valor-16-" + data['CasasDecimaisValorUnitario'] + "-R");
                            $("#inputDescontoUnitario")[0].setAttribute("radarmask", "radar-valor-16-" + data['CasasDecimaisValorUnitario'] + "-R");
                            $("#inputQuantidade")[0].setAttribute("radarmask", "radar-valor-8-" + data['CasasDecimaisQuantidade'] + "-R");
                            alterControlGroupBehavior('inputValorUnitario', controlGroupBehavior.normal);
                            setMask();
                            setPermissions();

                            // sugere OC nos itens
                            if ($("#inputNumeroOc").data("podesugerir") && !$("#buttonAdicionarItem").attr("disabled")) {
                                $("#inputNumeroOc").val($("#fieldNumeroOrdemCompraCliente").val());
                            }
                            else {
                                $("#inputNumeroOc").val($("#inputNumeroOc").attr("valorBkp"));
                            }
                        },
                        onInvalid: function () {
                            validatorProdutos.setChange(true);
                            validatorGrade1.disable();
                            validatorGrade2.disable();
                            validatorGrade3.disable();
                            u.disable('inputQuantidade');
                            u.disable('inputValorUnitario');
                            u.disable('inputDescontoUnitario');
                            var self = this;
                            u.alterTab(1);
                            self.focus();
                            self.value = "";
                            self.input.value = "";

                            // sugere OC nos itens
                            if ($("#inputNumeroOc").data("podesugerir") && !$("#buttonAdicionarItem").attr("disabled"))
                                $("#inputNumeroOc").val($("#fieldNumeroOrdemCompraCliente").val());
                            else
                                $("#inputNumeroOc").val($("#inputNumeroOc").attr("valorBkp"));
                        },
                        onEmpty: function () {
                            validatorProdutos.setChange(true);
                            validatorGrade1.disable();
                            validatorGrade2.disable();
                            validatorGrade3.disable();
                            u.disable('inputQuantidade');
                            u.disable('inputValorUnitario');
                            u.disable('inputDescontoUnitario');
                            u.disable('buttonAlterarItem');
                            u.disable('buttonRemoverItem');
                            u.enable('buttonAdicionarItem');
                            clearCurrentItem();
                            gridItens.clearSelectedData();

                            // sugere OC nos itens
                            if ($("#inputNumeroOc").data("podesugerir") && !$("#buttonAdicionarItem").attr("disabled"))
                                $("#inputNumeroOc").val($("#fieldNumeroOrdemCompraCliente").val());
                            else
                                $("#inputNumeroOc").val($("#inputNumeroOc").attr("valorBkp"));
                        }
                    });
                    validatorProdutos.listen();

                    var validatorGrade1 = new Validator({
                        field: 'CodigoGrade1',
                        onPendencyMessage: "Deve ser informada a Grade 1.",
                        route: 'Comercial/F4ProdutoPedido/GetItemGrade1',
                        pendency: [validatorProdutos, validatorTabelaPrecos],
                        onValid: function (data) {
                            validatorGrade1.setChange(true);
                            document.getElementById('inputCodigoGrade1').value = data['Codigo'];
                            document.getElementById('descriptionCodigoGrade1').innerHTML = ' - ' + data['Descricao'];

                            if (data['ValorUnitarioAtualizadoDoProduto'] !== "")
                                document.getElementById('inputValorUnitario').value = data['ValorUnitarioAtualizadoDoProduto'];
                        },
                        onInvalid: function () {
                            validatorGrade1.setChange(true);
                            var self = this;
                            u.alterTab(1);
                            self.focus();
                            self.value = "";
                            self.input.value = "";
                        }
                    });
                    validatorGrade1.listen();

                    var validatorGrade2 = new Validator({
                        field: 'CodigoGrade2',
                        onPendencyMessage: "Deve ser informada a Grade 2.",
                        route: 'Comercial/F4ProdutoPedido/GetItemGrade2',
                        pendency: [validatorGrade1, validatorProdutos, validatorTabelaPrecos],
                        onValid: function (data) {
                            validatorGrade2.setChange(true);
                            document.getElementById('inputCodigoGrade2').value = data['Codigo'];
                            document.getElementById('descriptionCodigoGrade2').innerHTML = ' - ' + data['Descricao'];

                            if (data['ValorUnitarioAtualizadoDoProduto'] !== "")
                                document.getElementById('inputValorUnitario').value = data['ValorUnitarioAtualizadoDoProduto'];
                        },
                        onInvalid: function () {
                            validatorGrade2.setChange(true);
                            var self = this;
                            u.alterTab(1);
                            self.focus();
                            self.value = "";
                            self.input.value = "";
                        }
                    });
                    validatorGrade2.listen();

                    var validatorGrade3 = new Validator({
                        field: 'CodigoGrade3',
                        onPendencyMessage: "Deve ser informada a Grade 3.",
                        route: 'Comercial/F4ProdutoPedido/GetItemGrade3',
                        pendency: [validatorGrade2, validatorGrade1, validatorProdutos, validatorTabelaPrecos],
                        onValid: function (data) {
                            validatorGrade3.setChange(true);
                            document.getElementById('inputCodigoGrade3').value = data['Codigo'];
                            document.getElementById('descriptionCodigoGrade3').innerHTML = ' - ' + data['Descricao'];

                            if (data['ValorUnitarioAtualizadoDoProduto'] !== "")
                                document.getElementById('inputValorUnitario').value = data['ValorUnitarioAtualizadoDoProduto'];
                        },
                        onInvalid: function () {
                            validatorGrade3.setChange(true);
                            var self = this;
                            u.alterTab(1);
                            self.focus();
                            self.value = "";
                            self.input.value = "";
                        }
                    });
                    validatorGrade3.listen();

                    var validatorTransportadora = new Validator({
                        field: 'CodigoTransportadora',
                        onPendencyMessage: 'Deve ser informada a transportadora.',
                        route: 'Empresarial/F4Transportadora/GetTransportadora',
                        onValid: function (data) {
                            document.getElementById('inputCodigoTransportadora').value = data.Codigo;
                            document.getElementById('descriptionCodigoTransportadora').innerHTML = data.Nome;

                            if (data['ValorUnitarioAtualizadoDoProduto'] !== "")
                                document.getElementById('inputValorUnitario').value = data['ValorUnitarioAtualizadoDoProduto'];
                        },
                        onInvalid: function () {
                            var self = this;
                            u.alterTab(3);
                            self.focus();
                            self.value = "";
                            self.input.value = "";
                        }
                    });
                    validatorTransportadora.listen();

                    var validatorTransportadoraRedespacho = new Validator({
                        field: 'CodigoTransportadoraRedespacho',
                        onPendencyMessage: 'Deve ser informada a transportadora de redespacho.',
                        route: 'Empresarial/F4Transportadora/GetTransportadora',
                        onValid: function (data) {
                            document.getElementById('inputCodigoTransportadoraRedespacho').value = data.Codigo;
                            document.getElementById('descriptionCodigoTransportadoraRedespacho').innerHTML = data.Nome;
                        },
                        onInvalid: function () {
                            var self = this;
                            u.alterTab(3);
                            self.focus();
                            self.value = "";
                            self.input.value = "";
                        }
                    });
                    validatorTransportadoraRedespacho.listen();
                    /*----->Validators<-----*/

                    /*----->DropDowns<-----*/
                    var dropDownTipoCobranca = new DropDown({
                        'id': 'fieldSelectTiposCobrancas',
                        'route': 'Comercial/CombosPedido/GetTiposCobranca',
                        'onChange': function () {
                            var param = {};
                            param['Value'] = document.getElementById('fieldSelectTiposCobrancas').value;
                            postJsonToRoute("Comercial/Faturas/SetIdTipoCobranca", JSON.stringify(param));
                        }
                    });
                    dropDownTipoCobranca.make();

                    var dropDownCondicoesPagamento = new DropDown({
                        'id': 'fieldSelectCondicaoPagamento',
                        'route': 'Comercial/CombosPedido/GetCondicoesPagamento',
                        'onChange': function () { updateCondicoesPagamento(); }
                    });
                    dropDownCondicoesPagamento.make();

                    var dropDownFormasPagamento = new DropDown({
                        'id': 'selectFormaPagamento',
                        'route': 'Comercial/CombosPedido/GetFormasPagamento'
                    });
                    dropDownFormasPagamento.make();

                    var dropDownQuemtransporta = new DropDown({
                        'id': 'fieldSelectQuemTransporta',
                        'route': 'Comercial/CombosPedido/GetQuemTransporta'
                    });
                    dropDownQuemtransporta.make();

                    var dropDownViaTransporte = new DropDown({
                        'id': 'fieldSelectViaTransporte',
                        'route': 'Comercial/CombosPedido/GetviaTransporte'
                    });
                    dropDownViaTransporte.make();
                    /*----->DropDowns<-----*/

                    /*----->F4s<-----*/

                    /*F4 Filial*/
                    var tableFiliais = new Table({
                        'id': 'tableFilial',
                        'route': window.baseUrl + 'Comercial/F4FilialPedido/GetFiliais',
                        'columns': [
                            { title: 'Código', field: 'Codigo', width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: 'Nome', field: 'Nome', width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: 'CNPJ/CPF', field: 'CpfCnpj', width: 115, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        'columnsLegend': { CpfCnpj: 'Ex: 11.222.333/4444-55' },
                        'showFilter': true,
                        'onChange': function () {
                            "use strict";
                            var ok = document.getElementById('inputF4ModalOk' + this.id);
                            ok.onclick = function () {
                                onTableFilialChange();
                                tableOperacoesComerciais.refresh();
                            };
                        },
                        'onDataBound': function () {
                            $('#tableFilial table tr').on('dblclick', function () {
                                onTableFilialChange();
                                $('#modalFilial').modal('hide');
                            });
                        },
                        'dataSourceType': "Filtered"
                    });
                    function onTableFilialChange() {
                        var data = tableFiliais.getSelectedData();
                        document.getElementById('inputCodigoFilial').value = data.Codigo;
                        document.getElementById('descriptionCodigoFilial').innerHTML = data.Nome;
                        validatorFilial.update();
                        validatorFilial.validate();
                        validatorCfop.update();
                        validatorCfop.validate();
                        tableCfops.refresh();
                        tableOperacoesComerciais.refresh();
                    }
                    var linkFiliais = document.getElementById('linkButtonModalFiliais');
                    var inputFiliais = document.getElementById('inputCodigoFilial');
                    var modalFiliais = new Modal('Filiais', linkFiliais, inputFiliais, tableFiliais);
                    modalFiliais.listen();

                    /*F4 Cliente*/
                    var tableClientes = new Table({
                        'params': [validatorFilial],
                        'id': 'tableCliente',
                        'route': window.baseUrl + "Comercial/F4ClientePedido/GetClientes",
                        'showFilter': true,
                        'columns': [
                            { title: 'Código', field: 'Codigo', width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: 'Razão Social', field: 'RazaoSocial', width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: 'CPF/CNPJ', field: 'CnpjCpf', width: 115, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        'columnsLegend': { CnpjCpf: "Ex: 11.222.333/4444-55" },
                        'onChange': function () {
                            "use strict";
                            var ok = document.getElementById('inputF4ModalOk' + this.id);
                            ok.onclick = function () {
                                var search = {};
                                var selectedCliente = tableClientes.getSelectedData();
                                search['CodigoCliente'] = selectedCliente['Codigo'];

                                getJsonFromRoute('Comercial/F4ClientePedido/GetCliente', search).done(function (data) {
                                    if (data.IsAlert)
                                        throw new Error(data.Message);

                                    document.getElementById("inputCodigoCliente").value = data.Codigo;
                                    document.getElementById("descriptionCodigoCliente").innerHTML = data.RazaoSocial;
                                    document.getElementById("inputCep").value = data.Cep;
                                    validatorCliente.update();
                                    validatorCliente.validate();

                                    document.getElementById("inputCodigoMunicipio").value = data.CodMunicipio;
                                    document.getElementById("descriptionCodigoMunicipio").innerHTML = data.DescricaoMunicipio;
                                    document.getElementById("inputUf").value = data.Uf;
                                    document.getElementById("inputLocalEntrega").value = data.LocalEntrega;
                                    validatorMunicipio.update();
                                    validatorTabelaPrecos.validate();

                                    document.getElementById("inputCodigoTabelaPrecos").value = data.CodTabelaPrecoProduto;
                                    document.getElementById("descriptionCodigoTabelaPrecos").innerHTML = data.DescricaoTabelaPrecoProduto;
                                    validatorTabelaPrecos.update();
                                    validatorTabelaPrecos.validate();

                                    dropDownCondicoesPagamento.set(data.IdCondicaoPagamento);
                                    dropDownFormasPagamento.set(data.IdFormaPagamento);
                                    dropDownTipoCobranca.set(data.IdTipoCobranca);
                                    dropDownQuemtransporta.set(data.QuemTransporta);
                                    tableCfops.refresh();

                                    document.getElementById("inputCodigoTransportadora").value = data.CodTransp;
                                    document.getElementById("descriptionCodigoTransportadora").innerHTML = data.DescricaoTransp;
                                    validatorTransportadora.update();
                                    validatorTransportadora.validate();

                                    document.getElementById("inputCodigoTransportadoraRedespacho").value = data.CodTranspRedespacho;
                                    document.getElementById("descriptionCodigoTransportadoraRedespacho").innerHTML = data.DescricaoTranspRedespacho;
                                    validatorTransportadoraRedespacho.update();
                                    validatorTransportadoraRedespacho.validate();
                                });
                            };
                        },
                        'onDataBound': function () {
                            $('#tableCliente table tr').on('dblclick', function () {
                                var search = {};
                                var cliente = tableClientes.getSelectedData();

                                search['CodigoCliente'] = cliente['Codigo'];
                                getJsonFromRoute('Comercial/F4ClientePedido/GetCliente', search).done(function (data) {
                                    if (data.IsAlert)
                                        throw new Error(data.Message);

                                    document.getElementById("inputCodigoCliente").value = data.Codigo;
                                    document.getElementById("descriptionCodigoCliente").innerHTML = data.RazaoSocial;
                                    document.getElementById("inputCep").value = data.Cep;
                                    validatorCliente.update();
                                    validatorCliente.validate();

                                    document.getElementById("inputCodigoMunicipio").value = data.CodMunicipio;
                                    document.getElementById("descriptionCodigoMunicipio").innerHTML = data.DescricaoMunicipio;
                                    document.getElementById("inputUf").value = data.Uf;
                                    document.getElementById("inputLocalEntrega").value = data.LocalEntrega;
                                    validatorMunicipio.update();
                                    validatorMunicipio.validate();

                                    document.getElementById("inputCodigoTabelaPrecos").value = data.CodTabelaPrecoProduto;
                                    document.getElementById("descriptionCodigoTabelaPrecos").innerHTML = data.DescricaoTabelaPrecoProduto;
                                    validatorTabelaPrecos.update();
                                    validatorTabelaPrecos.validate();

                                    dropDownCondicoesPagamento.set(data.IdCondicaoPagamento);
                                    dropDownFormasPagamento.set(data.IdFormaPagamento);
                                    dropDownTipoCobranca.set(data.IdTipoCobranca);
                                    dropDownQuemtransporta.set(data.QuemTransporta);
                                    tableCfops.refresh();

                                    document.getElementById("inputCodigoTransportadora").value = data.CodTransp;
                                    document.getElementById("descriptionCodigoTransportadora").innerHTML = data.DescricaoTransp;
                                    validatorTransportadora.update();
                                    validatorTransportadora.validate();

                                    document.getElementById("inputCodigoTransportadoraRedespacho").value = data.CodTranspRedespacho;
                                    document.getElementById("descriptionCodigoTransportadoraRedespacho").innerHTML = data.DescricaoTranspRedespacho;
                                    validatorTransportadoraRedespacho.update();
                                    validatorTransportadoraRedespacho.validate();
                                });
                                $('#modalCliente').modal('hide');
                            });
                        },
                        'dataSourceType': "Filtered"
                    });
                    var linkButtonModalClientes = document.getElementById('linkButtonModalClientes');
                    var inputClientes = document.getElementById('inputCodigoCliente');
                    var modalClientes = new Modal('Clientes', linkButtonModalClientes, inputClientes, tableClientes);
                    modalClientes.listen();

                    /*F4 Municipio*/
                    var tableMunicipios = new Table({
                        'id': 'tableMunicipios',
                        'route': window.baseUrl + 'Empresarial/F4Municipio/GetMunicipios',
                        'columns': [
                            { title: 'Código', field: 'Codigo', width: 60, headerAttributes: { style: "color: black; text-align: center;" }, attributes: { style: "text-align: right;" } },
                            { title: 'Nome', field: 'Nome', width: 240, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: 'UF', field: 'Uf', width: 35, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        'showFilter': true,
                        'onChange': function () {
                            "use strict";
                            var ok = document.getElementById('inputF4ModalOk' + this.id);
                            ok.onclick = function () {
                                var data = tableMunicipios.getSelectedData();
                                document.getElementById('inputCodigoMunicipio').value = data.Codigo;
                                document.getElementById('descriptionCodigoMunicipio').innerHTML = data.Nome;
                                document.getElementById('inputUf').value = data.Uf;
                                validatorMunicipio.update();
                                validatorMunicipio.validate();
                            };
                        },
                        'onDataBound': function () {
                            $('#tableMunicipios table  tr').on('dblclick', function () {
                                var data = tableMunicipios.getSelectedData();
                                document.getElementById('inputCodigoMunicipio').value = data.Codigo;
                                document.getElementById('descriptionCodigoMunicipio').innerHTML = data.Nome;
                                document.getElementById('inputUf').value = data.Uf;
                                validatorMunicipio.update();
                                validatorMunicipio.validate();
                                $('#modalMunicipio').modal('hide');
                            });
                        },
                        'dataSourceType': "Filtered"
                    });
                    var linkButtonModalMunicipios = document.getElementById('linkButtonModalMunicipios');
                    var inputMunicipios = document.getElementById('inputCodigoMunicipio');
                    var modalMunicipios = new Modal('Municípios', linkButtonModalMunicipios, inputMunicipios, tableMunicipios);
                    modalMunicipios.listen();

                    /*F4 Operações Comerciais*/
                    var tableOperacoesComerciais = new Table({
                        'id': 'tableOperacaoComercial',
                        'route': window.baseUrl + 'Comercial/F4OpComerciaisPedido/GetOpComerciais',
                        'showFilter': true,
                        'columns': [
                            { title: 'Código', field: 'Codigo', width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: 'Descrição', field: 'Descricao', width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        'params': [validatorFilial, validatorCliente],
                        'mixedFields': [inputCodigoOpComercial, inputCodigoCliente, inputCodigoFilial],
                        'onChange': function () {
                            "use strict";
                            var ok = document.getElementById('inputF4ModalOk' + this.id);
                            ok.onclick = function () {
                                var data = tableOperacoesComerciais.getSelectedData();
                                document.getElementById('inputCodigoOpComercial').value = data.Codigo;
                                document.getElementById('descriptionCodigoOpComercial').innerHTML = data.Descricao;
                                document.getElementById('inputCodigoCfop').value = "";
                                document.getElementById('descriptionCodigoCfop').innerHTML = "";
                                validatorCfop.disable();
                                validatorOperacaoComercial.update();
                                validatorOperacaoComercial.validate();
                                setPermissions();
                            };
                        },
                        'onDataBound': function () {
                            $('#tableOperacaoComercial table tr').on('dblclick', function () {
                                var data = tableOperacoesComerciais.getSelectedData();
                                document.getElementById('inputCodigoOpComercial').value = data.Codigo;
                                document.getElementById('descriptionCodigoOpComercial').innerHTML = data.Descricao;
                                document.getElementById('inputCodigoCfop').value = "";
                                document.getElementById('descriptionCodigoCfop').innerHTML = "";
                                validatorCfop.disable();
                                validatorOperacaoComercial.update();
                                validatorOperacaoComercial.validate();
                                $('#modalOpComercial').modal('hide');
                            });
                        },
                        'dataSourceType': "Mixed"
                    });
                    var linkButtonModalOperacoesComerciais = document.getElementById('linkButtonModalOperacoesComerciais');
                    var inputOperacoesComerciais = document.getElementById('inputCodigoOpComercial');
                    var modalOperacoesComerciais = new Modal('Operações Comerciais', linkButtonModalOperacoesComerciais, inputOperacoesComerciais, tableOperacoesComerciais);
                    modalOperacoesComerciais.listen();

                    /*F4 CFOPs*/
                    var tableCfops = new Table({
                        'id': 'tableCfops',
                        'route': window.baseUrl + 'Comercial/F4CfopPedido/GetCfops',
                        'showFilter': true,
                        'columns': [
                            { title: 'Classificação', field: 'Classificacao', width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: 'Nome', field: 'Nome', width: 275, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: 'Filial', field: 'NomeFilial', width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: right;" } }
                        ],
                        'columnsLegend': { Classificacao: "Ex: 1.101" },
                        'params': [validatorFilial, validatorCliente],
                        'onChange': function () {
                            "use strict";
                            var ok = document.getElementById('inputF4ModalOk' + this.id);
                            ok.onclick = function () {
                                var data = tableCfops.getSelectedData();
                                document.getElementById('inputCodigoCfop').value = data.Classificacao;
                                document.getElementById('descriptionCodigoCfop').innerHTML = data.Nome;
                                validatorCfop.update();
                                validatorCfop.validate();
                            };
                        },
                        'onDataBound': function () {
                            $('#tableCfops table  tr').on('dblclick', function () {
                                var data = tableCfops.getSelectedData();
                                document.getElementById('inputCodigoCfop').value = data.Classificacao;
                                document.getElementById('descriptionCodigoCfop').innerHTML = data.Nome;
                                validatorCfop.update();
                                validatorCfop.validate();
                                $('#modalCfop').modal('hide');
                            });
                        },
                        'dataSourceType': "Mixed"
                    });
                    var linkButtonModalCfops = document.getElementById('linkButtonModalCfops');
                    var inputaCfops = document.getElementById('inputCodigoCfop');
                    var modalCfops = new Modal('CFOPs', linkButtonModalCfops, inputaCfops, tableCfops);
                    modalCfops.listen();

                    /*F4 Tabela de Preços de Produtos*/
                    var tableTabelaPrecosProduto = new Table({
                        'id': 'tablePrecosProduto',
                        'route': window.baseUrl + 'Empresarial/F4TabelaPrecoProdutos/GetTabPrecos',
                        'showFilter': true,
                        'columns': [
                            { title: 'Código', field: 'Codigo', width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: 'Nome', field: 'Nome', width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: 'Validade', field: 'DataValidade', width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        'onChange': function () {
                            "use strict";
                            var ok = document.getElementById('inputF4ModalOk' + this.id);
                            ok.onclick = function () {
                                var data = tableTabelaPrecosProduto.getSelectedData();
                                document.getElementById('inputCodigoTabelaPrecos').value = data['Codigo'];
                                document.getElementById('descriptionCodigoTabelaPrecos').innerHTML = data['Nome'];
                                validatorTabelaPrecos.update();
                                validatorTabelaPrecos.validate();
                            };
                        },
                        'onDataBound': function () {
                            $('#tablePrecosProduto table  tr').on('dblclick', function () {
                                var data = tableTabelaPrecosProduto.getSelectedData();
                                document.getElementById('inputCodigoTabelaPrecos').value = data['Codigo'];
                                document.getElementById('descriptionCodigoTabelaPrecos').innerHTML = data['Nome'];
                                validatorTabelaPrecos.update();
                                validatorTabelaPrecos.validate();
                                $('#modalTabPrecosProduto').modal('hide');
                            });
                        },
                        'dataSourceType': "Filtered"
                    });
                    var linkButtonModalTabelaPrecos = document.getElementById('linkButtonModalTabelaPrecos');
                    var inputTabelaPrecos = document.getElementById('inputCodigoTabelaPrecos');
                    var modalTabelasPrecosProdutos = new Modal('Tabelas Preços Produtos', linkButtonModalTabelaPrecos, inputTabelaPrecos, tableTabelaPrecosProduto);
                    modalTabelasPrecosProdutos.listen();

                    /*F4 Produtos*/
                    var tableProdutos = new Table({
                        'id': 'tableProdutos',
                        'route': window.baseUrl + 'Comercial/F4ProdutoPedido/GetProdutos',
                        'showFilter': true,
                        'columns': [
                            { title: 'Código', field: 'Codigo', width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: 'Nome', field: 'Nome', width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: 'Unidade', field: 'Unidade', width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: 'Preço', field: 'ValorUnitario', width: 60, headerAttributes: { style: "color: black; text-align: rigtht;" }, attributes: { style: "text-align: rigtht;" } },
                            { title: 'Classificação', field: 'Classificacao', width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        'columnsLegend': { Classificacao: "Ex: 1.101" },
                        'params': [validatorTabelaPrecos, validatorFilial],
                        'onChange': function () {
                            var ok = document.getElementById('inputF4ModalOk' + this.id);
                            ok.onclick = function () {
                                // refatorar e colocar em uma rotina, pois sao 3 lugares para alterar: onclick-table, dblclick-table e dblclick-hierarquia
                                validatorProdutos.setChange(true);
                                var data = tableProdutos.getSelectedData(),
                                    search = {};

                                search['CodigoProduto'] = data['Codigo'];
                                search['CodigoTabelaPrecos'] = document.getElementById('inputCodigoTabelaPrecos').value;

                                getJsonFromRoute('Comercial/F4ProdutoPedido/GetProduto', search).done(function (produto) {
                                    if (data.IsAlert)
                                        throw new Error(data.Message);

                                    document.getElementById('inputCodigoProduto').value = produto['Codigo'];
                                    document.getElementById('descriptionCodigoProduto').innerHTML = produto['Nome'];
                                    document.getElementById('inputValorUnitario').value = produto['ValorUnitario'];
                                    document.getElementById('inputValorAliquotaIcms').value = produto['ValorAliquotaIcms'].toCasasDecimais(2);
                                    document.getElementById('inputValorAliquotaIpi').value = produto['ValorAliquotaIPI'].toCasasDecimais(2);
                                    document.getElementById('inputValorAliquotaIcmsSt').value = produto['ValorAliquotaIcmsSt'].toCasasDecimais(2);
                                    data['HaveGrade1'] ? validatorGrade1.enable() : validatorGrade1.disable();
                                    data['HaveGrade2'] ? validatorGrade2.enable() : validatorGrade2.disable();
                                    data['HaveGrade3'] ? validatorGrade3.enable() : validatorGrade3.disable();
                                    u.enable('inputQuantidade');
                                    u.enable('inputValorUnitario');
                                    u.enable('inputDescontoUnitario');
                                    $("#inputValorUnitario")[0].setAttribute("radarmask", "radar-valor-16-" + data['CasasDecimaisValorUnitario'] + "-R");
                                    $("#inputDescontoUnitario")[0].setAttribute("radarmask", "radar-valor-16-" + data['CasasDecimaisValorUnitario'] + "-R");
                                    $("#inputQuantidade")[0].setAttribute("radarmask", "radar-valor-8-" + data['CasasDecimaisQuantidade'] + "-R");
                                    setMask();
                                    validatorProdutos.update();
                                    validatorProdutos.validate();
                                    setPermissions();

                                    // sugere OC nos itens
                                    if ($("#inputNumeroOc").data("podesugerir") && !$("#buttonAdicionarItem").attr("disabled"))
                                        $("#inputNumeroOc").val($("#fieldNumeroOrdemCompraCliente").val());
                                    else
                                        $("#inputNumeroOc").val($("#inputNumeroOc").attr("valorBkp"));
                                });
                            };
                        },
                        'onDataBound': function () {
                            $('#tableProdutos table  tr').on('dblclick', function () {
                                // refatorar e colocar em uma rotina, pois sao 3 lugares para alterar: onclick-table, dblclick-table e dblclick-hierarquia
                                validatorProdutos.setChange(true);
                                var data = tableProdutos.getSelectedData(),
                                    search = {};

                                search['CodigoProduto'] = data['Codigo'];
                                search['CodigoTabelaPrecos'] = document.getElementById('inputCodigoTabelaPrecos').value;

                                getJsonFromRoute('Comercial/F4ProdutoPedido/GetProduto', search).done(function (produto) {
                                    if (data.IsAlert)
                                        throw new Error(data.Message);

                                    document.getElementById('inputCodigoProduto').value = produto['Codigo'];
                                    document.getElementById('descriptionCodigoProduto').innerHTML = produto['Nome'];
                                    document.getElementById('inputValorUnitario').value = produto['ValorUnitario'];
                                    document.getElementById('inputValorAliquotaIcms').value = produto['ValorAliquotaIcms'].toCasasDecimais(2);
                                    document.getElementById('inputValorAliquotaIpi').value = produto['ValorAliquotaIPI'].toCasasDecimais(2);
                                    document.getElementById('inputValorAliquotaIcmsSt').value = produto['ValorAliquotaIcmsSt'].toCasasDecimais(2);
                                    data['HaveGrade1'] ? validatorGrade1.enable() : validatorGrade1.disable();
                                    data['HaveGrade2'] ? validatorGrade2.enable() : validatorGrade2.disable();
                                    data['HaveGrade3'] ? validatorGrade3.enable() : validatorGrade3.disable();
                                    u.enable('inputQuantidade');
                                    u.enable('inputValorUnitario');
                                    u.enable('inputDescontoUnitario');
                                    $("#inputValorUnitario")[0].setAttribute("radarmask", "radar-valor-16-" + data['CasasDecimaisValorUnitario'] + "-R");
                                    $("#inputDescontoUnitario")[0].setAttribute("radarmask", "radar-valor-16-" + data['CasasDecimaisValorUnitario'] + "-R");
                                    $("#inputQuantidade")[0].setAttribute("radarmask", "radar-valor-8-" + data['CasasDecimaisQuantidade'] + "-R");
                                    setMask();
                                    validatorProdutos.update();
                                    validatorProdutos.validate();
                                    setPermissions();

                                    // sugere OC nos itens
                                    if ($("#inputNumeroOc").data("podesugerir") && !$("#buttonAdicionarItem").attr("disabled"))
                                        $("#inputNumeroOc").val($("#fieldNumeroOrdemCompraCliente").val());
                                    else
                                        $("#inputNumeroOc").val($("#inputNumeroOc").attr("valorBkp"));
                                });

                                $('#modalProdutos').modal('hide');
                            });
                        },
                        'dataSourceType': "Filtered"
                    });
                    var linkButtonModalProdutos = document.getElementById('linkButtonModalProdutos');
                    var inputProdutos = document.getElementById('inputCodigoProduto');

                    // showOpcaoExibir, exibirHierarquiaLista
                    var options = {
                        showOpcaoExibir: true,
                        exibirHierarquiaParams: {
                            ClassificacaoProdutoPai: "",
                            CodigoTabelaPrecos: validatorTabelaPrecos.value
                        },
                        onDblClickGetItem: function (event, dados) {
                            // refatorar e colocar em uma rotina, pois sao 3 lugares para alterar: onclick-table, dblclick-table e dblclick-hierarquia
                            validatorProdutos.setChange(true);
                            var data = dados,
                                search = {};

                            search['CodigoProduto'] = data['Codigo'];
                            search['CodigoTabelaPrecos'] = document.getElementById('inputCodigoTabelaPrecos').value;

                            getJsonFromRoute('Comercial/F4ProdutoPedido/GetProduto', search).done(function (produto) {
                                if (produto.IsAlert)
                                    throw new Error(produto.Message);

                                document.getElementById('inputCodigoProduto').value = produto['Codigo'];
                                document.getElementById('descriptionCodigoProduto').innerHTML = produto['Nome'];
                                document.getElementById('inputValorUnitario').value = produto['ValorUnitario'];
                                document.getElementById('inputValorAliquotaIcms').value = produto['ValorAliquotaIcms'].toCasasDecimais(2);
                                document.getElementById('inputValorAliquotaIpi').value = produto['ValorAliquotaIPI'].toCasasDecimais(2);
                                document.getElementById('inputValorAliquotaIcmsSt').value = produto['ValorAliquotaIcmsSt'].toCasasDecimais(2);
                                produto['HaveGrade1'] ? validatorGrade1.enable() : validatorGrade1.disable();
                                produto['HaveGrade2'] ? validatorGrade2.enable() : validatorGrade2.disable();
                                produto['HaveGrade3'] ? validatorGrade3.enable() : validatorGrade3.disable();
                                u.enable('inputQuantidade');
                                u.enable('inputValorUnitario');
                                u.enable('inputDescontoUnitario');
                                $("#inputValorUnitario")[0].setAttribute("radarmask", "radar-valor-16-" + produto['CasasDecimaisValorUnitario'] + "-R");
                                $("#inputDescontoUnitario")[0].setAttribute("radarmask", "radar-valor-16-" + produto['CasasDecimaisValorUnitario'] + "-R");
                                $("#inputQuantidade")[0].setAttribute("radarmask", "radar-valor-8-" + produto['CasasDecimaisQuantidade'] + "-R");
                                setMask();
                                validatorProdutos.update();
                                validatorProdutos.validate();
                                setPermissions();

                                // sugere OC nos itens
                                if ($("#inputNumeroOc").data("podesugerir") && !$("#buttonAdicionarItem").attr("disabled"))
                                    $("#inputNumeroOc").val($("#fieldNumeroOrdemCompraCliente").val());
                                else
                                    $("#inputNumeroOc").val($("#inputNumeroOc").attr("valorBkp"));
                            });

                            $('#modalProdutos').modal('hide');
                        }
                    };

                    var modalProdutos = new Modal('Produtos', linkButtonModalProdutos, inputProdutos, tableProdutos, null, options);
                    modalProdutos.listen();

                    /*F4 Grades*/
                    var columnsGrade = [
                        { title: 'Código', field: 'Codigo', width: 45, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                        { title: 'Descrição', field: 'Descricao', width: 64, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                    ];

                    var tableGrade1 = new Table({
                        'id': 'tableGrade1',
                        'route': window.baseUrl + 'Comercial/F4ProdutoPedido/List1',
                        'showFilter': true,
                        'columns': columnsGrade,
                        'params': [validatorProdutos, validatorTabelaPrecos],
                        "fieldDepende": validatorProdutos,
                        'onChange': function () {
                            var ok = document.getElementById('inputF4ModalOk' + this.id);
                            ok.onclick = function () {
                                validatorGrade1.setChange(true);
                                var data = tableGrade1.getSelectedData();
                                document.getElementById('inputCodigoGrade1').value = data['Codigo'];
                                document.getElementById('descriptionCodigoGrade1').innerHTML = ' - ' + data['Descricao'];
                                validatorGrade1.update();
                                validatorGrade1.validate();
                            };
                        },
                        'onDataBound': function () {
                            $('#' + this.id + ' table  tr').on('dblclick', function () {
                                validatorGrade1.setChange(true);
                                var data = tableGrade1.getSelectedData();
                                document.getElementById('inputCodigoGrade1').value = data['Codigo'];
                                document.getElementById('descriptionCodigoGrade1').innerHTML = ' - ' + data['Descricao'];
                                validatorGrade1.update();
                                validatorGrade1.validate();

                                $('#modalGrade1').modal('hide');
                            });
                        },
                        'dataSourceType': "Parameter"
                    });
                    var tableGrade2 = new Table({
                        'id': 'tableGrade2',
                        'route': window.baseUrl + 'Comercial/F4ProdutoPedido/List2',
                        'showFilter': true,
                        'columns': columnsGrade,
                        'params': [validatorGrade1, validatorProdutos, validatorTabelaPrecos],
                        "fieldDepende": validatorGrade1,
                        'onChange': function () {
                            var ok = document.getElementById('inputF4ModalOk' + this.id);
                            ok.onclick = function () {
                                validatorGrade2.setChange(true);
                                var data = tableGrade2.getSelectedData();
                                document.getElementById('inputCodigoGrade2').value = data['Codigo'];
                                document.getElementById('descriptionCodigoGrade2').innerHTML = ' - ' + data['Descricao'];
                                validatorGrade2.update();
                                validatorGrade2.validate();
                            };
                        },
                        'onDataBound': function () {
                            $('#' + this.id + ' table  tr').on('dblclick', function () {
                                validatorGrade2.setChange(true);
                                var data = tableGrade2.getSelectedData();
                                document.getElementById('inputCodigoGrade2').value = data['Codigo'];
                                document.getElementById('descriptionCodigoGrade2').innerHTML = ' - ' + data['Descricao'];
                                validatorGrade2.update();
                                validatorGrade2.validate();

                                $('#modalGrade2').modal('hide');
                            });
                        },
                        'dataSourceType': "Parameter"
                    });
                    var tableGrade3 = new Table({
                        'id': 'tableGrade3',
                        'route': window.baseUrl + 'Comercial/F4ProdutoPedido/List3',
                        'showFilter': true,
                        'columns': columnsGrade,
                        'params': [validatorGrade2, validatorGrade1, validatorProdutos, validatorTabelaPrecos],
                        "fieldDepende": validatorGrade2,
                        'onChange': function () {
                            var ok = document.getElementById('inputF4ModalOk' + this.id);
                            ok.onclick = function () {
                                validatorGrade3.setChange(true);
                                var data = tableGrade2.getSelectedData();
                                document.getElementById('inputCodigoGrade3').value = data['Codigo'];
                                document.getElementById('descriptionCodigoGrade3').innerHTML = ' - ' + data['Descricao'];
                                validatorGrade3.update();
                                validatorGrade3.validate();
                            };
                        },
                        'onDataBound': function () {
                            $('#' + this.id + ' table  tr').on('dblclick', function () {
                                validatorGrade3.setChange(true);
                                var data = tableGrade3.getSelectedData();
                                document.getElementById('inputCodigoGrade3').value = data['Codigo'];
                                document.getElementById('descriptionCodigoGrade3').innerHTML = ' - ' + data['Descricao'];
                                validatorGrade3.update();
                                validatorGrade3.validate();

                                $('#modalGrade3').modal('hide');
                            });
                        },
                        'dataSourceType': "Parameter"
                    });

                    var linkButtonModalGrade1 = document.getElementById('linkButtonModalGrade1');
                    var linkButtonModalGrade2 = document.getElementById('linkButtonModalGrade2');
                    var linkButtonModalGrade3 = document.getElementById('linkButtonModalGrade3');

                    var inputGrade1 = document.getElementById('inputCodigoGrade1');
                    var inputGrade2 = document.getElementById('inputCodigoGrade2');
                    var inputGrade3 = document.getElementById('inputCodigoGrade3');

                    var modalGrade1 = new Modal('Grade', linkButtonModalGrade1, inputGrade1, tableGrade1);
                    var modalGrade2 = new Modal('Grade', linkButtonModalGrade2, inputGrade2, tableGrade2);
                    var modalGrade3 = new Modal('Grade', linkButtonModalGrade3, inputGrade3, tableGrade3);

                    modalGrade1.listen();
                    modalGrade2.listen();
                    modalGrade3.listen();

                    listenToggleProdutoGradesF4();

                    var columnsTransportadoras = [
                     { title: 'Código', field: 'Codigo', width: 40, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                     { title: 'Nome', field: 'RazaoSocial', width: 120, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                     { title: 'CPF/CNPJ', field: 'CnpjCpf', width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                    ];
                    var columnsTrasnportadorasLegend = { CpfCnpj: 'Ex: 11.222.333/4444-55', Telefone: ' Ex: (0xx47) 33332222' };

                    /*F4 Transportadora*/
                    var tableTransportadoras = new Table({
                        'id': 'tableTransportadora',
                        'route': window.baseUrl + 'Empresarial/F4Transportadora/GetTransportadoras',
                        'showFilter': true,
                        'columns': columnsTransportadoras,
                        'columnsLegend': columnsTrasnportadorasLegend,
                        'onChange': function () {
                            var ok = document.getElementById('inputF4ModalOk' + this.id);
                            ok.onclick = function () {
                                var data = tableTransportadoras.getSelectedData();
                                document.getElementById('inputCodigoTransportadora').value = data.Codigo;
                                document.getElementById('descriptionCodigoTransportadora').innerHTML = data.Nome;
                                validatorTransportadora.update();
                                validatorTransportadora.validate();
                            };
                        },
                        'onDataBound': function () {
                            $('#tableTransportadora table  tr').on('dblclick', function () {
                                var data = tableTransportadoras.getSelectedData();
                                document.getElementById('inputCodigoTransportadora').value = data.Codigo;
                                document.getElementById('descriptionCodigoTransportadora').innerHTML = data.Nome;
                                validatorTransportadora.update();
                                validatorTransportadora.validate();

                                $('#modalTransportadora').modal('hide');
                            });
                        },
                        'dataSourceType': "Filtered"
                    });
                    var linkButtonModalTransportadora = document.getElementById('linkButtonModalTransportadora');
                    var inputTransportadora = document.getElementById('inputCodigoTransportadora');
                    var modalTransportadora = new Modal('Transportadoras', linkButtonModalTransportadora, inputTransportadora, tableTransportadoras);
                    modalTransportadora.listen();

                    /*F4 Transportadora Redespacho*/
                    var tableTransportadorasRedespacho = new Table({
                        'id': 'tableTransportadoraRedespacho',
                        'route': window.baseUrl + 'Empresarial/F4Transportadora/GetTransportadoras',
                        'showFilter': true,
                        'columns': columnsTransportadoras,
                        'onChange': function () {
                            var ok = document.getElementById('inputF4ModalOk' + this.id);
                            ok.onclick = function () {
                                var data = tableTransportadorasRedespacho.getSelectedData();
                                document.getElementById('inputCodigoTransportadoraRedespacho').value = data.Codigo;
                                document.getElementById('descriptionCodigoTransportadoraRedespacho').innerHTML = data.Nome;
                                validatorTransportadoraRedespacho.update();
                                validatorTransportadoraRedespacho.validate();
                            };
                        },
                        'onDataBound': function () {
                            $('#tableTransportadoraRedespacho table  tr').on('dblclick', function () {
                                var data = tableTransportadorasRedespacho.getSelectedData();
                                document.getElementById('inputCodigoTransportadoraRedespacho').value = data.Codigo;
                                document.getElementById('descriptionCodigoTransportadoraRedespacho').innerHTML = data.Nome;
                                validatorTransportadoraRedespacho.update();
                                validatorTransportadoraRedespacho.validate();

                                $('#modalTransportadoraRedespacho').modal('hide');
                            });
                        },
                        'dataSourceType': "Filtered"
                    });
                    var linkButtonModalTransportadoraRedespacho = document.getElementById('linkButtonModalTransportadoraRedespacho');
                    var inputTransportadoraRedespacho = document.getElementById('inputCodigoTransportadoraRedespacho');
                    var modalTransportadoraRedespacho = new Modal('Transportadoras', linkButtonModalTransportadoraRedespacho, inputTransportadoraRedespacho, tableTransportadorasRedespacho);
                    modalTransportadoraRedespacho.listen();
                    /*----->F4s<-----*/

                    function validateDate(field, abaIndex) {
                        if ($("#" + field).val() === "")
                            $("#" + field).val("00/00/0000")

                        if ($("#" + field).val() !== "00/00/0000" && $("#" + field).val() !== "00/00/00") {
                            var entregaMes = $("#" + field).val().substr(3, 3);
                            var entregaDia = $("#" + field).val().substr(0, 3);
                            var entregaAno = $("#" + field).val().substr(6, 4);
                            var entrega = new Date(entregaMes + entregaDia + entregaAno);

                            var emissaoMes = $("#inputDataEmissao").val().substr(3, 3);
                            var emissaoDia = $("#inputDataEmissao").val().substr(0, 3);
                            var emissaoAno = $("#inputDataEmissao").val().substr(6, 4);
                            var emissao = new Date(emissaoMes + emissaoDia + emissaoAno);

                            if (entrega < emissao) {
                                u.alert("Prazo de entrega deve ser igual ou posterior à data de emissão do pedido.", alertBehavior.error);
                                u.alterTab(abaIndex);
                                u.alterControlGroupBehavior(field, controlGroupBehavior.error);
                                $("#" + field).focus();
                                throw new Error("Prazo de entrega deve ser igual ou posterior à data de emissão do pedido.");
                            } else {
                                u.alterControlGroupBehavior(field, controlGroupBehavior.normal);
                            }
                        } else {
                            u.alterControlGroupBehavior(field, controlGroupBehavior.normal);
                        }
                    }

                    // seta como true no inicio, porque as rotinas de sugestões, só funcionam quando não tem valor informado manualmente, 
                    // a partir do momento que foi informado um valor manual, não será feito mais nenhuma sugestão
                    $("#inputNumeroOc").data("podesugerir", true);

                    // sugere OC nos itens, quando altera OC do pedido
                    $("#fieldNumeroOrdemCompraCliente").on("change", function () {
                        if ($("#inputNumeroOc").data("podesugerir") && !$("#buttonAdicionarItem").attr("disabled")) {
                            $("#inputNumeroOc").val($("#fieldNumeroOrdemCompraCliente").val());
                        }
                    });
                    // sugere OC nos itens, se estiver alterando um pedido
                    if ($("#inputNumeroOc").data("podesugerir") && !$("#buttonAdicionarItem").attr("disabled")) {
                        $("#inputNumeroOc").val($("#fieldNumeroOrdemCompraCliente").val());
                    }

                    // flag para indicar que o campo foi alterado manualmente, para não fazer mais sugestões,
                    // o evento 'change' somente é invocado quando o campo é alterado manualmente,
                    // quando altera o campo pelo rotina 'val()' do jquery, o evento não é disparado
                    $("#inputNumeroOc").on("change", function () {
                        // mesmo que o valor do campo inputNumeroOc for vazio, não vai mais deixar sugerir valor,
                        // porque o usuario pode querer que o valor do campo seja vazio
                        $("#inputNumeroOc").data("podesugerir", false);
                        // quando digita um novo codigo para o produto, e feito clear no campo inputNumeroOc,
                        // como foi um valor digitado, tenho que recuperar esse valor, por isso eh feito bkp e restaurado
                        // o mesmo, quando o codigo do produto eh alterado
                        $("#inputNumeroOc").attr("valorBkp", $("#inputNumeroOc").val());
                    });

                    /*Adicionar/Remover/Alterar Itens de um pedido*/

                    function getCurrentItem() {
                        "use strict";
                        var item = {};

                        validateDate('inputDataEntrega', 1);
                        if (validatorTabelaPrecos.invalid) {
                            validatorTabelaPrecos.focus(controlGroupBehavior.warning);
                            validatorTabelaPrecos.showValidateMessage();
                            u.alterTab(1);
                            throw new Error(validatorTabelaPrecos.onPendencyMessage);
                        }
                        if (validatorProdutos.invalid) {
                            validatorProdutos.focus(controlGroupBehavior.warning);
                            validatorProdutos.showValidateMessage();
                            u.alterTab(1);
                            throw new Error(validatorProdutos.onPendencyMessage);
                        }

                        item['CodTabelaPrecos'] = document.getElementById('inputCodigoTabelaPrecos').value;
                        item['CodProduto'] = document.getElementById('inputCodigoProduto').value;
                        item['CodItemGrade1'] = document.getElementById('inputCodigoGrade1').value || 0;
                        item['CodItemGrade2'] = document.getElementById('inputCodigoGrade2').value || 0;
                        item['CodItemGrade3'] = document.getElementById('inputCodigoGrade3').value || 0;
                        item['Complemento'] = document.getElementById('fieldItemComplemento').value; //TODO: alterar nome para padrão

                        var inputQuantidade = document.getElementById('inputQuantidade');
                        if (inputQuantidade.value.replace(/\./g, '').replace(/\,/g, '') == 0) {
                            var msgErroquantidade = '"Quantidade" deve ser informada.';
                            inputQuantidade.focus();
                            alterControlGroupBehavior('inputQuantidade', controlGroupBehavior.warning);
                            u.alterTab(1);
                            u.alert(msgErroquantidade, alertBehavior.warning);
                            throw new Error(msgErroquantidade);
                        } else {
                            alterControlGroupBehavior('inputQuantidade', controlGroupBehavior.normal);
                            item['Quantidade'] = inputQuantidade.value.replace(/\./g, '').replace(/\,/g, '.');
                        }

                        item['ValorUnitarioLiquido'] = document.getElementById('inputValorUnitario').value;

                        var inputValorUnitario = document.getElementById('inputValorUnitario');
                        if (inputValorUnitario.value.replace(/\./g, '').replace(/\,/g, '') == 0) {
                            var msgErroValor = '"Vlr. Unitário" deve ser informado.';
                            inputValorUnitario.focus();
                            alterControlGroupBehavior('inputValorUnitario', controlGroupBehavior.warning);
                            u.alterTab(1);
                            u.alert(msgErroValor, alertBehavior.warning);
                            throw new Error(msgErroValor);
                        } else {
                            alterControlGroupBehavior('inputValorUnitario', controlGroupBehavior.normal);
                            item['ValorUnitario'] = inputValorUnitario.value.replace(/\./g, '').replace(/\,/g, '.');
                        }

                        item['ValorDescontoUnitario'] = document.getElementById("inputDescontoUnitario").value.replace(/\./g, '').replace(/\,/g, '.');
                        //item['PercentualDescontoUnitario'] //TODO: Adicionar opção para percentual
                        //item['DescontoEmPercentual'] 
                        item['AliquotaIcms'] = document.getElementById('inputValorAliquotaIcms').value.replace(/\,/g, '.');
                        item['AliquotaIpi'] = document.getElementById('inputValorAliquotaIpi').value.replace(/\,/g, '.');
                        item['AliquotaIcmsSt'] = document.getElementById('inputValorAliquotaIcmsSt').value.replace(/\,/g, '.');
                        item['NumeroOrdemCompra'] = document.getElementById('inputNumeroOc').value;
                        item['ItemPed'] = document.getElementById('inputItemPed').value;
                        item['DataEntrega'] = document.getElementById('inputDataEntrega').value;
                        item['LivreCobranca'] = document.getElementById('inputLivreCobranca').checked;

                        return item;
                    }

                    function clearCurrentItem() {
                        document.getElementById('inputCodigoProduto').value = "";
                        document.getElementById('descriptionCodigoProduto').innerHTML = "";
                        document.getElementById('inputCodigoGrade1').value = "";
                        document.getElementById('descriptionCodigoGrade1').innerHTML = "";
                        document.getElementById('inputCodigoGrade2').value = "";
                        document.getElementById('descriptionCodigoGrade2').innerHTML = "";
                        document.getElementById('inputCodigoGrade3').value = "";
                        document.getElementById('descriptionCodigoGrade3').innerHTML = "";

                        document.getElementById('fieldItemComplemento').value = ""; // TODO: alterar para o padrão
                        document.getElementById('inputQuantidade').value = "";
                        document.getElementById('inputValorUnitario').value = "";
                        document.getElementById('inputDescontoUnitario').value = "";
                        document.getElementById('inputValorAliquotaIcms').value = "";
                        document.getElementById('inputValorAliquotaIpi').value = "";
                        document.getElementById('inputValorAliquotaIcmsSt').value = "";
                        document.getElementById('inputNumeroOc').value = "";
                        document.getElementById('inputItemPed').value = "";
                        document.getElementById('inputDataEntrega').value = document.getElementById('inputPrincipalDataEntrega').value;
                        document.getElementById('inputLivreCobranca').value = "";

                        u.disable('inputQuantidade');
                        u.disable('inputValorUnitario');
                        u.disable('inputDescontoUnitario');
                        u.disable('inputCodigoGrade1');
                        u.disable('inputCodigoGrade2');
                        u.disable('inputCodigoGrade3');

                        setMask();
                    }

                    function adicionarItem() {
                        alterouCampo = true;
                        var item = getCurrentItem();
                        function refresh() {
                            clearCurrentItem();
                            defaultSetIdCondicaoPagamento();
                            updateCondicoesPagamento();
                            defaultSetIdTipoCobranca();
                            gridItens.refresh();
                            updateFatura();
                            document.getElementById('inputCodigoTabelaPrecos').focus();

                            // sugere OC nos itens
                            $("#inputNumeroOc").val($("#fieldNumeroOrdemCompraCliente").val());
                            $("#inputNumeroOc").data("podesugerir", true);
                            $("#inputNumeroOc").attr("valorBkp", "");
                        }

                        postJsonToRoute('Comercial/Itens/AddItem', JSON.stringify(item)).done(function (data) {
                            if (data.IsAlert) {
                                u.alert(data.Message, getAlertBehavior(data.Level));
                                if (data.IsWrongQuantity) {
                                    alterControlGroupBehavior("inputQuantidade", u.getControlGroupBehavior(data.Level));
                                    $("#inputQuantidade").focus();
                                }
                                if (data.Level == alertLevel.warning) {
                                    refresh();
                                }
                                throw new Error(data.Message);
                            } else {
                                refresh();
                            }
                        });
                    }

                    function alterarItem() {
                        alterouCampo = true;
                        var param = {};
                        param.Index = gridItens.getSelectedData()['Sequencial'];
                        param.Item = getCurrentItem();
                        postJsonToRoute('Comercial/Itens/ChangeItem', JSON.stringify(param)).done(function (data) {
                            if (data.IsAlert) {
                                if (data.Level == alertLevel.error) {
                                    u.alert(data.Message, getAlertBehavior(data.Level));
                                    throw new Error(data.Message);
                                }
                            }

                            clearCurrentItem();
                            u.disable('buttonAlterarItem');
                            u.disable('buttonRemoverItem');
                            u.enable('buttonAdicionarItem');
                            defaultSetIdCondicaoPagamento();
                            updateCondicoesPagamento();
                            defaultSetIdTipoCobranca();
                            gridItens.refresh();
                            updateFatura();
                            document.getElementById('inputCodigoTabelaPrecos').focus();

                            // sugere OC nos itens
                            $("#inputNumeroOc").val($("#fieldNumeroOrdemCompraCliente").val());
                            $("#inputNumeroOc").data("podesugerir", true);
                            $("#inputNumeroOc").attr("valorBkp", "");
                        });
                    }

                    function removerItem() {
                        "use strict";
                        alterouCampo = true;
                        var param = {};
                        param.Index = gridItens.getSelectedData()['Sequencial'];
                        postJsonToRoute('Comercial/Itens/DeleteItem', JSON.stringify(param)).done(function (data) {
                            if (data.IsAlert) {
                                u.alert(data.Message, getAlertBehavior(data.Level));
                                throw new Error(data.Message);
                            }
                            clearCurrentItem();
                            u.disable('buttonAlterarItem');
                            u.disable('buttonRemoverItem');
                            u.enable('buttonAdicionarItem');
                            defaultSetIdCondicaoPagamento();
                            updateCondicoesPagamento();
                            defaultSetIdTipoCobranca();
                            gridItens.refresh();
                            updateFatura();

                            // sugere OC nos itens
                            $("#inputNumeroOc").val($("#fieldNumeroOrdemCompraCliente").val());
                            $("#inputNumeroOc").data("podesugerir", true);
                            $("#inputNumeroOc").attr("valorBkp", "");
                        });
                    }

                    /*Aba Faturamento*/
                    function getCurrentParcela() {
                        var fatura = {};
                        fatura['Numero'] = document.getElementById("inputFaturamentoParcela").value;
                        fatura['Parcela'] = "";
                        fatura['DataVencimento'] = document.getElementById("inputDataVencimento").value;
                        fatura['Valor'] = document.getElementById("inputFaturamentoValor").value;
                        fatura['IdFormaPagamento'] = document.getElementById("selectFormaPagamento").value;
                        fatura['Observacao'] = document.getElementById("inputObservacao").value;
                        fatura['IsIcmsSt'] = false;
                        fatura['IdTipoVencimento'] = 0;
                        fatura['TipoVencimento'] = "";
                        return fatura;
                    }

                    function clearCurrentParcela() {
                        document.getElementById('inputFaturamentoParcela').value = "";
                        document.getElementById('inputDataVencimento').value = "";
                        document.getElementById('inputFaturamentoValor').value = "";
                        document.getElementById('inputObservacao').value = "";
                        u.disable('buttonAlteraParcela');
                        dropDownFormasPagamento.disable();
                        setMask();
                    }

                    function alteraParcela() {
                        "use strict";
                        alterouCampo = true;
                        var desconto = document.getElementById('fieldValorTotalDesconto').value.replace('.', '').replace(',', '.');
                        var param = {};
                        param.Fatura = getCurrentParcela();
                        param.Index = $('#gridParcelas .k-grid-content table tbody .k-state-selected')[0].rowIndex;

                        postJsonToRoute('Comercial/Faturas/ChangeParcela', JSON.stringify(param)).done(
                            function (data) {
                                if (data.IsAlert && data.Level == alertLevel.error) {
                                    u.alert(data.Message, getAlertBehavior(data.Level));
                                    throw new Error(data.Message);
                                }

                                param['Value'] = "0.00"; //primeiro deve zerar o desconto
                                postJsonToRoute('Comercial/Faturas/SetDescontoPedido', JSON.stringify(param)).done(
                                    function () {
                                        getJsonFromRoute("Comercial/Faturas/UpdateFatura", null).done(function (data) {
                                            if (data.IsAlert) {
                                                u.alert(data.Message, getAlertBehavior(data.Level));
                                                throw new Error(data.Message);
                                            } else {
                                                param['Value'] = desconto;
                                                postJsonToRoute('Comercial/Faturas/SetDescontoPedido', JSON.stringify(param)).done(
                                                    function () {
                                                        updateFatura();
                                                        clearCurrentParcela();
                                                        dropDownFormasPagamento.set("0");
                                                    }
                                                );
                                            }
                                        });
                                    }
                                );
                            }
                        );
                    }

                    function updateFaturaDesconto(param) {
                        getJsonFromRoute("Comercial/Faturas/UpdateFatura", null).done(function (data) {
                            if (data.IsAlert) {
                                u.alert(data.Message, getAlertBehavior(data.Level));
                                throw new Error(data.Message);
                            }

                            if (parseInt(data.ValorTotalProdutos) == 0)
                                disableField('fieldValorTotalDesconto');
                            else {
                                var input = document.getElementById('fieldValorTotalDesconto');
                                if (input.hasAttribute('datapermission')) {
                                    if (input.getAttribute('datapermission') == 'False') {
                                        disableField('fieldValorTotalDesconto');
                                    } else {
                                        enableField('fieldValorTotalDesconto');
                                    }
                                }
                            }

                            enableField('fieldValorTotalDesconto');

                            byId("fieldValorTotalProdutos").value = data.ValorTotalProdutos;
                            byId("fieldValorTotalDesconto").value = data.ValorTotalDesconto;
                            byId("fieldValorTotalIpi").value = data.ValorTotalIpi;
                            byId("fieldValorTotalAPagar").value = data.ValorTotalAPagar;
                            gridParcelas.refresh();

                            postJsonToRoute('Comercial/Faturas/SetDescontoPedido', JSON.stringify(param)).done(
                                function () {
                                    clearCurrentParcela();
                                    gridParcelas.refresh();
                                }
                            );
                        });

                        setMask();
                        setPermissions();
                    }

                    function updateFatura() {
                        getJsonFromRoute("Comercial/Faturas/UpdateFatura", null).done(function (data) {
                            if (data.IsAlert) {
                                u.alert(data.Message, getAlertBehavior(data.Level));
                                throw new Error(data.Message);
                            }

                            if (parseInt(data.ValorTotalProdutos) == 0)
                                disableField('fieldValorTotalDesconto');
                            else
                                enableField('fieldValorTotalDesconto');

                            byId("fieldValorTotalProdutos").value = data.ValorTotalProdutos;
                            byId("fieldValorTotalDesconto").value = data.ValorTotalDesconto;
                            byId("fieldValorTotalIpi").value = data.ValorTotalIpi;
                            byId("fieldValorTotalAPagar").value = data.ValorTotalAPagar;
                            gridParcelas.refresh();
                            setMask();
                        });
                        setPermissions();
                    }

                    function setInProxy(fieldId, route, data) {
                        "use strict";
                        var param = {};
                        if (isFieldControlGroupInBehavior(fieldId, controlGroupBehavior.error)) {

                        } else {
                            if (data)
                                param.Value = data;
                            else
                                param.Value = byId(fieldId).value;

                            if (param.Value === "") {

                            } else {
                                if (param.Value === '0') {
                                    var input = byId(fieldId);
                                    if (input.options) {
                                        param.Value = byId(fieldId).options[0].value;
                                    }
                                }


                                postJsonToRoute(route, JSON.stringify(param));
                            }
                        }
                    }

                    function defaultSetIdTipoCobranca() {
                        setInProxy("fieldSelectTiposCobrancas", "Comercial/Faturas/SetIdTipoCobranca");
                    }

                    function defaultSetIdCondicaoPagamento() {
                        setInProxy("fieldSelectCondicaoPagamento", "Comercial/Faturas/SetIdCondicaoPagamento");
                    }

                    /*Ações Gerais*/

                    function clearProdutoBeforeInsert() {
                        document.getElementById('inputCodigoProduto').value = "";
                        document.getElementById('inputCodigoGrade1').value = "";
                        document.getElementById('inputCodigoGrade2').value = "";
                        document.getElementById('inputCodigoGrade3').value = "";
                        document.getElementById('descriptionCodigoProduto').innerHTML = "";
                        document.getElementById('descriptionCodigoGrade1').innerHTML = "";
                        document.getElementById('descriptionCodigoGrade2').innerHTML = "";
                        document.getElementById('descriptionCodigoGrade3').innerHTML = "";
                        document.getElementById('fieldItemComplemento').value = "";

                        if (document.getElementById('inputQuantidade').value !== "0,0000")
                            document.getElementById('inputQuantidade').value = "";

                        if (document.getElementById('inputValorUnitario').value !== "0,00")
                            document.getElementById('inputValorUnitario').value = "";

                        if (document.getElementById('inputDescontoUnitario').value !== "0,00")
                            document.getElementById('inputDescontoUnitario').value = "";

                        if (document.getElementById('inputValorAliquotaIcms').value !== "0,00")
                            document.getElementById('inputValorAliquotaIcms').value = "";

                        if (document.getElementById('inputValorAliquotaIpi').value !== "0,00")
                            document.getElementById('inputValorAliquotaIpi').value = "";

                        if (document.getElementById('inputValorAliquotaIcmsSt').value !== "0,00")
                            document.getElementById('inputValorAliquotaIcmsSt').value = "";

                        document.getElementById('inputNumeroOc').value = "";
                        document.getElementById('inputItemPed').value = "";

                        if (document.getElementById('inputDataEntrega').value !== "00/00/0000")
                            document.getElementById('inputDataEntrega').value = "";
                    }

                    function updateCondicoesPagamento() {
                        var desconto = document.getElementById('fieldValorTotalDesconto').value.replace('.', '').replace(',', '.');
                        var param = {};
                        param['Value'] = document.getElementById("fieldSelectCondicaoPagamento").value;

                        postJsonToRoute("Comercial/Faturas/SetIdCondicaoPagamento", JSON.stringify(param)).done(
                            function (data) {
                                if (data.Level == alertLevel.error) {
                                    u.alert(data.Message, alertLevel.error);
                                    throw new Error(data.Message);
                                } else {
                                    updateValorAcrescimoOuDescontoCondicaoPagamento(data);
                                }

                                param['Value'] = desconto;
                                updateFaturaDesconto(param);
                            }
                        );
                    }

                    function updateValorAcrescimoOuDescontoCondicaoPagamento(data) {
                        var tipo = data['TipoCondicao'];
                        var valor = data['ValorAcrescimoOuDesconto'];

                        if (tipo === 0) { //nenhum
                            $("#idFaturamentoValorAcrescimoOuDesconto").hide();
                            document.getElementById('labelFaturamentoValorAcrescimoOuDesconto').innerHTML = "";
                            document.getElementById('inputFaturamentoValorAcrescimoOuDesconto').value = "";
                        } else if (tipo === 1) { //acréscimo
                            $("#idFaturamentoValorAcrescimoOuDesconto").show();
                            document.getElementById('labelFaturamentoValorAcrescimoOuDesconto').innerHTML = "Valor Acréscimo:";
                            document.getElementById('inputFaturamentoValorAcrescimoOuDesconto').value = valor;
                        } else if (tipo === 2) { //desconto
                            $("#idFaturamentoValorAcrescimoOuDesconto").show();
                            document.getElementById('labelFaturamentoValorAcrescimoOuDesconto').innerHTML = "Valor Desconto:";
                            document.getElementById('inputFaturamentoValorAcrescimoOuDesconto').value = valor;
                        } else {
                            $("#idFaturamentoValorAcrescimoOuDesconto").hide();
                            document.getElementById('labelFaturamentoValorAcrescimoOuDesconto').innerHTML = "";
                            document.getElementById('inputFaturamentoValorAcrescimoOuDesconto').value = "";
                            throw new Error("Situação desconhecida retornada pelo servidor.");
                        }
                    }

                    function getCurrentPedido() {
                        "use strict";
                        var pedido = {};

                        pedido['codigoMunicipio'] = document.getElementById("inputCodigoMunicipio").value;
                        pedido['LocalEntrega'] = document.getElementById("inputLocalEntrega").value;
                        pedido['DataEntrega'] = document.getElementById("inputPrincipalDataEntrega").value;
                        pedido['NumeroOrdemCompraCliente'] = document.getElementById("fieldNumeroOrdemCompraCliente").value;
                        pedido['Observacoes'] = document.getElementById("fieldObservacoes").value;
                        pedido['QuemTransporta'] = document.getElementById("fieldSelectQuemTransporta").value;
                        pedido['codigoTransportadora'] = document.getElementById("inputCodigoTransportadora").value;
                        pedido['ViaTransporte'] = document.getElementById("fieldSelectViaTransporte").value;
                        pedido['codigoTransportadoraRedespacho'] = document.getElementById("inputCodigoTransportadoraRedespacho").value;
                        pedido['QuantidadeTotalVolumes'] = document.getElementById("fieldQuantidadeTotalVolumes").value.replace(/\./g, '');
                        pedido['Especie'] = document.getElementById("fieldEspecie").value;
                        pedido['Marca'] = document.getElementById("fieldMarca").value;
                        pedido['NumeroInicial'] = document.getElementById("fieldNumeroInicial").value;
                        pedido['PesoBruto'] = document.getElementById("fieldPesoBruto").value;
                        pedido['PesoLiquido'] = document.getElementById("fieldPesoLiquido").value;

                        return pedido;
                    }

                    function resolveValidators() {
                        if (validatorFilial.invalid) {
                            u.alterTab(0);
                            validatorFilial.showValidateMessage();
                            validatorFilial.focus(controlGroupBehavior.error);
                            throw new Error(validatorFilial.onPendencyMessage);
                        }

                        if (validatorCliente.invalid) {
                            u.alterTab(0);
                            validatorCliente.showValidateMessage();
                            validatorCliente.focus(controlGroupBehavior.error);
                            throw new Error(validatorCliente.onPendencyMessage);
                        }

                        if (validatorOperacaoComercial.invalid && !permissions.IsOperacaoComercialOpcional) {
                            var message = "É obrigatório informar a Operação Comercial.";
                            u.alert(message, alertBehavior.error);
                            u.alterTab(0);
                            validatorOperacaoComercial.focus(controlGroupBehavior.error);
                            throw new Error(message);
                        }

                        if (gridItens.getDataSource()._data.length == 0) {
                            alterTab(1);
                            u.alert("Deve ser adicionado pelo menos um item.", alertBehavior.error);
                            throw new Error("Deve ser adicionado pelo menos um item.");
                        }
                    }

                    function salvarPedido() {
                        "use strict";
                        validateDate('inputPrincipalDataEntrega', 0);
                        resolveValidators();
                        var pedido = getCurrentPedido();

                        var toutId = setTimeout(function () {
                            $('#waiting').show();
                        }, 200);
                        getJsonFromRoute("Comercial/Movimentos/ConferePedido").done(
                            function (data) {
                                if (data.IsAlert) {
                                    if (data.Level == alertLevel.normal) {
                                        u.dialog(
                                            null,
                                            data.Message,
                                            function () {
                                                postPedido(pedido);
                                            }
                                        );
                                        $('#linkButtonSalvarPedido').click();
                                    } else {
                                        u.dialogOk("Aviso", data.Message);
                                        $('#linkButtonSalvarPedido').click();
                                    }
                                } else {
                                    postPedido(pedido);
                                }
                                window.clearTimeout(toutId);
                                $('#waiting').hide();
                            }
                        );
                    }

                    function postPedido(pedido) {
                        postJsonToRoute("Comercial/Movimentos/SavePedido", JSON.stringify(pedido)).done(function (data) {
                            if (data.IsAlert) {
                                if (data.Level == alertLevel.success) {
                                    var message = "";
                                    if (params.Pedido.IsAlteracao)
                                        message = "Pedido salvo com sucesso.";
                                    else
                                        message = "Pedido adicionado com sucesso.";

                                    u.alert(message, getAlertBehavior(data.Level), true);
                                    enableField('buttonGeneratePdfPedido');
                                    $('#fieldCodigoProprio').val(data.Numero);
                                    params.Pedido.IsAlteracao = true;
                                    params.Pedido.Situacao = data.Situacao;
                                    permissions = data.Permissions;
                                    setPermissions();
                                    alterTab(0);
                                }

                                if (data.Level == alertLevel.error)
                                    u.alert(data.Message, getAlertBehavior(data.Level), true);

                                if (data.Level == alertLevel.warning)
                                    u.alert(data.Message, getAlertBehavior(data.Level), true);
                            }
                        });
                    }

                    function cancelarAlteracao() {
                        "use strict";
                        u.dialog(
                            null,
                            "Deseja realmente abandonar as alterações?",
                            function () {
                                setTimeout(function () {
                                    $('#waiting').show();
                                }, 200);
                                window.location.href = window.baseUrl + "Comercial/Movimentos/Pedidos";
                            },
                            null,
                            lastFieldFocus
                        );
                    }

                    function copiarPedido() {
                        "use strict";
                        u.dialog(
                            null,
                            "Deseja realmente abandonar as alterações?",
                            function () {
                                setTimeout(function () {
                                    $('#waiting').show();
                                }, 200);
                                window.location.href = window.baseUrl + "Comercial/Movimentos/CopyPedido";
                            },
                            null,
                            lastFieldFocus
                        );
                    }

                    function checkQuantidade() {
                        "use strict";
                        if (validatorTabelaPrecos.invalid) {
                            u.alterTab(1);
                            validatorTabelaPrecos.focus(controlGroupBehavior.error);
                            validatorTabelaPrecos.showValidateMessage();
                            u.alert();
                            throw new Error(validatorTabelaPrecos.onPendencyMessage);
                        }

                        if (validatorProdutos.invalid) {
                            u.alterTab(1);
                            validatorProdutos.focus(controlGroupBehavior.error);
                            validatorProdutos.showValidateMessage();
                            u.alert();
                            throw new Error(validatorProdutos.onPendencyMessage);
                        }

                        var search = {};
                        search['Quantidade'] = byId("inputQuantidade").value.replace(/\./g, '').replace(/\,/g, '.');//replace(/\.|,/g, '');
                        search['CodigoTabelaPreco'] = validatorTabelaPrecos.value;
                        search['CodigoProduto'] = validatorProdutos.value;

                        getJsonFromRoute("Comercial/F4ProdutoPedido/CheckQuantidade", search).done(function (data) {
                            if (data.IsAlert) {
                                if (data.Level == alertLevel.error) {
                                    alterControlGroupBehavior("inputQuantidade", controlGroupBehavior.error);
                                    $("#inputQuantidade").focus();
                                    u.alert(data.Message, getAlertBehavior(alertLevel.error));
                                    throw new Error(data.Message);
                                }
                                if (data.Level == alertLevel.normal) {
                                    u.alert(data.Message, getAlertBehavior(alertLevel.warning));
                                }
                            }
                            alterControlGroupBehavior("inputQuantidade", controlGroupBehavior.normal);
                        });
                    }

                    //Núm OC - comentado provisoriamente pela diferença entre o tamanho dos campos.
                    //$('#tabItens').on('click', function () {
                    //    "use strict";
                    //
                    //    if (document.getElementById('inputNumeroOc').value === "")
                    //        document.getElementById('inputNumeroOc').value = document.getElementById('fieldNumeroOrdemCompraCliente').value;
                    //});

                    $('#inputQuantidade').on('blur', checkQuantidade);
                    $('#inputValorUnitario').on('blur', function () {
                        "use strict";
                        var cmp = this.value.toFloat().compare(0);
                        if (cmp == 'greater') {
                            alterControlGroupBehavior(this.id, controlGroupBehavior.normal);
                        }
                    });
                    $("#fieldValorTotalDesconto").on('blur', function () {
                        var param = {};
                        param.Value = document.getElementById('fieldValorTotalDesconto').value.replace('.', '').replace(',', '.');
                        postJsonToRoute('Comercial/Faturas/SetDescontoPedido', JSON.stringify(param)).done(
                            function () {
                                updateFatura();
                            }
                        );
                    });
                    $("#inputPrincipalDataEntrega").on('blur', function () {
                        validateDate('inputPrincipalDataEntrega', 0);
                    });
                    $('#inputDataEntrega').on('blur', function () {
                        validateDate('inputDataEntrega', 1);
                    });
                    $('#inputDataVencimento').on('blur', function () {
                        validateDate('inputDataVencimento', 2);
                    });
                    $('#buttonAdicionarItem').on('click', adicionarItem);
                    $('#buttonAlterarItem').on('click', alterarItem);
                    $('#buttonRemoverItem').on('click', removerItem);
                    $('#buttonAlteraParcela').on('click', alteraParcela);

                    $('#buttonSalvarPedido').on('click', salvarPedido);
                    $('#buttonCancelarAlteracaoPedido').on('click', cancelarAlteracao);

                    $('#buttonNovoPedido').on('click', function () {
                        "use strict";
                        u.dialog(
                            null,
                            "Deseja realmente abandonar as alterações e adicionar um novo pedido?",
                            function () {
                                window.location.replace(window.baseUrl + "Comercial/Movimentos/NovoPedido");
                            },
                            null,
                            lastFieldFocus
                        );
                    });

                    $("#inputPrincipalDataEntrega").on('change', function () {
                        $("#inputDataEntrega").val($("#inputPrincipalDataEntrega").val());
                        validateDate('inputPrincipalDataEntrega', 0);
                    });
                    $("#inputDataEntrega").on('change', function () {
                        validateDate('inputDataEntrega', 1);
                    });
                    $("#inputDataVencimento").on('change', function () {
                        validateDate('inputDataVencimento', 2);
                    });

                    $('#fieldObservacoes').on('keydown', function (ev) {
                        var key = ev.which || ev.keyCode;
                        if (key == 9) {
                            u.alterTab(1);
                            $('#inputCodigoTabelaPrecos').focus();
                        }
                    });
                    $('#buttonAdicionarItem').on('keydown', function (ev) {
                        var key = ev.which || ev.keyCode;
                        if (key == 9) {
                            u.alterTab(2);
                            $('#fieldValorTotalDesconto').focus();
                        }
                    });
                    $('#fieldValorTotalAPagar').on('keydown', function (ev) {
                        var key = ev.which || ev.keyCode;
                        if (key == 9) {
                            u.alterTab(3);
                            $('#inputCodigoTransportadora').focus();
                        }
                    });

                    $('#inputCodigoFilial').focus();
                    $.each($("input, textarea, a[role=button]"), function (index, value) {
                        if (value !== undefined && value !== null && value.id !== undefined && value.id !== null && value.id !== ""
                            && value.id !== "fieldItemSequencial"
                            && value.id !== "buttonSalvarPedido"
                            && value.id !== "buttonCancelarAlteracaoPedido"
                            && value.id !== "buttonGeneratePdfPedido"
                            && value.id !== "textAreaPordutoComplemento") {
                            $("#" + value.id).on("focus", function (evt) {
                                lastFieldFocus = evt.target.id;
                            });
                        }
                    });

                    document.getElementById('inputDataEntrega').value = document.getElementById('inputPrincipalDataEntrega').value;

                    var inputDataEmissaoValidator = new DateValidator({
                        id: "inputDataEmissao",
                        constructInjection: function () {
                            makeDatePicker('#' + this.id);
                        },
                        isEmptyValid: true,
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        }
                    });

                    var inputDataEntregaValidator = new DateValidator({
                        id: "inputDataEntrega",
                        constructInjection: function () {
                            makeDatePicker('#' + this.id);
                        },
                        isEmptyValid: true,
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        }
                    });

                    var inputDataVencimentoValidator = new DateValidator({
                        id: "inputDataVencimento",
                        constructInjection: function () {
                            makeDatePicker('#' + this.id);
                        },
                        isEmptyValid: true,
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        }
                    });

                    var inputPrincipalDataEntregaValidator = new DateValidator({
                        id: "inputPrincipalDataEntrega",
                        constructInjection: function () {
                            makeDatePicker('#' + this.id);
                        },
                        isEmptyValid: true,
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        }
                    });

                    kendo.culture("pt-BR");
                    setPermissions();
                    setMask();

                    if (params.Pedido.IsAlert && params.Pedido.IsAlteracao && !params.Pedido.PodeSerAlterado && params.Pedido.Level === alertLevel.error) {
                        disablePedido();
                    }
                })(params);
            }
        };
    }());

    Consultas.Manager = (function () {
        return {
            HistoricoClientes: function (params) {
                return (function () {
                    var u = new Util();
                    $("<div id='modalDiv'>").appendTo("body");

                    u.addButtonHelpBreadcrumb("RadarWEB.htm", "Tela Inicial");

                    var inputPeriodoInicial = new DateValidator({
                        id: "inputPeriodoInicial",
                        v2: true,
                        constructInjection: function () {
                            makeDatePicker("#" + this.id);
                        },
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);

                            getHistoricoDeClientes();
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);

                            getHistoricoDeClientes();
                        },
                        onEmpty: function () {
                            getHistoricoDeClientes();
                        }
                    });

                    var inputPeriodoFinal = new DateValidator({
                        id: "inputPeriodoFinal",
                        v2: true,
                        constructInjection: function () {
                            makeDatePicker("#" + this.id);
                        },
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);

                            getHistoricoDeClientes();
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);

                            getHistoricoDeClientes();
                        },
                        onEmpty: function () {
                            getHistoricoDeClientes();
                        }
                    });

                    var comparePeriodoInicialComFinal = new DateComparer({
                        idA: "inputPeriodoInicial",
                        idB: "inputPeriodoFinal",
                        verb: "less",
                        onInvalid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.error);
                            u.alert("Data inicial deve ser anterior a data final.", alertBehavior.error);
                        },
                        onValid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.normal);
                        }
                    });

                    var validatorCliente = new Validator({
                        field: "CodigoCliente",
                        onPendencyMessage: "Deve ser informado o código do cliente.",
                        route: "Comercial/F4ClientePedido/GetCliente",
                        v2: true,
                        onValid: function (data) {
                            $("#inputCodigoCliente").val(data.Codigo);
                            $("#descriptionCodigoCliente").html(data.RazaoSocial);
                            validatorCliente.update();

                            getHistoricoDeClientes();
                        },
                        onInvalid: function (data) {
                            validatorCliente.clear({ error: true });
                            validatorCliente.update();
                            validatorCliente.focus();

                            getHistoricoDeClientes();
                        },
                        onEmpty: function () {
                            validatorCliente.clear();
                            validatorCliente.update();

                            getHistoricoDeClientes();
                        }
                    });
                    validatorCliente.listen();

                    var tableClientes = new Table({
                        "id": "tableCliente",
                        "route": window.baseUrl + "Comercial/F4ClientePedido/GetClientes",
                        "showFilter": true,
                        "columns": [
                            { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Razão Social", field: "RazaoSocial", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "CPF/CNPJ", field: "CnpjCpf", width: 115, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        "columnsLegend": { CnpjCpf: "Ex: 11.222.333/4444-55" },
                        "onChange": function () {
                            $("#inputF4ModalOk" + this.id).on("click", function () {
                                var data = tableClientes.getSelectedData();
                                validatorCliente.onValid(data);
                                $("#modalCliente").modal("hide");
                            });
                            $("#inputF4ModalCancelar").on("click", function () {
                                $("#modalCliente").modal("hide");
                            });
                        },
                        "onDataBound": function () {
                            $("#tableCliente table tr").on("dblclick", function () {
                                var data = tableClientes.getSelectedData();
                                validatorCliente.onValid(data);
                                $("#modalCliente").modal("hide");
                            });
                            $("#inputF4ModalCancelar").on("click", function () {
                                $("#modalCliente").modal("hide");
                            });
                        },
                        "dataSourceType": "Filtered"
                    });
                    var modalClientes = new Modal("Clientes", byId("linkButtonModalClientes"), byId("inputCodigoCliente"), tableClientes).listen();

                    function getHistoricoDeClientes() {
                        if (validatorCliente.invalid || !inputPeriodoInicial.isValid || !inputPeriodoFinal.isValid || !comparePeriodoInicialComFinal.isValid) {
                            $("#buttonDadosClienteAnotacoesGerais").attr("disabled", "disabled");

                            setVal("DadosCliente.CpfCnpj", "");
                            setVal("DadosCliente.InscricaoEstadual", "");
                            setVal("DadosCliente.DataClienteDesde", "");

                            setVal("DadosCliente.Endereco", "");

                            setVal("DadosCliente.Contato", "");
                            setVal("DadosCliente.Telefone", "");
                            setVal("DadosCliente.Email", "");

                            setHtml("DadosCliente.Categoria1Legenda", "Categoria 1:");
                            setVal("DadosCliente.Categoria1Descricao", "");
                            setHtml("DadosCliente.Categoria2Legenda", "Categoria 2:");
                            setVal("DadosCliente.Categoria2Descricao", "");
                            setHtml("DadosCliente.Categoria3Legenda", "Categoria 3:");
                            setVal("DadosCliente.Categoria3Descricao", "");

                            // - informacoes comerciais
                            setHtml("InformacoesComerciais.ValorPedidos", "");
                            setHtml("InformacoesComerciais.ValorVendas", "");
                            setHtml("InformacoesComerciais.ValorDevolucoes", "");
                            setHtml("InformacoesComerciais.ValorProdutoMaisComprado", "");
                            setVal("InformacoesComerciais.DescricaoProdutoMaisCompradoValor", "");

                            setHtml("InformacoesComerciais.CondicoesPagamento", "");
                            setHtml("InformacoesComerciais.TabelaPrecos", "");
                            setHtml("InformacoesComerciais.FrequenciaMediaCompra", "");
                            setHtml("InformacoesComerciais.QuantidadeProdutoMaisComprado", "");
                            setVal("InformacoesComerciais.DescricaoProdutoMaisCompradoQuantidade", "");

                            // - informacoes financeiras
                            setHtml("InformacoesFinanceiras.ValorLimite", "");
                            setHtml("InformacoesFinanceiras.DataLimite", "");
                            setHtml("InformacoesFinanceiras.ValorCreditoUtilizado", "");
                            setHtml("InformacoesFinanceiras.ValorAdiantamento", "");
                            setHtml("InformacoesFinanceiras.ValorChequesPreDatados", "");
                            setHtml("InformacoesFinanceiras.ValorCreditoDisponivel", "");
                            setHtml("InformacoesFinanceiras.LiberacaoVenda", "");
                            setHtml("InformacoesFinanceiras.ValorSaldoVencido", "");
                            setHtml("InformacoesFinanceiras.ValorSaldoAVencer", "");
                            setHtml("InformacoesFinanceiras.MediaAtrasoEmDias", "");
                            setHtml("InformacoesFinanceiras.ValorChequesDevolvidos", "");
                            setHtml("InformacoesFinanceiras.ValorMaiorAtraso", "");
                            setHtml("InformacoesFinanceiras.BaixasInadimplencia", "");
                            setHtml("InformacoesFinanceiras.ValorBaixasInadimplencia", "");

                            var data = new kendo.data.DataSource({ data: [] });
                            $("#gridUltimasCompras").data("kendoGrid").setDataSource(data);
                        }
                        else {
                            request(
                                "Comercial/Consultas/GetHistoricoDeClientes",
                                {
                                    codCliente: getVal("inputCodigoCliente"),
                                    dataInicial: getVal("inputPeriodoInicial"),
                                    dataFinal: getVal("inputPeriodoFinal")
                                },
                                function (model) {
                                    // - periodo pesquisa
                                    //setVal("inputPeriodoInicial", );
                                    //setVal("inputPeriodoFinal", );

                                    // - dados do cliente
                                    //setVal("inputCodigoCliente", );
                                    //setHtml("descriptionCodigoCliente", );
                                    $("#buttonDadosClienteAnotacoesGerais").removeAttr("disabled")

                                    setVal("DadosCliente.CpfCnpj", model.DadosCliente.CpfCnpj);
                                    setVal("DadosCliente.InscricaoEstadual", model.DadosCliente.InscricaoEstadual);
                                    setVal("DadosCliente.DataClienteDesde", getDateJsonMSStringDDMMYYYY(model.DadosCliente.DataClienteDesde));

                                    setVal("DadosCliente.Endereco", model.DadosCliente.Endereco);

                                    setVal("DadosCliente.Contato", model.DadosCliente.Contato);
                                    setVal("DadosCliente.Telefone", model.DadosCliente.Telefone);
                                    setVal("DadosCliente.Email", model.DadosCliente.Email);

                                    setHtml("DadosCliente.Categoria1Legenda", model.DadosCliente.Categoria1Legenda);
                                    setVal("DadosCliente.Categoria1Descricao", model.DadosCliente.Categoria1Descricao);
                                    setHtml("DadosCliente.Categoria2Legenda", model.DadosCliente.Categoria2Legenda);
                                    setVal("DadosCliente.Categoria2Descricao", model.DadosCliente.Categoria2Descricao);
                                    setHtml("DadosCliente.Categoria3Legenda", model.DadosCliente.Categoria3Legenda);
                                    setVal("DadosCliente.Categoria3Descricao", model.DadosCliente.Categoria3Descricao);

                                    // - informacoes comerciais
                                    setHtml("InformacoesComerciais.ValorPedidos", formatDecimalPtBr(model.InformacoesComerciais.ValorPedidos));
                                    setHtml("InformacoesComerciais.ValorVendas", formatDecimalPtBr(model.InformacoesComerciais.ValorVendas));
                                    setHtml("InformacoesComerciais.ValorDevolucoes", formatDecimalPtBr(model.InformacoesComerciais.ValorDevolucoes));
                                    setHtml("InformacoesComerciais.ValorProdutoMaisComprado", formatDecimalPtBr(model.InformacoesComerciais.ValorProdutoMaisComprado));
                                    setVal("InformacoesComerciais.DescricaoProdutoMaisCompradoValor", model.InformacoesComerciais.DescricaoProdutoMaisCompradoValor);

                                    setHtml("InformacoesComerciais.CondicoesPagamento", model.InformacoesComerciais.CondicoesPagamento);
                                    setHtml("InformacoesComerciais.TabelaPrecos", model.InformacoesComerciais.TabelaPrecos);
                                    setHtml("InformacoesComerciais.FrequenciaMediaCompra", model.InformacoesComerciais.FrequenciaMediaCompra);
                                    setHtml("InformacoesComerciais.QuantidadeProdutoMaisComprado", formatDecimalPtBr(model.InformacoesComerciais.QuantidadeProdutoMaisComprado));
                                    setVal("InformacoesComerciais.DescricaoProdutoMaisCompradoQuantidade", model.InformacoesComerciais.DescricaoProdutoMaisCompradoQuantidade);

                                    if (model.MostrarInformacoesFinanceiras) {
                                        // - informacoes financeiras
                                        setHtml("InformacoesFinanceiras.ValorLimite", formatDecimalPtBr(model.InformacoesFinanceiras.ValorLimite));
                                        setHtml("InformacoesFinanceiras.DataLimite", getDateJsonMSStringDDMMYYYY(model.InformacoesFinanceiras.DataLimite));
                                        setHtml("InformacoesFinanceiras.ValorCreditoUtilizado", formatDecimalPtBr(model.InformacoesFinanceiras.ValorCreditoUtilizado));
                                        setHtml("InformacoesFinanceiras.ValorAdiantamento", formatDecimalPtBr(model.InformacoesFinanceiras.ValorAdiantamento));
                                        setHtml("InformacoesFinanceiras.ValorChequesPreDatados", formatDecimalPtBr(model.InformacoesFinanceiras.ValorChequesPreDatados));
                                        setHtml("InformacoesFinanceiras.ValorCreditoDisponivel", formatDecimalPtBr(model.InformacoesFinanceiras.ValorCreditoDisponivel));

                                        setHtml("InformacoesFinanceiras.LiberacaoVenda", model.InformacoesFinanceiras.LiberacaoVenda);
                                        $(document.getElementById("InformacoesFinanceiras.LiberacaoVenda")).css({ "color": "green", "font-weight": "800" });

                                        setHtml("InformacoesFinanceiras.ValorSaldoVencido", formatDecimalPtBr(model.InformacoesFinanceiras.ValorSaldoVencido));
                                        setHtml("InformacoesFinanceiras.ValorSaldoAVencer", formatDecimalPtBr(model.InformacoesFinanceiras.ValorSaldoAVencer));
                                        setHtml("InformacoesFinanceiras.MediaAtrasoEmDias", model.InformacoesFinanceiras.MediaAtrasoEmDias);
                                        setHtml("InformacoesFinanceiras.ValorChequesDevolvidos", formatDecimalPtBr(model.InformacoesFinanceiras.ValorChequesDevolvidos));
                                        setHtml("InformacoesFinanceiras.ValorMaiorAtraso", formatDecimalPtBr(model.InformacoesFinanceiras.ValorMaiorAtraso));
                                        setHtml("InformacoesFinanceiras.BaixasInadimplencia", model.InformacoesFinanceiras.BaixasInadimplencia);
                                        setHtml("InformacoesFinanceiras.ValorBaixasInadimplencia", formatDecimalPtBr(model.InformacoesFinanceiras.ValorBaixasInadimplencia));
                                    }

                                    var data = new kendo.data.DataSource({ data: [] });
                                    for (var atual in model.ListaUltimasCompras) {
                                        data.options.data.push({
                                            TipoMovimentacao: model.ListaUltimasCompras[atual].TipoMovimentacao,
                                            Documento: model.ListaUltimasCompras[atual].Documento,
                                            Filial: model.ListaUltimasCompras[atual].Filial,
                                            DataEmissao: getDateJsonMSStringDDMMYYYY(model.ListaUltimasCompras[atual].DataEmissao),
                                            DataSaida: getDateJsonMSStringDDMMYYYY(model.ListaUltimasCompras[atual].DataSaida),
                                            ValorVenda: model.ListaUltimasCompras[atual].ValorVenda,
                                            ValorDesconto: model.ListaUltimasCompras[atual].ValorDesconto,
                                            Vendedor: model.ListaUltimasCompras[atual].Vendedor,
                                            Representante: model.ListaUltimasCompras[atual].Representante
                                        });
                                    }
                                    $("#gridUltimasCompras").data("kendoGrid").setDataSource(data);
                                }
                            );
                        }
                    }

                    $("#buttonDadosClienteAnotacoesGerais").on("click", function () {
                        request("Comercial/Consultas/GetHistoricoDeClientes_AnotacoesGerais",
                            {
                                codCliente: getVal("inputCodigoCliente"),
                            },
                            function (result) {
                                setVal("DadosCliente.AnotacoesGerais", result);
                            }
                        );
                    });

                    $("#buttonOK_AnotacoesGerais").on("click", function () {
                        request("Comercial/Consultas/SalveHistoricoDeClientes_AnotacoesGerais",
                            {
                                codCliente: getVal("inputCodigoCliente"),
                                anotacoesGerais: getVal("DadosCliente.AnotacoesGerais")
                            }
                        );
                    });

                    var gridUltimasCompras = new Table({
                        "toolbar": "<span id='toolbarUltimasCompras'>&nbsp&nbsp&nbspÚltimas Compras do Cliente </span>",
                        "id": "gridUltimasCompras",
                        "pageable": false,
                        "columns": [
                            { field: "TipoMovimentacao", title: "Tipo Movimentação", width: 60, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } },
                            { field: "Documento", title: "Documento", width: 60, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } },
                            { field: "Filial", title: "Filial", width: 100, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } },

                            { field: "DataEmissao", title: "Data Emissão", width: 90, headerAttributes: { style: "color: black; text-align: center;" }, attributes: { style: "text-align: center;" }, type: "date", format: "{0:dd/MM/yyyy}" },
                            { field: "DataSaida", title: "Data Saída", width: 90, headerAttributes: { style: "color: black; text-align: center;" }, attributes: { style: "text-align: center;" }, type: "date", format: "{0:dd/MM/yyyy}" },

                            { field: "ValorVenda", title: "Vlr Venda", width: 90, headerAttributes: { style: "color: black; text-align: right;" }, attributes: { style: "text-align: right;" }, format: "{0:C}" },
                            { field: "ValorDesconto", title: "Vlr Desconto", width: 90, headerAttributes: { style: "color: black; text-align: right;" }, attributes: { style: "text-align: right;" }, format: "{0:C}" },

                            { field: "Vendedor", title: "Vendedor", width: 100, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } },
                            { field: "Representante", title: "Representante", width: 100, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } }
                        ],
                        "dataSourceType": "Object"
                    });
                    gridUltimasCompras.make();

                    // formata o titulo da grid
                    var selector_Titulo = ".container-historico-clientes > fieldset > legend";
                    var cssGridUltimasCompras_Titulo = {
                        "font-family": $(selector_Titulo).css("font-family"),
                        "font-size": $(selector_Titulo).css("font-size"),
                        "font-weight": $(selector_Titulo).css("font-weight"),
                        "color": $(selector_Titulo).css("color"),
                        "background": $(selector_Titulo).css("background"),
                        "line-height": "20px"
                    }
                    $("#toolbarUltimasCompras").css(cssGridUltimasCompras_Titulo);

                    // formata os heads da grid
                    var selector_Header = ".container-historico-clientes > fieldset > .radar-row > .radar-control > .control-group > .controls > label";
                    var cssGridUltimasCompras_Header = {
                        "font-family": $(selector_Header).css("font-family"),
                        "font-size": $(selector_Header).css("font-size"),
                        "font-weight": $(selector_Header).css("font-weight"),
                        "color": $(selector_Header).css("color"),
                    }
                    $("#gridUltimasCompras > .k-grid-header > .k-grid-header-wrap > table > thead > tr > th > .k-link ").css(cssGridUltimasCompras_Header);

                    // seta a altura do grid
                    $("#gridUltimasCompras .k-grid-content").height(140);

                    $("#inputCodigoCliente").focus();

                }(params));
            },

            SaldoProdutoNoEstoque: function (params) {
                return (function () {
                    var u = new Util();
                    $("<div id='modalDiv'>").appendTo("body");

                    u.addButtonHelpBreadcrumb("RadarWEB.htm", "Tela Inicial");

                    // produto
                    var validatorProdutos = new Validator({
                        field: "CodigoProduto",
                        onPendencyMessage: "Deve ser informado o código do produto.",
                        route: "Empresarial/F4Produto/GetProduto",
                        v2: true,
                        onValid: function (data) {
                            validatorProdutos.setChange(true);
                            setVal("inputCodigoProduto", data["Codigo"]);
                            setHtml("descriptionCodigoProduto", data["Nome"]);
                            validatorGrade1.clear({ disable: true });
                            validatorGrade2.clear({ disable: true });
                            validatorGrade3.clear({ disable: true });

                            if (data["HaveGrade1"]) {
                                validatorGrade1.enable();
                                validatorGrade1.focus();
                            } else {
                                $("#linkButtonModalProdutos").focus();
                            }

                            if (data["HaveGrade2"])
                                validatorGrade2.enable();

                            if (data["HaveGrade3"])
                                validatorGrade3.enable();

                            getSaldoProduto();
                        },
                        onInvalid: function (data) {
                            validatorProdutos.setChange(true);
                            validatorProdutos.clear({ error: true });
                            validatorProdutos.focus();
                            validatorGrade1.clear({ error: true, disable: true });
                            validatorGrade2.clear({ error: true, disable: true });
                            validatorGrade3.clear({ error: true, disable: true });
                            getSaldoProduto();
                        },
                        onEmpty: function () {
                            validatorProdutos.setChange(true);
                            validatorProdutos.clear();
                            validatorGrade1.clear({ disable: true });
                            validatorGrade2.clear({ disable: true });
                            validatorGrade3.clear({ disable: true });
                            $("#linkButtonModalProdutos").focus();
                            getSaldoProduto();
                        }
                    });
                    validatorProdutos.listen();

                    var tableProdutos = new Table({
                        "id": "tableProdutos",
                        "route": window.baseUrl + "Empresarial/F4Produto/GetProdutos",
                        "showFilter": true,
                        "columns": [
                            { title: "Código", field: "Codigo", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Nome", field: "Nome", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Unidade", field: "Unidade", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Preço", field: "ValorUnitario", width: 60, headerAttributes: { style: "color: black; text-align: rigtht;" }, attributes: { style: "text-align: rigtht;" } },
                            { title: "Classificação", field: "Classificacao", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        "onChange": function () {
                            var ok = document.getElementById("inputF4ModalOk" + this.id);
                            ok.onclick = function () {
                                // refatorar e colocar em uma rotina, pois sao 3 lugares para alterar: onclick-table, dblclick-table e dblclick-hierarquia
                                var data = tableProdutos.getSelectedData(),
                                    search = {};
                                search["CodigoProduto"] = data["Codigo"];
                                getJsonFromRoute("Empresarial/F4Produto/GetProduto", search).done(function (data) {
                                    validatorProdutos.onValid(data);
                                    validatorProdutos.update();
                                });
                            };
                        },
                        "onDataBound": function () {
                            $("#tableProdutos table  tr").on("dblclick", function () {
                                // refatorar e colocar em uma rotina, pois sao 3 lugares para alterar: onclick-table, dblclick-table e dblclick-hierarquia
                                var data = tableProdutos.getSelectedData(),
                                    search = {};
                                search["CodigoProduto"] = data["Codigo"];
                                getJsonFromRoute("Empresarial/F4Produto/GetProduto", search).done(function (data) {
                                    validatorProdutos.onValid(data);
                                    validatorProdutos.update();
                                });
                                $("#modalProdutos").modal("hide");
                            });
                        },
                        "dataSourceType": "Filtered"
                    });
                    var linkButtonModalProdutos = document.getElementById("linkButtonModalProdutos");
                    var inputProdutos = document.getElementById("inputCodigoProduto");

                    // showOpcaoExibir, exibirHierarquiaLista
                    var options = {
                        showOpcaoExibir: true,
                        onDblClickGetItem: function (event, dados) {
                            // refatorar e colocar em uma rotina, pois sao 3 lugares para alterar: onclick-table, dblclick-table e dblclick-hierarquia
                            var data = dados,
                                search = {};
                            search["CodigoProduto"] = data["Codigo"];
                            getJsonFromRoute("Empresarial/F4Produto/GetProduto", search).done(function (data) {
                                validatorProdutos.onValid(data);
                                validatorProdutos.update();
                            });
                            $("#modalProdutos").modal("hide");
                        }
                    };

                    var modalProdutos = new Modal("Produtos", linkButtonModalProdutos, inputProdutos, tableProdutos, null, options);
                    modalProdutos.listen();

                    // grades
                    var columnsGrade = [
                        { title: "Código", field: "Codigo", width: 45, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                        { title: "Descrição", field: "Descricao", width: 64, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                    ];

                    // grade1
                    var validatorGrade1 = new Validator({
                        field: "CodigoGrade1",
                        onPendencyMessage: "Deve ser informado a Grade 1.",
                        route: "Empresarial/F4Produto/GetItemGrade1",
                        pendency: [validatorProdutos],
                        v2: true,
                        onValid: function (data) {
                            validatorGrade1.setChange(true);
                            setVal("inputCodigoGrade1", data["Codigo"]);
                            setHtml("descriptionCodigoGrade1", " - " + data["Descricao"]);
                            getSaldoProduto();
                        },
                        onInvalid: function (data) {
                            validatorGrade1.setChange(true);
                            validatorGrade1.clear({ error: true });
                            validatorGrade1.focus();
                            getSaldoProduto();
                        },
                        onEmpty: function () {
                            validatorGrade1.setChange(true);
                            validatorGrade1.clear();
                            validatorGrade2.clear();
                            validatorGrade3.clear();
                            getSaldoProduto();
                        }
                    });
                    validatorGrade1.listen();

                    var optionsGrade1 = {
                        "id": "tableGrade1",
                        "route": window.baseUrl + "Empresarial/F4Produto/List1",
                        "showFilter": true,
                        "columns": columnsGrade,
                        "params": [validatorProdutos],
                        "fieldDepende": validatorProdutos,
                        "onChange": function () {
                            var ok = document.getElementById("inputF4ModalOk" + this.id);
                            var cancelar = document.getElementById("inputF4ModalCancelar");
                            ok.onclick = function () {
                                var data = tableGrade1.getSelectedData();
                                validatorGrade1.onValid(data);
                                validatorGrade1.update();
                                $("#filtroPedidosModal").modal("show");
                            };
                            cancelar.onclick = function () {
                                $("#filtroPedidosModal").modal("show");
                            };
                        },
                        "onDataBound": onDataBoundGrade1,
                        "dataSourceType": "Parameter"
                    };

                    function onDataBoundGrade1() {
                        $("#filtroPedidosModal").modal("hide");
                        $("#" + this.id + " table  tr").on("dblclick", function () {
                            var data = tableGrade1.getSelectedData();
                            validatorGrade1.onValid(data);
                            validatorGrade1.update();
                            $("#modalGrade1").modal("hide");
                            $("#filtroPedidosModal").modal("show");
                        });
                        var cancelar = document.getElementById("inputF4ModalCancelar");
                        cancelar.onclick = function () {
                            $("#filtroPedidosModal").modal("show");
                        };
                        $("#filtroPedidosModal").modal("hide");
                    }

                    var tableGrade1 = new Table(optionsGrade1);
                    var linkButtonModalGrade1 = document.getElementById("linkButtonModalGrade1");
                    $(linkButtonModalGrade1).on("click", function () {
                        $("#filtroPedidosModal").modal("hide");
                    });
                    var inputGrade1 = document.getElementById("inputCodigoGrade1");
                    var modalGrade1 = new Modal("Grade", linkButtonModalGrade1, inputGrade1, tableGrade1);
                    modalGrade1.listen();

                    // grade2
                    var validatorGrade2 = new Validator({
                        field: "CodigoGrade2",
                        onPendencyMessage: "Deve ser informado a Grade 2.",
                        route: "Empresarial/F4Produto/GetItemGrade2",
                        pendency: [validatorGrade1, validatorProdutos],
                        v2: true,
                        onValid: function (data) {
                            validatorGrade2.setChange(true);
                            setVal("inputCodigoGrade2", data["Codigo"]);
                            setHtml("descriptionCodigoGrade2", " - " + data["Descricao"]);
                            getSaldoProduto();
                        },
                        onInvalid: function (data) {
                            validatorGrade2.setChange(true);
                            validatorGrade2.clear({ error: true });
                            validatorGrade2.focus();
                            getSaldoProduto();
                        },
                        onEmpty: function () {
                            validatorGrade2.setChange(true);
                            validatorGrade2.clear();
                            validatorGrade3.clear();
                            getSaldoProduto();
                        }
                    });
                    validatorGrade2.listen();

                    var optionsGrade2 = {
                        "id": "tableGrade2",
                        "route": window.baseUrl + "Empresarial/F4Produto/List2",
                        "showFilter": true,
                        "columns": columnsGrade,
                        "params": [validatorGrade1, validatorProdutos],
                        "fieldDepende": validatorGrade1,
                        "onChange": function () {
                            var ok = document.getElementById("inputF4ModalOk" + this.id);
                            var cancelar = document.getElementById("inputF4ModalCancelar");
                            ok.onclick = function () {
                                var data = tableGrade2.getSelectedData();
                                validatorGrade2.onValid(data);
                                validatorGrade2.update();
                                $("#filtroPedidosModal").modal("show");
                            };
                            cancelar.onclick = function () {
                                $("#filtroPedidosModal").modal("show");
                            };
                        },
                        "onDataBound": onDataBoundGrade2,
                        "dataSourceType": "Parameter"
                    };

                    function onDataBoundGrade2() {
                        $("#filtroPedidosModal").modal("hide");
                        $("#" + this.id + " table  tr").on("dblclick", function () {
                            var data = tableGrade2.getSelectedData();
                            validatorGrade2.onValid(data);
                            validatorGrade2.update();
                            $("#modalGrade2").modal("hide");
                            $("#filtroPedidosModal").modal("show");
                        });
                        var cancelar = document.getElementById("inputF4ModalCancelar");
                        cancelar.onclick = function () {
                            $("#filtroPedidosModal").modal("show");
                        };
                    }

                    var tableGrade2 = new Table(optionsGrade2);
                    var linkButtonModalGrade2 = document.getElementById("linkButtonModalGrade2");
                    $(linkButtonModalGrade2).on("click", function () {
                        $("#filtroPedidosModal").modal("hide");
                    });
                    var inputGrade2 = document.getElementById("inputCodigoGrade2");
                    var modalGrade2 = new Modal("Grade", linkButtonModalGrade2, inputGrade2, tableGrade2);
                    modalGrade2.listen();

                    // grade3
                    var validatorGrade3 = new Validator({
                        field: "CodigoGrade3",
                        onPendencyMessage: "Deve ser informado a Grade 3.",
                        route: "Empresarial/F4Produto/GetItemGrade3",
                        pendency: [validatorGrade2, validatorGrade1, validatorProdutos],
                        v2: true,
                        onValid: function (data) {
                            validatorGrade3.setChange(true);
                            setVal("inputCodigoGrade3", data["Codigo"]);
                            setHtml("descriptionCodigoGrade3", " - " + data["Descricao"]);
                            getSaldoProduto();
                        },
                        onInvalid: function (data) {
                            validatorGrade3.setChange(true);
                            validatorGrade3.clear({ error: true });
                            validatorGrade3.focus();
                            getSaldoProduto();
                        },
                        onEmpty: function () {
                            validatorGrade3.setChange(true);
                            validatorGrade3.clear();
                            getSaldoProduto();
                        }
                    });
                    validatorGrade3.listen();

                    var optionsGrade3 = {
                        "id": "tableGrade3",
                        "route": window.baseUrl + "Empresarial/F4Produto/List3",
                        "showFilter": true,
                        "columns": columnsGrade,
                        "params": [validatorGrade2, validatorGrade1, validatorProdutos],
                        "fieldDepende": validatorGrade2,
                        "onChange": function () {
                            var ok = document.getElementById("inputF4ModalOk" + this.id);
                            var cancelar = document.getElementById("inputF4ModalCancelar");
                            ok.onclick = function () {
                                var data = tableGrade3.getSelectedData();
                                validatorGrade3.onValid(data);
                                validatorGrade3.update();
                                $("#filtroPedidosModal").modal("show");
                            };
                            cancelar.onclick = function () {
                                $("#filtroPedidosModal").modal("show");
                            };
                        },
                        "onDataBound": onDataBoundGrade3,
                        "dataSourceType": "Parameter"
                    };

                    function onDataBoundGrade3() {
                        $("#filtroPedidosModal").modal("hide");
                        $("#" + this.id + " table  tr").on("dblclick", function () {
                            var data = tableGrade3.getSelectedData();
                            validatorGrade3.onValid(data);
                            validatorGrade3.update();
                            $("#modalGrade3").modal("hide");
                            $("#filtroPedidosModal").modal("show");
                        });
                        var cancelar = document.getElementById("inputF4ModalCancelar");
                        cancelar.onclick = function () {
                            $("#filtroPedidosModal").modal("show");
                        };
                        $("#filtroPedidosModal").modal("hide");
                    }

                    var tableGrade3 = new Table(optionsGrade3);
                    var linkButtonModalGrade3 = document.getElementById("linkButtonModalGrade3");
                    $(linkButtonModalGrade3).on("click", function () {
                        $("#filtroPedidosModal").modal("hide");
                    });
                    var inputGrade3 = document.getElementById("inputCodigoGrade3");
                    var modalGrade3 = new Modal("Grade", linkButtonModalGrade3, inputGrade3, tableGrade3);
                    modalGrade3.listen();

                    // filial
                    var validatorFilial = new Validator({
                        field: "CodigoFilial",
                        onPendencyMessage: "Deve ser informado o código da filial.",
                        route: "Empresarial/F4Filial/GetFilialEx",
                        v2: true,
                        onValid: function (data) {
                            setVal("inputCodigoFilial", data["Codigo"]);
                            setHtml("descriptionCodigoFilial", data["Nome"]);
                            getSaldoProduto();
                        },
                        onInvalid: function () {
                            validatorFilial.clear({ error: true });
                            validatorFilial.focus();
                            getSaldoProduto();
                        },
                        onEmpty: function () {
                            validatorFilial.clear();
                            getSaldoProduto();
                        }
                    });
                    validatorFilial.listen();

                    var tableFiliais = new Table({
                        "id": "tableFilial",
                        "route": window.baseUrl + "Empresarial/F4Filial/GetFiliais",
                        "columns": [
                            { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Nome", field: "Nome", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "CNPJ/CPF", field: "CpfCnpj", width: 115, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        "showFilter": true,
                        "onChange": function () {
                            var ok = document.getElementById("inputF4ModalOk" + this.id);
                            ok.onclick = function () {
                                var data = tableFiliais.getSelectedData();
                                validatorFilial.onValid(data);
                                validatorFilial.update();
                            };
                        },
                        "onDataBound": function () {
                            $("#tableFilial table tr").on("dblclick", function () {
                                var data = tableFiliais.getSelectedData();
                                validatorFilial.onValid(data);
                                validatorFilial.update();
                                $("#modalFilial").modal("hide");
                            });
                        },
                        "dataSourceType": "Filtered"
                    });
                    var linkFiliais = document.getElementById("linkButtonModalFiliais");
                    var inputFiliais = document.getElementById("inputCodigoFilial");
                    var modalFiliais = new Modal("Filiais", linkFiliais, inputFiliais, tableFiliais);
                    modalFiliais.listen();

                    // tab. preços
                    var validatorTabelaPrecos = new Validator({
                        field: "CodigoTabelaPrecos",
                        onPendencyMessage: "Deve ser informado o código da tabela de preços",
                        route: "Empresarial/F4TabelaPrecoProdutos/GetTabPreco",
                        v2: true,
                        onValid: function (data) {
                            setVal("inputCodigoTabelaPrecos", data["Codigo"]);
                            setHtml("descriptionCodigoTabelaPrecos", data["Nome"]);
                        },
                        onInvalid: function () {
                            validatorTabelaPrecos.clear({ error: true });
                            validatorTabelaPrecos.focus();
                        },
                        onEmpty: function () {
                            validatorTabelaPrecos.clear();
                        }
                    });
                    validatorTabelaPrecos.listen();

                    function setDefault() {
                        getJsonFromRoute('Empresarial/F4Filial/GetFilialPadrao').done(
                            function (data) {
                                if (data.IsAlert)
                                    throw new Error(data.Message);

                                validatorFilial.setValues(data.Codigo, data.Nome);

                                if (data.CpfCnpj === "")
                                    validatorFilial.enable();
                                else
                                    validatorFilial.disable();
                            }
                        );

                        getJsonFromRoute('Empresarial/F4TabelaPrecoProdutos/GetTabelaPadrao').done(
                            function (data) {
                                if (data.IsAlert)
                                    throw new Error(data.Message);

                                validatorTabelaPrecos.setValues(data.Codigo, data.Nome);
                            }
                        );
                    };

                    var tableTabelaPrecosProduto = new Table({
                        "id": "tablePrecosProduto",
                        "route": window.baseUrl + "Empresarial/F4TabelaPrecoProdutos/GetTabPrecos",
                        "showFilter": true,
                        "columns": [
                            { title: "Código", field: "Codigo", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Nome", field: "Nome", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Validade", field: "DataValidade", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        "onChange": function () {
                            var ok = document.getElementById("inputF4ModalOk" + this.id);
                            ok.onclick = function () {
                                var data = tableTabelaPrecosProduto.getSelectedData();
                                validatorTabelaPrecos.onValid(data);
                                validatorTabelaPrecos.update();
                            };
                        },
                        "onDataBound": function () {
                            $("#tablePrecosProduto table  tr").on("dblclick", function () {
                                var data = tableTabelaPrecosProduto.getSelectedData();
                                validatorTabelaPrecos.onValid(data);
                                validatorTabelaPrecos.update();
                                $("#modalTabPrecosProduto").modal("hide");
                            });
                        },
                        "dataSourceType": "Filtered"
                    });
                    var linkButtonModalTabelaPrecos = document.getElementById("linkButtonModalTabelaPrecos");
                    var inputTabelaPrecos = document.getElementById("inputCodigoTabelaPrecos");
                    var modalTabelasPrecosProdutos = new Modal("Tabelas Preços Produtos", linkButtonModalTabelaPrecos, inputTabelaPrecos, tableTabelaPrecosProduto);
                    modalTabelasPrecosProdutos.listen();

                    // grid produtos
                    var gridProdutos = new Table({
                        "id": "gridProdutos",
                        "pageable": false,
                        "columnMenu": true,
                        "sortable": true,
                        "columns": [
                            { field: "CodFilial", title: "Cód.", width: 40, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } },
                            { field: "NomeFilial", title: "Filial", width: 100, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } },
                            { field: "CodProduto", title: "Cód.", width: 40, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } },
                            { field: "NomeProduto", title: "Produto", width: 100, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } },
                            { field: "ItemGrade1", title: "Grade 1", width: 80, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } },
                            { field: "ItemGrade2", title: "Grade 2", width: 80, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } },
                            { field: "ItemGrade3", title: "Grade 3", width: 80, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: Left;" } },
                            { field: "QuantidadeTotal", title: "Total", width: 60, headerAttributes: { style: "color: black; text-align: center;" }, attributes: { style: "text-align: right;", format: "{0:c0}" } },
                            { field: "QuantidadeReservada", title: "Reservada", width: 60, headerAttributes: { style: "color: black; text-align: center;" }, attributes: { style: "text-align: right;", format: "{0:c0}" } },
                            { field: "QuantidadePreBaixa", title: "Pré-Baixa", width: 60, headerAttributes: { style: "color: black; text-align: center;" }, attributes: { style: "text-align: right;", format: "{0:c0}" } },
                            { field: "QuantidadeDisponivel", title: "Disponível", width: 60, headerAttributes: { style: "color: black; text-align: center;" }, attributes: { style: "text-align: right;", format: "{0:c0}" } },
                            { field: "Preco", title: "Preço", width: 80, headerAttributes: { style: "color: black; text-align: center;" }, attributes: { style: "text-align: right;", format: "{0:c0}" } }
                        ],
                        "dataSourceType": "Object"
                    });
                    gridProdutos.make();

                    // formata os heads da grid
                    var selector_Header = ".containerSaldoProdutoNoEstoque > fieldset > .radar-row > .radar-control > .control-group > label";
                    var cssGridProdutos_Header = {
                        "font-family": $(selector_Header).css("font-family"),
                        "font-size": $(selector_Header).css("font-size"),
                        "font-weight": $(selector_Header).css("font-weight"),
                        "color": $(selector_Header).css("color"),
                    }
                    $("#gridProdutos > .k-grid-header > .k-grid-header-wrap > table > thead > tr > th > .k-link ").css(cssGridProdutos_Header);

                    // seta a altura do grid
                    $("#gridProdutos .k-grid-content").height(140);

                    // saldo produto
                    $("#EstoqueProprio, #EstoqueEmPoderDeTerceiros, #EstoqueDeTerceirosEmPoderDaEmpresa, #MostrarProdutosComSaldoIgualZero").on(
                        "change",
                        function () {
                            getSaldoProduto();
                        }
                    );

                    var getSaldoProduto = (function () {
                        if (getVal("inputCodigoProduto") === "") {
                            var data = new kendo.data.DataSource({ data: [] });
                            $("#gridProdutos").data("kendoGrid").setDataSource(data);
                        } else {
                            request("Comercial/Consultas/GetSaldoProdutoNoEstoque", {
                                CodProduto: getVal("inputCodigoProduto"),
                                CodGrade1: getVal("inputCodigoGrade1"),
                                CodGrade2: getVal("inputCodigoGrade2"),
                                CodGrade3: getVal("inputCodigoGrade3"),
                                CodFilial: getVal("inputCodigoFilial"),
                                CodTabPrecos: getVal("inputCodigoTabelaPrecos"),
                                EstoqueProprio: isChecked("EstoqueProprio"),
                                EstoqueEmPoderDeTerceiros: isChecked("EstoqueEmPoderDeTerceiros"),
                                EstoqueDeTerceirosEmPoderDaEmpresa: isChecked("EstoqueDeTerceirosEmPoderDaEmpresa"),
                                MostrarProdutosComSaldoIgualZero: isChecked("MostrarProdutosComSaldoIgualZero")
                            },
                                function (model) {
                                    vok = model;
                                    var data = new kendo.data.DataSource({ data: [] });
                                    for (var atual in model) {
                                        data.options.data.push({
                                            CodFilial: model[atual].CodFilial,
                                            NomeFilial: model[atual].NomeFilial,
                                            CodProduto: model[atual].CodProduto,
                                            NomeProduto: model[atual].NomeProduto,
                                            ItemGrade1: model[atual].ItemGrade1,
                                            ItemGrade2: model[atual].ItemGrade2,
                                            ItemGrade3: model[atual].ItemGrade3,
                                            QuantidadeTotal: model[atual].QuantidadeTotal,
                                            QuantidadeReservada: model[atual].QuantidadeReservada,
                                            QuantidadePreBaixa: model[atual].QuantidadePreBaixa,
                                            QuantidadeDisponivel: model[atual].QuantidadeDisponivel,
                                            Preco: model[atual].Preco,
                                        });
                                    }
                                    $("#gridProdutos").data("kendoGrid").setDataSource(data);
                                }
                            );
                        }
                    });

                    $("#EstoqueDeTerceirosEmPoderDaEmpresa").on("click", function () {
                        if (isChecked("EstoqueDeTerceirosEmPoderDaEmpresa")) {
                            $("#EstoqueProprio").attr("checked", false);
                            $("#EstoqueEmPoderDeTerceiros").attr("checked", false);
                            $("#EstoqueProprio").attr("disabled", "disabled");
                            $("#EstoqueEmPoderDeTerceiros").attr("disabled", "disabled");
                        } else {
                            $("#EstoqueProprio").removeAttr("disabled");
                            $("#EstoqueEmPoderDeTerceiros").removeAttr("disabled");
                        }
                    });
                    setDefault();
                    $("#inputCodigoProduto").focus();
                }(params));
            }
        };
    }());

    Relatorios.Manager = (function () {
        return {
            RelacaoDePedidos: function (params) {
                return (function () {
                    var u = new Util();
                    $("<div id='modalDiv'>").appendTo("body");

                    u.addButtonHelpBreadcrumb("RadarWEB.htm", "Tela Inicial");

                    var inputPeriodoInicial = new DateValidator({
                        id: "inputPeriodoInicial",
                        v2: true,
                        constructInjection: function () {
                            makeDatePicker("#" + this.id);
                        },
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        },
                        onEmpty: function () {
                        }
                    });

                    var inputPeriodoFinal = new DateValidator({
                        id: "inputPeriodoFinal",
                        v2: true,
                        constructInjection: function () {
                            makeDatePicker("#" + this.id);
                        },
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        },
                        onEmpty: function () {
                        }
                    });

                    var comparePeriodoInicialComFinal = new DateComparer({
                        idA: "inputPeriodoInicial",
                        idB: "inputPeriodoFinal",
                        verb: "less",
                        onInvalid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.error);
                            u.alert("Data inicial deve ser anterior a data final.", alertBehavior.error);
                        },
                        onValid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.normal);
                        }
                    });

                    var validatorCliente = new Validator({
                        field: "CodigoCliente",
                        onPendencyMessage: "Deve ser informado o código do cliente.",
                        route: "Empresarial/F4Cliente/GetCliente",
                        v2: true,
                        onValid: function (data) {
                            $("#inputCodigoCliente").val(data.Codigo);
                            $("#descriptionCodigoCliente").html(data.RazaoSocial);
                        },
                        onInvalid: function (data) {
                            validatorCliente.clear({ error: true });
                            validatorCliente.focus();
                        },
                        onEmpty: function () {
                            validatorCliente.clear();
                        }
                    });
                    validatorCliente.listen();

                    var tableClientes = new Table({
                        "id": "tableCliente",
                        "route": window.baseUrl + "Empresarial/F4Cliente/GetClientes",
                        "showFilter": true,
                        "columns": [
                            { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Razão Social", field: "RazaoSocial", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "CPF/CNPJ", field: "CnpjCpf", width: 115, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        "columnsLegend": { CnpjCpf: "Ex: 11.222.333/4444-55" },
                        "onChange": function () {
                            $("#inputF4ModalOk" + this.id).on("click", function () {
                                var data = tableClientes.getSelectedData();
                                validatorCliente.onValid(data);
                                validatorCliente.update();
                                $("#modalCliente").modal("hide");
                            });
                            $("#inputF4ModalCancelar").on("click", function () {
                                $("#modalCliente").modal("hide");
                            });
                        },
                        "onDataBound": function () {
                            $("#tableCliente table tr").on("dblclick", function () {
                                var data = tableClientes.getSelectedData();
                                validatorCliente.onValid(data);
                                validatorCliente.update();
                                $("#modalCliente").modal("hide");
                            });
                            $("#inputF4ModalCancelar").on("click", function () {
                                $("#modalCliente").modal("hide");
                            });
                        },
                        "dataSourceType": "Filtered"
                    });
                    var modalClientes = new Modal("Clientes", byId("linkButtonModalClientes"), byId("inputCodigoCliente"), tableClientes).listen();

                    var inputRelatorio = new DropDown({
                        "id": "inputRelatorio",
                        "route": "Comercial/Relatorios/GetModelosRelacaoPedidosReport"
                    });
                    inputRelatorio.make();

                    currentUser.update(params.User);
                    var inputs = currentUser.getCustomData("com_rel_relacaodepedidos");
                    if (inputs === null || inputs === "") {
                        inputPeriodoInicial.setValue(getDateNowDDMMYYYY());
                        inputPeriodoFinal.setValue(getDateNowDDMMYYYY());
                    }
                    else {
                        inputs = JSON.parse(inputs);
                        inputRelatorio.set(inputs.Relatorio);
                        inputPeriodoInicial.setValue(inputs.PeriodoInicial);
                        inputPeriodoFinal.setValue(inputs.PeriodoFinal);
                        validatorCliente.setValue(inputs.Cliente);
                    }

                    $("#buttonOK").on("click", function () {
                        inputs = {
                            Relatorio: inputRelatorio.get(),
                            PeriodoInicial: inputPeriodoInicial.getValue(),
                            PeriodoFinal: inputPeriodoFinal.getValue(),
                            Cliente: validatorCliente.getValue()
                        }
                        currentUser.setCustomData("com_rel_relacaodepedidos", JSON.stringify(inputs));

                        window.open(window.baseUrl + "Comercial/Relatorios/GeraRelatorioRelacaoDePedidos?"
                            + "Relatorio=" + inputRelatorio.dropDown.dataItem().Text
                            + "&DataInicial=" + getVal("inputPeriodoInicial")
                            + "&DataFinal=" + getVal("inputPeriodoFinal")
                            + "&Cliente=" + getVal("inputCodigoCliente")
                        );
                    });
                }(params));
            },

            ComissoesAPagar: function (params) {
                return (function () {
                    var u = new Util();

                    u.addButtonHelpBreadcrumb("RadarWEB.htm", "Tela Inicial");

                    var inputPeriodoInicial = new DateValidator({
                        id: "inputPeriodoInicial",
                        v2: true,
                        constructInjection: function () {
                            makeDatePicker("#" + this.id);
                        },
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        },
                        onEmpty: function () {
                        }
                    });

                    var inputPeriodoFinal = new DateValidator({
                        id: "inputPeriodoFinal",
                        v2: true,
                        constructInjection: function () {
                            makeDatePicker("#" + this.id);
                        },
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        },
                        onEmpty: function () {
                        }
                    });

                    var comparePeriodoInicialComFinal = new DateComparer({
                        idA: "inputPeriodoInicial",
                        idB: "inputPeriodoFinal",
                        verb: "less",
                        onInvalid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.error);
                            u.alert("Data inicial deve ser anterior a data final.", alertBehavior.error);
                        },
                        onValid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.normal);
                        }
                    });

                    var inputRelatorio = new DropDown({
                        "id": "inputRelatorio",
                        "route": "Comercial/Relatorios/GetModelosComissoesReport"
                    });
                    inputRelatorio.make();

                    currentUser.update(params.User);
                    var inputs = currentUser.getCustomData("com_rel_comissoes");
                    if (inputs === null || inputs === "") {
                        inputPeriodoInicial.setValue(getDateNowDDMMYYYY());
                        inputPeriodoFinal.setValue(getDateNowDDMMYYYY());
                    }
                    else {
                        inputs = JSON.parse(inputs);
                        inputRelatorio.set(inputs.Relatorio);
                        inputPeriodoInicial.setValue(inputs.PeriodoInicial);
                        inputPeriodoFinal.setValue(inputs.PeriodoFinal);
                    }

                    $("#buttonOK").on("click", function () {
                        inputs = {
                            Relatorio: inputRelatorio.get(),
                            PeriodoInicial: inputPeriodoInicial.getValue(),
                            PeriodoFinal: inputPeriodoFinal.getValue()
                        }
                        currentUser.setCustomData("com_rel_comissoes", JSON.stringify(inputs));

                        window.open(window.baseUrl + "Comercial/Relatorios/GeraRelatorioComissoesAPagar?"
                            + "Relatorio=" + inputRelatorio.dropDown.dataItem().Text
                            + "&DataInicial=" + getVal("inputPeriodoInicial")
                            + "&DataFinal=" + getVal("inputPeriodoFinal")
                        );
                    });
                }(params));
            },

            Movimentos: function (params) {
                return (function () {
                    var u = new Util();

                    u.addButtonHelpBreadcrumb("RadarWEB.htm", "Tela Inicial");

                    var inputPeriodoInicial = new DateValidator({
                        id: "inputPeriodoInicial",
                        v2: true,
                        constructInjection: function () {
                            makeDatePicker("#" + this.id);
                        },
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        },
                        onEmpty: function () {
                        }
                    });

                    var inputPeriodoFinal = new DateValidator({
                        id: "inputPeriodoFinal",
                        v2: true,
                        constructInjection: function () {
                            makeDatePicker("#" + this.id);
                        },
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        },
                        onEmpty: function () {
                        }
                    });

                    var comparePeriodoInicialComFinal = new DateComparer({
                        idA: "inputPeriodoInicial",
                        idB: "inputPeriodoFinal",
                        verb: "less",
                        onInvalid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.error);
                            u.alert("Data inicial deve ser anterior a data final.", alertBehavior.error);
                        },
                        onValid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.normal);
                        }
                    });

                    var inputData = $("#inputData").kendoDropDownList({
                        dataSource: [
                            { Value: "0", Text: "Emissão" },
                            { Value: "1", Text: "Saída" },
                            { Value: "2", Text: "Inclusão" },
                            { Value: "3", Text: "Vencimento" },
                            { Value: "4", Text: "Recebimento" }
                        ],
                        dataTextField: "Text",
                        dataValueField: "Value",
                        value: "0"
                    });

                    var inputSituacao = $("#inputSituacao").kendoDropDownList({
                        dataSource: [
                            { Value: "0", Text: "Recebidos" },
                            { Value: "1", Text: "Abertos" },
                            { Value: "2", Text: "Vencidos" },
                            { Value: "3", Text: "Recebidos parcialmente" },
                            { Value: "4", Text: "Todos" }
                        ],
                        dataTextField: "Text",
                        dataValueField: "Value",
                        value: "0"
                    });

                    var inputRelatorio = new DropDown({
                        "id": "inputRelatorio",
                        "route": "Comercial/Relatorios/GetModelosContasReceberMovimentosReport"
                    });
                    inputRelatorio.make();

                    currentUser.update(params.User);
                    var inputs = currentUser.getCustomData("com_rel_movimentos");
                    if (inputs === null || inputs === "") {
                        inputPeriodoInicial.setValue(getDateNowDDMMYYYY());
                        inputPeriodoFinal.setValue(getDateNowDDMMYYYY());
                    }
                    else {
                        inputs = JSON.parse(inputs);
                        inputRelatorio.set(inputs.Relatorio);
                        inputPeriodoInicial.setValue(inputs.PeriodoInicial);
                        inputPeriodoFinal.setValue(inputs.PeriodoFinal);
                        inputData.data().kendoDropDownList.select(inputs.Data.toInt());
                        inputSituacao.data().kendoDropDownList.select(inputs.Situacao.toInt());
                    }

                    $("#buttonOK").on("click", function () {
                        inputs = {
                            Relatorio: inputRelatorio.get(),
                            PeriodoInicial: inputPeriodoInicial.getValue(),
                            PeriodoFinal: inputPeriodoFinal.getValue(),
                            Data: inputData.val(),
                            Situacao: inputSituacao.val()
                        }
                        currentUser.setCustomData("com_rel_movimentos", JSON.stringify(inputs));

                        window.open(window.baseUrl + "Comercial/Relatorios/GeraRelatorioMovimentos?"
                            + "Relatorio=" + inputRelatorio.dropDown.dataItem().Text
                            + "&DataInicial=" + getVal("inputPeriodoInicial")
                            + "&DataFinal=" + getVal("inputPeriodoFinal")
                            + "&PorData=" + getVal("inputData")
                            + "&Situacao=" + getVal("inputSituacao")
                        );
                    });
                }(params));
            }
        }
    }());

    Test.Manager = (function () {
        return {
            Treeview: function (params) {
                return (function () {
                    var u = new Util();
                    $("<div id='modalDiv'>").appendTo("body");

                    u.addButtonHelpBreadcrumb("RadarWEB.htm", "Tela Inicial");

                    // produto
                    var validatorProdutos = new Validator({
                        field: "CodigoProduto",
                        onPendencyMessage: "Deve ser informado o código do produto.",
                        route: "Empresarial/F4Produto/GetProduto",
                        v2: true,
                        onValid: function (data) {
                            validatorProdutos.setChange(true);
                            setVal("inputCodigoProduto", data["Codigo"]);
                            setHtml("descriptionCodigoProduto", data["Nome"]);

                            validatorGrade1.clear({ disable: true });
                            validatorGrade2.clear({ disable: true });
                            validatorGrade3.clear({ disable: true });
                            if (data["HaveGrade1"]) {
                                validatorGrade1.enable();
                                validatorGrade1.focus();
                            }
                            else
                                $("#linkButtonModalProdutos").focus();
                            if (data["HaveGrade2"]) {
                                validatorGrade2.enable();
                            }
                            if (data["HaveGrade3"]) {
                                validatorGrade3.enable();
                            }
                        },
                        onInvalid: function (data) {
                            validatorProdutos.setChange(true);
                            validatorProdutos.clear({ error: true });
                            validatorProdutos.focus();

                            validatorGrade1.clear({ error: true, disable: true });
                            validatorGrade2.clear({ error: true, disable: true });
                            validatorGrade3.clear({ error: true, disable: true });
                        },
                        onEmpty: function () {
                            validatorProdutos.setChange(true);
                            validatorProdutos.clear();

                            validatorGrade1.clear({ disable: true });
                            validatorGrade2.clear({ disable: true });
                            validatorGrade3.clear({ disable: true });

                            $("#linkButtonModalProdutos").focus();
                        }
                    });
                    validatorProdutos.listen();

                    var tableProdutos = new Table({
                        "id": "tableProdutos",
                        "route": window.baseUrl + "Empresarial/F4Produto/GetProdutos",
                        "showFilter": true,
                        "columns": [
                            { title: "Código", field: "Codigo", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Nome", field: "Nome", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Unidade", field: "Unidade", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Preço", field: "ValorUnitario", width: 60, headerAttributes: { style: "color: black; text-align: rigtht;" }, attributes: { style: "text-align: rigtht;" } },
                            { title: "Classificação", field: "Classificacao", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        "onChange": function () {
                            var ok = document.getElementById("inputF4ModalOk" + this.id);
                            ok.onclick = function () {
                                // refatorar e colocar em uma rotina, pois sao 3 lugares para alterar: onclick-table, dblclick-table e dblclick-hierarquia
                                var data = tableProdutos.getSelectedData(),
                                    search = {};
                                search["CodigoProduto"] = data["Codigo"];
                                getJsonFromRoute("Empresarial/F4Produto/GetProduto", search).done(function (data) {
                                    validatorProdutos.onValid(data);
                                    validatorProdutos.update();
                                });
                            };
                        },
                        "onDataBound": function () {
                            $("#tableProdutos table  tr").on("dblclick", function () {
                                // refatorar e colocar em uma rotina, pois sao 3 lugares para alterar: onclick-table, dblclick-table e dblclick-hierarquia
                                var data = tableProdutos.getSelectedData(),
                                    search = {};
                                search["CodigoProduto"] = data["Codigo"];
                                getJsonFromRoute("Empresarial/F4Produto/GetProduto", search).done(function (data) {
                                    validatorProdutos.onValid(data);
                                    validatorProdutos.update();
                                });
                                $("#modalProdutos").modal("hide");
                            });
                        },
                        "dataSourceType": "Filtered"
                    });
                    var linkButtonModalProdutos = document.getElementById("linkButtonModalProdutos");
                    var inputProdutos = document.getElementById("inputCodigoProduto");

                    // showOpcaoExibir, exibirHierarquiaLista
                    var options = {
                        showOpcaoExibir: true,
                        onDblClickGetItem: function (event, dados) {
                            // refatorar e colocar em uma rotina, pois sao 3 lugares para alterar: onclick-table, dblclick-table e dblclick-hierarquia
                            var data = dados,
                                search = {};
                            search["CodigoProduto"] = data["Codigo"];
                            getJsonFromRoute("Empresarial/F4Produto/GetProduto", search).done(function (data) {
                                validatorProdutos.onValid(data);
                                validatorProdutos.update();
                            });
                            $("#modalProdutos").modal("hide");
                        }
                    };

                    var modalProdutos = new Modal("Produtos", linkButtonModalProdutos, inputProdutos, tableProdutos, null, options);
                    modalProdutos.listen();

                    // grades
                    var columnsGrade = [
                        { title: "Código", field: "Codigo", width: 45, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                        { title: "Descrição", field: "Descricao", width: 64, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                    ];

                    // grade1
                    var validatorGrade1 = new Validator({
                        field: "CodigoGrade1",
                        onPendencyMessage: "Deve ser informado a Grade 1.",
                        route: "Empresarial/F4Produto/GetItemGrade1",
                        pendency: [validatorProdutos],
                        v2: true,
                        onValid: function (data) {
                            validatorGrade1.setChange(true);
                            setVal("inputCodigoGrade1", data["Codigo"]);
                            setHtml("descriptionCodigoGrade1", " - " + data["Descricao"]);
                        },
                        onInvalid: function (data) {
                            validatorGrade1.setChange(true);
                            validatorGrade1.clear({ error: true });
                            validatorGrade1.focus();
                        },
                        onEmpty: function () {
                            validatorGrade1.setChange(true);
                            validatorGrade1.clear();

                            validatorGrade2.clear();
                            validatorGrade3.clear();
                        }
                    });
                    validatorGrade1.listen();

                    var optionsGrade1 = {
                        "id": "tableGrade1",
                        "route": window.baseUrl + "Empresarial/F4Produto/List1",
                        "showFilter": true,
                        "columns": columnsGrade,
                        "params": [validatorProdutos],
                        "fieldDepende": validatorProdutos,
                        "onChange": function () {
                            var ok = document.getElementById("inputF4ModalOk" + this.id);
                            var cancelar = document.getElementById("inputF4ModalCancelar");
                            ok.onclick = function () {
                                var data = tableGrade1.getSelectedData();
                                validatorGrade1.onValid(data);
                                validatorGrade1.update();
                                $("#filtroPedidosModal").modal("show");
                            };
                            cancelar.onclick = function () {
                                $("#filtroPedidosModal").modal("show");
                            };
                        },
                        "onDataBound": onDataBoundGrade1,
                        "dataSourceType": "Parameter"
                    };

                    function onDataBoundGrade1() {
                        $("#filtroPedidosModal").modal("hide");
                        $("#" + this.id + " table  tr").on("dblclick", function () {
                            var data = tableGrade1.getSelectedData();
                            validatorGrade1.onValid(data);
                            validatorGrade1.update();
                            $("#modalGrade1").modal("hide");
                            $("#filtroPedidosModal").modal("show");
                        });
                        var cancelar = document.getElementById("inputF4ModalCancelar");
                        cancelar.onclick = function () {
                            $("#filtroPedidosModal").modal("show");
                        };
                        $("#filtroPedidosModal").modal("hide");
                    }

                    var tableGrade1 = new Table(optionsGrade1);
                    var linkButtonModalGrade1 = document.getElementById("linkButtonModalGrade1");
                    $(linkButtonModalGrade1).on("click", function () {
                        $("#filtroPedidosModal").modal("hide");
                    });
                    var inputGrade1 = document.getElementById("inputCodigoGrade1");
                    var modalGrade1 = new Modal("Grade", linkButtonModalGrade1, inputGrade1, tableGrade1);
                    modalGrade1.listen();

                    // grade2
                    var validatorGrade2 = new Validator({
                        field: "CodigoGrade2",
                        onPendencyMessage: "Deve ser informado a Grade 2.",
                        route: "Empresarial/F4Produto/GetItemGrade2",
                        pendency: [validatorGrade1, validatorProdutos],
                        v2: true,
                        onValid: function (data) {
                            validatorGrade2.setChange(true);
                            setVal("inputCodigoGrade2", data["Codigo"]);
                            setHtml("descriptionCodigoGrade2", " - " + data["Descricao"]);
                        },
                        onInvalid: function (data) {
                            validatorGrade2.setChange(true);
                            validatorGrade2.clear({ error: true });
                            validatorGrade2.focus();
                        },
                        onEmpty: function () {
                            validatorGrade2.setChange(true);
                            validatorGrade2.clear();

                            validatorGrade3.clear();
                        }
                    });
                    validatorGrade2.listen();

                    var optionsGrade2 = {
                        "id": "tableGrade2",
                        "route": window.baseUrl + "Empresarial/F4Produto/List2",
                        "showFilter": true,
                        "columns": columnsGrade,
                        "params": [validatorGrade1, validatorProdutos],
                        "fieldDepende": validatorGrade1,
                        "onChange": function () {
                            var ok = document.getElementById("inputF4ModalOk" + this.id);
                            var cancelar = document.getElementById("inputF4ModalCancelar");
                            ok.onclick = function () {
                                var data = tableGrade2.getSelectedData();
                                validatorGrade2.onValid(data);
                                validatorGrade2.update();
                                $("#filtroPedidosModal").modal("show");
                            };
                            cancelar.onclick = function () {
                                $("#filtroPedidosModal").modal("show");
                            };
                        },
                        "onDataBound": onDataBoundGrade2,
                        "dataSourceType": "Parameter"
                    };

                    function onDataBoundGrade2() {
                        $("#filtroPedidosModal").modal("hide");
                        $("#" + this.id + " table  tr").on("dblclick", function () {
                            var data = tableGrade2.getSelectedData();
                            validatorGrade2.onValid(data);
                            validatorGrade2.update();
                            $("#modalGrade2").modal("hide");
                            $("#filtroPedidosModal").modal("show");
                        });
                        var cancelar = document.getElementById("inputF4ModalCancelar");
                        cancelar.onclick = function () {
                            $("#filtroPedidosModal").modal("show");
                        };
                    }

                    var tableGrade2 = new Table(optionsGrade2);
                    var linkButtonModalGrade2 = document.getElementById("linkButtonModalGrade2");
                    $(linkButtonModalGrade2).on("click", function () {
                        $("#filtroPedidosModal").modal("hide");
                    });
                    var inputGrade2 = document.getElementById("inputCodigoGrade2");
                    var modalGrade2 = new Modal("Grade", linkButtonModalGrade2, inputGrade2, tableGrade2);
                    modalGrade2.listen();

                    // grade3
                    var validatorGrade3 = new Validator({
                        field: "CodigoGrade3",
                        onPendencyMessage: "Deve ser informado a Grade 3.",
                        route: "Empresarial/F4Produto/GetItemGrade3",
                        pendency: [validatorGrade2, validatorGrade1, validatorProdutos],
                        v2: true,
                        onValid: function (data) {
                            validatorGrade3.setChange(true);
                            setVal("inputCodigoGrade3", data["Codigo"]);
                            setHtml("descriptionCodigoGrade3", " - " + data["Descricao"]);
                        },
                        onInvalid: function (data) {
                            validatorGrade3.setChange(true);
                            validatorGrade3.clear({ error: true });
                            validatorGrade3.focus();
                        },
                        onEmpty: function () {
                            validatorGrade3.setChange(true);
                            validatorGrade3.clear();
                        }
                    });
                    validatorGrade3.listen();

                    var optionsGrade3 = {
                        "id": "tableGrade3",
                        "route": window.baseUrl + "Empresarial/F4Produto/List3",
                        "showFilter": true,
                        "columns": columnsGrade,
                        "params": [validatorGrade2, validatorGrade1, validatorProdutos],
                        "fieldDepende": validatorGrade2,
                        "onChange": function () {
                            var ok = document.getElementById("inputF4ModalOk" + this.id);
                            var cancelar = document.getElementById("inputF4ModalCancelar");
                            ok.onclick = function () {
                                var data = tableGrade3.getSelectedData();
                                validatorGrade3.onValid(data);
                                validatorGrade3.update();
                                $("#filtroPedidosModal").modal("show");
                            };
                            cancelar.onclick = function () {
                                $("#filtroPedidosModal").modal("show");
                            };
                        },
                        "onDataBound": onDataBoundGrade3,
                        "dataSourceType": "Parameter"
                    };

                    function onDataBoundGrade3() {
                        $("#filtroPedidosModal").modal("hide");
                        $("#" + this.id + " table  tr").on("dblclick", function () {
                            var data = tableGrade3.getSelectedData();
                            validatorGrade3.onValid(data);
                            validatorGrade3.update();
                            $("#modalGrade3").modal("hide");
                            $("#filtroPedidosModal").modal("show");
                        });
                        var cancelar = document.getElementById("inputF4ModalCancelar");
                        cancelar.onclick = function () {
                            $("#filtroPedidosModal").modal("show");
                        };
                        $("#filtroPedidosModal").modal("hide");
                    }

                    var tableGrade3 = new Table(optionsGrade3);
                    var linkButtonModalGrade3 = document.getElementById("linkButtonModalGrade3");
                    $(linkButtonModalGrade3).on("click", function () {
                        $("#filtroPedidosModal").modal("hide");
                    });
                    var inputGrade3 = document.getElementById("inputCodigoGrade3");
                    var modalGrade3 = new Modal("Grade", linkButtonModalGrade3, inputGrade3, tableGrade3);
                    modalGrade3.listen();

                    //$("#linkButtonModalProdutos").click();
                    $("#linkButtonModalProdutos").trigger("click");
                }(params));
            },

            GrupoContas: function (params) {
                return (function () {
                    var u = new Util();
                    $("<div id='modalDiv'>").appendTo("body");
                    u.addButtonHelpBreadcrumb("RadarWEB.htm", "Tela Inicial");
                    currentUser.update(params.User);

                    // Grupo Contas Cliente
                    var validatorCliente = new Validator({
                        field: "inputCodigoCliente",
                        fieldDescriptionId: "descriptionCodigoCliente",
                        fieldSearch: "CodigoCliente",
                        onPendencyMessage: "Deve ser informado o código do cliente.",
                        route: "Empresarial/F4Cliente/GetCliente",
                        v2: true,
                        ModalGrupoContas: true,
                        grupoContasFieldNome: "RazaoSocial",
                        linkButton: "linkButtonModalClientes",
                        linkButtonModalGrupoContas: "linkButtonModalGrupoContasClientes",
                        onValid: function (data) {
                            $("#inputCodigoCliente").val(data.Codigo);
                            $("#descriptionCodigoCliente").html(data.RazaoSocial);
                        },
                        onInvalid: function (data) {
                            validatorCliente.clear({ error: true });
                            validatorCliente.focus();
                        },
                        onEmpty: function () {
                            validatorCliente.clear();
                        }
                    });
                    validatorCliente.listen();

                    var tableClientes = new Table({
                        "id": "tableCliente",
                        "route": window.baseUrl + "Comercial/F4ClientePedido/GetClientes",
                        "showFilter": true,
                        "columns": [
                            { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Razão Social", field: "RazaoSocial", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "CPF/CNPJ", field: "CnpjCpf", width: 115, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        "columnsLegend": { CnpjCpf: "Ex: 11.222.333/4444-55" },
                        "onChange": function () {
                            $("#inputF4ModalOk" + this.id).on("click", function () {
                                var data = tableClientes.getSelectedData();
                                validatorCliente.onValid(data);
                                validatorCliente.update();
                                $("#modalCliente").modal("hide");
                            });
                            $("#inputF4ModalCancelar").on("click", function () {
                                $("#modalCliente").modal("hide");
                            });
                        },
                        "onDataBound": function () {
                            $("#tableCliente table tr").on("dblclick", function () {
                                var data = tableClientes.getSelectedData();
                                validatorCliente.onValid(data);
                                validatorCliente.update();
                                $("#modalCliente").modal("hide");
                            });
                            $("#inputF4ModalCancelar").on("click", function () {
                                $("#modalCliente").modal("hide");
                            });
                        },
                        "dataSourceType": "Filtered"
                    });

                    var options = {
                        validatorInput: validatorCliente,
                        onHidden: function () {
                            $("#filtroPedidosModal").modal("show");
                        }
                    }
                    var modalClientes = new Modal("Clientes",
                        byId("linkButtonModalClientes"),
                        byId("inputCodigoCliente"),
                        tableClientes,
                        function () {
                            $("#filtroPedidosModal").modal("hide");
                        },
                        options).listen();

                    var modalGrupoContasClientes = new ModalGrupoContas({
                        id: "Clientes",
                        validatorInput: validatorCliente,
                        validatorConta: {
                            fieldSearch: "CodigoCliente",
                            onPendencyMessage: "Deve ser informado o código do cliente.",
                            route: "Comercial/F4ClientePedido/GetCliente",
                            fieldNome: "RazaoSocial"
                        },
                        tableConta: {
                            route: window.baseUrl + "Comercial/F4ClientePedido/GetClientes",
                            showFilter: true,
                            columns: [
                                { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                                { title: "Razão Social", field: "RazaoSocial", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                                { title: "CPF/CNPJ", field: "CnpjCpf", width: 115, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                            ]
                        },
                        onShow: function () {
                            $("#filtroPedidosModal").modal("hide");
                        },
                        onHidden: function () {
                            $("#filtroPedidosModal").modal("show");
                        }
                    });

                    // Grupo Contas Contabil

                    var validatorContaContabil = new Validator({
                        field: "inputCodigoContaContabil",
                        fieldDescriptionId: "descriptionCodigoContaContabil",
                        fieldSearch: "CodigoContaContabil",
                        onPendencyMessage: "Deve ser informado o código da Conta Contabil.",
                        route: "Empresarial/F4ContaContabil/GetContaContabil",
                        v2: "v3",
                        ModalGrupoContas: true,
                        grupoContasFieldNome: "Nome",
                        linkButton: "linkButtonModalContaContabil",
                        linkButtonModalGrupoContas: "linkButtonModalGrupoContasContaContabil",
                        onValid: function (data) {
                            if (data.Tipo !== "T") {
                                u.alert("Conta deve ser do tipo título", alertBehavior.warning);
                                validatorContaContabil.clear({ error: true });
                                validatorContaContabil.update();
                            }
                            else {
                                $("#inputCodigoContaContabil").val(data.Codigo);
                                $("#descriptionCodigoContaContabil").html(data.Nome);
                            }
                        },
                        onInvalid: function (data) {
                            validatorContaContabil.clear({ error: true });
                            validatorContaContabil.focus();
                        },
                        onEmpty: function () {
                            validatorContaContabil.clear();
                        }
                    });
                    validatorContaContabil.listen();

                    var tableContaContabil = new Table({
                        "id": "tableContaContabil",
                        "route": window.baseUrl + "Empresarial/F4ContaContabil/GetContasContabeis",
                        "showFilter": true,
                        "columns": [
                            { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Nome", field: "Nome", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Classificação", field: "Classificacao", width: 100, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Tipo", field: "Tipo", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        "onChange": function () {
                            $("#inputF4ModalOk" + this.id).on("click", function () {
                                var data = tableContaContabil.getSelectedData();
                                validatorContaContabil.onValid(data);
                                validatorContaContabil.update();
                                $("#modalContaContabil").modal("hide");
                            });
                            $("#inputF4ModalCancelar").on("click", function () {
                                $("#modalContaContabil").modal("hide");
                            });
                        },
                        "onDataBound": function () {
                            $("#tableContaContabil table tr").on("dblclick", function () {
                                var data = tableContaContabil.getSelectedData();
                                validatorContaContabil.onValid(data);
                                validatorContaContabil.update();
                                $("#modalContaContabil").modal("hide");
                            });
                            $("#inputF4ModalCancelar").on("click", function () {
                                $("#modalContaContabil").modal("hide");
                            });
                        },
                        "dataSourceType": "Filtered"
                    });

                    var modalContaContabil = new Modal("Conta Contábil",
                        byId("linkButtonModalContaContabil"),
                        byId("inputCodigoContaContabil"),
                        tableContaContabil,
                        null, {
                            validatorInput: validatorContaContabil,
                            useClassePai: true,
                            ClassePaiURL: "Empresarial/F4ContaContabil/GetClassesPai",
                            onHidden: function () {
                            }
                        }
                     ).listen();

                    var modalGrupoContasContaContabil = new ModalGrupoContas({
                        id: "ContaContabil",
                        validatorInput: validatorContaContabil,
                        validatorConta: {
                            fieldSearch: "CodigoContaContabil",
                            onPendencyMessage: "Deve ser informado o código da Conta Contabil.",
                            route: "Empresarial/F4ContaContabil/GetContaContabil",
                            v2: "v3",
                            fieldNome: "Nome"
                        },
                        tableConta: {
                            route: window.baseUrl + "Empresarial/F4ContaContabil/GetContasContabeis",
                            showFilter: true,
                            columns: [
                                { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                                { title: "Nome", field: "Nome", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                                { title: "Classificação", field: "Classificacao", width: 100, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                                { title: "Tipo", field: "Tipo", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                            ]
                        },
                        modalConta: {
                            useClassePai: true,
                            ClassePaiURL: "Empresarial/F4ContaContabil/GetClassesPai",
                        },
                        onShow: function () {
                        },
                        onHidden: function () {
                        }
                    });

                    // test
                    //$("#linkButtonModalGrupoContasClientes").trigger("click");
                    //validatorCliente.setVarios(true);

                    $("#loadFilter").on('click', function () {
                        "use strict";

                        var filtroVM = JSON.parse(currentUser.getSessionData('filtro_pedidos'));

                        if (filtroVM != null) {
                            // filtro unico
                            if (typeof filtroVM['CodigoCliente'] === 'string') {
                                document.getElementById('inputCodigoCliente').value = filtroVM['CodigoCliente'];
                                validatorCliente.setValue(filtroVM['CodigoCliente']);
                            }
                            else {
                                // filtro GrupoContas
                                validatorCliente.setGrupoContas(filtroVM['CodigoCliente']);
                                validatorCliente.setVarios(true);
                            }
                        }

                        $('#filtroPedidosModal').modal('show');
                    });

                    $("#doFilter").on('click', function () {
                        "use strict";

                        var filtroVM = {};

                        // GrupoContas
                        if (validatorCliente.getVarios()) {
                            filtroVM['CodigoCliente'] = validatorCliente.getGrupoContas();
                        }
                        else {
                            filtroVM['CodigoCliente'] = document.getElementById('inputCodigoCliente').value;
                        }

                        currentUser.setSessionData('filtro_pedidos', JSON.stringify(filtroVM));
                    });

                    $("#buttonOK").on("click", function () {
                        inputs = {
                            Cliente: validatorCliente.getValue(),
                        }

                        window.open(window.baseUrl + "?"
                            + "Cliente=" + getVal("inputCodigoCliente")
                        );
                    });

                }(params));
            },

            MultipleModals: function (params) {
                return (function () {
                    var u = new Util();
                    $("<div id='modalDiv'>").appendTo("body");
                    u.addButtonHelpBreadcrumb("RadarWEB.htm", "Tela Inicial");
                    u.alert("MultipleModals", alertBehavior.error);

                    var criaModal = function (id) {
                        var htmlModal = "";
                        htmlModal += "<div id='" + id + "' class='modal hide' role='dialog' >";

                        htmlModal += "    <div class='modal-header' style='background-color: #314A63'>";
                        htmlModal += "        <button type='button' class='close' data-dismiss='modal' aria-hidden='true'>&times;</button>";
                        htmlModal += "        <h4 style='color: white'>Modal id=" + id + "</h4>";
                        htmlModal += "    </div>";

                        htmlModal += "    <div class='modal-body' style=''>";
                        htmlModal += "        body do modal id=" + id + " <br />";
                        htmlModal += '        <a id="link-modalId1" href="#modalId1" role="button" data-toggle="modal">modalId1<i class="icon-zoom-in"></i></a>';
                        htmlModal += '        <a id="link-modalId2" href="#modalId2" role="button" data-toggle="modal">modalId2<i class="icon-zoom-in"></i></a>';
                        htmlModal += '        <a id="link-modalId3" href="#modalId3" role="button" data-toggle="modal">modalId3<i class="icon-zoom-in"></i></a>';
                        htmlModal += "    </div>";

                        htmlModal += "    <div class='modal-footer'>";
                        htmlModal += "        <input type='button' id='ModalGrupoContasButtonOk' value='OK' class='btn btn-inverse btn-small' data-dismiss='modal' aria-hidden='true' style='width: 75px'/>";
                        htmlModal += "        <input type='button' id='ModalGrupoContasButtonCancel'  value='Cancelar' class='btn btn-inverse btn-small' data-dismiss='modal' aria-hidden='true' style='width: 75px'/>";
                        htmlModal += "    </div>";

                        htmlModal += "</div>";

                        $("#modalDiv").append(htmlModal);
                    };
                    // a ordem de criacao implica em qual modal pode ficar acima de outro
                    // se tentar fazer um showmodal do modalId1 sobre o modalId3,
                    criaModal("modalId3");
                    criaModal("modalId2");
                    criaModal("modalId1");
                    //$("#link-modalId1").trigger("click");
                    //$("#link-modalId2").trigger("click");
                    //$("#link-modalId3").trigger("click");

                }(params));
            },

            JsonParams: function (params) {
                return (function () {
                    var u = new Util();
                    $("<div id='modalDiv'>").appendTo("body");
                    u.addButtonHelpBreadcrumb("RadarWEB.htm", "Tela Inicial");

                    //u.alert("ModeloTest", alertBehavior.error);

                    requestNoAsync(window.baseUrl + "Test/JsonParamsRequest",
                        {
                            vint: 1,
                            lststring: ["lststring1", "lststring2", ],
                            Produto: {
                                idProduto: 12,
                                idGrade1: 13,
                                idGrade2: 14,
                                idGrade3: 15
                            },
                            Produtos: [
                                {
                                    idProduto: 1,
                                    idGrade1: 2,
                                    idGrade2: 3,
                                    idGrade3: 4
                                },
                                {
                                    idProduto: 4,
                                    idGrade1: 5,
                                    idGrade2: 6,
                                    idGrade3: 7
                                },
                                {
                                    idProduto: 8,
                                    idGrade1: 9,
                                    idGrade2: 10,
                                    idGrade3: 11
                                }
                            ],
                            ProdutosList: [
                                {
                                    idProduto: 16,
                                    idGrade1: 17,
                                    idGrade2: 18,
                                    idGrade3: 19
                                },
                                {
                                    idProduto: 20,
                                    idGrade1: 21,
                                    idGrade2: 22,
                                    idGrade3: 23
                                }
                            ]
                        },
                        function (result) {
                        }
                    );

                    var Produto = {
                        idProduto: 12,
                        idGrade1: 13,
                        idGrade2: 14,
                        idGrade3: 15
                    };

                    requestNoAsync(window.baseUrl + "Test/JsonParamsRequest?"
                        + "Produto=" + JSON.stringify()
                        + "&vint=132",
                        {
                        },
                        function (result) {
                        }
                    );

                }(params));
            },

            ModeloTest: function (params) {
                return (function () {
                    var u = new Util();
                    $("<div id='modalDiv'>").appendTo("body");
                    u.addButtonHelpBreadcrumb("RadarWEB.htm", "Tela Inicial");
                    u.alert("ModeloTest", alertBehavior.error);
                }(params));
            }
        }
    }());

    Modelos.Manager = (function () {
        return {
            Modelo1: function (params) {
                return (function () {
                    var u = new Util();
                    $("<div id='modalDiv'>").appendTo("body");
                    u.alert("modelo1", alertBehavior.error);
                }(params));
            },
            Modelo2: function (params) {
                return (function () {
                    var u = new Util();
                    $("<div id='modalDiv'>").appendTo("body");
                    u.alert("modelo2", alertBehavior.error);
                }(params));
            },
            Modelo3: function (params) {
                return (function () {
                    var u = new Util();
                    $("<div id='modalDiv'>").appendTo("body");
                    u.alert("modelo3", alertBehavior.error);
                }(params));
            }
        }
    }());

    Empresarial.Manager = (function () {
        var util = new Util();

        var mostrarVigencia = false;
        var firstState;

        var template =
         "<span style='float:left; width: NaN;'>" +
         "    <span style='font-size: large; font-weight: 800; text-align: center; ' id='tableTitle'></span>" +
         "</span>" +
         "<span style='float:right'>" +
         "    <button id='inputFilter' type='button' class='btn btn-small'>" +
         "        <span class='k-icon k-i-funnel'>Atualiza</span> Fitro" +
         "    </button>" +
         "    <button id='buttonCadastrar' type='button' class='btn btn-small'>" +
         "        <span class='k-icon k-i-plus'>Atualiza</span>Novo" +
         "    </button>" +
         "</span>";

        var promptDataVigenciaOptions = {
            'id': 'dataVigenciaModal',
            'title': 'Data final de Vigência',
            'template':
                "<div>\
                    <label> Data Vigência\
                        <input type='text' id='inputDataFinalVigencia' class='radar-date-picker' vm-model='prompt-viewmodel' vm-field='DataVigencia' value='" + getDateNowDDMMYYYY() + "'/>\
                    </label>\
                </div>",
            'onOk': function (model) {
                console.log('OK foi pressionado!');
                console.log(model);
            },
            'onCancel': function () {
                console.log('Cancelar foi pressionado!');
            }
        };

        var promptDataVigencia = new PromptDialog(promptDataVigenciaOptions);

        var baseTable = new Table({
            'id': null,
            'route': null,
            'showFilter': false,
            'columns': [
                { title: 'Código', field: 'Codigo', width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                { title: 'CPF/CNPJ', field: 'CnpjCpf', width: 115, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                { title: 'Razão Social', field: 'RazaoSocial', width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                { title: 'UF', field: 'Uf', width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                { title: 'Município', field: 'Municipio', width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                { title: 'Telefone1', field: 'Telefone1', width: 115, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                { title: 'E-mail', field: 'Email', width: 115, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                { title: 'Contato', field: 'Contato', width: 115, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
            ],
            'onChange': function () {
                "use strict";
                var self = this;
                var data = self.getSelectedData();
            },
            'toolbar': template,
            'onDataBound': function () {
                "use strict";
                var self = this;
                $('#' + self.id + ' table tr').on('dblclick', function () {
                    var data = self.getSelectedData();
                });
                var el = $('#' + self.id + ' .k-grid-content');
                el[0].style.height = "auto";
                msgWait.hide();
            },
            'dataSourceType': "Filtered",
            'pageable': {
                refresh: true,
                numeric: true,
                pageSizes: [20, 30, 40, 50],
                buttonCount: 5
            }
        });

        var baseTableEndereco = new Table({
            'id': null,
            'route': null,
            'showFilter': false,
            'columns': [
                { title: 'Tipo Endereço', field: 'TipoEndereco', width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                { title: 'UF', field: 'Uf', width: 115, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                { title: 'Município', field: 'Municipio', width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                { title: 'Telefone 1', field: 'Telefone1Numero', width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                { title: 'E-mail', field: 'Email', width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
            ],
            'onChange': function () {
                "use strict";
                var self = this;
                var data = self.getSelectedData();
            },
            'onDataBound': function () {
                "use strict";
                var el = $('#gridEnderecos .k-grid-content');
                el[0].style.height = "108px";
            },
            'dataSourceType': "Filtered"
        });

        var dropDownUf = new DropDown({
            'id': 'selectUf',
            'route': 'Empresarial/Combos/GetUf'
        });

        $('#inputInscricaoEstadual').setMask('insc-estadual');

        var dropDownUfEnderecos = new DropDown({
            'id': 'selectUfEnderecos',
            'route': 'Empresarial/Combos/GetUf'
        });




        function updateMascaraInscricaoEstadual() {
            $.post(window.baseUrl + 'Empresarial/Cadastros/Get/MascaraInscricaoEstadual')
                .done(function (data) {
                    $('#inputInscricaoEstadual').setMask({ mask: data.mascara });
                })
               .fail(function () {
                   $('#inputInscricaoEstadual').setMask('999.999.999');
               });
        }

        function bindMunicipoEnderecoData(data) {
            if (data !== undefined) {
                dropDownUfEnderecos.set(data.Uf);
                dropDownUfEnderecos.change();
                document.getElementById('inputCodigoMunicipioEndereco').value = data.Codigo;
                document.getElementById('descriptionCodigoMunicipioEndereco').innerHTML = data.Nome;
            } else {
                dropDownUfEnderecos.setIndex(0);
                dropDownUfEnderecos.change();
                document.getElementById('inputCodigoMunicipioEndereco').value = "";
                document.getElementById('descriptionCodigoMunicipioEndereco').innerHTML = "";
            }
        }

        function selectModeAlteracao(drop, option) {
            drop.enable(!option);
        };

        function adicionandoEndereco(option) {
            document.getElementById('buttonAlterarEndereco').disabled = option;
            document.getElementById('buttonRemoverEndereco').disabled = option;
            document.getElementById('buttonAdicionarEndereco').disabled = !option;
        }

        function checkRequiredCadastro() {
            return checkRequired('#principal input[required=required]');
        }

        function checkRequiredEndereco() {
            return checkRequired('#endereco input[required=required]');
        }

        function checkRequired(selector) {
            var requireds = document.querySelectorAll(selector), l = requireds.length;
            for (var i = 0; i < l; i++) {
                var required = requireds[i];
                if (required.value == "") {
                    if (!required.hidden)
                        return required;
                }
            }
            return false;
        }

        function temEnderecoTipo(view, tipo) {
            var m = view.filter(function (m) { return m.Tipo == tipo; });
            return m.length > 0;
        }

        function temEnderecoAlteracaoMesmoTipo(novoEndereco, view, enderecoDaGrid) {
            for (var i = 0; i < view.length; i = i + 1) {
                var enderecoAtual = view[i];

                if (enderecoAtual.Index !== enderecoDaGrid.Index && enderecoAtual.Tipo.toString() === novoEndereco.Tipo)
                    return i;
            }

            return -1;
        }

        function masker(isListar) {
            if (isListar) {
                $('#inputCpf').setMask('cpf2');
                $('#inputCnpj').setMask('cnpj2');
            } else {
                $('#inputCpf').setMask('cpf');
                $('#inputCnpj').setMask('cnpj');
            }

            //$('#inputCep').setMask('radar-cep'); cep não possuirá máscara conforme #1403-00721-1
        }

        function criaCf(tipo, cf, drop) {
            var postUrl = window.baseUrl + 'Empresarial/Cadastros/Crud/Create/' + tipo;
            $.post(postUrl, cf)
                .done(function (data) {
                    if (data.Valido) {
                        document.getElementById('inputCodigo').value = data.CodigoProprio;
                        util.alert("Cadastro realizado com sucesso.", alertBehavior.success);
                        selectModeAlteracao(drop, true);
                        updateFirstState();
                    } else {
                        util.alert(data.Message, alertBehavior.error);
                    }

                    document.querySelector('a[href="#principal"]').click();
                    masker();
                });
        }

        function alteraCf(tipo, cf, drop, gravarHistorico, prompt) {
            var postUrl = window.baseUrl + 'Empresarial/Cadastros/Crud/Update/' + tipo;
            var required = checkRequiredCadastro();
            if (!required) {
                if (gravarHistorico) {
                    prompt.onOk = function (clbData) {
                        cf.DataVigencia = clbData.DataVigencia;
                        postDoneCf(postUrl, cf, drop);
                    };
                    prompt.make();
                    prompt.listen();
                    prompt.show(true);
                    makeDatePicker('#inputDataFinalVigencia');
                } else {
                    postDoneCf(postUrl, cf, drop);
                }
            } else {
                var message = required.dataset.message;
                required.focus();
                util.dialogOk("Aviso", message, function () {
                    setTimeout(function () { required.focus(); }, 20);
                });
                $('#linkDialog').click();
            }
        }

        function postDoneCf(postUrl, cfData, drop) {
            $.post(postUrl, cfData).done(function () {
                util.alert("Alteração realizada com sucesso.", alertBehavior.success);
                selectModeAlteracao(drop, true);
                document.querySelector('a[href="#principal"]').click();
                masker();
                updateFirstState();
                updateMascaraInscricaoEstadual();
            });
        }

        function checkCadastroCf(options, callback) {
            var required = checkRequiredCadastro();

            if (!required) {
                var view = baseTableEndereco.grid.dataSource.view().toJSON();
                if (view.length == 0 || !temEnderecoTipo(view, 80)) {
                    util.dialogOk("Aviso", "Deve ser informado um endereço do tipo Padrão.", function () {
                        setTimeout(function () {
                            document.querySelector('a[href="#endereco"]').click();
                        }, 20);
                    });
                    $('#linkDialog').click();
                    return;
                }
            } else {
                var message = required.dataset.message;
                util.dialogOk("Aviso", message, function () {
                    document.querySelector('a[href="#principal"]').click();
                    setTimeout(function () {
                        required.focus();
                    }, 300);
                });
                $('#linkDialog').click();
                return;
            }
            var inscricaoEstadual = document.getElementById('inputInscricaoEstadual');
            var showInscricaoEstadualPrompts = !inscricaoEstadual.disabled;
            var inscricaoEstadualValue = inscricaoEstadual.value;
            var emptyInscricaoEstadual = inscricaoEstadualValue.removeOccurrencesOf(/\.|\/|-/g).asInt() === 0 || inscricaoEstadualValue.empty();

            if (emptyInscricaoEstadual && options.cf.TipoContribuinte == IcmsType.CONTRIBUINTE && showInscricaoEstadualPrompts) {
                util.dialogOk("Inscrição Estadual", "Inscrição estadual deve ser informada.", function () {
                    document.querySelector('a[href="#inscricoesLegais"]').click();
                    setTimeout(function () {
                        document.getElementById('inputInscricaoEstadual').focus();
                    }, 300);
                });
                $('#linkDialog').click();
                return;
            }

            var validarCpfCnpjUrl = window.baseUrl + 'Api/Validar/ValidateCpfCnpj';
            var dataValidarCpfCnpj = { Data: options.cf.CnpjCpf, TipoCfrt: options.tipo, TipoPessoa: options.cf.TipoPessoa, Codigo: options.cf.Codigo };
            var postValidarCpfCnpj = $.post(validarCpfCnpjUrl, dataValidarCpfCnpj);

            var validarInscricaoEstadualUrl = window.baseUrl + 'Api/Validar/ValidateInscricaoEstadual';
            var dataValidarInscricaoEstadual = { Data: options.cf.InscricaoEstadual, Uf: options.cf.Uf };
            var postValidarInscricaoEstadual = $.post(validarInscricaoEstadualUrl, dataValidarInscricaoEstadual);

            var validarEmailUrl = window.baseUrl + 'Api/Validar/ValidateEmail';
            var dataValidarEmail = { Data: options.cf.Email };
            var postValidarEmail = $.post(validarEmailUrl, dataValidarEmail);

            $.when(
                postValidarCpfCnpj,
                postValidarInscricaoEstadual,
                postValidarEmail
            ).done(function (resultCpfCnpj, resultInscricaoEstadual, resultEmail) {
                var dataCpfCnpj = resultCpfCnpj[0],
                    dataInscricaoEstadual = resultInscricaoEstadual[0],
                    dataEmail = resultEmail[0];
                var inputDisabled = document.querySelectorAll('#inputInscricaoEstadual:disabled').length > 0;

                checkaPost(
                    dataCpfCnpj,
                    dataInscricaoEstadual,
                    dataEmail
                ).then(function (data, dataCpfCnpj, dataInscricaoEstadual) {
                    //Confere Inscrição Estadual (sim/não)
                    if (dataInscricaoEstadual.Valido && dataInscricaoEstadual.Message != undefined && !inputDisabled && showInscricaoEstadualPrompts) {
                        data.setPromptInscricoesLegaisYesNo(true);
                    }
                }).then(function (data, dataCpfCnpj, dataInscricaoEstadual) {
                    //Confere Inscrição Estadual (ok)
                    if (!dataInscricaoEstadual.Valido && dataInscricaoEstadual.Message != undefined && !inputDisabled && showInscricaoEstadualPrompts) {
                        data.setPromptInscricoresLegaisConfirm(true);
                    }
                }).then(function (data, dataCpfCnpj, dataInscricaoEstadual) {
                    //Confere CNPJ/CPF (sim/não)
                    if (dataCpfCnpj.Valido && dataCpfCnpj.Message != undefined) {
                        data.setPromptCpfCnpjYesNo(true);
                    }
                }).then(function (data, dataCpfCnpj, dataInscricaoEstadual) {
                    //Confere CNPJ/CPF (ok)
                    if (!dataCpfCnpj.Valido && dataCpfCnpj.Message != undefined) {
                        data.setPromptCpfCnpjConfirm(true);
                    }
                }).then(function (data, dataCpfCnpj, dataInscricaoEstadual) {
                    //Confere Email (ok)
                    if (!dataEmail.Valido && dataEmail.Message != undefined) {
                        data.setPromptEmailConfirm(true);
                    }
                }).done(function (data) {
                    data.done(callback);
                });
            });

            var checkaPost = function (dataCpfCnpj, dataInscricaoEstadual, dataEmail) {
                var deferred = new $.Deferred();

                var data = (function (o) {
                    var _valid = o.valid;
                    var _promptCpfCnpjYesNo = false;
                    var _promptCpfCnpjConfirm = false;
                    var _promptInscricoesLegaisYesNo = false;
                    var _promptInscricoresLegaisConfirm = false;
                    var _promptEmailConfirm = false;

                    function done(callback) {
                        if (_promptCpfCnpjConfirm) {
                            promptCpfCnpjConfirm();
                        } else if (_promptCpfCnpjYesNo) {
                            promptCpfCnpjYesNo(callback);
                        } else if (_promptInscricoresLegaisConfirm) {
                            promptInscricoresLegaisConfirm();
                        } else if (_promptInscricoesLegaisYesNo) {
                            promptInscricoesLegaisYesNo(callback);
                        } else if (_promptEmailConfirm) {
                            promptEmailConfirm();
                        } else {
                            callback();
                        }
                    }

                    function promptEmailConfirm() {
                        var promptOptions = {
                            'id': 'emailInvalido',
                            'title': 'E-mail.',
                            'template': "<div><span>E-mail inválido.</span></div>",
                            'onOk': function () {
                                this.show(false);
                                document.querySelector('a[href="#principal"]').click();
                                setTimeout(function () {
                                    document.getElementById('inputEmail').focus();
                                }, 300);
                            }
                        };
                        var prompt = new PromptDialog(promptOptions);
                        prompt.make();
                        prompt.listen();
                        prompt.show(true);
                    }

                    function promptCpfCnpjConfirm() {
                        var promptOptions = {
                            'id': 'cpfCnpfInvalido',
                            'title': 'CNPJ/CPF.',
                            'template': "<div><span>CNPJ/CPF inválido.</span></div>",
                            'onOk': function () {
                                this.show(false);
                                document.querySelector('a[href="#principal"]').click();
                                setTimeout(function () {
                                    var cpf = document.getElementById('inputCpf');
                                    var cnpj = document.getElementById('inputCnpj');
                                    if (cpf.hidden)
                                        cnpj.focus();
                                    else if (cnpj.hidden)
                                        cpf.focus();
                                }, 300);
                            }
                        };
                        var prompt = new PromptDialog(promptOptions);
                        prompt.make();
                        prompt.listen();
                        prompt.show(true);
                    }

                    function promptCpfCnpjYesNo(callback) {
                        var promptOptions = {
                            'id': 'naoBloquearCnpjCpfInvalido',
                            'title': 'CNPJ/CPF.',
                            'template': "<div><span>CNPJ/CPF inválido. Confirma o cadastro?</span></div>",
                            'onYes': function () {
                                this.show(false);
                                if (_promptInscricoesLegaisYesNo) {
                                    promptInscricoesLegaisYesNo(callback);
                                } else if (_promptInscricoresLegaisConfirm) {
                                    promptInscricoresLegaisConfirm();
                                } else {
                                    callback();
                                }
                            },
                            'onNo': function () {
                                this.show(false);
                                document.querySelector('a[href="#principal"]').click();
                                setTimeout(function () {
                                    document.getElementById('inputInscricaoEstadual').focus();
                                }, 300);
                            }
                        };
                        var prompt = new PromptDialogYesNo(promptOptions);
                        prompt.make();
                        prompt.listen();
                        prompt.show(true);
                    }

                    function promptInscricoresLegaisConfirm() {

                        var promptOptions = {
                            'id': 'inscricaoEstadualInvalida',
                            'title': 'Inscrição Estadual.',
                            'template': "<div><span>Inscrição estadual inválida.</span></div>",
                            'onOk': function () {
                                this.show(false);
                                document.querySelector('a[href="#inscricoesLegais"]').click();
                                setTimeout(function () {
                                    document.getElementById('inputInscricaoEstadual').focus();
                                }, 300);
                            }
                        };
                        var prompt = new PromptDialog(promptOptions);
                        prompt.make();
                        prompt.listen();
                        prompt.show(true);
                    }

                    function promptInscricoesLegaisYesNo(callback) {
                        var promptOptions = {
                            'id': 'naoBloquearInscricaoEstadualInvalida',
                            'title': 'Inscrição Estadual.',
                            'template': "<div><span>Inscrição estadual inválida. Confirma o cadastro?</span></div>",
                            'onYes': function () {
                                this.show(false);
                                callback();
                            },
                            'onNo': function () {
                                this.show(false);
                                document.querySelector('a[href="#inscricoesLegais"]').click();
                                setTimeout(function () {
                                    document.getElementById('inputInscricaoEstadual').focus();
                                }, 300);
                            }
                        };
                        var prompt = new PromptDialogYesNo(promptOptions);
                        prompt.make();
                        prompt.listen();
                        prompt.show(true);
                    }

                    return {
                        isValid: function () { return _valid; },
                        setValid: function (valid) { _valid = valid; },
                        setPromptCpfCnpjYesNo: function (promptCpfCnpjYesNo) { _promptCpfCnpjYesNo = promptCpfCnpjYesNo; },
                        setPromptCpfCnpjConfirm: function (promptCpfCnpjConfirm) { _promptCpfCnpjConfirm = promptCpfCnpjConfirm; },
                        setPromptInscricoesLegaisYesNo: function (promptInscricoesLegaisYesNo) { _promptInscricoesLegaisYesNo = promptInscricoesLegaisYesNo; },
                        setPromptInscricoresLegaisConfirm: function (promptInscricoresLegaisConfirm) { _promptInscricoresLegaisConfirm = promptInscricoresLegaisConfirm; },
                        setPromptEmailConfirm: function (promptEmailConfirm) { _promptEmailConfirm = promptEmailConfirm; },
                        done: done
                    };
                })({ valid: true });

                deferred.resolve(data, dataCpfCnpj, dataInscricaoEstadual);
                return deferred.promise();
            };
        };

        function updateFirstState() {
            firstState.TipoPessoa = document.getElementById('selectTipoPessoa').value;

            if (firstState.TipoPessoa == PessoaType.FISICA) {
                firstState.CnpjCpf = document.getElementById('inputCpf').value;
            } else if (firstState.TipoPessoa == PessoaType.JURIDICA) {
                firstState.CnpjCpf = document.getElementById('inputCnpj').value;
            }

            firstState.InscricaoEstadual = document.getElementById('inputInscricaoEstadual').value;
            firstState.RazaoSocial = document.getElementById('inputRazaoSocial').value;
            mostrarVigencia = false;
        }

        function equalsObject(right, left) {
            var a = JSON.stringify(right);
            var b = JSON.stringify(left);
            return a == b;
        }

        return {
            Cadastros: function (params) {
                return (function () {
                    var isAlteracao = params.Method == 'update' ? true : false;
                    var podeIncluirAlterar = params.UsuarioAtualPodeIncluirAlterar;

                    var lastEnderecoStatus = {
                        Endereco: '',
                        IsSemNumero: false,
                        Numero: '',
                        Complemento: '',
                        Bairro: ''
                    };
                    var gravarHistorico = params.GravarHistorico;

                    var modoCf = '';
                    if (params.Option == 'Clientes')
                        modoCf = 'Cliente';
                    else
                        modoCf = 'Fornecedor';

                    baseTableEndereco.id = 'gridEnderecos';
                    baseTableEndereco.route = window.baseUrl + 'Empresarial/Cadastros/Get/Enderecos';
                    baseTableEndereco.make();
                    baseTableEndereco.listen();
                    baseTableEndereco.onChange = function () {
                        "use strict";
                        var self = this;
                        var $data = self.getSelectedData();
                        currentEndereco($data);
                        if (gravarHistorico && isAlteracao) {
                            setEnderecoLastStatus($data);
                        }
                        if (podeIncluirAlterar) {
                            adicionandoEndereco(false);
                        }
                    };

                    var icmsSwitcherOptions = {
                        groupSelector: '[name=tipoIcms]',
                        onChange: function (input) {
                            var value = input.value;

                            if (value == IcmsType.NAO_CONTRIBUINTE || IcmsType.ISENTO) {
                                console.log('Desabilitar campo inscrição');
                                enableInputInscricaoEstadual(false);
                            }

                            if (value == IcmsType.CONTRIBUINTE) {
                                console.log('Habilitar campo inscrição');
                                enableInputInscricaoEstadual(true);
                            }
                        }
                    };
                    var icmsSwitcher = new RadioSwitcher(icmsSwitcherOptions);

                    function enableInputInscricaoEstadual(option) {
                        var inputInscricaoEstadual = document.getElementById('inputInscricaoEstadual');
                        inputInscricaoEstadual.disabled = !option;
                        inputInscricaoEstadual.required = option;
                    }

                    function setEnderecoLastStatus(data) {
                        lastEnderecoStatus.Endereco = data.Endereco;
                        lastEnderecoStatus.IsSemNumero = data.IsSemNumero;
                        lastEnderecoStatus.Numero = data.Numero;
                        lastEnderecoStatus.Complemento = data.Complemento;
                        lastEnderecoStatus.Bairro = data.Bairro;
                    }

                    function checkEnderecoLastStatus(data) {
                        if (lastEnderecoStatus.Endereco != data.Endereco)
                            return false;
                        if (lastEnderecoStatus.IsSemNumero != data.IsSemNumero)
                            return false;
                        if (lastEnderecoStatus.Numero != data.Numero)
                            return false;
                        if (lastEnderecoStatus.Complemento != data.Complemento)
                            return false;
                        if (lastEnderecoStatus.Bairro != data.Bairro)
                            return false;

                        return true;
                    }

                    function gravarHistoricoAction(endereco) {
                        var result = checkEnderecoLastStatus(endereco);
                        if (!result) {
                            mostrarVigencia = true;
                        }
                    }

                    dropDownUfEnderecos.make();
                    dropDownUfEnderecos.disable();

                    promptDataVigencia.make();
                    promptDataVigencia.listen();

                    var dropTipoPessoa = $('#selectTipoPessoa').kendoDropDownList({
                        change: function () {
                            var value = this.value();

                            var $inputCpf = $('#inputCpf');
                            var $labelCpf = $('#labelCpf');
                            var $inputCnpj = $('#inputCnpj');
                            var $labelCnpj = $('#labelCnpj');

                            var labelRazaoSocial = document.getElementById('labelRazaoSocial');
                            var labelNomeFantasia = document.getElementById('labelNomeFantasia');

                            if (value == PessoaType.FISICA) {
                                labelRazaoSocial.innerHTML = 'Nome:';
                                labelNomeFantasia.innerHTML = 'Apelido:';

                                $inputCnpj.val('');
                                $inputCnpj.hide();
                                $inputCnpj.attr('hidden', 'hidden');
                                $labelCnpj.hide();

                                $inputCpf.val('000.000.000-00');
                                $inputCpf.show();
                                $inputCpf.removeAttr('hidden');
                                $labelCpf.show();

                                enableInputInscricaoEstadual(false);
                                $('#liTabInscLegais').attr('hidden', 'hidden');
                            } else if (value == PessoaType.JURIDICA) {
                                labelRazaoSocial.innerHTML = 'Razão Social:';
                                labelNomeFantasia.innerHTML = 'Nome Fantasia:';

                                $inputCpf.val('');
                                $inputCpf.hide();
                                $labelCpf.hide();
                                $inputCpf.attr('hidden', 'hidden');

                                $inputCnpj.val('00.000.000/0000-00');
                                $inputCnpj.show();
                                $inputCnpj.removeAttr('hidden');
                                $labelCnpj.show();

                                enableInputInscricaoEstadual(true);
                                $('#liTabInscLegais').removeAttr('hidden', 'hidden');
                            }
                        }
                    }).data('kendoDropDownList');
                    var dropTipoEndereco = $('#selectTipoEndereco').kendoDropDownList().data('kendoDropDownList');

/*
                    $('#inputCpf').on('blur', function (ev) {
                        var validarCpfUrl = window.baseUrl + 'Api/Validar/ValidateCpfCnpj';
                        var cf = currentCf();
                        var data = { Data: cf.CnpjCpf, TipoCfrt: modoCf, TipoPessoa: "70", Codigo: cf.Codigo };
                        $.post(validarCpfUrl, data).done(function (mess) {
                            if (mess.Message !== undefined) {
                                util.dialogOk(
                                    "Aviso",
                                    mess.Message,
                                    function () {
                                        if (mess.Valido)
                                            $("#buttonCadastrarCf").removeAttr("disabled");
                                        else
                                            $("#buttonCadastrarCf").attr("disabled", "disabled");
                                    }
                                );
                                $('#linkDialog').click();
                            } else {
                                $("#buttonCadastrarCf").removeAttr("disabled");
                            }
                        });
                    });
                    
                    $('#inputCnpj').on('blur', function (ev) {
                        var validarCnpjUrl = window.baseUrl + 'Api/Validar/ValidateCpfCnpj';
                        var cf = currentCf();
                        var data = { Data: cf.CnpjCpf, TipoCfrt: modoCf, TipoPessoa: "74", Codigo: cf.Codigo };
                        $.post(validarCnpjUrl, data).done(function (mess) {
                            if (mess.Message !== undefined) {
                                util.dialogOk(
                                    "Aviso",
                                    mess.Message,
                                    function () {
                                        if (mess.Valido)
                                            $("#buttonCadastrarCf").removeAttr("disabled");
                                        else
                                            $("#buttonCadastrarCf").attr("disabled", "disabled");
                                    }
                                );
                                $('#linkDialog').click();
                            } else {
                                $("#buttonCadastrarCf").removeAttr("disabled");
                            }
                        });
                    });
                    
                    $('#inputInscricaoEstadual').on('blur', function (ev) {
                        var cf = currentCf();
                    
                        if (cf.TipoPessoa == 70)
                            return;
                    
                        var validarInscricaoEstUrl = window.baseUrl + 'Api/Validar/ValidateInscricaoEstadual';                        
                        var data = { Data: cf.InscricaoEstadual, Uf: cf.Uf };
                    
                        $.post(validarInscricaoEstUrl, data).done(function (mess) {
                            if (mess.Message !== undefined) {                                
                                util.dialogOk(
                                    "Aviso",
                                    mess.Message,
                                    function () {
                                        if (mess.Valido)
                                            $("#buttonCadastrarCf").removeAttr("disabled");
                                        else
                                            $("#buttonCadastrarCf").attr("disabled", "disabled");
                                    }
                                );
                                $('#linkDialog').click();
                            } else {
                                $("#buttonCadastrarCf").removeAttr("disabled");
                            }
                        });
                    });
                                        
                    $('#inputEmail').on('blur', function (ev) {
                        var validarEmailUrl = window.baseUrl + 'Api/Validar/ValidateEmail';
                        var cf = currentCf();
                        var data = { Data: cf.Email };
                    
                        $.post(validarEmailUrl, data).done(function (mess) {
                            if (!mess.Valido) {
                                util.dialogOk("Aviso", mess.Message);
                                $('#linkDialog').click();
                            }
                        });
                    });
*/

                    var validatorMunicipioEndereco = new ValidatorEx({
                        field: 'CodigoMunicipio',
                        inputId: 'inputCodigoMunicipioEndereco',
                        descriptionId: 'descriptionCodigoMunicipioEndereco',
                        onPendencyMessage: 'Deve ser informado o código do município.',
                        route: 'Empresarial/F4Municipio/GetMunicipio',
                        onValid: function (data) {
                            bindMunicipoEnderecoData(data);
                        },
                        onInvalid: function () {
                            var self = this;
                            self.focus();
                            self.value = "";
                            self.input.value = "";
                        },
                        onEmpty: function () {
                            bindMunicipoEnderecoData();
                        }
                    });
                    validatorMunicipioEndereco.listen();

                    var tableMunicipiosEndereco = new Table({
                        'id': 'tableMunicipiosEndereco',
                        'route': window.baseUrl + 'Empresarial/F4Municipio/GetMunicipios',
                        'columns': [
                            { title: 'Código', field: 'Codigo', width: 60, headerAttributes: { style: "color: black; text-align: center;" }, attributes: { style: "text-align: right;" } },
                            { title: 'Nome', field: 'Nome', width: 240, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: 'UF', field: 'Uf', width: 35, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        'showFilter': true,
                        'onChange': function () {
                            "use strict";
                            var self = this;
                            var ok = document.getElementById('inputF4ModalOk' + this.id);
                            ok.onclick = function () {
                                var $data = self.getSelectedData();
                                bindMunicipoEnderecoData($data);
                            };
                        },
                        'onDataBound': function () {
                            var self = this;
                            $('#' + self.id + ' table tr').on('dblclick', function () {
                                var $data = self.getSelectedData();
                                bindMunicipoEnderecoData($data);
                                $cancel.click();
                            });

                            var $ok = $('#inputF4ModalOk' + self.id);
                            var $cancel = $ok.next();
                            $cancel.onclick = function (ev) {
                                ev.preventDefault();
                            };
                        },
                        'dataSourceType': "Filtered"
                    });
                    var linkButtonModalMunicipiosEndereco = document.getElementById('linkButtonModalMunicipiosEndereco');
                    var inputMunicipiosEndereco = document.getElementById('inputCodigoMunicipioEndereco');
                    var modalMunicipiosEndereco = new Modal('Municípios', linkButtonModalMunicipiosEndereco, inputMunicipiosEndereco, tableMunicipiosEndereco);
                    modalMunicipiosEndereco.listen();

                    $('#buttonAdicionarEndereco').on('click', function (ev) {
                        currentEndereco(function (endereco) {
                            var url = window.baseUrl + 'Empresarial/Cadastros/Crud/Enderecos/{0}';
                            var postUrl = url.format('Create');
                            var view = baseTableEndereco.grid.dataSource.view().toJSON();
                            var required = checkRequiredEndereco();
                            if (!required) {
                                if (temEnderecoTipo(view, endereco.Tipo)) {
                                    util.dialogOk('Aviso', 'Tipo de endereço já cadastrado.');
                                    $('#linkDialog').click();
                                } else {
                                    $.post(postUrl, endereco)
                                        .done(function (data) {
                                            baseTableEndereco.refresh();
                                            currentEndereco(data);
                                            updateMascaraInscricaoEstadual();
                                        });
                                }
                            } else {
                                var message = required.dataset.message;
                                util.dialogOk('Aviso', message, function () {
                                    setTimeout(function () {
                                        required.focus();
                                    }, 20);
                                });
                                $('#linkDialog').click();
                            }

                            masker();
                        });
                    });
                    $('#buttonAlterarEndereco').on('click', function (ev) {
                        currentEndereco(function (endereco) {
                            var url = window.baseUrl + 'Empresarial/Cadastros/Crud/Enderecos/{0}';
                            var postUrl = url.format('Update');
                            var view = baseTableEndereco.grid.dataSource.view().toJSON();
                            var selectedData = baseTableEndereco.getSelectedData();
                            var required = checkRequiredEndereco();
                            if (!required) {
                                var index = temEnderecoAlteracaoMesmoTipo(endereco, view, selectedData);
                                if (index >= 0) {
                                    baseTableEndereco.clearSelectedData();
                                    $($('#gridEnderecos tr')[index + 1]).addClass('k-state-selected');
                                    var selLocal = baseTableEndereco.getSelectedData();
                                    currentEndereco(selLocal);
                                } else {
                                    endereco.Index = selectedData.Index;
                                    if (gravarHistorico && isAlteracao) {
                                        gravarHistoricoAction(endereco);
                                    }
                                    $.post(postUrl, endereco).done(function (data) {
                                        baseTableEndereco.refresh();
                                        currentEndereco(data);
                                        adicionandoEndereco(true);
                                        updateMascaraInscricaoEstadual();
                                    });
                                }
                            } else {
                                var message = required.dataset.message;
                                util.dialogOk('Aviso', message, function () {
                                    setTimeout(function () {
                                        required.focus();
                                    }, 20);
                                });
                                $('#linkDialog').click();
                            }

                            masker();
                        });
                    });
                    $('#buttonRemoverEndereco').on('click', function (ev) {
                        currentEndereco(function (endereco) {
                            var postUrl = window.baseUrl + 'Empresarial/Cadastros/Crud/Enderecos/Delete';
                            $.post(postUrl, endereco).done(function (data) {
                                baseTableEndereco.refresh();
                                adicionandoEndereco(true);
                                currentEndereco(data);
                                updateMascaraInscricaoEstadual();
                                if (gravarHistorico && isAlteracao) {
                                    mostrarVigencia = true;
                                }
                            });
                            masker();
                        });
                    });

                    $('#inputNumero').setMask('integer');

                    $("#checkSemNumero").on("click", function () {
                        if (isChecked("checkSemNumero")) {
                            $("#inputNumero").val("");
                            $("#inputNumero").attr("disabled", "disabled");
                        } else {
                            $("#inputNumero").removeAttr("disabled");
                        }
                    });

                    function currentEndereco(callback) {
                        if (callback == undefined)
                            return;

                        if (typeof callback == 'function') {
                            var endereco = {};

                            endereco.Tipo = dropTipoEndereco.value();
                            endereco.Endereco = document.getElementById("inputEndereco").value;
                            endereco.Complemento = document.getElementById("inputComplemento").value;
                            endereco.Bairro = document.getElementById("inputBairro").value;
                            endereco.Cep = document.getElementById("inputCep").value;
                            endereco.CodigoMunicipio = document.getElementById("inputCodigoMunicipioEndereco").value;
                            endereco.Uf = document.getElementById("selectUfEnderecos").value;
                            endereco.Telefone1Codigo = document.getElementById("inputTelefone1Codigo").value;
                            endereco.Telefone1Numero = document.getElementById("inputTelefone1Numero").value;
                            endereco.Telefone2Codigo = document.getElementById("inputTelefone2Codigo").value;
                            endereco.Telefone2Numero = document.getElementById("inputTelefone2Numero").value;
                            endereco.Contato = document.getElementById("inputEnderecoContato").value;
                            endereco.Email = document.getElementById("inputEnderecoEmail").value;
                            endereco.IsSemNumero = document.getElementById("checkSemNumero").checked;

                            if (endereco.IsSemNumero) {
                                $("#inputNumero").val("");
                                $("#inputNumero").attr("disabled", "disabled");
                            } else {
                                endereco.Numero = document.getElementById("inputNumero").value;
                            }

                            callback(endereco);
                            updateMascaraInscricaoEstadual();
                            bindMunicipoEnderecoData();
                        }

                        if (typeof callback == 'object') {
                            dropTipoEndereco.value(callback.Tipo);

                            document.getElementById("inputEndereco").value = callback.Endereco;
                            document.getElementById("inputComplemento").value = callback.Complemento;
                            document.getElementById("inputBairro").value = callback.Bairro;
                            document.getElementById("inputCep").value = callback.Cep;
                            document.getElementById("inputCodigoMunicipioEndereco").value = callback.CodigoMunicipio;
                            document.getElementById("descriptionCodigoMunicipioEndereco").innerHTML = callback.Municipio;
                            document.getElementById("inputTelefone1Codigo").value = callback.Telefone1Codigo;
                            document.getElementById("inputTelefone1Numero").value = callback.Telefone1Numero;
                            document.getElementById("inputTelefone2Codigo").value = callback.Telefone2Codigo;
                            document.getElementById("inputTelefone2Numero").value = callback.Telefone2Numero;
                            document.getElementById("inputEnderecoContato").value = callback.Contato;
                            document.getElementById("inputEnderecoEmail").value = callback.Email;
                            document.getElementById("checkSemNumero").checked = callback.IsSemNumero;

                            dropDownUfEnderecos.set(callback.Uf);
                            dropDownUfEnderecos.change();

                            if (callback.IsSemNumero) {
                                $("#inputNumero").val("");
                                $("#inputNumero").attr("disabled", "disabled");
                            } else {
                                document.getElementById("inputNumero").value = callback.Numero;
                                $("#inputNumero").removeAttr("disabled", "disabled");
                            }
                        }
                    }

                    $('#buttonCadastrarCf').on('click', function (ev) {
                        var options = {};
                        options.cf = currentCf();
                        options.tipo = modoCf;
                        options.drop = dropTipoPessoa;
                        options.mostrarVigencia = mostrarVigencia;

                        checkCadastroCf(options, function () {
                            var cf;
                            if (!isAlteracao) {
                                cf = currentCf();
                                mostrarVigencia = false;
                                criaCf(modoCf, cf, dropTipoPessoa);
                                isAlteracao = true;
                            } else {
                                cf = currentCf();
                                checkMostrarVigencia(cf);
                                alteraCf(modoCf, cf, dropTipoPessoa, mostrarVigencia, promptDataVigencia);
                            }
                        });
                    });
                    $('#buttonCancelarCf').on('click', function (ev) {
                        var current = currentCf();
                        if (!equalsObject(firstState, current)) {
                            util.dialog("Aviso", "Deseja abandonar as alterações?", abandonarAlteracoes);
                            $('#linkDialogModal').click();
                        } else {
                            abandonarAlteracoes();
                        }

                        function abandonarAlteracoes() {
                            "use strict";
                            var url = window.baseUrl + 'Empresarial/Cadastros/Set/{0}/{1}';
                            var postUrl = url.format('New', modoCf);
                            $.post(postUrl)
                                    .done(function () {
                                        window.location = window.baseUrl + 'Empresarial/Cadastros/Listar/' + params.Option;
                                    });
                        }
                    });
                    $('#buttonNovoCf').on('click', function (ev) {
                        window.location = window.baseUrl + 'Empresarial/Cadastros/' + params.Option;
                    });

                    function checkMostrarVigencia(cf) {
                        if (firstState.CnpjCpf != cf.CnpjCpf)
                            mostrarVigencia = true;
                        if (firstState.InscricaoEstadual != cf.InscricaoEstadual)
                            mostrarVigencia = true;
                        if (firstState.RazaoSocial != cf.RazaoSocial)
                            mostrarVigencia = true;
                    }

                    function currentCf(callback) {
                        var cf;
                        if (callback == undefined) {
                            cf = getCf();
                            return cf;
                        }

                        if (typeof callback == 'function') {
                            cf = getCf();
                            callback(cf);
                        }

                        if (typeof callback == 'object') {
                            if (isAlteracao)
                                document.getElementById('inputCodigo').value = callback.Codigo;

                            dropTipoPessoa.value(callback.TipoPessoa);
                            dropTipoPessoa.trigger('change');
                            document.getElementById('selectTipoPessoa').value = callback.TipoPessoa;

                            if (callback.TipoPessoa == 70) {
                                document.getElementById('inputCpf').value = callback.CnpjCpf;
                            } else if (callback.TipoPessoa == 74) {
                                document.getElementById('inputCnpj').value = callback.CnpjCpf;
                            }

                            document.getElementById('inputClassificao').value = callback.Classificacao;
                            document.getElementById('inputRazaoSocial').value = callback.RazaoSocial;
                            document.getElementById('inputNomeFantasia').value = callback.NomeFantasia;
                            document.getElementById('inputContato').value = callback.Contato;
                            document.getElementById('inputEmail').value = callback.Email;
                            document.getElementById('inputHomepage').value = callback.Homepage;
                            document.querySelector("input[name=tipoIcms][value='" + callback.TipoContribuinte + "']").click();
                            document.getElementById('inputInscricaoEstadual').value = callback.InscricaoEstadual;
                        }
                    };

                    function getCf() {
                        var cf = {};

                        if (isAlteracao)
                            cf.Codigo = document.getElementById('inputCodigo').value;

                        cf.TipoPessoa = dropTipoPessoa.value();
                        var $input = $('.cpf-cnpj input').not('[hidden=hidden]');
                        cf.CnpjCpf = $input.val();
                        cf.Classificacao = document.getElementById('inputClassificao').value;
                        cf.RazaoSocial = document.getElementById('inputRazaoSocial').value;
                        cf.NomeFantasia = document.getElementById('inputNomeFantasia').value;
                        cf.Contato = document.getElementById('inputContato').value;
                        cf.Email = document.getElementById('inputEmail').value;
                        cf.Homepage = document.getElementById('inputHomepage').value;
                        cf.TipoContribuinte = document.querySelector('[name=tipoIcms]:checked').value;
                        cf.InscricaoEstadual = document.getElementById('inputInscricaoEstadual').value;
                        cf.Uf = dropDownUfEnderecos.get();
                        return cf;
                    }

                    function postAction() {
                        selectModeAlteracao(dropTipoPessoa, true);
                        document.querySelector('a[href="#principal"]').click();
                        isAlteracao = true;
                        firstState = currentCf();
                        masker();
                    };

                    if (!isAlteracao) {
                        selectModeAlteracao(dropTipoPessoa, false);
                        icmsSwitcher.change();
                    } else {
                        selectModeAlteracao(dropTipoPessoa, true);
                        icmsSwitcher.change();
                    }

                    adicionandoEndereco(true);
                    currentCf(params.Model);
                    firstState = currentCf();
                    console.log(firstState);

                    util.addButtonHelpBreadcrumb("RadarWEB.htm", "Empresarial - Cadastros - Clientes/Fornecedores");
                    makeDatePicker("#inputDataFinalVigencia");
                    updateMascaraInscricaoEstadual();
                    masker();

                    if (!podeIncluirAlterar) {
                        disableAllInputs();
                        $('#selectTipoPessoa').attr("disabled", "disabled");
                        $('#selectTipoEndereco').attr("disabled", "disabled");
                        $('#selectUfEnderecos').attr("disabled", "disabled");
                        $('#buttonAlterarEndereco').attr("disabled", "disabled");
                        $('#buttonRemoverEndereco').attr("disabled", "disabled");
                    }
                })(params);
            },

            Listar: function (params) {
                return (function () {
                    var modoCf = '';

                    if (params.Option == 'Clientes')
                        modoCf = 'Cliente';
                    else
                        modoCf = 'Fornecedor';

                    console.log(params);
                    baseTable.id = 'grid' + params.Option;
                    baseTable.route = window.baseUrl + 'Empresarial/Cadastros/Get/' + params.Option;
                    baseTable.make();
                    baseTable.listen();
                    baseTable.onChange = function () {
                        "use strict";
                        var self = this;
                        var $data = self.getSelectedData();
                        window.location = window.baseUrl + 'Empresarial/Cadastros/' + params.Option + '/' + $data.Codigo;
                    };

                    var switcherOptions = {
                        groupSelector: '[name=tipoPessoa]',
                        onChange: function (input) {
                            var value = input.value;

                            var $inputCpf = $('#inputCpf');
                            var $labelCpf = $('#labelCpf');
                            var $inputCnpj = $('#inputCnpj');
                            var $labelCnpj = $('#labelCnpj');

                            var labelRazaoSocial = document.getElementById('labelFiltroRazaoSocial');

                            if (value == 70) {
                                labelRazaoSocial.innerHTML = 'Nome:';
                                $inputCnpj.val('');
                                $inputCnpj.hide();
                                $inputCnpj.attr('hidden', 'hidden');
                                $labelCnpj.hide();

                                //$inputCpf.val('000.000.000-00');
                                $inputCpf.show();
                                $inputCpf.removeAttr('hidden');
                                $labelCpf.show();
                            } else if (value == 74 || value == 0) {
                                labelRazaoSocial.innerHTML = 'Razão Social:';
                                $inputCpf.val('');
                                $inputCpf.hide();
                                $labelCpf.hide();
                                $inputCpf.attr('hidden', 'hidden');

                                //$inputCnpj.val('00.000.000/0000-00');
                                $inputCnpj.show();
                                $inputCnpj.removeAttr('hidden');
                                $labelCnpj.show();
                            }

                            masker(true);
                        }
                    };
                    var switcher = new RadioSwitcher(switcherOptions);

                    dropDownUf.route = 'Empresarial/Combos/GetUfAndEmpty';
                    dropDownUf.make();

                    var validatorMunicipio = new Validator({
                        field: 'CodigoMunicipio',
                        onPendencyMessage: 'Deve ser informado o código do município.',
                        route: 'Empresarial/F4Municipio/GetMunicipio',
                        onValid: function (data) {
                            document.getElementById('inputCodigoMunicipio').value = data.Codigo;
                            document.getElementById('descriptionCodigoMunicipio').innerHTML = data.Nome;
                            dropDownUf.set(data.Uf);
                            dropDownUf.disable();
                        },
                        onInvalid: function () {
                            var self = this;
                            self.focus();
                            self.value = "";
                            self.input.value = "";
                            dropDownUf.enable();
                        },
                        onEmpty: function () {
                            dropDownUf.enable();
                        }
                    });
                    validatorMunicipio.listen();

                    function toggleMunicipio() {
                        var data = tableMunicipios.getSelectedData();
                        document.getElementById('inputCodigoMunicipio').value = data.Codigo;
                        document.getElementById('descriptionCodigoMunicipio').innerHTML = data.Nome;

                        validatorMunicipio.update();
                        validatorMunicipio.validate();
                        $('#modalMunicipio').modal('hide');
                        $('#filtroModal').modal('show');
                    }
                    var tableMunicipios = new Table({
                        'id': 'tableMunicipios',
                        'route': window.baseUrl + 'Empresarial/F4Municipio/GetMunicipios',
                        'columns': [
                            { title: 'Código', field: 'Codigo', width: 60, headerAttributes: { style: "color: black; text-align: center;" }, attributes: { style: "text-align: right;" } },
                            { title: 'Nome', field: 'Nome', width: 240, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: 'UF', field: 'Uf', width: 35, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        'showFilter': true,
                        'onChange': function () {
                            "use strict";
                            var ok = document.getElementById('inputF4ModalOk' + this.id);
                            ok.onclick = function () {
                                toggleMunicipio();
                            };
                        },
                        'onDataBound': function () {
                            $('#filtroModal').modal('hide');
                            $('#tableMunicipios table  tr').on('dblclick', function () {
                                toggleMunicipio();
                            });

                            var $ok = $('#inputF4ModalOk' + this.id);
                            var $cancel = $ok.next();
                            $cancel.on('click', function () {
                                $('#modalMunicipio').modal('hide');
                                $('#filtroModal').modal('show');
                            });
                        },
                        'dataSourceType': "Filtered"
                    });
                    var linkButtonModalMunicipios = document.getElementById('linkButtonModalMunicipios');
                    var inputMunicipios = document.getElementById('inputCodigoMunicipio');
                    var modalMunicipios = new Modal('Municípios', linkButtonModalMunicipios, inputMunicipios, tableMunicipios);
                    modalMunicipios.listen();

                    $('#doFilter').on('click', function () {
                        doFilter();
                    });
                    $('#removeFilter').on('click', function () {
                        validatorMunicipio.setValue('');
                        dropDownUf.setIndex(0);
                        dropDownUf.enable();
                        document.getElementById('radioFisica').checked = true;
                        document.getElementById('inputFiltroRazaoSocial').value = '';
                        document.getElementById('inputCnpj').value = '';
                        document.getElementById('inputCpf').value = '';
                        document.querySelector("input[name=tipoPessoa][value='0']").checked = true;

                        var dataSource = new kendo.data.DataSource(
                            baseTable.getFilteredDataSource()
                        );
                        baseTable.setDataSource(dataSource);
                    });
                    $('#inputFilter').on('click', function () {
                        $("#filtroModal").modal('show');
                    });

                    if (!params.UsuarioAtualPodeIncluirAlterar) {
                        $("#buttonCadastrar").attr("disabled", "disabled");
                    } else {
                        $("#buttonCadastrar").on('click', function () {
                            window.location.href = window.baseUrl + 'Empresarial/Cadastros/' + params.Option;
                        });
                    }

                    function onCpfCnpjExistente(tipo, filter, existenteCall, inexistenteCall) {
                        var validarCpfCnpjUrl = window.baseUrl + 'Api/Validar/IsCnpjCpfExistente';

                        var data = { Data: filter.CnpjCpf, TipoCfrt: tipo, TipoPessoa: filter.TipoPessoa };

                        $.post(validarCpfCnpjUrl, data).done(function (mess) {
                            if (mess.IsExistente) {
                                existenteCall(filter);
                            } else {
                                inexistenteCall(filter);
                            }
                        });
                    }

                    function doFilter() {
                        var filter = {};
                        filter.CodigoMunicipio = validatorMunicipio.getValue();
                        filter.Uf = dropDownUf.get();
                        filter.Pessoa = $('input[name=tipoPessoa]:checked').val();
                        filter.RazaoSocial = document.getElementById('inputFiltroRazaoSocial').value;

                        if (filter.Pessoa == 70)
                            filter.CnpjCpf = document.getElementById('inputCpf').value;
                        else
                            filter.CnpjCpf = document.getElementById('inputCnpj').value;

                        onCpfCnpjExistente(modoCf, filter, function (filtro) {
                            var dataSource = new kendo.data.DataSource(
                                baseTable.getFilteredDataSource(filtro));
                            baseTable.setDataSource(dataSource);
                        }, function (filtro) {
                            util.dialogOk(
                             "Aviso",
                             "Não existem dados para o filtro selecionado.",
                             function () {
                                 filtro.CnpjCpf = null;
                                 //var dataSource = new kendo.data.DataSource(
                                 //baseTable.getFilteredDataSource(filtro));
                                 var dataSource = new kendo.data.DataSource();
                                 baseTable.setDataSource(dataSource);
                             });
                            $('#linkDialog').click();
                        });
                    }

                    document.getElementById('tableTitle').innerHTML = params.Option;

                    masker(true);
                    util.addButtonHelpBreadcrumb("RadarWEB.htm", "Empresarial - Cadastros - Clientes/Fornecedores");
                })(params);
            },

            RelatoriosPlanoEmpresarial: function (params) {
                return (function () {
                    var u = new Util();
                    $("<div id='modalDiv'>").appendTo("body");

                    u.addButtonHelpBreadcrumb("RadarWEB.htm", "Tela Inicial");

                    var validatorContaContabil = new Validator({
                        field: "inputCodigoContaContabil",
                        fieldDescriptionId: "descriptionCodigoContaContabil",
                        fieldSearch: "CodigoContaContabil",
                        onPendencyMessage: "Deve ser informado o código da Conta Contabil.",
                        route: "Empresarial/F4ContaContabil/GetContaContabil",
                        v2: "v3",
                        onValid: function (data) {
                            if (data.Tipo !== "T") {
                                u.alert("Conta deve ser do tipo título", alertBehavior.warning);
                                validatorContaContabil.clear({ error: true });
                                validatorContaContabil.update();
                            } else {
                                $("#inputCodigoContaContabil").val(data.Codigo);
                                $("#descriptionCodigoContaContabil").html(data.Nome);
                            }
                        },
                        onInvalid: function (data) {
                            validatorContaContabil.clear({ error: true });
                            validatorContaContabil.focus();
                        },
                        onEmpty: function () {
                            validatorContaContabil.clear();
                        }
                    });
                    validatorContaContabil.listen();

                    var tableContaContabil = new Table({
                        "id": "tableContaContabil",
                        "route": window.baseUrl + "Empresarial/F4ContaContabil/GetContasContabeis",
                        "showFilter": true,
                        "columns": [
                            { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Nome", field: "Nome", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Classificação", field: "Classificacao", width: 100, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Tipo", field: "Tipo", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        "onChange": function () {
                            $("#inputF4ModalOk" + this.id).on("click", function () {
                                var data = tableContaContabil.getSelectedData();
                                validatorContaContabil.onValid(data);
                                validatorContaContabil.update();
                                $("#modalContaContabil").modal("hide");
                            });
                            $("#inputF4ModalCancelar").on("click", function () {
                                $("#modalContaContabil").modal("hide");
                            });
                        },
                        "onDataBound": function () {
                            $("#tableContaContabil table tr").on("dblclick", function () {
                                var data = tableContaContabil.getSelectedData();
                                validatorContaContabil.onValid(data);
                                validatorContaContabil.update();
                                $("#modalContaContabil").modal("hide");
                            });
                            $("#inputF4ModalCancelar").on("click", function () {
                                $("#modalContaContabil").modal("hide");
                            });
                        },
                        "dataSourceType": "Filtered"
                    });

                    var options = {
                        useClassePai: true,
                        ClassePaiURL: "Empresarial/F4ContaContabil/GetClassesPai"
                    }
                    var modalContaContabil = new Modal("Conta Contábil",
                        byId("linkButtonModalContaContabil"),
                        byId("inputCodigoContaContabil"),
                        tableContaContabil,
                        null, options).listen();

                    var inputRelatorio = new DropDown({
                        "id": "inputRelatorio",
                        "route": "Empresarial/Relatorios/GetModelosPlanoEmpresarial"
                    });
                    inputRelatorio.make();

                    currentUser.update(params.User);
                    var inputs = currentUser.getCustomData("emp_rel_planoempresarial");
                    if (inputs === null || inputs === "") {
                    }
                    else {
                        inputs = JSON.parse(inputs);
                        inputRelatorio.set(inputs.Relatorio);
                        validatorContaContabil.setValue(inputs.ContaContabil);
                    }

                    $("#buttonOK").on("click", function () {
                        inputs = {
                            Relatorio: inputRelatorio.get(),
                            ContaContabil: validatorContaContabil.getValue()
                        }
                        currentUser.setCustomData("emp_rel_planoempresarial", JSON.stringify(inputs));

                        window.open(window.baseUrl + "Empresarial/Relatorios/GeraRelatorioPlanoEmpresarial?"
                            + "Relatorio=" + inputRelatorio.dropDown.dataItem().Text
                            + "&ContaContabil=" + getVal("inputCodigoContaContabil")
                        );
                    });
                })(params);
            },

            RelatoriosPlanoGerencial: function (params) {
                return (function () {
                    var u = new Util();
                    $("<div id='modalDiv'>").appendTo("body");

                    u.addButtonHelpBreadcrumb("RadarWEB.htm", "Tela Inicial");

                    var validatorContaGerencial = new Validator({
                        field: "inputCodigoContaGerencial",
                        fieldDescriptionId: "descriptionCodigoContaGerencial",
                        fieldSearch: "CodigoContaGerencial",
                        onPendencyMessage: "Deve ser informado o código da Conta Gerencial.",
                        route: "Empresarial/F4ContaGerencial/GetContaGerencial",
                        v2: "v3",
                        onValid: function (data) {
                            if (data.Tipo !== "T") {
                                u.alert("Conta deve ser do tipo título", alertBehavior.warning);
                                validatorContaGerencial.clear({ error: true });
                                validatorContaGerencial.update();
                            }
                            else {
                                $("#inputCodigoContaGerencial").val(data.Codigo);
                                $("#descriptionCodigoContaGerencial").html(data.Nome);
                            }
                        },
                        onInvalid: function (data) {
                            validatorContaGerencial.clear({ error: true });
                            validatorContaGerencial.focus();
                        },
                        onEmpty: function () {
                            validatorContaGerencial.clear();
                        }
                    });
                    validatorContaGerencial.listen();

                    var tableContaGerencial = new Table({
                        "id": "tableContaGerencial",
                        "route": window.baseUrl + "Empresarial/F4ContaGerencial/GetContasGerenciais",
                        "showFilter": true,
                        "columns": [
                            { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Nome", field: "Nome", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Classificação", field: "Classificacao", width: 100, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Tipo", field: "Tipo", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        "onChange": function () {
                            $("#inputF4ModalOk" + this.id).on("click", function () {
                                var data = tableContaGerencial.getSelectedData();
                                validatorContaGerencial.onValid(data);
                                validatorContaGerencial.update();
                                $("#modalContaGerencial").modal("hide");
                            });
                            $("#inputF4ModalCancelar").on("click", function () {
                                $("#modalContaGerencial").modal("hide");
                            });
                        },
                        "onDataBound": function () {
                            $("#tableContaGerencial table tr").on("dblclick", function () {
                                var data = tableContaGerencial.getSelectedData();
                                validatorContaGerencial.onValid(data);
                                validatorContaGerencial.update();
                                $("#modalContaGerencial").modal("hide");
                            });
                            $("#inputF4ModalCancelar").on("click", function () {
                                $("#modalContaGerencial").modal("hide");
                            });
                        },
                        "dataSourceType": "Filtered"
                    });

                    var options = {
                        useClassePai: true,
                        ClassePaiURL: "Empresarial/F4ContaGerencial/GetClassesPai"
                    }
                    var modalContaGerencial = new Modal("Conta Gerencial",
                        byId("linkButtonModalContaGerencial"),
                        byId("inputCodigoContaGerencial"),
                        tableContaGerencial,
                        null, options).listen();

                    var inputRelatorio = new DropDown({
                        "id": "inputRelatorio",
                        "route": "Empresarial/Relatorios/GetModelosPlanoGerencial"
                    });
                    inputRelatorio.make();

                    currentUser.update(params.User);
                    var inputs = currentUser.getCustomData("emp_rel_planogerencial");
                    if (inputs === null || inputs === "") {
                    }
                    else {
                        inputs = JSON.parse(inputs);
                        inputRelatorio.set(inputs.Relatorio);
                        validatorContaGerencial.setValue(inputs.ContaGerencial);
                    }

                    $("#buttonOK").on("click", function () {
                        inputs = {
                            Relatorio: inputRelatorio.get(),
                            ContaGerencial: validatorContaGerencial.getValue()
                        }
                        currentUser.setCustomData("emp_rel_planogerencial", JSON.stringify(inputs));

                        window.open(window.baseUrl + "Empresarial/Relatorios/GeraRelatorioPlanoGerencial?"
                            + "Relatorio=" + inputRelatorio.dropDown.dataItem().Text
                            + "&ContaGerencial=" + getVal("inputCodigoContaGerencial")
                        );
                    });
                })(params);
            }
        };
    })();

    Contabil.Manager = (function () {
        return {
            ConsultasSaldoContabil: function (params) {
                return (function () {
                    var u = new Util();
                    $("<div id='modalDiv'>").appendTo("body");

                    u.addButtonHelpBreadcrumb("RadarWEB.htm", "Tela Inicial");

                    // conta contabil
                    var validatorContaContabil = new Validator({
                        field: "inputCodigoContaContabil",
                        fieldDescriptionId: "descriptionCodigoContaContabil",
                        fieldSearch: "CodigoContaContabil",
                        onPendencyMessage: "Deve ser informado o código da Conta Contábil.",
                        route: "Empresarial/F4ContaContabil/GetContaContabil",
                        v2: "v3",
                        onValid: function (data) {
                            $("#inputCodigoContaContabil").val(data.Codigo);
                            $("#descriptionCodigoContaContabil").html(data.Nome);
                            validatorContaContabil.update();
                            executaConsulta();
                        },
                        onInvalid: function (data) {
                            validatorContaContabil.clear({ error: true });
                            validatorContaContabil.focus();
                            zeraCampos();
                        },
                        onEmpty: function () {
                            validatorContaContabil.clear();
                            zeraCampos();
                        }
                    });
                    validatorContaContabil.listen();

                    var tableContaContabil = new Table({
                        "id": "tableContaContabil",
                        "route": window.baseUrl + "Empresarial/F4ContaContabil/GetContasContabeis",
                        "showFilter": true,
                        "columns": [
                            { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Nome", field: "Nome", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Classificação", field: "Classificacao", width: 100, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Tipo", field: "Tipo", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        "onChange": function () {
                            $("#inputF4ModalOk" + this.id).on("click", function () {
                                var data = tableContaContabil.getSelectedData();
                                validatorContaContabil.onValid(data);
                                validatorContaContabil.update();
                                $("#modalContaContabil").modal("hide");
                            });
                            $("#inputF4ModalCancelar").on("click", function () {
                                $("#modalContaContabil").modal("hide");
                            });
                        },
                        "onDataBound": function () {
                            $("#tableContaContabil table tr").on("dblclick", function () {
                                var data = tableContaContabil.getSelectedData();
                                validatorContaContabil.onValid(data);
                                validatorContaContabil.update();
                                $("#modalContaContabil").modal("hide");
                            });
                            $("#inputF4ModalCancelar").on("click", function () {
                                $("#modalContaContabil").modal("hide");
                            });
                        },
                        "dataSourceType": "Filtered"
                    });

                    var options = {
                        useClassePai: true,
                        ClassePaiURL: "Empresarial/F4ContaContabil/GetClassesPai"
                    }
                    var modalContaContabil = new Modal("Conta Contábil",
                        byId("linkButtonModalContaContabil"),
                        byId("inputCodigoContaContabil"),
                        tableContaContabil,
                        null, options).listen();

                    // periodo
                    var inputPeriodoInicial = new DateValidator({
                        id: "inputPeriodoInicial",
                        v2: true,
                        constructInjection: function () {
                            makeDatePicker("#" + this.id);
                        },
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                            executaConsulta();
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                            zeraCampos();
                        },
                        onEmpty: function () {
                            zeraCampos();
                        }
                    });

                    var inputPeriodoFinal = new DateValidator({
                        id: "inputPeriodoFinal",
                        v2: true,
                        constructInjection: function () {
                            makeDatePicker("#" + this.id);
                        },
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                            executaConsulta();
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                            zeraCampos();
                        },
                        onEmpty: function () {
                            zeraCampos();
                        }
                    });

                    var comparePeriodoInicialComFinal = new DateComparer({
                        idA: "inputPeriodoInicial",
                        idB: "inputPeriodoFinal",
                        verb: "less",
                        onInvalid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.error);
                            u.alert("Data inicial deve ser anterior a data final.", alertBehavior.error);
                        },
                        onValid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.normal);
                        }
                    });

                    currentUser.update(params.User);
                    var inputs = currentUser.getCustomData("con_con_saldocontail");
                    if (inputs === null || inputs === "") {
                        inputPeriodoInicial.setValue(getDateNowDDMMYYYY());
                        inputPeriodoFinal.setValue(getDateNowDDMMYYYY());
                    } else {
                        inputs = JSON.parse(inputs);
                        validatorContaContabil.setValue(inputs.ContaContabil);
                        inputPeriodoInicial.setValue(inputs.PeriodoInicial);
                        inputPeriodoFinal.setValue(inputs.PeriodoFinal);
                    }

                    function zeraCampos() {
                        if (validatorContaContabil.invalid || !inputPeriodoInicial.isValid || !inputPeriodoFinal.isValid) {
                            setHtml("spanSaldoAnterior", "");
                            setHtml("spanDebitos", "");
                            setHtml("spanCreditos", "");
                            setHtml("spanSaldoAtual", "");
                        }
                    }

                    function executaConsulta() {
                        if (!validatorContaContabil.invalid && inputPeriodoInicial.isValid && inputPeriodoFinal.isValid) {
                            inputs = {
                                ContaContabil: validatorContaContabil.getValue(),
                                PeriodoInicial: inputPeriodoInicial.getValue(),
                                PeriodoFinal: inputPeriodoFinal.getValue()
                            }
                            currentUser.setCustomData("con_con_saldocontail", JSON.stringify(inputs));

                            request(
                                "Contabil/Consultas/GetSaldoContabil", {
                                    ContaContabil: getVal("inputCodigoContaContabil"),
                                    DataInicial: getVal("inputPeriodoInicial"),
                                    DataFinal: getVal("inputPeriodoFinal")
                                },
                                function (model) {
                                    if (model.IsAlert) {
                                        zeraCampos();
                                        u.alert(model.Message, alertBehavior.error);
                                    } else {
                                        setHtml("spanSaldoAnterior", model.SaldoAnterior);
                                        setHtml("spanDebitos", model.Debitos);
                                        setHtml("spanCreditos", model.Creditos);
                                        setHtml("spanSaldoAtual", model.SaldoAtual);
                                    }
                                }
                            );
                        }
                    }
                })(params);
            },

            ConsultasAcompanhamento: function (params) {
                return (function () {
                    var u = new Util();
                    $("<div id='modalDiv'>").appendTo("body");

                    u.addButtonHelpBreadcrumb("RadarWEB.htm", "Tela Inicial");

                    // conta contabil
                    var validatorContaContabil = new Validator({
                        field: "inputCodigoContaContabil",
                        fieldDescriptionId: "descriptionCodigoContaContabil",
                        fieldSearch: "CodigoContaContabil",
                        onPendencyMessage: "Deve ser informado o código da Conta Contabil.",
                        route: "Empresarial/F4ContaContabil/GetContaContabil",
                        v2: "v3",
                        onValid: function (data) {
                            $("#inputCodigoContaContabil").val(data.Codigo);
                            $("#descriptionCodigoContaContabil").html(data.Nome);
                            validatorContaContabil.update();
                            executaConsulta();
                        },
                        onInvalid: function (data) {
                            validatorContaContabil.clear({ error: true });
                            validatorContaContabil.focus();
                            zeraCampos();
                        },
                        onEmpty: function () {
                            validatorContaContabil.clear();
                            zeraCampos();
                        }
                    });
                    validatorContaContabil.listen();

                    var tableContaContabil = new Table({
                        "id": "tableContaContabil",
                        "route": window.baseUrl + "Empresarial/F4ContaContabil/GetContasContabeis",
                        "showFilter": true,
                        "columns": [
                            { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Nome", field: "Nome", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Classificação", field: "Classificacao", width: 100, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Tipo", field: "Tipo", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        "onChange": function () {
                            $("#inputF4ModalOk" + this.id).on("click", function () {
                                var data = tableContaContabil.getSelectedData();
                                validatorContaContabil.onValid(data);
                                validatorContaContabil.update();
                                $("#modalContaContabil").modal("hide");
                            });
                            $("#inputF4ModalCancelar").on("click", function () {
                                $("#modalContaContabil").modal("hide");
                            });
                        },
                        "onDataBound": function () {
                            $("#tableContaContabil table tr").on("dblclick", function () {
                                var data = tableContaContabil.getSelectedData();
                                validatorContaContabil.onValid(data);
                                validatorContaContabil.update();
                                $("#modalContaContabil").modal("hide");
                            });
                            $("#inputF4ModalCancelar").on("click", function () {
                                $("#modalContaContabil").modal("hide");
                            });
                        },
                        "dataSourceType": "Filtered"
                    });

                    var options = {
                        useClassePai: true,
                        ClassePaiURL: "Empresarial/F4ContaContabil/GetClassesPai"
                    }
                    var modalContaContabil = new Modal("Conta Contábil",
                        byId("linkButtonModalContaContabil"),
                        byId("inputCodigoContaContabil"),
                        tableContaContabil,
                        null, options).listen();

                    // periodo
                    var inputPeriodoInicial = new DateValidator({
                        id: "inputPeriodoInicial",
                        v2: true,
                        isMMAAAA: true,
                        constructInjection: function () {
                            makeDatePickerMMAAAA("#" + this.id);
                        },
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                            executaConsulta();
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                            zeraCampos();
                        },
                        onEmpty: function () {
                            zeraCampos();
                        }
                    });

                    var inputPeriodoFinal = new DateValidator({
                        id: "inputPeriodoFinal",
                        v2: true,
                        isMMAAAA: true,
                        constructInjection: function () {
                            makeDatePickerMMAAAA("#" + this.id);
                        },
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                            executaConsulta();
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                            zeraCampos();
                        },
                        onEmpty: function () {
                            zeraCampos();
                        }
                    });

                    var comparePeriodoInicialComFinal = new DateComparer({
                        idA: "inputPeriodoInicial",
                        idB: "inputPeriodoFinal",
                        verb: "less",
                        isMMAAAA: true,
                        onInvalid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.error);
                            u.alert("Data inicial deve ser anterior a data final.", alertBehavior.error);
                        },
                        onValid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.normal);
                        }
                    });

                    $("#inputDiario").on("change", function () {
                        if (!validatorContaContabil.invalid && inputPeriodoInicial.isValid && inputPeriodoFinal.isValid)
                            executaConsulta();
                    });

                    // grid

                    var gridResultado = new Table({
                        "id": "gridResultado",
                        "pageable": false,
                        "columns": [
                            { field: "Data", title: "Data", width: 40, headerAttributes: { style: "color: black; text-align: center;" }, attributes: { style: "text-align: center;" } },
                            { field: "Debitos", title: "Débitos", width: 100, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: right;" } },
                            { field: "Creditos", title: "Créditos", width: 100, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: right;" } },
                            { field: "SaldoAtual", title: "Saldo Atual", width: 100, headerAttributes: { style: "color: black; text-align: Left;" }, attributes: { style: "text-align: right;" } }
                        ],
                        "dataSourceType": "Object"
                    });
                    gridResultado.make();

                    // formata os heads da grid
                    var selector_Header = ".acompanhamento > fieldset > .radar-row > .radar-control > .control-group > .controls > label";
                    var cssgridResultado_Header = {
                        "font-family": $(selector_Header).css("font-family"),
                        "font-size": $(selector_Header).css("font-size"),
                        "font-weight": $(selector_Header).css("font-weight"),
                        "color": $(selector_Header).css("color"),
                    }
                    $("#gridResultado > .k-grid-header > .k-grid-header-wrap > table > thead > tr > th > .k-link ").css(cssgridResultado_Header);

                    // seta a altura do grid
                    $("#gridResultado .k-grid-content").height(500);

                    // valores padroes / ultimos filtros usados
                    currentUser.update(params.User);
                    var inputs = currentUser.getCustomData("con_con_acompanhamento");
                    if (inputs === null || inputs === "") {
                        inputPeriodoInicial.setValue(getDateNowMMYYYY());
                        inputPeriodoFinal.setValue(getDateNowMMYYYY());
                    }
                    else {
                        inputs = JSON.parse(inputs);
                        validatorContaContabil.setValue(inputs.ContaContabil);
                        inputPeriodoInicial.setValue(inputs.PeriodoInicial);
                        inputPeriodoFinal.setValue(inputs.PeriodoFinal);
                        setChecked("inputDiario", inputs.Diario);
                    }

                    function zeraCampos() {
                        if (validatorContaContabil.invalid || !inputPeriodoInicial.isValid || !inputPeriodoFinal.isValid) {
                            setHtml("spanSaldoAnterior", "");
                            var data = new kendo.data.DataSource({ data: [] });
                            $("#gridResultado").data("kendoGrid").setDataSource(data);
                        }
                    }

                    function executaConsulta() {
                        if (!validatorContaContabil.invalid && inputPeriodoInicial.isValid && inputPeriodoFinal.isValid) {
                            inputs = {
                                ContaContabil: validatorContaContabil.getValue(),
                                PeriodoInicial: inputPeriodoInicial.getValue(),
                                PeriodoFinal: inputPeriodoFinal.getValue(),
                                Diario: isChecked("inputDiario")
                            }
                            currentUser.setCustomData("con_con_acompanhamento", JSON.stringify(inputs));

                            request(
                                "Contabil/Consultas/GetAcompanhamento", {
                                    ContaContabil: getVal("inputCodigoContaContabil"),
                                    DataInicial: getVal("inputPeriodoInicial"),
                                    DataFinal: getVal("inputPeriodoFinal"),
                                    Diario: isChecked("inputDiario")
                                },
                                function (model) {
                                    if (model.IsAlert) {
                                        zeraCampos();
                                        u.alert(model.Message, alertBehavior.error);
                                    } else {
                                        setHtml("spanSaldoAnterior", model.SaldoAnterior);
                                        var data = new kendo.data.DataSource({ data: [] });

                                        for (var atual in model.Saldos) {
                                            data.options.data.push({
                                                Data: model.Saldos[atual].Data,
                                                Debitos: model.Saldos[atual].Debitos,
                                                Creditos: model.Saldos[atual].Creditos,
                                                SaldoAtual: model.Saldos[atual].SaldoAtual
                                            });
                                        }

                                        $("#gridResultado").data("kendoGrid").setDataSource(data);
                                    }
                                }
                            );
                        }
                    }
                })(params);
            },

            RelatoriosBalancete: function (params) {
                return (function () {
                    var u = new Util();
                    $("<div id='modalDiv'>").appendTo("body");

                    u.addButtonHelpBreadcrumb("RadarWEB.htm", "Tela Inicial");

                    var inputPeriodoInicial = new DateValidator({
                        id: "inputPeriodoInicial",
                        v2: true,
                        constructInjection: function () {
                            makeDatePicker("#" + this.id);
                        },
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        },
                    });

                    var inputPeriodoFinal = new DateValidator({
                        id: "inputPeriodoFinal",
                        v2: true,
                        constructInjection: function () {
                            makeDatePicker("#" + this.id);
                        },
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        },
                    });

                    var comparePeriodoInicialComFinal = new DateComparer({
                        idA: "inputPeriodoInicial",
                        idB: "inputPeriodoFinal",
                        verb: "less",
                        onInvalid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.error);
                            u.alert("Data inicial deve ser anterior a data final.", alertBehavior.error);
                        },
                        onValid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.normal);
                        }
                    });

                    var validatorContaContabil = new Validator({
                        field: "inputCodigoContaContabil",
                        fieldDescriptionId: "descriptionCodigoContaContabil",
                        fieldSearch: "CodigoContaContabil",
                        onPendencyMessage: "Deve ser informado o código da Conta Contabil.",
                        route: "Empresarial/F4ContaContabil/GetContaContabil",
                        v2: "v3",
                        ModalGrupoContas: true,
                        grupoContasFieldNome: "Nome",
                        linkButton: "linkButtonModalContaContabil",
                        linkButtonModalGrupoContas: "linkButtonModalGrupoContasContaContabil",
                        onValid: function (data) {
                            $("#inputCodigoContaContabil").val(data.Codigo);
                            $("#descriptionCodigoContaContabil").html(data.Nome);
                        },
                        onInvalid: function (data) {
                            validatorContaContabil.clear({ error: true });
                            validatorContaContabil.focus();
                        },
                        onEmpty: function () {
                            validatorContaContabil.clear();
                        }
                    });
                    validatorContaContabil.listen();

                    var tableContaContabil = new Table({
                        "id": "tableContaContabil",
                        "route": window.baseUrl + "Empresarial/F4ContaContabil/GetContasContabeis",
                        "showFilter": true,
                        "columns": [
                            { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Nome", field: "Nome", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Classificação", field: "Classificacao", width: 100, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Tipo", field: "Tipo", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        "onChange": function () {
                            $("#inputF4ModalOk" + this.id).on("click", function () {
                                var data = tableContaContabil.getSelectedData();
                                validatorContaContabil.onValid(data);
                                validatorContaContabil.update();
                                $("#modalContaContabil").modal("hide");
                            });
                            $("#inputF4ModalCancelar").on("click", function () {
                                $("#modalContaContabil").modal("hide");
                            });
                        },
                        "onDataBound": function () {
                            $("#tableContaContabil table tr").on("dblclick", function () {
                                var data = tableContaContabil.getSelectedData();
                                validatorContaContabil.onValid(data);
                                validatorContaContabil.update();
                                $("#modalContaContabil").modal("hide");
                            });
                            $("#inputF4ModalCancelar").on("click", function () {
                                $("#modalContaContabil").modal("hide");
                            });
                        },
                        "dataSourceType": "Filtered"
                    });

                    var modalContaContabil = new Modal("Conta Contábil",
                        byId("linkButtonModalContaContabil"),
                        byId("inputCodigoContaContabil"),
                        tableContaContabil,
                        null, {
                            validatorInput: validatorContaContabil,
                            useClassePai: true,
                            ClassePaiURL: "Empresarial/F4ContaContabil/GetClassesPai",
                            onHidden: function () {
                            }
                        }
                     ).listen();

                    var modalGrupoContasContaContabil = new ModalGrupoContas({
                        id: "ContaContabil",
                        validatorInput: validatorContaContabil,
                        validatorConta: {
                            fieldSearch: "CodigoContaContabil",
                            onPendencyMessage: "Deve ser informado o código da Conta Contabil.",
                            route: "Empresarial/F4ContaContabil/GetContaContabil",
                            v2: "v3",
                            fieldNome: "Nome"
                        },
                        tableConta: {
                            route: window.baseUrl + "Empresarial/F4ContaContabil/GetContasContabeis",
                            showFilter: true,
                            columns: [
                                { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                                { title: "Nome", field: "Nome", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                                { title: "Classificação", field: "Classificacao", width: 100, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                                { title: "Tipo", field: "Tipo", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                            ]
                        },
                        modalConta: {
                            useClassePai: true,
                            ClassePaiURL: "Empresarial/F4ContaContabil/GetClassesPai",
                        },
                        onShow: function () {
                        },
                        onHidden: function () {
                        }
                    });

                    var inputTotalizaPraCima = $("#inputTotalizaPraCima").kendoDropDownList({
                        dataSource: [
                            { Value: "0", Text: "Total acima" },
                            { Value: "1", Text: "Total abaixo" }
                        ],
                        dataTextField: "Text",
                        dataValueField: "Value",
                        value: "1"
                    });

                    // oculta a linha interado do inputMostrarContasSubAnaliticas
                    requestNoAsync(window.baseUrl + "Contabil/Relatorios/GetMostrarContasSubanaliticas", {},
                        function (result) {
                            document.getElementById("inputMostrarContasSubAnaliticas").disabled = !result;
                        }
                    );

                    var inputRelatorio = new DropDown({
                        "id": "inputRelatorio",
                        "route": "Contabil/Relatorios/GetModelosBalancete"
                    });
                    inputRelatorio.make();

                    currentUser.update(params.User);
                    var inputs = currentUser.getCustomData("con_rel_balancete");
                    if (inputs === null || inputs === "") {
                        inputPeriodoInicial.setValue(getDateNowDDMMYYYY());
                        inputPeriodoFinal.setValue(getDateNowDDMMYYYY());
                    }
                    else {
                        inputs = JSON.parse(inputs);
                        inputRelatorio.set(inputs.Relatorio);

                        // filtro unico
                        if (typeof inputs.ContaContabil === 'string') {
                            validatorContaContabil.setValue(inputs.ContaContabil);
                        }
                        else {
                            // filtro GrupoContas
                            validatorContaContabil.setGrupoContasLista(inputs.ContaContabil);
                            validatorContaContabil.setVarios(true);
                        }

                        inputPeriodoInicial.setValue(inputs.PeriodoInicial);
                        inputPeriodoFinal.setValue(inputs.PeriodoFinal);
                        inputTotalizaPraCima.data().kendoDropDownList.select(inputs.TotalizaPraCima.toInt());
                        setChecked("inputMostrarContasSubAnaliticas", inputs.MostrarContasSubAnaliticas);
                    }

                    $("#buttonOK").on("click", function () {
                        inputs = {
                            Relatorio: inputRelatorio.get(),
                            ContaContabil: validatorContaContabil.getVarios() ? validatorContaContabil.getGrupoContasLista() : validatorContaContabil.getValue(),
                            PeriodoInicial: inputPeriodoInicial.getValue(),
                            PeriodoFinal: inputPeriodoFinal.getValue(),
                            TotalizaPraCima: inputTotalizaPraCima.val(),
                            MostrarContasSubAnaliticas: isChecked("inputMostrarContasSubAnaliticas")
                        }
                        currentUser.setCustomData("con_rel_balancete", JSON.stringify(inputs));

                        window.open(window.baseUrl + "Contabil/Relatorios/GeraRelatorioBalancete?"
                            + "Relatorio=" + inputRelatorio.dropDown.dataItem().Text
                            + "&ContaContabil=" + (validatorContaContabil.getVarios() ? validatorContaContabil.getGrupoContasString() : getVal("inputCodigoContaContabil"))
                            + "&DataInicial=" + getVal("inputPeriodoInicial")
                            + "&DataFinal=" + getVal("inputPeriodoFinal")
                            + "&TotalizaPraCima=" + (getVal("inputTotalizaPraCima") === "0" ? true : false)
                            + "&MostrarContasSubAnaliticas=" + isChecked("inputMostrarContasSubAnaliticas")
                        );
                    });
                })(params);
            },

            RelatoriosRazao: function (params) {
                return (function () {
                    var u = new Util();
                    $("<div id='modalDiv'>").appendTo("body");

                    u.addButtonHelpBreadcrumb("RadarWEB.htm", "Tela Inicial");

                    var validatorContaContabil = new Validator({
                        field: "inputCodigoContaContabil",
                        fieldDescriptionId: "descriptionCodigoContaContabil",
                        fieldSearch: "CodigoContaContabil",
                        onPendencyMessage: "Deve ser informado o código da Conta Contabil.",
                        route: "Empresarial/F4ContaContabil/GetContaContabil",
                        v2: "v3",
                        onValid: function (data) {
                            $("#inputCodigoContaContabil").val(data.Codigo);
                            $("#descriptionCodigoContaContabil").html(data.Nome);
                        },
                        onInvalid: function (data) {
                            validatorContaContabil.clear({ error: true });
                            validatorContaContabil.focus();
                        },
                        onEmpty: function () {
                            validatorContaContabil.clear();
                        }
                    });
                    validatorContaContabil.listen();

                    var validatorContaContabil = new Validator({
                        field: "inputCodigoContaContabil",
                        fieldDescriptionId: "descriptionCodigoContaContabil",
                        fieldSearch: "CodigoContaContabil",
                        onPendencyMessage: "Deve ser informado o código da Conta Contabil.",
                        route: "Empresarial/F4ContaContabil/GetContaContabil",
                        v2: "v3",
                        ModalGrupoContas: true,
                        grupoContasFieldNome: "Nome",
                        linkButton: "linkButtonModalContaContabil",
                        linkButtonModalGrupoContas: "linkButtonModalGrupoContasContaContabil",
                        onValid: function (data) {
                            $("#inputCodigoContaContabil").val(data.Codigo);
                            $("#descriptionCodigoContaContabil").html(data.Nome);
                        },
                        onInvalid: function (data) {
                            validatorContaContabil.clear({ error: true });
                            validatorContaContabil.focus();
                        },
                        onEmpty: function () {
                            validatorContaContabil.clear();
                        }
                    });
                    validatorContaContabil.listen();

                    var tableContaContabil = new Table({
                        "id": "tableContaContabil",
                        "route": window.baseUrl + "Empresarial/F4ContaContabil/GetContasContabeis",
                        "showFilter": true,
                        "columns": [
                            { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Nome", field: "Nome", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Classificação", field: "Classificacao", width: 100, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Tipo", field: "Tipo", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        "onChange": function () {
                            $("#inputF4ModalOk" + this.id).on("click", function () {
                                var data = tableContaContabil.getSelectedData();
                                validatorContaContabil.onValid(data);
                                validatorContaContabil.update();
                                $("#modalContaContabil").modal("hide");
                            });
                            $("#inputF4ModalCancelar").on("click", function () {
                                $("#modalContaContabil").modal("hide");
                            });
                        },
                        "onDataBound": function () {
                            $("#tableContaContabil table tr").on("dblclick", function () {
                                var data = tableContaContabil.getSelectedData();
                                validatorContaContabil.onValid(data);
                                validatorContaContabil.update();
                                $("#modalContaContabil").modal("hide");
                            });
                            $("#inputF4ModalCancelar").on("click", function () {
                                $("#modalContaContabil").modal("hide");
                            });
                        },
                        "dataSourceType": "Filtered"
                    });

                    var modalContaContabil = new Modal("Conta Contábil",
                        byId("linkButtonModalContaContabil"),
                        byId("inputCodigoContaContabil"),
                        tableContaContabil,
                        null, {
                            validatorInput: validatorContaContabil,
                            useClassePai: true,
                            ClassePaiURL: "Empresarial/F4ContaContabil/GetClassesPai",
                            onHidden: function () {
                            }
                        }
                     ).listen();

                    var modalGrupoContasContaContabil = new ModalGrupoContas({
                        id: "ContaContabil",
                        validatorInput: validatorContaContabil,
                        validatorConta: {
                            fieldSearch: "CodigoContaContabil",
                            onPendencyMessage: "Deve ser informado o código da Conta Contabil.",
                            route: "Empresarial/F4ContaContabil/GetContaContabil",
                            v2: "v3",
                            fieldNome: "Nome"
                        },
                        tableConta: {
                            route: window.baseUrl + "Empresarial/F4ContaContabil/GetContasContabeis",
                            showFilter: true,
                            columns: [
                                { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                                { title: "Nome", field: "Nome", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                                { title: "Classificação", field: "Classificacao", width: 100, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                                { title: "Tipo", field: "Tipo", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                            ]
                        },
                        modalConta: {
                            useClassePai: true,
                            ClassePaiURL: "Empresarial/F4ContaContabil/GetClassesPai",
                        },
                        onShow: function () {
                        },
                        onHidden: function () {
                        }
                    });

                    var inputPeriodoInicial = new DateValidator({
                        id: "inputPeriodoInicial",
                        v2: true,
                        constructInjection: function () {
                            makeDatePicker("#" + this.id);
                        },
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        },
                    });

                    var inputPeriodoFinal = new DateValidator({
                        id: "inputPeriodoFinal",
                        v2: true,
                        constructInjection: function () {
                            makeDatePicker("#" + this.id);
                        },
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        },
                    });

                    var comparePeriodoInicialComFinal = new DateComparer({
                        idA: "inputPeriodoInicial",
                        idB: "inputPeriodoFinal",
                        verb: "less",
                        onInvalid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.error);
                            u.alert("Data inicial deve ser anterior a data final.", alertBehavior.error);
                        },
                        onValid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.normal);
                        }
                    });

                    var inputRelatorio = new DropDown({
                        "id": "inputRelatorio",
                        "route": "Contabil/Relatorios/GetModelosRazao"
                    });
                    inputRelatorio.make();

                    currentUser.update(params.User);
                    var inputs = currentUser.getCustomData("con_rel_razao");
                    if (inputs === null || inputs === "") {
                        inputPeriodoInicial.setValue(getDateNowDDMMYYYY());
                        inputPeriodoFinal.setValue(getDateNowDDMMYYYY());
                    }
                    else {
                        inputs = JSON.parse(inputs);
                        inputRelatorio.set(inputs.Relatorio);

                        // filtro unico
                        if (typeof inputs.ContaContabil === 'string') {
                            validatorContaContabil.setValue(inputs.ContaContabil);
                        }
                        else {
                            // filtro GrupoContas
                            validatorContaContabil.setGrupoContasLista(inputs.ContaContabil);
                            validatorContaContabil.setVarios(true);
                        }

                        inputPeriodoInicial.setValue(inputs.PeriodoInicial);
                        inputPeriodoFinal.setValue(inputs.PeriodoFinal);
                    }

                    $("#buttonOK").on("click", function () {
                        inputs = {
                            Relatorio: inputRelatorio.get(),
                            ContaContabil: validatorContaContabil.getVarios() ? validatorContaContabil.getGrupoContasLista() : validatorContaContabil.getValue(),
                            PeriodoInicial: inputPeriodoInicial.getValue(),
                            PeriodoFinal: inputPeriodoFinal.getValue()
                        }
                        currentUser.setCustomData("con_rel_razao", JSON.stringify(inputs));

                        window.open(window.baseUrl + "Contabil/Relatorios/GeraRelatorioRazao?"
                            + "Relatorio=" + inputRelatorio.dropDown.dataItem().Text
                            + "&ContaContabil=" + (validatorContaContabil.getVarios() ? validatorContaContabil.getGrupoContasString() : getVal("inputCodigoContaContabil"))
                            + "&DataInicial=" + getVal("inputPeriodoInicial")
                            + "&DataFinal=" + getVal("inputPeriodoFinal")
                        );
                    });
                })(params);
            },

            RelatoriosDiarioDetalhado: function (params) {
                return (function () {
                    var u = new Util();
                    $("<div id='modalDiv'>").appendTo("body");

                    u.addButtonHelpBreadcrumb("RadarWEB.htm", "Tela Inicial");

                    var inputPeriodoInicial = new DateValidator({
                        id: "inputPeriodoInicial",
                        v2: true,
                        constructInjection: function () {
                            makeDatePicker("#" + this.id);
                        },
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        },
                    });

                    var inputPeriodoFinal = new DateValidator({
                        id: "inputPeriodoFinal",
                        v2: true,
                        constructInjection: function () {
                            makeDatePicker("#" + this.id);
                        },
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        },
                    });

                    var comparePeriodoInicialComFinal = new DateComparer({
                        idA: "inputPeriodoInicial",
                        idB: "inputPeriodoFinal",
                        verb: "less",
                        onInvalid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.error);
                            u.alert("Data inicial deve ser anterior a data final.", alertBehavior.error);
                        },
                        onValid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.normal);
                        }
                    });

                    var validatorContaContabil = new Validator({
                        field: "inputCodigoContaContabil",
                        fieldDescriptionId: "descriptionCodigoContaContabil",
                        fieldSearch: "CodigoContaContabil",
                        onPendencyMessage: "Deve ser informado o código da Conta Contabil.",
                        route: "Empresarial/F4ContaContabil/GetContaContabil",
                        v2: "v3",
                        ModalGrupoContas: true,
                        grupoContasFieldNome: "Nome",
                        linkButton: "linkButtonModalContaContabil",
                        linkButtonModalGrupoContas: "linkButtonModalGrupoContasContaContabil",
                        onValid: function (data) {
                            $("#inputCodigoContaContabil").val(data.Codigo);
                            $("#descriptionCodigoContaContabil").html(data.Nome);
                        },
                        onInvalid: function (data) {
                            validatorContaContabil.clear({ error: true });
                            validatorContaContabil.focus();
                        },
                        onEmpty: function () {
                            validatorContaContabil.clear();
                        }
                    });
                    validatorContaContabil.listen();

                    var tableContaContabil = new Table({
                        "id": "tableContaContabil",
                        "route": window.baseUrl + "Empresarial/F4ContaContabil/GetContasContabeis",
                        "showFilter": true,
                        "columns": [
                            { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Nome", field: "Nome", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Classificação", field: "Classificacao", width: 100, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Tipo", field: "Tipo", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        "onChange": function () {
                            $("#inputF4ModalOk" + this.id).on("click", function () {
                                var data = tableContaContabil.getSelectedData();
                                validatorContaContabil.onValid(data);
                                validatorContaContabil.update();
                                $("#modalContaContabil").modal("hide");
                            });
                            $("#inputF4ModalCancelar").on("click", function () {
                                $("#modalContaContabil").modal("hide");
                            });
                        },
                        "onDataBound": function () {
                            $("#tableContaContabil table tr").on("dblclick", function () {
                                var data = tableContaContabil.getSelectedData();
                                validatorContaContabil.onValid(data);
                                validatorContaContabil.update();
                                $("#modalContaContabil").modal("hide");
                            });
                            $("#inputF4ModalCancelar").on("click", function () {
                                $("#modalContaContabil").modal("hide");
                            });
                        },
                        "dataSourceType": "Filtered"
                    });

                    var modalContaContabil = new Modal("Conta Contábil",
                        byId("linkButtonModalContaContabil"),
                        byId("inputCodigoContaContabil"),
                        tableContaContabil,
                        null, {
                            validatorInput: validatorContaContabil,
                            useClassePai: true,
                            ClassePaiURL: "Empresarial/F4ContaContabil/GetClassesPai",
                            onHidden: function () {
                            }
                        }
                     ).listen();

                    var modalGrupoContasContaContabil = new ModalGrupoContas({
                        id: "ContaContabil",
                        validatorInput: validatorContaContabil,
                        validatorConta: {
                            fieldSearch: "CodigoContaContabil",
                            onPendencyMessage: "Deve ser informado o código da Conta Contabil.",
                            route: "Empresarial/F4ContaContabil/GetContaContabil",
                            v2: "v3",
                            fieldNome: "Nome"
                        },
                        tableConta: {
                            route: window.baseUrl + "Empresarial/F4ContaContabil/GetContasContabeis",
                            showFilter: true,
                            columns: [
                                { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                                { title: "Nome", field: "Nome", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                                { title: "Classificação", field: "Classificacao", width: 100, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                                { title: "Tipo", field: "Tipo", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                            ]
                        },
                        modalConta: {
                            useClassePai: true,
                            ClassePaiURL: "Empresarial/F4ContaContabil/GetClassesPai",
                        },
                        onShow: function () {
                        },
                        onHidden: function () {
                        }
                    });

                    var inputRelatorio = new DropDown({
                        "id": "inputRelatorio",
                        "route": "Contabil/Relatorios/GetModelosDiarioDetalhado"
                    });
                    inputRelatorio.make();

                    // periodo integracao
                    var DataInferiorIntegracao = "";
                    var DataSuperiorIntegracao = "";
                    requestNoAsync(window.baseUrl + "Contabil/Relatorios/GetPeriodoIntegracao", {},
                        function (result) {
                            DataInferiorIntegracao = result.DataInferiorIntegracao;
                            DataSuperiorIntegracao = result.DataSuperiorIntegracao;
                        }
                    );

                    currentUser.update(params.User);
                    var inputs = currentUser.getCustomData("con_rel_diariodetalhado");
                    if (inputs === null || inputs === "") {
                        inputPeriodoInicial.setValue(DataInferiorIntegracao);
                        inputPeriodoFinal.setValue(DataSuperiorIntegracao);
                    }
                    else {
                        inputs = JSON.parse(inputs);
                        inputRelatorio.set(inputs.Relatorio);

                        // filtro unico
                        if (typeof inputs.ContaContabil === 'string') {
                            validatorContaContabil.setValue(inputs.ContaContabil);
                        }
                        else {
                            // filtro GrupoContas
                            validatorContaContabil.setGrupoContasLista(inputs.ContaContabil);
                            validatorContaContabil.setVarios(true);
                        }

                        inputPeriodoInicial.setValue(inputs.PeriodoInicial);
                        inputPeriodoFinal.setValue(inputs.PeriodoFinal);
                    }

                    $("#buttonOK").on("click", function () {
                        if (!inputPeriodoInicial.isValid) {
                            u.alert("Informe uma data inicial válida", alertBehavior.warning);
                            $(inputPeriodoInicial).focus();
                        }
                        else if (!inputPeriodoFinal.isValid) {
                            u.alert("Informe uma data final válida", alertBehavior.warning);
                            $(inputPeriodoFinal).focus();
                        }
                        else if (inputPeriodoInicial.getValueDate() < convertDateStringDDMMYYYYToDate(DataInferiorIntegracao) || inputPeriodoFinal.getValueDate() > convertDateStringDDMMYYYYToDate(DataSuperiorIntegracao)) {
                            u.alert("Data fora do limite do período contábil", alertBehavior.warning);
                            $(inputPeriodoInicial).focus();
                        }
                        else {
                            inputs = {
                                Relatorio: inputRelatorio.get(),
                                ContaContabil: validatorContaContabil.getVarios() ? validatorContaContabil.getGrupoContasLista() : validatorContaContabil.getValue(),
                                PeriodoInicial: inputPeriodoInicial.getValue(),
                                PeriodoFinal: inputPeriodoFinal.getValue()
                            }
                            currentUser.setCustomData("con_rel_diariodetalhado", JSON.stringify(inputs));

                            window.open(window.baseUrl + "Contabil/Relatorios/GeraRelatorioDiarioDetalhado?"
                                + "Relatorio=" + inputRelatorio.dropDown.dataItem().Text
                                + "&ContaContabil=" + (validatorContaContabil.getVarios() ? validatorContaContabil.getGrupoContasString() : getVal("inputCodigoContaContabil"))
                                + "&DataInicial=" + getVal("inputPeriodoInicial")
                                + "&DataFinal=" + getVal("inputPeriodoFinal")
                            );
                        }
                    });
                })(params);
            },

            RelatoriosAcompanhamentoMensal: function (params) {
                return (function () {
                    var u = new Util();
                    $("<div id='modalDiv'>").appendTo("body");

                    u.addButtonHelpBreadcrumb("RadarWEB.htm", "Tela Inicial");

                    var validatorContaContabil = new Validator({
                        field: "inputCodigoContaContabil",
                        fieldDescriptionId: "descriptionCodigoContaContabil",
                        fieldSearch: "CodigoContaContabil",
                        onPendencyMessage: "Deve ser informado o código da Conta Contabil.",
                        route: "Empresarial/F4ContaContabil/GetContaContabil",
                        v2: "v3",
                        ModalGrupoContas: true,
                        grupoContasFieldNome: "Nome",
                        linkButton: "linkButtonModalContaContabil",
                        linkButtonModalGrupoContas: "linkButtonModalGrupoContasContaContabil",
                        onValid: function (data) {
                            if (data.Tipo !== "T") {
                                u.alert("Conta deve ser do tipo título", alertBehavior.warning);
                                validatorContaContabil.clear({ error: true });
                                validatorContaContabil.update();
                            }
                            else {
                                $("#inputCodigoContaContabil").val(data.Codigo);
                                $("#descriptionCodigoContaContabil").html(data.Nome);
                            }
                        },
                        onInvalid: function (data) {
                            validatorContaContabil.clear({ error: true });
                            validatorContaContabil.focus();
                        },
                        onEmpty: function () {
                            validatorContaContabil.clear();
                        }
                    });
                    validatorContaContabil.listen();

                    var tableContaContabil = new Table({
                        "id": "tableContaContabil",
                        "route": window.baseUrl + "Empresarial/F4ContaContabil/GetContasContabeis",
                        "showFilter": true,
                        "columns": [
                            { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Nome", field: "Nome", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Classificação", field: "Classificacao", width: 100, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Tipo", field: "Tipo", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        "onChange": function () {
                            $("#inputF4ModalOk" + this.id).on("click", function () {
                                var data = tableContaContabil.getSelectedData();
                                validatorContaContabil.onValid(data);
                                validatorContaContabil.update();
                                $("#modalContaContabil").modal("hide");
                            });
                            $("#inputF4ModalCancelar").on("click", function () {
                                $("#modalContaContabil").modal("hide");
                            });
                        },
                        "onDataBound": function () {
                            $("#tableContaContabil table tr").on("dblclick", function () {
                                var data = tableContaContabil.getSelectedData();
                                validatorContaContabil.onValid(data);
                                validatorContaContabil.update();
                                $("#modalContaContabil").modal("hide");
                            });
                            $("#inputF4ModalCancelar").on("click", function () {
                                $("#modalContaContabil").modal("hide");
                            });
                        },
                        "dataSourceType": "Filtered"
                    });

                    var modalContaContabil = new Modal("Conta Contábil",
                        byId("linkButtonModalContaContabil"),
                        byId("inputCodigoContaContabil"),
                        tableContaContabil,
                        null, {
                            validatorInput: validatorContaContabil,
                            useClassePai: true,
                            ClassePaiURL: "Empresarial/F4ContaContabil/GetClassesPai"
                        }
                     ).listen();

                    var modalGrupoContasContaContabil = new ModalGrupoContas({
                        id: "ContaContabil",
                        validatorInput: validatorContaContabil,
                        validatorConta: {
                            fieldSearch: "CodigoContaContabil",
                            onPendencyMessage: "Deve ser informado o código da Conta Contabil.",
                            route: "Empresarial/F4ContaContabil/GetContaContabil",
                            v2: "v3",
                            fieldNome: "Nome",
                            onValid: function (data, validatorAtual) {
                                if (data.Tipo !== "T") {
                                    u.alert("Conta deve ser do tipo título", alertBehavior.warning);
                                    validatorAtual.clear({ error: true });
                                    validatorAtual.update();
                                }
                            }
                        },
                        tableConta: {
                            route: window.baseUrl + "Empresarial/F4ContaContabil/GetContasContabeis",
                            showFilter: true,
                            columns: [
                                { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                                { title: "Nome", field: "Nome", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                                { title: "Classificação", field: "Classificacao", width: 100, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                                { title: "Tipo", field: "Tipo", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                            ]
                        },
                        modalConta: {
                            useClassePai: true,
                            ClassePaiURL: "Empresarial/F4ContaContabil/GetClassesPai",
                        },
                        onShow: function () {
                        },
                        onHidden: function () {
                        }
                    });

                    var inputMesAno = new DateValidator({
                        id: "inputMesAno",
                        v2: true,
                        isMMAAAA: true,
                        constructInjection: function () {
                            makeDatePickerMMAAAA("#" + this.id);
                        },
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        },
                    });

                    var inputTotalizaPraCima = $("#inputTotalizaPraCima").kendoDropDownList({
                        dataSource: [
                            { Value: "0", Text: "Total acima" },
                            { Value: "1", Text: "Total abaixo" }
                        ],
                        dataTextField: "Text",
                        dataValueField: "Value",
                        value: "1"
                    });

                    var inputTipoValor = $("#inputTipoValor").kendoDropDownList({
                        dataSource: [
                            { Value: "0", Text: "Débitos" },
                            { Value: "1", Text: "Créditos" },
                            { Value: "2", Text: "Movimentos" },
                            { Value: "3", Text: "Saldo" }
                        ],
                        dataTextField: "Text",
                        dataValueField: "Value",
                        value: "0"
                    });

                    var inputRelatorio = new DropDown({
                        "id": "inputRelatorio",
                        "route": "Contabil/Relatorios/GetModelosAcompanhamentoMensal"
                    });
                    inputRelatorio.make();

                    currentUser.update(params.User);
                    var inputs = currentUser.getCustomData("con_rel_acompanhamentomensal");
                    if (inputs === null || inputs === "") {
                        inputMesAno.setValue(getDateNowMMYYYY());
                    }
                    else {
                        inputs = JSON.parse(inputs);
                        inputRelatorio.set(inputs.Relatorio);

                        // filtro unico
                        if (typeof inputs.ContaContabil === 'string') {
                            validatorContaContabil.setValue(inputs.ContaContabil);
                        }
                        else {
                            // filtro GrupoContas
                            validatorContaContabil.setGrupoContasLista(inputs.ContaContabil);
                            validatorContaContabil.setVarios(true);
                        }

                        inputMesAno.setValue(inputs.MesAno);
                        inputTotalizaPraCima.data().kendoDropDownList.select(inputs.TotalizaPraCima.toInt());
                        inputTipoValor.data().kendoDropDownList.select(inputs.TipoValor.toInt());
                    }

                    $("#buttonOK").on("click", function () {
                        inputs = {
                            Relatorio: inputRelatorio.get(),
                            ContaContabil: validatorContaContabil.getVarios() ? validatorContaContabil.getGrupoContasLista() : validatorContaContabil.getValue(),
                            MesAno: inputMesAno.getValue(),
                            TotalizaPraCima: inputTotalizaPraCima.val(),
                            TipoValor: inputTipoValor.val()
                        }
                        currentUser.setCustomData("con_rel_acompanhamentomensal", JSON.stringify(inputs));

                        window.open(window.baseUrl + "Contabil/Relatorios/GeraRelatorioAcompanhamentoMensal?"
                            + "Relatorio=" + inputRelatorio.dropDown.dataItem().Text
                            + "&ContaContabil=" + (validatorContaContabil.getVarios() ? validatorContaContabil.getGrupoContasString() : getVal("inputCodigoContaContabil"))
                            + "&MesAno=" + getVal("inputMesAno")
                            + "&TotalizaPraCima=" + (getVal("inputTotalizaPraCima") === 0 ? "true" : "false")
                            + "&TipoValor=" + getVal("inputTipoValor")
                        );
                    });
                })(params);
            },

            RelatoriosInversaoGerencialBalancete: function (params) {
                return (function () {
                    var u = new Util();
                    $("<div id='modalDiv'>").appendTo("body");

                    u.addButtonHelpBreadcrumb("RadarWEB.htm", "Tela Inicial");

                    var inputPeriodoInicial = new DateValidator({
                        id: "inputPeriodoInicial",
                        v2: true,
                        constructInjection: function () {
                            makeDatePicker("#" + this.id);
                        },
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        },
                    });

                    var inputPeriodoFinal = new DateValidator({
                        id: "inputPeriodoFinal",
                        v2: true,
                        constructInjection: function () {
                            makeDatePicker("#" + this.id);
                        },
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        },
                    });

                    var comparePeriodoInicialComFinal = new DateComparer({
                        idA: "inputPeriodoInicial",
                        idB: "inputPeriodoFinal",
                        verb: "less",
                        onInvalid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.error);
                            u.alert("Data inicial deve ser anterior a data final.", alertBehavior.error);
                        },
                        onValid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.normal);
                        }
                    });

                    // conta contabil
                    var validatorContaContabil = new Validator({
                        field: "inputCodigoContaContabil",
                        fieldDescriptionId: "descriptionCodigoContaContabil",
                        fieldSearch: "CodigoContaContabil",
                        onPendencyMessage: "Deve ser informado o código da Conta Contabil.",
                        route: "Empresarial/F4ContaContabil/GetContaContabil",
                        v2: "v3",
                        onValid: function (data) {
                            $("#inputCodigoContaContabil").val(data.Codigo);
                            $("#descriptionCodigoContaContabil").html(data.Nome);
                        },
                        onInvalid: function (data) {
                            validatorContaContabil.clear({ error: true });
                            validatorContaContabil.focus();
                        },
                        onEmpty: function () {
                            validatorContaContabil.clear();
                        }
                    });
                    validatorContaContabil.listen();

                    var tableContaContabil = new Table({
                        "id": "tableContaContabil",
                        "route": window.baseUrl + "Empresarial/F4ContaContabil/GetContasContabeis",
                        "showFilter": true,
                        "columns": [
                            { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Nome", field: "Nome", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Classificação", field: "Classificacao", width: 100, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Tipo", field: "Tipo", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        "onChange": function () {
                            $("#inputF4ModalOk" + this.id).on("click", function () {
                                var data = tableContaContabil.getSelectedData();
                                validatorContaContabil.onValid(data);
                                validatorContaContabil.update();
                                $("#modalContaContabil").modal("hide");
                            });
                            $("#inputF4ModalCancelar").on("click", function () {
                                $("#modalContaContabil").modal("hide");
                            });
                        },
                        "onDataBound": function () {
                            $("#tableContaContabil table tr").on("dblclick", function () {
                                var data = tableContaContabil.getSelectedData();
                                validatorContaContabil.onValid(data);
                                validatorContaContabil.update();
                                $("#modalContaContabil").modal("hide");
                            });
                            $("#inputF4ModalCancelar").on("click", function () {
                                $("#modalContaContabil").modal("hide");
                            });
                        },
                        "dataSourceType": "Filtered"
                    });

                    var options = {
                        useClassePai: true,
                        ClassePaiURL: "Empresarial/F4ContaContabil/GetClassesPai"
                    }
                    var modalContaContabil = new Modal("Conta Contábil",
                        byId("linkButtonModalContaContabil"),
                        byId("inputCodigoContaContabil"),
                        tableContaContabil,
                        null, options).listen();

                    // conta gerencial
                    var validatorContaGerencial = new Validator({
                        field: "inputCodigoContaGerencial",
                        fieldDescriptionId: "descriptionCodigoContaGerencial",
                        fieldSearch: "CodigoContaGerencial",
                        onPendencyMessage: "Deve ser informado o código da Conta Gerencial.",
                        route: "Empresarial/F4ContaGerencial/GetContaGerencial",
                        v2: "v3",
                        onValid: function (data) {
                            $("#inputCodigoContaGerencial").val(data.Codigo);
                            $("#descriptionCodigoContaGerencial").html(data.Nome);
                        },
                        onInvalid: function (data) {
                            validatorContaGerencial.clear({ error: true });
                            validatorContaGerencial.focus();
                        },
                        onEmpty: function () {
                            validatorContaGerencial.clear();
                        }
                    });
                    validatorContaGerencial.listen();

                    var tableContaGerencial = new Table({
                        "id": "tableContaGerencial",
                        "route": window.baseUrl + "Empresarial/F4ContaGerencial/GetContasGerenciais",
                        "showFilter": true,
                        "columns": [
                            { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Nome", field: "Nome", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Classificação", field: "Classificacao", width: 100, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Tipo", field: "Tipo", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        "onChange": function () {
                            $("#inputF4ModalOk" + this.id).on("click", function () {
                                var data = tableContaGerencial.getSelectedData();
                                validatorContaGerencial.onValid(data);
                                validatorContaGerencial.update();
                                $("#modalContaGerencial").modal("hide");
                            });
                            $("#inputF4ModalCancelar").on("click", function () {
                                $("#modalContaGerencial").modal("hide");
                            });
                        },
                        "onDataBound": function () {
                            $("#tableContaGerencial table tr").on("dblclick", function () {
                                var data = tableContaGerencial.getSelectedData();
                                validatorContaGerencial.onValid(data);
                                validatorContaGerencial.update();
                                $("#modalContaGerencial").modal("hide");
                            });
                            $("#inputF4ModalCancelar").on("click", function () {
                                $("#modalContaGerencial").modal("hide");
                            });
                        },
                        "dataSourceType": "Filtered"
                    });

                    var options = {
                        useClassePai: true,
                        ClassePaiURL: "Empresarial/F4ContaGerencial/GetClassesPai"
                    }
                    var modalContaGerencial = new Modal("Conta Gerencial",
                        byId("linkButtonModalContaGerencial"),
                        byId("inputCodigoContaGerencial"),
                        tableContaGerencial,
                        null, options).listen();

                    // relatorio
                    var inputRelatorio = new DropDown({
                        "id": "inputRelatorio",
                        "route": "Contabil/Relatorios/GetModelosInversaoGerencialBalancete"
                    });
                    inputRelatorio.make();

                    currentUser.update(params.User);
                    var inputs = currentUser.getCustomData("con_rel_inversaogerencialbalancete");
                    if (inputs === null || inputs === "") {
                        inputPeriodoInicial.setValue(getDateNowDDMMYYYY());
                        inputPeriodoFinal.setValue(getDateNowDDMMYYYY());
                    }
                    else {
                        inputs = JSON.parse(inputs);
                        inputRelatorio.set(inputs.Relatorio);
                        inputPeriodoInicial.setValue(inputs.PeriodoInicial);
                        inputPeriodoFinal.setValue(inputs.PeriodoFinal);
                        setVal("inputRelacionamento", inputs.Relacionamento);
                        validatorContaContabil.setValue(inputs.ContaContabil);
                        validatorContaGerencial.setValue(inputs.ContaGerencial);
                        setVal("inputMascaraInvertida", inputs.MascaraInvertida);
                    }

                    $("#buttonOK").on("click", function () {
                        inputs = {
                            Relatorio: inputRelatorio.get(),
                            PeriodoInicial: inputPeriodoInicial.getValue(),
                            PeriodoFinal: inputPeriodoFinal.getValue(),
                            Relacionamento: getVal("inputRelacionamento"),
                            ContaContabil: validatorContaContabil.getValue(),
                            ContaGerencial: validatorContaGerencial.getValue(),
                            MascaraInvertida: getVal("inputMascaraInvertida")
                        }
                        currentUser.setCustomData("con_rel_inversaogerencialbalancete", JSON.stringify(inputs));

                        window.open(window.baseUrl + "Contabil/Relatorios/GeraRelatorioInversaoGerencialBalancete?"
                            + "Relatorio=" + inputRelatorio.dropDown.dataItem().Text
                            + "&DataInicial=" + getVal("inputPeriodoInicial")
                            + "&DataFinal=" + getVal("inputPeriodoFinal")
                            + "&Relacionamento=" + getVal("inputRelacionamento")
                            + "&ContaContabil=" + getVal("inputCodigoContaContabil")
                            + "&ContaGerencial=" + getVal("inputCodigoContaGerencial")
                            + "&MascaraInvertida=" + getVal("inputMascaraInvertida")
                        );
                    });
                })(params);
            },

            RelatoriosGerador: function (params) {
                return (function () {
                    var u = new Util();
                    $("<div id='modalDiv'>").appendTo("body");

                    u.addButtonHelpBreadcrumb("RadarWEB.htm", "Tela Inicial");

                    var inputPeriodoInicial = new DateValidator({
                        id: "inputPeriodoInicial",
                        v2: true,
                        constructInjection: function () {
                            makeDatePicker("#" + this.id);
                        },
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        },
                    });

                    var inputPeriodoFinal = new DateValidator({
                        id: "inputPeriodoFinal",
                        v2: true,
                        constructInjection: function () {
                            makeDatePicker("#" + this.id);
                        },
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        },
                    });

                    var comparePeriodoInicialComFinal = new DateComparer({
                        idA: "inputPeriodoInicial",
                        idB: "inputPeriodoFinal",
                        verb: "less",
                        onInvalid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.error);
                            u.alert("Data inicial deve ser anterior a data final.", alertBehavior.error);
                        },
                        onValid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.normal);
                        }
                    });

                    var inputRelatorio = new DropDown({
                        "id": "inputRelatorio",
                        "route": "Contabil/Relatorios/GetModelosGerador"
                    });
                    inputRelatorio.make();

                    currentUser.update(params.User);
                    var inputs = currentUser.getCustomData("con_rel_gerador");
                    if (inputs === null || inputs === "") {
                        inputPeriodoInicial.setValue(getDateNowDDMMYYYY());
                        inputPeriodoFinal.setValue(getDateNowDDMMYYYY());
                    }
                    else {
                        inputs = JSON.parse(inputs);
                        inputRelatorio.set(inputs.Relatorio);
                        inputPeriodoInicial.setValue(inputs.PeriodoInicial);
                        inputPeriodoFinal.setValue(inputs.PeriodoFinal);
                        setVal("inputPaginaInicial", inputs.PaginaInicial);
                    }

                    $("#buttonOK").on("click", function () {
                        inputs = {
                            Relatorio: inputRelatorio.get(),
                            PeriodoInicial: inputPeriodoInicial.getValue(),
                            PeriodoFinal: inputPeriodoFinal.getValue(),
                            PaginaInicial: getVal("inputPaginaInicial")
                        }
                        currentUser.setCustomData("con_rel_gerador", JSON.stringify(inputs));

                        window.open(window.baseUrl + "Contabil/Relatorios/GeraRelatorioGerador?"
                            + "Relatorio=" + inputRelatorio.dropDown.dataItem().Text
                            + "&DataInicial=" + getVal("inputPeriodoInicial")
                            + "&DataFinal=" + getVal("inputPeriodoFinal")
                            + "&PaginaInicial=" + getVal("inputPaginaInicial")
                        );
                    });
                })(params);
            }
        };
    })();

    Estoque.Manager = (function () {
        return {
            RelatoriosInventario: function (params) {
                return (function () {
                    var u = new Util();
                    $("<div id='modalDiv'>").appendTo("body");

                    u.addButtonHelpBreadcrumb("RadarWEB.htm", "Tela Inicial");

                    var inputPeriodoInicial = new DateValidator({
                        id: "inputPeriodoInicial",
                        v2: true,
                        constructInjection: function () {
                            makeDatePicker("#" + this.id);
                        },
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        },
                    });

                    var inputPeriodoFinal = new DateValidator({
                        id: "inputPeriodoFinal",
                        v2: true,
                        constructInjection: function () {
                            makeDatePicker("#" + this.id);
                        },
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        },
                    });

                    var comparePeriodoInicialComFinal = new DateComparer({
                        idA: "inputPeriodoInicial",
                        idB: "inputPeriodoFinal",
                        verb: "less",
                        onInvalid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.error);
                            u.alert("Data inicial deve ser anterior a data final.", alertBehavior.error);
                        },
                        onValid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.normal);
                        }
                    });

                    // filial
                    var validatorFilial = new Validator({
                        field: "CodigoFilial",
                        onPendencyMessage: "Deve ser informado o código da filial.",
                        route: "Empresarial/F4Filial/GetFilialEx",
                        v2: true,
                        onValid: function (data) {
                            setVal("inputCodigoFilial", data["Codigo"]);
                            setHtml("descriptionCodigoFilial", data["Nome"]);
                        },
                        onInvalid: function () {
                            validatorFilial.clear({ error: true });
                            validatorFilial.focus();
                        },
                        onEmpty: function () {
                            validatorFilial.clear();
                        }
                    });
                    validatorFilial.listen();

                    var tableFiliais = new Table({
                        "id": "tableFilial",
                        "route": window.baseUrl + "Empresarial/F4Filial/GetFiliais",
                        "columns": [
                            { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Nome", field: "Nome", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "CNPJ/CPF", field: "CpfCnpj", width: 115, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        "showFilter": true,
                        "onChange": function () {
                            var ok = document.getElementById("inputF4ModalOk" + this.id);
                            ok.onclick = function () {
                                var data = tableFiliais.getSelectedData();
                                validatorFilial.onValid(data);
                                validatorFilial.update();
                            };
                        },
                        "onDataBound": function () {
                            $("#tableFilial table tr").on("dblclick", function () {
                                var data = tableFiliais.getSelectedData();
                                validatorFilial.onValid(data);
                                validatorFilial.update();
                                $("#modalFilial").modal("hide");
                            });
                        },
                        "dataSourceType": "Filtered"
                    });
                    var linkFiliais = document.getElementById("linkButtonModalFiliais");
                    var inputFiliais = document.getElementById("inputCodigoFilial");
                    var modalFiliais = new Modal("Filiais", linkFiliais, inputFiliais, tableFiliais);
                    modalFiliais.listen();

                    // ClasseProduto
                    var validatorClasseProduto = new Validator({
                        field: "CodigoClasseProduto",
                        onPendencyMessage: "Deve ser informado o código da Classe Produto.",
                        route: "Empresarial/F4ClasseProduto/GetClasseProduto",
                        v2: true,
                        onValid: function (data) {
                            setVal("inputCodigoClasseProduto", data["Codigo"]);
                            setHtml("descriptionCodigoClasseProduto", data["Nome"]);
                        },
                        onInvalid: function () {
                            validatorClasseProduto.clear({ error: true });
                            validatorClasseProduto.focus();
                        },
                        onEmpty: function () {
                            validatorClasseProduto.clear();
                        }
                    });
                    validatorClasseProduto.listen();

                    var tableClasseProduto = new Table({
                        "id": "tableClasseProduto",
                        "route": window.baseUrl + "Empresarial/F4ClasseProduto/GetClassesProdutos",
                        "columns": [
                            { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Nome", field: "Nome", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Classificação", field: "Classificacao", width: 115, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        "showFilter": true,
                        "onChange": function () {
                            var ok = document.getElementById("inputF4ModalOk" + this.id);
                            ok.onclick = function () {
                                var data = tableClasseProduto.getSelectedData();
                                validatorClasseProduto.onValid(data);
                                validatorClasseProduto.update();
                            };
                        },
                        "onDataBound": function () {
                            $("#tableClasseProduto table tr").on("dblclick", function () {
                                var data = tableClasseProduto.getSelectedData();
                                validatorClasseProduto.onValid(data);
                                validatorClasseProduto.update();
                                $("#modalClasseProduto").modal("hide");
                            });
                        },
                        "dataSourceType": "Filtered"
                    });
                    var linkClasseProduto = document.getElementById("linkButtonModalClasseProduto");
                    var inputClasseProduto = document.getElementById("inputCodigoClasseProduto");
                    var modalClasseProduto = new Modal("ClasseProduto", linkClasseProduto, inputClasseProduto, tableClasseProduto);
                    modalClasseProduto.listen();

                    var inputTipoDeInventario = $("#inputTipoDeInventario").kendoDropDownList({
                        dataSource: [
                            { Value: "0", Text: "Normal" },
                            { Value: "1", Text: "Separar Estoque de Terceiros em Poder da Empresa" }
                        ],
                        dataTextField: "Text",
                        dataValueField: "Value",
                        value: "0"
                    });

                    var inputRelatorio = new DropDown({
                        "id": "inputRelatorio",
                        "route": "Estoque/Relatorios/GetModelosInventario"
                    });
                    inputRelatorio.make();

                    currentUser.update(params.User);
                    var inputs = currentUser.getCustomData("est_rel_inventario");
                    if (inputs === null || inputs === "") {
                        inputPeriodoInicial.setValue(getDateNowDDMMYYYY());
                        inputPeriodoFinal.setValue(getDateNowDDMMYYYY());
                        setFilialDefault(validatorFilial, true);
                    }
                    else {
                        inputs = JSON.parse(inputs);
                        inputRelatorio.set(inputs.Relatorio);
                        inputPeriodoInicial.setValue(inputs.PeriodoInicial);
                        inputPeriodoFinal.setValue(inputs.PeriodoFinal);
                        validatorFilial.setValue(inputs.Filial);
                        setFilialDefault(validatorFilial, false);
                        validatorClasseProduto.setValue(inputs.ClasseProduto);
                        inputTipoDeInventario.data().kendoDropDownList.select(inputs.TipoDeInventario.toInt());
                        setChecked("inputListarEstoqueDeTerceirosEmPoderDaEmpresa", inputs.ListarEstoqueDeTerceirosEmPoderDaEmpresa);
                        setChecked("inputIgnorarProdutosInativosNaImpressao", inputs.IgnorarProdutosInativosNaImpressao);
                    }

                    $("#buttonOK").on("click", function () {
                        inputs = {
                            Relatorio: inputRelatorio.get(),
                            PeriodoInicial: inputPeriodoInicial.getValue(),
                            PeriodoFinal: inputPeriodoFinal.getValue(),
                            Filial: getVal("inputCodigoFilial"),
                            ClasseProduto: getVal("inputCodigoClasseProduto"),
                            TipoDeInventario: inputTipoDeInventario.val(),
                            ListarEstoqueDeTerceirosEmPoderDaEmpresa: isChecked("inputListarEstoqueDeTerceirosEmPoderDaEmpresa"),
                            IgnorarProdutosInativosNaImpressao: isChecked("inputIgnorarProdutosInativosNaImpressao")
                        }
                        currentUser.setCustomData("est_rel_inventario", JSON.stringify(inputs));

                        window.open(window.baseUrl + "Estoque/Relatorios/GeraRelatorioInventario?"
                            + "Relatorio=" + inputRelatorio.dropDown.dataItem().Text
                            + "&DataInicial=" + getVal("inputPeriodoInicial")
                            + "&DataFinal=" + getVal("inputPeriodoFinal")
                            + "&Filial=" + getVal("inputCodigoFilial")
                            + "&ClasseProduto=" + getVal("inputCodigoClasseProduto")
                            + "&TipoDeInventario=" + getVal("inputTipoDeInventario")
                            + "&ListarEstoqueDeTerceirosEmPoderDaEmpresa=" + isChecked("inputCodigoClasseProduto")
                            + "&IgnorarProdutosInativosNaImpressao=" + isChecked("inputCodigoClasseProduto")
                        );
                    });
                })(params);
            },

            RelatoriosMovimentos: function (params) {
                return (function () {
                    var u = new Util();
                    $("<div id='modalDiv'>").appendTo("body");

                    u.addButtonHelpBreadcrumb("RadarWEB.htm", "Tela Inicial");

                    var inputPeriodoInicial = new DateValidator({
                        id: "inputPeriodoInicial",
                        v2: true,
                        constructInjection: function () {
                            makeDatePicker("#" + this.id);
                        },
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        },
                    });

                    var inputPeriodoFinal = new DateValidator({
                        id: "inputPeriodoFinal",
                        v2: true,
                        constructInjection: function () {
                            makeDatePicker("#" + this.id);
                        },
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        },
                    });

                    var comparePeriodoInicialComFinal = new DateComparer({
                        idA: "inputPeriodoInicial",
                        idB: "inputPeriodoFinal",
                        verb: "less",
                        onInvalid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.error);
                            u.alert("Data inicial deve ser anterior a data final.", alertBehavior.error);
                        },
                        onValid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.normal);
                        }
                    });

                    // produto
                    var validatorProdutos = new Validator({
                        field: "inputCodigoProduto",
                        fieldDescriptionId: "descriptionCodigoProduto",
                        fieldSearch: "CodigoProduto",
                        v2: "v3",
                        linkButton: "linkButtonModalProdutos",
                        linkButtonModalGrupoContas: "linkButtonModalGrupoContasProduto",
                        onPendencyMessage: "Deve ser informado o código do produto.",
                        route: "Empresarial/F4Produto/GetProdutoClasse",
                        onValid: function (data) {
                            validatorProdutos.setChange(true);
                            validatorProdutos.setValues(data["Codigo"], data["Nome"]);
                            validatorProdutos.PropertiesSpecifyField = {
                                Classificacao: data.Classificacao,
                                HaveGrade1: data.HaveGrade1,
                                HaveGrade2: data.HaveGrade2,
                                HaveGrade3: data.HaveGrade3
                            };

                            validatorGrade1.clear({ disable: true });
                            validatorGrade2.clear({ disable: true });
                            validatorGrade3.clear({ disable: true });

                            if (validatorProdutos.PropertiesSpecifyField.HaveGrade1) {
                                validatorGrade1.enable();
                                validatorGrade1.focus();
                            } else {
                                $("#linkButtonModalProdutos").focus();
                            }

                            if (validatorProdutos.PropertiesSpecifyField.HaveGrade2)
                                validatorGrade2.enable();

                            if (validatorProdutos.PropertiesSpecifyField.HaveGrade3)
                                validatorGrade3.enable();
                        },
                        onInvalid: function (data) {
                            validatorProdutos.setChange(true);
                            validatorProdutos.clear({ error: true });
                            validatorProdutos.focus();
                            validatorGrade1.clear({ error: true, disable: true });
                            validatorGrade2.clear({ error: true, disable: true });
                            validatorGrade3.clear({ error: true, disable: true });
                            validatorProdutos.PropertiesSpecifyField = {};
                        },
                        onEmpty: function () {
                            validatorProdutos.setChange(true);
                            validatorProdutos.clear();
                            validatorGrade1.clear({ disable: true });
                            validatorGrade2.clear({ disable: true });
                            validatorGrade3.clear({ disable: true });
                            validatorProdutos.PropertiesSpecifyField = {};
                            $("#linkButtonModalProdutos").focus();
                        }
                    });
                    validatorProdutos.listen();

                    var tableProdutos = new Table({
                        id: "tableProdutos",
                        route: window.baseUrl + "Empresarial/F4Produto/GetProdutos",
                        showFilter: true,
                        columns: [
                            { title: "Código", field: "Codigo", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Nome", field: "Nome", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Unidade", field: "Unidade", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Preço", field: "ValorUnitario", width: 60, headerAttributes: { style: "color: black; text-align: rigtht;" }, attributes: { style: "text-align: rigtht;" } },
                            { title: "Classificação", field: "Classificacao", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        onChange: function () {
                            $("#inputF4ModalOk" + this.id).on("click", function () {
                                // refatorar e colocar em uma rotina, pois sao 3 lugares para alterar: onclick-table, dblclick-table e dblclick-hierarquia
                                var data = tableProdutos.getSelectedData(),
                                    search = {};
                                search["CodigoProduto"] = data["Codigo"];
                                getJsonFromRoute("Empresarial/F4Produto/GetProdutoClasse", search).done(function (data) {
                                    validatorProdutos.onValid(data);
                                    validatorProdutos.update();
                                });
                            });
                        },
                        onDataBound: function () {
                            $("#" + this.id + " table  tr").on("dblclick", function () {
                                // refatorar e colocar em uma rotina, pois sao 3 lugares para alterar: onclick-table, dblclick-table e dblclick-hierarquia
                                var data = tableProdutos.getSelectedData(),
                                    search = {};
                                search["CodigoProduto"] = data["Codigo"];
                                getJsonFromRoute("Empresarial/F4Produto/GetProdutoClasse", search).done(function (data) {
                                    validatorProdutos.onValid(data);
                                    validatorProdutos.update();
                                });
                                $("#modalProdutos").modal("hide");
                            });
                        },
                        dataSourceType: "Filtered"
                    });

                    var modalProdutos = new Modal("Produtos",
                        byId("linkButtonModalProdutos"),
                        byId("inputCodigoProduto"),
                        tableProdutos,
                        null,
                        {
                            validatorInput: validatorProdutos, // o objeto modal precisa para depois setar a instancia dele, na propriedade "modal" do validator
                            showOpcaoExibir: true,
                            selectClass: true,
                            onDblClickGetItem: function (event, dados) {
                                // refatorar e colocar em uma rotina, pois sao 3 lugares para alterar: onclick-table, dblclick-table e dblclick-hierarquia
                                var data = dados,
                                    search = {};
                                search["CodigoProduto"] = data["Codigo"];
                                getJsonFromRoute("Empresarial/F4Produto/GetProdutoClasse", search).done(function (data) {
                                    validatorProdutos.onValid(data);
                                    validatorProdutos.update();
                                });
                                $("#modalProdutos").modal("hide");
                            }
                        }).listen();

                    // grades
                    var columnsGrade = [
                        { title: "Código", field: "Codigo", width: 45, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                        { title: "Descrição", field: "Descricao", width: 64, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                    ];

                    // grade1
                    var validatorGrade1 = new Validator({
                        field: "inputCodigoGrade1",
                        fieldDescriptionId: "descriptionCodigoGrade1",
                        fieldSearch: "CodigoGrade1",
                        v2: "v3",
                        onPendencyMessage: "Deve ser informado a Grade 1.",
                        route: "Empresarial/F4Produto/GetItemGrade1",
                        pendency: [validatorProdutos],
                        onValid: function (data) {
                            validatorGrade1.setChange(true);
                            validatorGrade1.setValues(data["Codigo"], " - " + data["Descricao"]);

                            if (validatorProdutos.PropertiesSpecifyField.HaveGrade2) {
                                validatorGrade2.focus();
                            }
                        },
                        onInvalid: function (data) {
                            validatorGrade1.setChange(true);
                            validatorGrade1.clear({ error: true });
                            validatorGrade1.focus();
                        },
                        onEmpty: function () {
                            validatorGrade1.setChange(true);
                            validatorGrade1.clear();
                            validatorGrade2.clear();
                            validatorGrade3.clear();
                        }
                    });
                    validatorGrade1.listen();

                    var tableGrade1 = new Table({
                        id: "tableGrade1",
                        route: window.baseUrl + "Empresarial/F4Produto/List1",
                        showFilter: true,
                        columns: columnsGrade,
                        params: [validatorProdutos],
                        fieldDepende: validatorProdutos,
                        onChange: function () {
                            $("#inputF4ModalOk" + this.id).on("click", function () {
                                var data = tableGrade1.getSelectedData();
                                requestLeg(function () {
                                    validatorGrade1.onValid(data);
                                    validatorGrade1.update();
                                });
                            });
                        },
                        onDataBound: function () {
                            $("#" + this.id + " table  tr").on("dblclick", function () {
                                var data = tableGrade1.getSelectedData();
                                requestLeg(function () {
                                    validatorGrade1.onValid(data);
                                    validatorGrade1.update();
                                });
                                $("#modalGrade1").modal("hide");
                            });
                        },
                        dataSourceType: "Parameter"
                    });

                    var modalGrade1 = new Modal("Grade",
                        byId("linkButtonModalGrade1"),
                        byId("inputCodigoGrade1"),
                        tableGrade1
                    ).listen();

                    // grade2
                    var validatorGrade2 = new Validator({
                        field: "inputCodigoGrade2",
                        fieldDescriptionId: "descriptionCodigoGrade2",
                        fieldSearch: "CodigoGrade2",
                        v2: "v3",
                        onPendencyMessage: "Deve ser informado a Grade 2.",
                        route: "Empresarial/F4Produto/GetItemGrade2",
                        pendency: [validatorGrade1, validatorProdutos],
                        onValid: function (data) {
                            validatorGrade2.setChange(true);
                            validatorGrade2.setValues(data["Codigo"], " - " + data["Descricao"]);

                            if (validatorProdutos.PropertiesSpecifyField.HaveGrade3) {
                                validatorGrade3.focus();
                            }
                        },
                        onInvalid: function (data) {
                            validatorGrade2.setChange(true);
                            validatorGrade2.clear({ error: true });
                            validatorGrade2.focus();
                        },
                        onEmpty: function () {
                            validatorGrade2.setChange(true);
                            validatorGrade2.clear();
                            validatorGrade3.clear();
                        }
                    });
                    validatorGrade2.listen();

                    var tableGrade2 = new Table({
                        id: "tableGrade2",
                        route: window.baseUrl + "Empresarial/F4Produto/List2",
                        showFilter: true,
                        columns: columnsGrade,
                        params: [validatorGrade1, validatorProdutos],
                        fieldDepende: validatorGrade1,
                        onChange: function () {
                            $("#inputF4ModalOk" + this.id).on("click", function () {
                                var data = tableGrade2.getSelectedData();
                                requestLeg(function () {
                                    validatorGrade2.onValid(data);
                                    validatorGrade2.update();
                                });
                            });
                        },
                        onDataBound: function () {
                            $("#" + this.id + " table  tr").on("dblclick", function () {
                                var data = tableGrade2.getSelectedData();
                                requestLeg(function () {
                                    validatorGrade2.onValid(data);
                                    validatorGrade2.update();
                                });
                                $("#modalGrade2").modal("hide");
                            });
                        },
                        dataSourceType: "Parameter"
                    });

                    var modalGrade2 = new Modal("Grade",
                        byId("linkButtonModalGrade2"),
                        byId("inputCodigoGrade2"),
                        tableGrade2
                    ).listen();

                    // grade3
                    var validatorGrade3 = new Validator({
                        field: "inputCodigoGrade3",
                        fieldDescriptionId: "descriptionCodigoGrade3",
                        fieldSearch: "CodigoGrade3",
                        v2: "v3",
                        onPendencyMessage: "Deve ser informado a Grade 3.",
                        route: "Empresarial/F4Produto/GetItemGrade3",
                        pendency: [validatorGrade2, validatorGrade1, validatorProdutos],
                        onValid: function (data) {
                            validatorGrade3.setChange(true);
                            validatorGrade3.setValues(data["Codigo"], " - " + data["Descricao"]);
                        },
                        onInvalid: function (data) {
                            validatorGrade3.setChange(true);
                            validatorGrade3.clear({ error: true });
                            validatorGrade3.focus();
                        },
                        onEmpty: function () {
                            validatorGrade3.setChange(true);
                            validatorGrade3.clear();
                        }
                    });
                    validatorGrade3.listen();

                    var tableGrade3 = new Table({
                        id: "tableGrade3",
                        route: window.baseUrl + "Empresarial/F4Produto/List3",
                        showFilter: true,
                        columns: columnsGrade,
                        params: [validatorGrade2, validatorGrade1, validatorProdutos],
                        fieldDepende: validatorGrade2,
                        onChange: function () {
                            $("#inputF4ModalOk" + this.id).on("click", function () {
                                var data = tableGrade3.getSelectedData();
                                validatorGrade3.onValid(data);
                                validatorGrade3.update();
                            });
                        },
                        onDataBound: function () {
                            $("#" + this.id + " table  tr").on("dblclick", function () {
                                var data = tableGrade3.getSelectedData();
                                validatorGrade3.onValid(data);
                                validatorGrade3.update();
                                $("#modalGrade3").modal("hide");
                            });
                        },
                        dataSourceType: "Parameter"
                    });

                    var modalGrade3 = new Modal("Grade",
                        byId("linkButtonModalGrade3"),
                        byId("inputCodigoGrade3"),
                        tableGrade3
                    ).listen();

                    listenToggleProdutoGradesF4();

                    // o modalGrupoContasProduto tem que criar por ultimo porque é passado os validator grades como parametro
                    var modalGrupoContasProduto = new ModalGrupoContas({
                        id: "Produto",
                        tipo: "Produto",
                        validatorInput: [validatorProdutos, validatorGrade1, validatorGrade2, validatorGrade3],
                    });

                    // tipo de local
                    $("#inputTipoLocalEstoqueProprio").on("click", function () {
                        if (!isChecked("inputTipoLocalEstoqueDeTerceirosEmPoderDaEmpresa") && !isChecked("inputTipoLocalEstoqueEmPoderDeTerceiros")) {
                            $("#inputTipoLocalEstoqueProprio").attr("checked", true);
                        }
                    });

                    $("#inputTipoLocalEstoqueEmPoderDeTerceiros").on("click", function () {
                        if (!isChecked("inputTipoLocalEstoqueDeTerceirosEmPoderDaEmpresa") && !isChecked("inputTipoLocalEstoqueProprio")) {
                            $("#inputTipoLocalEstoqueEmPoderDeTerceiros").attr("checked", true);
                        }
                    });

                    $("#inputTipoLocalEstoqueDeTerceirosEmPoderDaEmpresa").on("click", function () {
                        if (isChecked("inputTipoLocalEstoqueDeTerceirosEmPoderDaEmpresa")) {
                            $("#inputTipoLocalEstoqueProprio").attr("checked", false);
                            $("#inputTipoLocalEstoqueEmPoderDeTerceiros").attr("checked", false);
                            $("#inputTipoLocalEstoqueProprio").attr("disabled", "disabled");
                            $("#inputTipoLocalEstoqueEmPoderDeTerceiros").attr("disabled", "disabled");
                        } else {
                            $("#inputTipoLocalEstoqueProprio").removeAttr("disabled");
                            $("#inputTipoLocalEstoqueEmPoderDeTerceiros").removeAttr("disabled");
                            setChecked("inputTipoLocalEstoqueProprio", true);
                        }
                    });

                    var inputNomesDosLocais = $("#inputNomesDosLocais").kendoDropDownList({
                        dataSource: [
                            { Value: "1", Text: "Estocagem" },
                            { Value: "2", Text: "Armazenagem" }
                        ],
                        dataTextField: "Text",
                        dataValueField: "Value",
                        value: "1"
                    });

                    var inputRelatorio = new DropDown({
                        "id": "inputRelatorio",
                        "route": "Estoque/Relatorios/GetModelosMovimentos"
                    });
                    inputRelatorio.make();

                    currentUser.update(params.User);
                    var inputs = currentUser.getCustomData("est_rel_movimentos");
                    if (inputs === null || inputs === "") {
                        inputPeriodoInicial.setValue(getDateNowDDMMYYYY());
                        inputPeriodoFinal.setValue(getDateNowDDMMYYYY());
                        setChecked("inputTipoLocalEstoqueProprio", true);
                        setChecked("inputTipoLocalEstoqueEmPoderDeTerceiros", false);
                        setChecked("inputTipoLocalEstoqueDeTerceirosEmPoderDaEmpresa", false);
                    } else {
                        inputs = JSON.parse(inputs);
                        inputRelatorio.set(inputs.Relatorio);
                        inputPeriodoInicial.setValue(inputs.PeriodoInicial);
                        inputPeriodoFinal.setValue(inputs.PeriodoFinal);

                        validatorProdutos.setGrupoContas(inputs.GrupoContasProdutos);
                        if (inputs.GrupoContasProdutos.length > 1) {
                            validatorProdutos.setVarios(true, "Produto");
                        }
                        else {
                            validatorProdutos.setVarios(false, "Produto", [validatorGrade1, validatorGrade2, validatorGrade3]);
                        }

                        setChecked("inputListarSubordinados", inputs.ListarSubordinados);
                        setChecked("inputTipoLocalEstoqueProprio", inputs.TipoLocalEstoqueProprio);
                        setChecked("inputTipoLocalEstoqueEmPoderDeTerceiros", inputs.TipoLocalEstoqueEmPoderDeTerceiros);
                        setChecked("inputTipoLocalEstoqueDeTerceirosEmPoderDaEmpresa", inputs.TipoLocalEstoqueDeTerceirosEmPoderDaEmpresa);
                        inputNomesDosLocais.data().kendoDropDownList.select(inputs.NomesDosLocais.toInt());
                    }

                    $("#buttonOK").on("click", function () {
                        var grupoContasProdutosSalva = [];
                        if (validatorProdutos.getVarios()) {
                            grupoContasProdutosSalva = validatorProdutos.getGrupoContas();
                        }
                        else {
                            var produto = {
                                Classificacao: validatorProdutos.PropertiesSpecifyField.Classificacao,
                                Codigo: validatorProdutos.getValue(),
                                Nome: validatorProdutos.getDescription(),
                                HaveGrade1: validatorProdutos.PropertiesSpecifyField.HaveGrade1,
                                HaveGrade2: validatorProdutos.PropertiesSpecifyField.HaveGrade2,
                                HaveGrade3: validatorProdutos.PropertiesSpecifyField.HaveGrade3,
                                CodigoGrade1: validatorGrade1.getValue(),
                                CodigoGrade2: validatorGrade2.getValue(),
                                CodigoGrade3: validatorGrade3.getValue(),
                                Grade1: validatorGrade1.getDescription().replace(" - ", ""),
                                Grade2: validatorGrade2.getDescription().replace(" - ", ""),
                                Grade3: validatorGrade3.getDescription().replace(" - ", "")
                            };
                            grupoContasProdutosSalva.push(produto);
                        }

                        inputs = {
                            Relatorio: inputRelatorio.get(),
                            PeriodoInicial: inputPeriodoInicial.getValue(),
                            PeriodoFinal: inputPeriodoFinal.getValue(),
                            GrupoContasProdutos: grupoContasProdutosSalva,
                            ListarSubordinados: isChecked("inputListarSubordinados"),
                            TipoLocalEstoqueProprio: isChecked("inputTipoLocalEstoqueProprio"),
                            TipoLocalEstoqueEmPoderDeTerceiros: isChecked("inputTipoLocalEstoqueEmPoderDeTerceiros"),
                            TipoLocalEstoqueDeTerceirosEmPoderDaEmpresa: isChecked("inputTipoLocalEstoqueDeTerceirosEmPoderDaEmpresa"),
                            NomesDosLocais: inputNomesDosLocais.val()
                        }
                        currentUser.setCustomData("est_rel_movimentos", JSON.stringify(inputs));

                        var grupoContasProdutosEnvia = [];
                        if (validatorProdutos.getVarios()) {
                            var lista = validatorProdutos.getGrupoContas()
                            for (var produtoAtual in lista) {
                                var produto = {
                                    Codigo: lista[produtoAtual].Codigo,
                                    CodigoGrade1: lista[produtoAtual].CodigoGrade1,
                                    CodigoGrade2: lista[produtoAtual].CodigoGrade2,
                                    CodigoGrade3: lista[produtoAtual].CodigoGrade3
                                };
                                grupoContasProdutosEnvia.push(produto);
                            }
                        }
                        else {
                            var produto = {
                                Codigo: validatorProdutos.getValue(),
                                CodigoGrade1: validatorGrade1.getValue(),
                                CodigoGrade2: validatorGrade2.getValue(),
                                CodigoGrade3: validatorGrade3.getValue()
                            };
                            grupoContasProdutosEnvia.push(produto);
                        }

                        window.open(window.baseUrl + "Estoque/Relatorios/GeraRelatorioMovimentos?"
                            + "Relatorio=" + inputRelatorio.dropDown.dataItem().Text
                            + "&DataInicial=" + getVal("inputPeriodoInicial")
                            + "&DataFinal=" + getVal("inputPeriodoFinal")
                            + "&GrupoContasProdutos=" + JSON.stringify(grupoContasProdutosEnvia)
                            + "&ListarSubordinados=" + isChecked("inputListarSubordinados")
                            + "&TipoLocalEstoqueProprio=" + isChecked("inputTipoLocalEstoqueProprio")
                            + "&TipoLocalEstoqueEmPoderDeTerceiros=" + isChecked("inputTipoLocalEstoqueEmPoderDeTerceiros")
                            + "&TipoLocalEstoqueDeTerceirosEmPoderDaEmpresa=" + isChecked("inputTipoLocalEstoqueDeTerceirosEmPoderDaEmpresa")
                            + "&NomesDosLocais=" + getVal("inputNomesDosLocais")
                        );
                    });
                })(params);
            },

            RelatoriosPontoDeReposicao: function (params) {
                return (function () {
                    var u = new Util();
                    $("<div id='modalDiv'>").appendTo("body");

                    u.addButtonHelpBreadcrumb("RadarWEB.htm", "Tela Inicial");

                    // filial
                    var validatorFilial = new Validator({
                        field: "CodigoFilial",
                        onPendencyMessage: "Deve ser informado o código da filial.",
                        route: "Empresarial/F4Filial/GetFilialEx",
                        v2: true,
                        onValid: function (data) {
                            setVal("inputCodigoFilial", data["Codigo"]);
                            setHtml("descriptionCodigoFilial", data["Nome"]);
                        },
                        onInvalid: function () {
                            validatorFilial.clear({ error: true });
                            validatorFilial.focus();
                        },
                        onEmpty: function () {
                            validatorFilial.clear();
                        }
                    });
                    validatorFilial.listen();

                    var tableFiliais = new Table({
                        "id": "tableFilial",
                        "route": window.baseUrl + "Empresarial/F4Filial/GetFiliais",
                        "columns": [
                            { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Nome", field: "Nome", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "CNPJ/CPF", field: "CpfCnpj", width: 115, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        "showFilter": true,
                        "onChange": function () {
                            var ok = document.getElementById("inputF4ModalOk" + this.id);
                            ok.onclick = function () {
                                var data = tableFiliais.getSelectedData();
                                validatorFilial.onValid(data);
                                validatorFilial.update();
                            };
                        },
                        "onDataBound": function () {
                            $("#tableFilial table tr").on("dblclick", function () {
                                var data = tableFiliais.getSelectedData();
                                validatorFilial.onValid(data);
                                validatorFilial.update();
                                $("#modalFilial").modal("hide");
                            });
                        },
                        "dataSourceType": "Filtered"
                    });
                    var linkFiliais = document.getElementById("linkButtonModalFiliais");
                    var inputFiliais = document.getElementById("inputCodigoFilial");
                    var modalFiliais = new Modal("Filiais", linkFiliais, inputFiliais, tableFiliais);
                    modalFiliais.listen();

                    var inputRelatorio = new DropDown({
                        "id": "inputRelatorio",
                        "route": "Estoque/Relatorios/GetModelosPontoDeReposicao"
                    });
                    inputRelatorio.make();

                    currentUser.update(params.User);
                    var inputs = currentUser.getCustomData("est_rel_pontodefeposicao");
                    if (inputs === null || inputs === "") {
                        setFilialDefault(validatorFilial, true);
                    }
                    else {
                        inputs = JSON.parse(inputs);
                        inputRelatorio.set(inputs.Relatorio);
                        setVal("inputCodigoFilial", inputs.Filial);
                        setFilialDefault(validatorFilial, false);
                    }

                    $("#buttonOK").on("click", function () {
                        inputs = {
                            Relatorio: inputRelatorio.get(),
                            Filial: getVal("inputCodigoFilial")
                        }
                        currentUser.setCustomData("est_rel_pontodefeposicao", JSON.stringify(inputs));

                        window.open(window.baseUrl + "Estoque/Relatorios/GeraRelatorioPontoDeReposicao?"
                            + "Relatorio=" + inputRelatorio.dropDown.dataItem().Text
                            + "&Filial=" + getVal("inputCodigoFilial")
                        );
                    });
                })(params);
            },

            RelatoriosRegistroEstoque: function (params) {
                return (function () {
                    var u = new Util();
                    $("<div id='modalDiv'>").appendTo("body");

                    u.addButtonHelpBreadcrumb("RadarWEB.htm", "Tela Inicial");

                    var inputPeriodoInicial = new DateValidator({
                        id: "inputPeriodoInicial",
                        v2: true,
                        constructInjection: function () {
                            makeDatePicker("#" + this.id);
                        },
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        },
                    });

                    var inputPeriodoFinal = new DateValidator({
                        id: "inputPeriodoFinal",
                        v2: true,
                        constructInjection: function () {
                            makeDatePicker("#" + this.id);
                        },
                        onValid: function (validator) {
                            dateValidatorOnValid(validator);
                        },
                        onInvalid: function (validator) {
                            dateValidatorOnInvalid(validator);
                        },
                    });

                    var comparePeriodoInicialComFinal = new DateComparer({
                        idA: "inputPeriodoInicial",
                        idB: "inputPeriodoFinal",
                        verb: "less",
                        onInvalid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.error);
                            u.alert("Data inicial deve ser anterior a data final.", alertBehavior.error);
                        },
                        onValid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.normal);
                        }
                    });

                    // filial
                    var validatorFilial = new Validator({
                        field: "CodigoFilial",
                        onPendencyMessage: "Deve ser informado o código da filial.",
                        route: "Empresarial/F4Filial/GetFilialEx",
                        v2: true,
                        onValid: function (data) {
                            setVal("inputCodigoFilial", data["Codigo"]);
                            setHtml("descriptionCodigoFilial", data["Nome"]);
                        },
                        onInvalid: function () {
                            validatorFilial.clear({ error: true });
                            validatorFilial.focus();
                        },
                        onEmpty: function () {
                            validatorFilial.clear();
                        }
                    });
                    validatorFilial.listen();

                    var tableFiliais = new Table({
                        "id": "tableFilial",
                        "route": window.baseUrl + "Empresarial/F4Filial/GetFiliais",
                        "columns": [
                            { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Nome", field: "Nome", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "CNPJ/CPF", field: "CpfCnpj", width: 115, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        "showFilter": true,
                        "onChange": function () {
                            var ok = document.getElementById("inputF4ModalOk" + this.id);
                            ok.onclick = function () {
                                var data = tableFiliais.getSelectedData();
                                validatorFilial.onValid(data);
                                validatorFilial.update();
                            };
                        },
                        "onDataBound": function () {
                            $("#tableFilial table tr").on("dblclick", function () {
                                var data = tableFiliais.getSelectedData();
                                validatorFilial.onValid(data);
                                validatorFilial.update();
                                $("#modalFilial").modal("hide");
                            });
                        },
                        "dataSourceType": "Filtered"
                    });
                    var linkFiliais = document.getElementById("linkButtonModalFiliais");
                    var inputFiliais = document.getElementById("inputCodigoFilial");
                    var modalFiliais = new Modal("Filiais", linkFiliais, inputFiliais, tableFiliais);
                    modalFiliais.listen();

                    // produto
                    var validatorProdutos = new Validator({
                        field: "inputCodigoProduto",
                        fieldDescriptionId: "descriptionCodigoProduto",
                        fieldSearch: "CodigoProduto",
                        v2: "v3",
                        linkButton: "linkButtonModalProdutos",
                        linkButtonModalGrupoContas: "linkButtonModalGrupoContasProduto",
                        onPendencyMessage: "Deve ser informado o código do produto.",
                        route: "Empresarial/F4Produto/GetProdutoClasse",
                        onValid: function (data) {
                            validatorProdutos.setChange(true);
                            validatorProdutos.setValues(data["Codigo"], data["Nome"]);
                            validatorProdutos.PropertiesSpecifyField = {
                                Classificacao: data.Classificacao,
                                HaveGrade1: data.HaveGrade1,
                                HaveGrade2: data.HaveGrade2,
                                HaveGrade3: data.HaveGrade3
                            };

                            validatorGrade1.clear({ disable: true });
                            validatorGrade2.clear({ disable: true });
                            validatorGrade3.clear({ disable: true });

                            if (validatorProdutos.PropertiesSpecifyField.HaveGrade1) {
                                validatorGrade1.enable();
                                validatorGrade1.focus();
                            } else {
                                $("#linkButtonModalProdutos").focus();
                            }

                            if (validatorProdutos.PropertiesSpecifyField.HaveGrade2)
                                validatorGrade2.enable();

                            if (validatorProdutos.PropertiesSpecifyField.HaveGrade3)
                                validatorGrade3.enable();
                        },
                        onInvalid: function (data) {
                            validatorProdutos.setChange(true);
                            validatorProdutos.clear({ error: true });
                            validatorProdutos.focus();
                            validatorGrade1.clear({ error: true, disable: true });
                            validatorGrade2.clear({ error: true, disable: true });
                            validatorGrade3.clear({ error: true, disable: true });
                            validatorProdutos.PropertiesSpecifyField = {};
                        },
                        onEmpty: function () {
                            validatorProdutos.setChange(true);
                            validatorProdutos.clear();
                            validatorGrade1.clear({ disable: true });
                            validatorGrade2.clear({ disable: true });
                            validatorGrade3.clear({ disable: true });
                            validatorProdutos.PropertiesSpecifyField = {};
                            $("#linkButtonModalProdutos").focus();
                        }
                    });
                    validatorProdutos.listen();

                    var tableProdutos = new Table({
                        id: "tableProdutos",
                        route: window.baseUrl + "Empresarial/F4Produto/GetProdutos",
                        showFilter: true,
                        columns: [
                            { title: "Código", field: "Codigo", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Nome", field: "Nome", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Unidade", field: "Unidade", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Preço", field: "ValorUnitario", width: 60, headerAttributes: { style: "color: black; text-align: rigtht;" }, attributes: { style: "text-align: rigtht;" } },
                            { title: "Classificação", field: "Classificacao", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        onChange: function () {
                            $("#inputF4ModalOk" + this.id).on("click", function () {
                                // refatorar e colocar em uma rotina, pois sao 3 lugares para alterar: onclick-table, dblclick-table e dblclick-hierarquia
                                var data = tableProdutos.getSelectedData(),
                                    search = {};
                                search["CodigoProduto"] = data["Codigo"];
                                getJsonFromRoute("Empresarial/F4Produto/GetProdutoClasse", search).done(function (data) {
                                    validatorProdutos.onValid(data);
                                    validatorProdutos.update();
                                });
                            });
                        },
                        onDataBound: function () {
                            $("#" + this.id + " table  tr").on("dblclick", function () {
                                // refatorar e colocar em uma rotina, pois sao 3 lugares para alterar: onclick-table, dblclick-table e dblclick-hierarquia
                                var data = tableProdutos.getSelectedData(),
                                    search = {};
                                search["CodigoProduto"] = data["Codigo"];
                                getJsonFromRoute("Empresarial/F4Produto/GetProdutoClasse", search).done(function (data) {
                                    validatorProdutos.onValid(data);
                                    validatorProdutos.update();
                                });
                                $("#modalProdutos").modal("hide");
                            });
                        },
                        dataSourceType: "Filtered"
                    });

                    var modalProdutos = new Modal("Produtos",
                        byId("linkButtonModalProdutos"),
                        byId("inputCodigoProduto"),
                        tableProdutos,
                        null,
                        {
                            validatorInput: validatorProdutos, // o objeto modal precisa para depois setar a instancia dele, na propriedade "modal" do validator
                            showOpcaoExibir: true,
                            selectClass: true,
                            onDblClickGetItem: function (event, dados) {
                                // refatorar e colocar em uma rotina, pois sao 3 lugares para alterar: onclick-table, dblclick-table e dblclick-hierarquia
                                var data = dados,
                                    search = {};
                                search["CodigoProduto"] = data["Codigo"];
                                getJsonFromRoute("Empresarial/F4Produto/GetProdutoClasse", search).done(function (data) {
                                    validatorProdutos.onValid(data);
                                    validatorProdutos.update();
                                });
                                $("#modalProdutos").modal("hide");
                            }
                        }).listen();

                    // grades
                    var columnsGrade = [
                        { title: "Código", field: "Codigo", width: 45, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                        { title: "Descrição", field: "Descricao", width: 64, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                    ];

                    // grade1
                    var validatorGrade1 = new Validator({
                        field: "inputCodigoGrade1",
                        fieldDescriptionId: "descriptionCodigoGrade1",
                        fieldSearch: "CodigoGrade1",
                        v2: "v3",
                        onPendencyMessage: "Deve ser informado a Grade 1.",
                        route: "Empresarial/F4Produto/GetItemGrade1",
                        pendency: [validatorProdutos],
                        onValid: function (data) {
                            validatorGrade1.setChange(true);
                            validatorGrade1.setValues(data["Codigo"], " - " + data["Descricao"]);

                            if (validatorProdutos.PropertiesSpecifyField.HaveGrade2) {
                                validatorGrade2.focus();
                            }
                        },
                        onInvalid: function (data) {
                            validatorGrade1.setChange(true);
                            validatorGrade1.clear({ error: true });
                            validatorGrade1.focus();
                        },
                        onEmpty: function () {
                            validatorGrade1.setChange(true);
                            validatorGrade1.clear();
                            validatorGrade2.clear();
                            validatorGrade3.clear();
                        }
                    });
                    validatorGrade1.listen();

                    var tableGrade1 = new Table({
                        id: "tableGrade1",
                        route: window.baseUrl + "Empresarial/F4Produto/List1",
                        showFilter: true,
                        columns: columnsGrade,
                        params: [validatorProdutos],
                        fieldDepende: validatorProdutos,
                        onChange: function () {
                            $("#inputF4ModalOk" + this.id).on("click", function () {
                                var data = tableGrade1.getSelectedData();
                                requestLeg(function () {
                                    validatorGrade1.onValid(data);
                                    validatorGrade1.update();
                                });
                            });
                        },
                        onDataBound: function () {
                            $("#" + this.id + " table  tr").on("dblclick", function () {
                                var data = tableGrade1.getSelectedData();
                                requestLeg(function () {
                                    validatorGrade1.onValid(data);
                                    validatorGrade1.update();
                                });
                                $("#modalGrade1").modal("hide");
                            });
                        },
                        dataSourceType: "Parameter"
                    });

                    var modalGrade1 = new Modal("Grade",
                        byId("linkButtonModalGrade1"),
                        byId("inputCodigoGrade1"),
                        tableGrade1
                    ).listen();

                    // grade2
                    var validatorGrade2 = new Validator({
                        field: "inputCodigoGrade2",
                        fieldDescriptionId: "descriptionCodigoGrade2",
                        fieldSearch: "CodigoGrade2",
                        v2: "v3",
                        onPendencyMessage: "Deve ser informado a Grade 2.",
                        route: "Empresarial/F4Produto/GetItemGrade2",
                        pendency: [validatorGrade1, validatorProdutos],
                        onValid: function (data) {
                            validatorGrade2.setChange(true);
                            validatorGrade2.setValues(data["Codigo"], " - " + data["Descricao"]);

                            if (validatorProdutos.PropertiesSpecifyField.HaveGrade3) {
                                validatorGrade3.focus();
                            }
                        },
                        onInvalid: function (data) {
                            validatorGrade2.setChange(true);
                            validatorGrade2.clear({ error: true });
                            validatorGrade2.focus();
                        },
                        onEmpty: function () {
                            validatorGrade2.setChange(true);
                            validatorGrade2.clear();
                            validatorGrade3.clear();
                        }
                    });
                    validatorGrade2.listen();

                    var tableGrade2 = new Table({
                        id: "tableGrade2",
                        route: window.baseUrl + "Empresarial/F4Produto/List2",
                        showFilter: true,
                        columns: columnsGrade,
                        params: [validatorGrade1, validatorProdutos],
                        fieldDepende: validatorGrade1,
                        onChange: function () {
                            $("#inputF4ModalOk" + this.id).on("click", function () {
                                var data = tableGrade2.getSelectedData();
                                requestLeg(function () {
                                    validatorGrade2.onValid(data);
                                    validatorGrade2.update();
                                });
                            });
                        },
                        onDataBound: function () {
                            $("#" + this.id + " table  tr").on("dblclick", function () {
                                var data = tableGrade2.getSelectedData();
                                requestLeg(function () {
                                    validatorGrade2.onValid(data);
                                    validatorGrade2.update();
                                });
                                $("#modalGrade2").modal("hide");
                            });
                        },
                        dataSourceType: "Parameter"
                    });

                    var modalGrade2 = new Modal("Grade",
                        byId("linkButtonModalGrade2"),
                        byId("inputCodigoGrade2"),
                        tableGrade2
                    ).listen();

                    // grade3
                    var validatorGrade3 = new Validator({
                        field: "inputCodigoGrade3",
                        fieldDescriptionId: "descriptionCodigoGrade3",
                        fieldSearch: "CodigoGrade3",
                        v2: "v3",
                        onPendencyMessage: "Deve ser informado a Grade 3.",
                        route: "Empresarial/F4Produto/GetItemGrade3",
                        pendency: [validatorGrade2, validatorGrade1, validatorProdutos],
                        onValid: function (data) {
                            validatorGrade3.setChange(true);
                            validatorGrade3.setValues(data["Codigo"], " - " + data["Descricao"]);
                        },
                        onInvalid: function (data) {
                            validatorGrade3.setChange(true);
                            validatorGrade3.clear({ error: true });
                            validatorGrade3.focus();
                        },
                        onEmpty: function () {
                            validatorGrade3.setChange(true);
                            validatorGrade3.clear();
                        }
                    });
                    validatorGrade3.listen();

                    var tableGrade3 = new Table({
                        id: "tableGrade3",
                        route: window.baseUrl + "Empresarial/F4Produto/List3",
                        showFilter: true,
                        columns: columnsGrade,
                        params: [validatorGrade2, validatorGrade1, validatorProdutos],
                        fieldDepende: validatorGrade2,
                        onChange: function () {
                            $("#inputF4ModalOk" + this.id).on("click", function () {
                                var data = tableGrade3.getSelectedData();
                                validatorGrade3.onValid(data);
                                validatorGrade3.update();
                            });
                        },
                        onDataBound: function () {
                            $("#" + this.id + " table  tr").on("dblclick", function () {
                                var data = tableGrade3.getSelectedData();
                                validatorGrade3.onValid(data);
                                validatorGrade3.update();
                                $("#modalGrade3").modal("hide");
                            });
                        },
                        dataSourceType: "Parameter"
                    });

                    var modalGrade3 = new Modal("Grade",
                        byId("linkButtonModalGrade3"),
                        byId("inputCodigoGrade3"),
                        tableGrade3
                    ).listen();

                    listenToggleProdutoGradesF4();

                    // o modalGrupoContasProduto tem que criar por ultimo porque é passado os validator grades como parametro
                    var modalGrupoContasProduto = new ModalGrupoContas({
                        id: "Produto",
                        tipo: "Produto",
                        validatorInput: [validatorProdutos, validatorGrade1, validatorGrade2, validatorGrade3],
                    });

                    // tipo operacao
                    var validatorTipoOperacao = new ValidatorDropDown({
                        id: "inputTipoOperacao",
                        idDescription: "descriptionTipoOperacao",
                        route: "Estoque/Relatorios/GetListTipoOperacao",
                        linkButtonModalGrupoContas: "linkButtonModalGrupoContasTipoOperacao"
                    });

                    var modalGrupoContasTipoOperacao = new ModalGrupoContas({
                        id: "TipoOperacao",
                        tipo: "TipoOperacao",
                        validatorInput: [validatorTipoOperacao]
                    });

                    // tipo de local
                    $("#inputTipoLocalEstoqueProprio").on("click", function () {
                        if (!isChecked("inputTipoLocalEstoqueDeTerceirosEmPoderDaEmpresa") && !isChecked("inputTipoLocalEstoqueEmPoderDeTerceiros")) {
                            $("#inputTipoLocalEstoqueProprio").attr("checked", true);
                        }
                    });

                    $("#inputTipoLocalEstoqueEmPoderDeTerceiros").on("click", function () {
                        if (!isChecked("inputTipoLocalEstoqueDeTerceirosEmPoderDaEmpresa") && !isChecked("inputTipoLocalEstoqueProprio")) {
                            $("#inputTipoLocalEstoqueEmPoderDeTerceiros").attr("checked", true);
                        }
                    });

                    $("#inputTipoLocalEstoqueDeTerceirosEmPoderDaEmpresa").on("click", function () {
                        if (isChecked("inputTipoLocalEstoqueDeTerceirosEmPoderDaEmpresa")) {
                            $("#inputTipoLocalEstoqueProprio").attr("checked", false);
                            $("#inputTipoLocalEstoqueEmPoderDeTerceiros").attr("checked", false);
                            $("#inputTipoLocalEstoqueProprio").attr("disabled", "disabled");
                            $("#inputTipoLocalEstoqueEmPoderDeTerceiros").attr("disabled", "disabled");
                        } else {
                            $("#inputTipoLocalEstoqueProprio").removeAttr("disabled");
                            $("#inputTipoLocalEstoqueEmPoderDeTerceiros").removeAttr("disabled");
                            setChecked("inputTipoLocalEstoqueProprio", true);
                        }
                    });

                    // tipo de relatorio
                    var inputTipoDeRelatorio = $("#inputTipoDeRelatorio").kendoDropDownList({
                        dataSource: [
                            { Value: "0", Text: "Sintético" },
                            { Value: "1", Text: "Analítico" }
                        ],
                        dataTextField: "Text",
                        dataValueField: "Value",
                        value: "0"
                    });

                    var inputRelatorio = new DropDown({
                        "id": "inputRelatorio",
                        "route": "Estoque/Relatorios/GetModelosRegistroEstoque"
                    });
                    inputRelatorio.make();

                    currentUser.update(params.User);

                    var inputs = currentUser.getCustomData("est_rel_registroestoque");
                    if (inputs === null || inputs === "") {
                        inputPeriodoInicial.setValue(getDateNowDDMMYYYY());
                        inputPeriodoFinal.setValue(getDateNowDDMMYYYY());
                        setFilialDefault(validatorFilial, true);
                        setChecked("inputTipoLocalEstoqueProprio", true);
                        setChecked("inputTipoLocalEstoqueEmPoderDeTerceiros", false);
                        setChecked("inputTipoLocalEstoqueDeTerceirosEmPoderDaEmpresa", false);
                    }
                    else {
                        inputs = JSON.parse(inputs);
                        inputRelatorio.set(inputs.Relatorio);
                        inputPeriodoInicial.setValue(inputs.PeriodoInicial);
                        inputPeriodoFinal.setValue(inputs.PeriodoFinal);
                        validatorFilial.setValue(inputs.Filial);
                        setFilialDefault(validatorFilial, false);

                        validatorProdutos.setGrupoContas(inputs.GrupoContasProdutos);
                        if (inputs.GrupoContasProdutos.length > 1) {
                            validatorProdutos.setVarios(true, "Produto");
                        }
                        else {
                            validatorProdutos.setVarios(false, "Produto", [validatorGrade1, validatorGrade2, validatorGrade3]);
                        }

                        setChecked("inputConsolidarGradesDoProduto", inputs.ConsolidarGradesDoProduto);

                        validatorTipoOperacao.setGrupoContas(inputs.TipoOperacao);
                        if (inputs.TipoOperacao.length > 1) {
                            validatorTipoOperacao.setVarios(true);
                        }
                        else {
                            validatorTipoOperacao.setVarios(false);
                        }

                        setChecked("inputTipoLocalEstoqueProprio", inputs.TipoLocalEstoqueProprio);
                        setChecked("inputTipoLocalEstoqueEmPoderDeTerceiros", inputs.TipoLocalEstoqueEmPoderDeTerceiros);
                        setChecked("inputTipoLocalEstoqueDeTerceirosEmPoderDaEmpresa", inputs.TipoLocalEstoqueDeTerceirosEmPoderDaEmpresa);
                        inputTipoDeRelatorio.data().kendoDropDownList.select(inputs.TipoDeRelatorio.toInt());
                    }

                    $("#buttonOK").on("click", function () {
                        var grupoContasProdutosSalva = [];
                        if (validatorProdutos.getVarios()) {
                            grupoContasProdutosSalva = validatorProdutos.getGrupoContas();
                        }
                        else {
                            var produto = {
                                Classificacao: validatorProdutos.PropertiesSpecifyField.Classificacao,
                                Codigo: validatorProdutos.getValue(),
                                Nome: validatorProdutos.getDescription(),
                                HaveGrade1: validatorProdutos.PropertiesSpecifyField.HaveGrade1,
                                HaveGrade2: validatorProdutos.PropertiesSpecifyField.HaveGrade2,
                                HaveGrade3: validatorProdutos.PropertiesSpecifyField.HaveGrade3,
                                CodigoGrade1: validatorGrade1.getValue(),
                                CodigoGrade2: validatorGrade2.getValue(),
                                CodigoGrade3: validatorGrade3.getValue(),
                                Grade1: validatorGrade1.getDescription().replace(" - ", ""),
                                Grade2: validatorGrade2.getDescription().replace(" - ", ""),
                                Grade3: validatorGrade3.getDescription().replace(" - ", "")
                            };
                            grupoContasProdutosSalva.push(produto);
                        }

                        var grupoContasTipoOperacaoSalva = [];
                        if (validatorTipoOperacao.getVarios()) {
                            grupoContasTipoOperacaoSalva = validatorTipoOperacao.getGrupoContas();
                        }
                        else {
                            var tipoOperacao = {
                                id: validatorTipoOperacao.getValue(),
                            };
                            grupoContasTipoOperacaoSalva.push(tipoOperacao);
                        }

                        inputs = {
                            Relatorio: inputRelatorio.get(),
                            PeriodoInicial: inputPeriodoInicial.getValue(),
                            PeriodoFinal: inputPeriodoFinal.getValue(),
                            Filial: getVal("inputCodigoFilial"),
                            GrupoContasProdutos: grupoContasProdutosSalva,
                            ConsolidarGradesDoProduto: isChecked("inputConsolidarGradesDoProduto"),
                            TipoOperacao: grupoContasTipoOperacaoSalva,
                            TipoLocalEstoqueProprio: isChecked("inputTipoLocalEstoqueProprio"),
                            TipoLocalEstoqueEmPoderDeTerceiros: isChecked("inputTipoLocalEstoqueEmPoderDeTerceiros"),
                            TipoLocalEstoqueDeTerceirosEmPoderDaEmpresa: isChecked("inputTipoLocalEstoqueDeTerceirosEmPoderDaEmpresa"),
                            TipoDeRelatorio: inputTipoDeRelatorio.val()
                        }
                        currentUser.setCustomData("est_rel_registroestoque", JSON.stringify(inputs));

                        var grupoContasProdutosEnvia = [];
                        if (validatorProdutos.getVarios()) {
                            var lista = validatorProdutos.getGrupoContas()
                            for (var produtoAtual in lista) {
                                var produto = {
                                    Codigo: lista[produtoAtual].Codigo,
                                    CodigoGrade1: lista[produtoAtual].CodigoGrade1,
                                    CodigoGrade2: lista[produtoAtual].CodigoGrade2,
                                    CodigoGrade3: lista[produtoAtual].CodigoGrade3
                                };
                                grupoContasProdutosEnvia.push(produto);
                            }
                        }
                        else {
                            var produto = {
                                Codigo: validatorProdutos.getValue(),
                                CodigoGrade1: validatorGrade1.getValue(),
                                CodigoGrade2: validatorGrade2.getValue(),
                                CodigoGrade3: validatorGrade3.getValue()
                            };
                            grupoContasProdutosEnvia.push(produto);
                        }

                        var grupoContasTipoOperacaoEnvia = "";
                        if (validatorTipoOperacao.getVarios()) {
                            grupoContasTipoOperacaoEnvia = validatorTipoOperacao.getGrupoContasString();
                        }
                        else {
                            grupoContasTipoOperacaoEnvia = validatorTipoOperacao.getValue();
                        }

                        window.open(window.baseUrl + "Estoque/Relatorios/GeraRelatorioRegistroEstoque?"
                            + "Relatorio=" + inputRelatorio.dropDown.dataItem().Text
                            + "&DataInicial=" + getVal("inputPeriodoInicial")
                            + "&DataFinal=" + getVal("inputPeriodoFinal")
                            + "&Filial=" + getVal("inputCodigoFilial")
                            + "&GrupoContasProdutos=" + JSON.stringify(grupoContasProdutosEnvia)
                            + "&ConsolidarGradesDoProduto=" + isChecked("inputConsolidarGradesDoProduto")
                            + "&TipoOperacao=" + grupoContasTipoOperacaoEnvia
                            + "&TipoLocalEstoqueProprio=" + isChecked("inputTipoLocalEstoqueProprio")
                            + "&TipoLocalEstoqueEmPoderDeTerceiros=" + isChecked("inputTipoLocalEstoqueEmPoderDeTerceiros")
                            + "&TipoLocalEstoqueDeTerceirosEmPoderDaEmpresa=" + isChecked("inputTipoLocalEstoqueDeTerceirosEmPoderDaEmpresa")
                            + "&TipoDeRelatorio=" + getVal("inputTipoDeRelatorio")
                        );
                    });
                })(params);
            }
        };
    })();

    Gerenciador.Manager = (function () {
        return {
            AtendimentosTecnicos: function (params) {
                return (function () {
                    var u = new Util();

                    var atendimentosTable = new Table({
                        'id': 'gridAtendimentos',
                        'route': window.baseUrl + 'Gerenciador/Movimentos/GetAtendimentosTecnicos/',
                        'showFilter': false,
                        'columns': [
                            { title: 'Nº', field: 'Numero', width: 50, headerAttributes: { style: "color: black; text-align: center;" }, attributes: { style: "text-align: center;" } },
                            { title: 'Cliente', field: 'Cliente', width: 160, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: 'Emissão', field: 'DataEmissao', width: 75, headerAttributes: { style: "color: black; text-align: center;" }, attributes: { style: "text-align: center;" } },
                            { title: 'Faturamento', field: 'DataFaturamento', width: 75, headerAttributes: { style: "color: black; text-align: center;" }, attributes: { style: "text-align: center;" } },
                            { title: 'Vencimento', field: 'DataVencimento', width: 75, headerAttributes: { style: "color: black; text-align: center;" }, attributes: { style: "text-align: center;" } },
                            { title: 'Situação', field: 'Situacao', width: 50, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: 'Filial', field: 'IdFilial', width: 50, headerAttributes: { style: "color: black; text-align: center;" }, attributes: { style: "text-align: center;" } }
                        ],
                        'toolbar':
                            "<span style='float:left; width: NaN;'>" +
                            "    <span style='font-size: large; font-weight: 800; text-align: center;' id='tableTitle'>Atendimentos Técnicos</span>" +
                            "</span>" +
                            "<span style='float:right'>" +
                            "    <button id='inputFilter' type='button' class='btn btn-small'>" +
                            "        <span class='k-icon k-i-funnel'>Atualiza</span>Fitro" +
                            "    </button>" +
                            "    <button id='buttonNovoAtendimentoTecnico' type='button' class='btn btn-small'>" +
                            "        <span class='k-icon k-i-plus'>Atualiza</span>Novo" +
                            "    </button>" +
                            "</span>",
                        'dataSourceType': "Filtered",
                        'pageable': {
                            refresh: true,
                            numeric: true,
                            pageSizes: [20, 30, 40, 50],
                            buttonCount: 5
                        },
                        'onChange': function () {
                            "use strict";
                            var self = this;
                            var $data = self.getSelectedData();
                            window.location = window.baseUrl + 'Gerenciador/Movimentos/AtendimentoTecnico?Id=' + $data.Id + "&DataEmissao=" + $data.DataEmissao;
                        },
                        'onDataBound': function () {
                            "use strict";
                            var self = this;
                            $('#' + self.id + ' table tr').on('dblclick',
                                function () {
                                    var data = self.getSelectedData();
                                }
                            );
                            var el = $('#' + self.id + ' .k-grid-content');
                            el[0].style.height = "auto";
                        }
                    });
                    atendimentosTable.make();
                    atendimentosTable.listen();

                    $("#buttonNovoAtendimentoTecnico").click(function () {
                        window.location = window.baseUrl + 'Gerenciador/Movimentos/AtendimentoTecnico/';
                    });

                    var dateComparerEmissao = new SimpleDateComparer({
                        'idA': 'inputEmissaoFinal',
                        'idB': 'inputEmissaoInicial',

                        'onLess': function () {
                            $.when((function () {
                                var u = new Util();
                                u.alert('A data inicial deve ser menor do que a data final.', alertBehavior.error);
                            })()).done(function () {
                                document.getElementById('inputEmissaoInicial').focus();
                            });
                        },
                        'onInvalid': function (input) {
                            $.when((function () {
                                if (input.value.match(/^\d{2}\/\d{2}\/\d{2}$/)) {
                                    u.alert('Informe uma data com o formato DD/MM/AAAA.', alertBehavior.error);
                                } else {
                                    u.alert('A data: "{0}" não é uma data válida'.format(input.value), alertBehavior.error);
                                }
                            })()).done(function () {
                                input.focus();
                            });
                        }
                    });

                    var dateComparerFaturamento = new SimpleDateComparer({
                        'idA': 'inputFaturamentoFinal',
                        'idB': 'inputFaturamentoInicial',

                        'onLess': function () {
                            $.when((function () {
                                var u = new Util();
                                u.alert('A data inicial deve ser menor do que a data final.', alertBehavior.error);
                            })()).done(function () {
                                document.getElementById('inputFaturamentoInicial').focus();
                            });
                        },
                        'onInvalid': function (input) {
                            $.when((function () {
                                if (input.value.match(/^\d{2}\/\d{2}\/\d{2}$/)) {
                                    u.alert('Informe uma data com o formato DD/MM/AAAA.', alertBehavior.error);
                                } else {
                                    u.alert('A data: "{0}" não é uma data válida'.format(input.value), alertBehavior.error);
                                }
                            })()).done(function () {
                                input.focus();
                            });
                        }
                    });

                    var validatorFilial = new Validator({
                        field: "CodigoFilial",
                        onPendencyMessage: "Deve ser informado o código da filial.",
                        route: "Empresarial/F4Filial/GetFilialEx",
                        onValid: function (data) {
                            setVal("inputCodigoFilial", data["Codigo"]);
                            setHtml("descriptionCodigoFilial", data["Nome"]);
                        },
                        onInvalid: function () {
                            validatorFilial.clear({ error: true });
                            validatorFilial.focus();
                        },
                        onEmpty: function () {
                            validatorFilial.clear();
                        }
                    });
                    validatorFilial.listen();

                    var validatorCliente = new Validator({
                        field: "CodigoCliente",
                        onPendencyMessage: "Deve ser informado o código do cliente.",
                        route: "Empresarial/F4Cliente/GetCliente",
                        onValid: function (data) {
                            console.log(data);
                            setVal("inputCodigoCliente", data["Codigo"]);
                            setHtml("descriptionCodigoCliente", data["RazaoSocial"]);
                        },
                        onInvalid: function () {
                            validatorCliente.clear({ error: true });
                            validatorCliente.focus();
                        },
                        onEmpty: function () {
                            validatorCliente.clear();
                        }
                    });
                    validatorCliente.listen();

                    var validatorServico = new Validator({
                        field: "CodigoServico",
                        onPendencyMessage: "Deve ser informado o código do serviço.",
                        route: "Empresarial/F4Servico/GetServico",
                        onValid: function (data) {
                            setVal("inputCodigoServico", data["Codigo"]);
                            setHtml("descriptionCodigoServico", data["Nome"]);
                            setVal("inputServicosValor", data["Valor"]);
                        },
                        onInvalid: function () {
                            validatorServico.clear({ error: true });
                            validatorServico.focus();
                        },
                        onEmpty: function () {
                            validatorServico.clear();
                        }
                    });
                    validatorServico.listen();

                    var tableFiliais = new Table({
                        "id": "tableFilial",
                        "route": window.baseUrl + "Empresarial/F4Filial/GetFiliais",
                        "columns": [
                            { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Nome", field: "Nome", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "CNPJ/CPF", field: "CpfCnpj", width: 115, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        "showFilter": true,
                        "onChange": function () {
                            var ok = document.getElementById("inputF4ModalOk" + this.id);
                            ok.onclick = function () {
                                var data = tableFiliais.getSelectedData();
                                validatorFilial.onValid(data);
                                validatorFilial.update();
                                $.when($("#modalFilial").modal("hide"))
									.done(function () {
									    $("#filtroAtendimentosModal").modal('show');
									});
                            };

                        },
                        "onDataBound": function () {
                            $("#tableFilial table tr").on("dblclick", function () {
                                var data = tableFiliais.getSelectedData();
                                validatorFilial.onValid(data);
                                validatorFilial.update();
                                $.when($("#modalFilial").modal("hide"))
								.done(function () {
								    $("#filtroAtendimentosModal").modal('show');
								});
                            });
                            listenF4ModalCancelar("#modalFilial");
                        },
                        "dataSourceType": "Filtered"
                    });
                    var linkFiliais = document.getElementById("linkButtonModalFiliais");
                    var inputFiliais = document.getElementById("inputCodigoFilial");
                    var modalFiliais = new Modal("Filiais", linkFiliais, inputFiliais, tableFiliais);
                    modalFiliais.listen();

                    var tableClientes = new Table({
                        "id": "tableCliente",
                        "route": window.baseUrl + "Empresarial/F4Cliente/GetClientes",
                        "showFilter": true,
                        "columns": [
                            { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Razão Social", field: "RazaoSocial", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "CPF/CNPJ", field: "CnpjCpf", width: 115, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        "columnsLegend": { CnpjCpf: "Ex: 11.222.333/4444-55" },
                        "onChange": function () {
                            $("#inputF4ModalOk" + this.id).on("click", function () {
                                var data = tableClientes.getSelectedData();
                                validatorCliente.onValid(data);
                                validatorCliente.update();
                                $.when($("#modalCliente").modal("hide"))
									.done(function () {
									    $("#filtroAtendimentosModal").modal('show');
									});
                            });
                            $("#inputF4ModalCancelar").on("click", function () {
                                $.when($("#modalCliente").modal("hide"))
									.done(function () {
									    $("#filtroAtendimentosModal").modal('show');
									});
                            });
                        },
                        "onDataBound": function () {
                            $("#tableCliente table tr").on("dblclick", function () {
                                var data = tableClientes.getSelectedData();
                                validatorCliente.onValid(data);
                                validatorCliente.update();
                                $.when($("#modalCliente").modal("hide"))
									.done(function () {
									    $("#filtroAtendimentosModal").modal('show');
									});
                            });
                            listenF4ModalCancelar("#modalCliente");
                        },
                        "dataSourceType": "Filtered"
                    });
                    var modalClientes = new Modal("Clientes", byId("linkButtonModalClientes"), byId("inputCodigoCliente"), tableClientes).listen();

                    var tableServicos = new Table({
                        "id": "tableServico",
                        "route": window.baseUrl + "Empresarial/F4Servico/GetServicos",
                        "showFilter": true,
                        "columns": [
                            { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Nome", field: "Nome", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Un. Serviço", field: "UnidadeMedida.Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Classificação", field: "Classificacao", width: 100, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        "onChange": function () {
                            $("#inputF4ModalOk" + this.id).on("click", function () {
                                var data = tableServicos.getSelectedData();
                                validatorServico.onValid(data);
                                validatorServico.update();
                                $.when($("#modalServico").modal("hide"))
									.done(function () {
									    $("#filtroAtendimentosModal").modal('show');
									});
                            });
                        },
                        "onDataBound": function () {
                            $("#tableServico table tr").on("dblclick", function () {
                                var data = tableServicos.getSelectedData();
                                validatorServico.onValid(data);
                                validatorServico.update();
                                $.when($("#modalServico").modal("hide"))
									.done(function () {
									    $("#filtroAtendimentosModal").modal('show');
									});
                            });
                            listenF4ModalCancelar("#modalServico");
                        },
                        "dataSourceType": "Filtered"
                    });
                    var modalServicos = new Modal("Serviços", byId("linkButtonModalServicos"), byId("inputCodigoServico"), tableServicos).listen();

                    $('#doFilter').on('click', function () {
                        var filter = $('filtro-viewmodel').viewModel();
                        filter.CodFilial = validatorFilial.getValue();
                        filter.CodCliente = validatorCliente.getValue();
                        filter.CodServico = validatorServico.getValue();

                        var dataSource = new kendo.data.DataSource(atendimentosTable.getFilteredDataSource(filter));
                        atendimentosTable.setDataSource(dataSource);
                    });

                    $('#removeFilter').on('click', function () {
                        var filtroDefault = {
                            "FaturamentoInicial": "",
                            "FaturamentoFinal": "",
                            "EmissaoInicial": "",
                            "EmissaoFinal": "",
                            "SituacaoPendente": true,
                            "SituacaoRealizado": true,
                            "CodigoFilial": "",
                            "NumeroAtendimento": "",
                            "CodigoCliente": "",
                            "CodigoServico": ""
                        };
                        $(filtroDefault).viewModel('filtro-viewmodel');
                        validatorFilial.setValue(filtroDefault.CodigoFilial);
                        document.getElementById('descriptionCodigoFilial').innerHTML = "";

                        validatorCliente.setValue(filtroDefault.CodigoCliente);
                        document.getElementById('descriptionCodigoCliente').innerHTML = "";

                        validatorServico.setValue(filtroDefault.CodigoServico);
                        document.getElementById('descriptionCodigoServico').innerHTML = "";

                        var dataSource = new kendo.data.DataSource(atendimentosTable.getFilteredDataSource());
                        atendimentosTable.setDataSource(dataSource);
                    });

                    $('#inputFilter').on('click', function () {
                        $("#filtroAtendimentosModal").modal('show');
                    });

                    function listenF4ModalCancelar(modalSelector) {
                        console.log('binding');
                        $(modalSelector + " #inputF4ModalCancelar").on("click", function () {
                            $.when($(modalSelector).modal('hide'))
                                .done(function () {
                                    $("#filtroAtendimentosModal").modal("show");
                                });
                        });
                    }

                })(params);
            },

            AtendimentoTecnico: function (params) {
                return (function () {
                    var u = new Util();
                    $("<div id='modalDiv'>").appendTo("body");
                    u.addButtonHelpBreadcrumb("RadarWEB.htm", "Tela Inicial");

                    var tabs = {
                        Principal: 0,
                        Servicos: 1,
                        Despesas: 2,
                    };

                    // aba principal

                    var idAtendimentoTecnico;

                    // filial
                    var validatorPrincipalFilial = new ValidatorLookup({
                        abrev: "PrincipalCodigoFilial",
                        fieldSearch: "CodigoFilial",
                        msgPendencyMessagePartEnd: "da filial.",
                        route: "Empresarial/F4Filial/GetFilialEx",
                        routeTable: "Empresarial/F4Filial/GetFiliais",
                        columnsTable: [
                            { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Nome", field: "Nome", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "CNPJ/CPF", field: "CpfCnpj", width: 115, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        titleModal: "Filiais"
                    });

                    // numero atendimento
                    var validatorPrincipalNumeroAtendimento = new ValidatorMask({
                        idInput: "inputPrincipalNumeroAtendimento",
                        mask: "radar-valor-6"
                    });

                    // cliente
                    var validatorPrincipalCliente = new ValidatorLookup({
                        abrev: "PrincipalCodigoCliente",
                        fieldSearch: "CodigoCliente",
                        fieldDescription: "RazaoSocial",
                        msgPendencyMessagePartEnd: "do cliente.",
                        route: "Empresarial/F4Cliente/GetCliente",
                        routeTable: "Empresarial/F4Cliente/GetClientes",
                        columnsTable: [
                            { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Razão Social", field: "RazaoSocial", width: 230, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "CPF/CNPJ", field: "CnpjCpf", width: 115, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        titleModal: "Clientes",
                        onValid: function (data) {
                            var params = {
                                CodigoCliente: validatorPrincipalCliente.getValue(),
                            };
                            postJsonToRoute("Gerenciador/Movimentos/ValidateCliente", JSON.stringify(params)).done(function (data) {
                                if (data.IsAlert) {
                                    u.dialogOk(null, data.Message, null, true, null, alertBehavior.warning);
                                    $("#waiting").hide();
                                }
                                else {
                                    $("#waiting").hide();
                                }
                            });
                        }
                    });

                    var validatorPrincipalDataEmissao = new ValidatorDate({
                        idInput: "inputPrincipalDataEmissao",
                        isEmptyValid: true
                    });

                    var validatorPrincipalDataFaturamento = new ValidatorDate({
                        idInput: "inputPrincipalDataFaturamento",
                        isEmptyValid: true
                    });

                    var validatorPrincipalDataVencimento = new ValidatorDate({
                        idInput: "inputPrincipalDataVencimento",
                        isEmptyValid: true
                    });

                    // rotinas principal
                    function getPrincipal() {
                        return {
                            id: idAtendimentoTecnico,
                            CodigoFilial: validatorPrincipalFilial.getValue(),
                            NumeroAtendimento: validatorPrincipalNumeroAtendimento.getValue(),

                            CodigoCliente: validatorPrincipalCliente.getValue(),

                            Contato: getVal("inputPrincipalContato"),
                            CargoSetor: getVal("inputPrincipalCargoSetor"),

                            DataEmissao: validatorPrincipalDataEmissao.getValue(),
                            DataFaturamento: validatorPrincipalDataFaturamento.getValue(),
                            DataVencimento: validatorPrincipalDataVencimento.getValue(),

                            Comentarios: getVal("inputPrincipalComentarios")
                        }
                    }

                    // aba servicos

                    var gridServicos = new Grid({
                        id: "divGridServicos",
                        columns: [
                            { field: "Codigo", title: "Código", width: 50, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { field: "Servico", title: "Serviço", width: 200, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { field: "Situacao", title: "Situação", width: 80, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { field: "Executor", title: "Executor", width: 80, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { field: "Valor", title: "Valor", width: 100, headerAttributes: { style: "color: black; text-align: right;" }, attributes: { style: "text-align: right;" }, format: "{0:C}" },
                            { field: "Cobrar", title: "Cobrar", width: 54, headerAttributes: { style: "color: black; text-align: center;" }, attributes: { style: "text-align: center;" } }
                        ],
                        onChange: function (data) {
                            setServicos(data);
                        },
                        height: 142
                    });

                    // tabela precos
                    var validatorServicosTabelaPrecoServico = new ValidatorLookup({
                        abrev: "ServicosCodigoTabelaPrecoServico",
                        fieldSearch: "CodigoTabelaPrecos",
                        msgPendencyMessagePartEnd: "da tabela de preços.",
                        route: "Empresarial/F4TabelaPrecoServicos/GetTabelaPrecoServicos",
                        routeTable: "Empresarial/F4TabelaPrecoServicos/GetTabelasPrecosServicos",
                        columnsTable: [
                            { title: "Código", field: "Codigo", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Nome", field: "Nome", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Validade", field: "Validade", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        titleModal: "Tabelas de Preços de Serviços"
                    });

                    // servico
                    var validatorServicosServico = new ValidatorLookup({
                        abrev: "ServicosCodigoServico",
                        fieldSearch: "CodigoServico",
                        msgPendencyMessagePartEnd: "do serviço.",
                        route: "Empresarial/F4Servico/GetServico",
                        pendency: [validatorServicosTabelaPrecoServico],
                        routeTable: "Empresarial/F4Servico/GetServicos",
                        params: [validatorServicosTabelaPrecoServico],
                        paramsRequired: [false],
                        paramsDefault: [1],
                        columnsTable: [
                            { title: "Código", field: "Codigo", width: 75, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Nome", field: "Nome", width: 100, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Un. Serviço", field: "UnidadeMedida.Codigo", width: 80, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Classificação", field: "Classificacao", width: 80, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                        ],
                        titleModal: "Clientes",
                        defaultValue: {
                            Codigo: "",
                            UnidadeMedida: {
                                ConsiderarFormatoHorario: false,
                                CasasDecimais: "2"
                            }
                        },
                        setDefaultValueInOldValueWhereCreateValidator: true,
                        onValid: function (dados) {
                            validatorServicosServico.PropertiesSpecifyField = dados;

                            if (!validatorServicosServico.oldValue.UnidadeMedida.ConsiderarFormatoHorario && dados.UnidadeMedida.ConsiderarFormatoHorario) {
                                var params = {
                                    totalHorasQuantidade: validatorServicosQuantidade.getValue(),
                                    codigoServico: validatorServicosServico.getValue()
                                };
                                postJsonToRoute("Gerenciador/Movimentos/ToggleHoraQuantidade", JSON.stringify(params)).done(function (data) {
                                    if (data.IsAlert) {
                                        u.alert(data.Message, getAlertBehavior(data.Level));
                                        $("#waiting").hide();
                                    }
                                    else {
                                        validatorServicosTotalHoras.setValue(data);
                                        updateTotalServico(validatorServicosServico.PropertiesSpecifyField.UnidadeMedida.ConsiderarFormatoHorario, validatorServicosServico.PropertiesSpecifyField.UnidadeMedida.CasasDecimais);
                                        $("#waiting").hide();
                                    }
                                });
                            }
                            else {
                                if (validatorServicosServico.oldValue.UnidadeMedida.ConsiderarFormatoHorario && !dados.UnidadeMedida.ConsiderarFormatoHorario) {
                                    var params = {
                                        totalHorasQuantidade: validatorServicosQuantidade.getValue(),
                                        codigoServico: validatorServicosServico.getValue()
                                    };
                                    postJsonToRoute("Gerenciador/Movimentos/ToggleHoraQuantidade", JSON.stringify(params)).done(function (data) {
                                        if (data.IsAlert) {
                                            u.alert(data.Message, getAlertBehavior(data.Level));
                                            $("#waiting").hide();
                                        }
                                        else {
                                            validatorServicosQuantidade.setValue(data);
                                            updateTotalServico(validatorServicosServico.PropertiesSpecifyField.UnidadeMedida.ConsiderarFormatoHorario, validatorServicosServico.PropertiesSpecifyField.UnidadeMedida.CasasDecimais);
                                            $("#waiting").hide();
                                        }
                                    });
                                }
                                else {
                                    var params = {
                                        quantidadeOrigem: validatorServicosQuantidade.getValue(),
                                        numeroCasasDecimaisDestino: dados.UnidadeMedida.CasasDecimais
                                    };
                                    postJsonToRoute("Gerenciador/Movimentos/ConvertQuantidadeNToQuantidadeN", JSON.stringify(params)).done(function (data) {
                                        if (data.IsAlert) {
                                            u.alert(data.Message, getAlertBehavior(data.Level));
                                            $("#waiting").hide();
                                        }
                                        else {
                                            validatorServicosQuantidade.setValue(data);
                                            updateTotalServico(validatorServicosServico.PropertiesSpecifyField.UnidadeMedida.ConsiderarFormatoHorario, validatorServicosServico.PropertiesSpecifyField.UnidadeMedida.CasasDecimais);
                                            $("#waiting").hide();
                                        }
                                    });
                                }
                            }

                            setTotalHorasOuQuantidade(dados.UnidadeMedida.ConsiderarFormatoHorario, dados.UnidadeMedida.CasasDecimais);
                            validatorServicosServico.oldValue = dados;
                        },
                        onInvalid: function (data) {
                            validatorServicosServico.PropertiesSpecifyField = {};
                            setTotalHorasOuQuantidade(false, validatorServicosServico.defaultValue.UnidadeMedida.CasasDecimais);
                            validatorServicosServico.oldValue = validatorServicosServico.defaultValue;
                        },
                        onEmpty: function () {
                            validatorServicosServico.PropertiesSpecifyField = {};
                            setTotalHorasOuQuantidade(false, validatorServicosServico.defaultValue.UnidadeMedida.CasasDecimais);
                            validatorServicosServico.oldValue = validatorServicosServico.defaultValue;
                        }
                    });

                    // executor
                    var validatorServicosExecutor = new ValidatorLookup({
                        abrev: "ServicosCodigoExecutor",
                        fieldSearch: "Apelido",
                        msgPendencyMessage: "Usuário não cadastrado.",
                        onValidOnly: function (validator, data) {
                            validator.setValue(data["Apelido"]);
                        },
                        route: "Empresarial/F4Usuario/GetUsuario",
                        routeTable: "Empresarial/F4Usuario/GetUsuarios",
                        columnsTable: [
                            { title: "Nome", field: "Nome", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "Apelido", field: "Apelido", width: 60, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { title: "IsSupervisor", field: "Supervisor", width: 30, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } }
                        ],
                        titleModal: "Usuários"
                    });

                    var validatorServicosDataSaida = new ValidatorDate({
                        idInput: "inputServicosDataSaida",
                        isEmptyValid: true
                    });

                    var validatorServicosDataRetorno = new ValidatorDate({
                        idInput: "inputServicosDataRetorno",
                        isEmptyValid: true
                    });

                    var compareDataSaidaComDataRetorno = new DateComparer({
                        idA: "inputServicosDataSaida",
                        idB: "inputServicosDataRetorno",
                        verb: "less",
                        onInvalid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.error);
                            u.alert("Data de Retorno deve ser igual ou posterior a data Saída", alertBehavior.error);
                        },
                        onValid: function (data) {
                            alterControlGroupBehavior(data.idA, controlGroupBehavior.normal);
                        }
                    });

                    // totalhoras
                    var validatorServicosTotalHoras = new ValidatorMask({
                        idInput: "inputServicosTotalHoras",
                        mask: "time-servico",
                        onChange: function () {
                            updateTotalServico(true);
                        }
                    });
                    $("#linkButtonModalServicosQuantidade").click(function () {
                        $("#waiting").show();

                        var indexServico = validatorServicosServico.isEmpty() ? -1 : gridServicos.getSelectedDataIndex();
                        postJsonToRoute("Gerenciador/Movimentos/GetSessoes", JSON.stringify({ indexServico: indexServico })).done(function (data) {
                            if (data.IsAlert) {
                                u.alert(data.Message, getAlertBehavior(data.Level));
                                $("#waiting").hide();
                            }
                            else {
                                loadGridSessoes(data);
                                $("#waiting").hide();
                            }
                        });

                        if (!permissoes.PodeAlterarAttecOutrem) {
                            $("#buttonSessoesAdicionar").attr("disabled", "disabled");
                            $("#buttonSessoesRemover").attr("disabled", "disabled");
                            $("#buttonSessoesAlterar").attr("disabled", "disabled");
                            $("#buttonSessoesOk").attr("disabled", "disabled");
                        }
                    });

                    // quantidade
                    var validatorServicosQuantidade = new ValidatorMask({
                        idInput: "inputServicosQuantidade",
                        mask: "radar-valor-14-2-R",
                        onChange: function () {
                            updateTotalServico(false);
                        }
                    });

                    // valor
                    var validatorServicosValor = new ValidatorMask({
                        idInput: "inputServicosValor",
                        mask: "radar-valor-14-2-R",
                        onChange: function () {
                            updateTotalServico(validatorServicosServico.oldValue.UnidadeMedida.ConsiderarFormatoHorario);
                        }
                    });

                    // total
                    var validatorServicosTotal = new ValidatorMask({
                        idInput: "inputServicosTotal",
                        mask: "radar-valor-16-2-R"
                    });

                    // botoes servico
                    function loadGridServicos(dados) {
                        gridServicos.setValue(dados, function (reg) {
                            return {
                                Codigo: reg.CodigoServico,
                                Servico: reg.NomeCodigoServico,
                                Situacao: reg.Pendente ? "Pendente" : "Realizado",
                                Executor: reg.CodigoExecutor,
                                Valor: reg.Valor,
                                Cobrar: reg.Cobrar ? "✓" : "",
                                DadosVM: reg
                            }
                        });
                    }

                    function updateTotalServico(ConsiderarFormatoHorario) {
                        if (ConsiderarFormatoHorario) {
                            var params = {
                                considerarFormatoHorario: ConsiderarFormatoHorario,
                                totalHorasQuantidade: validatorServicosTotalHoras.getValue(),
                                valor: validatorServicosValor.getValue()
                            };
                            postJsonToRoute("Gerenciador/Movimentos/UpdateTotalServico", JSON.stringify(params)).done(function (data) {
                                if (data.IsAlert) {
                                    u.alert(data.Message, getAlertBehavior(data.Level));
                                    $("#waiting").hide();
                                }
                                else {
                                    validatorServicosTotal.setValue(data);
                                    $("#waiting").hide();
                                }
                            });
                        }
                        else {
                            var params = {
                                considerarFormatoHorario: ConsiderarFormatoHorario,
                                totalHorasQuantidade: validatorServicosQuantidade.getValue(),
                                valor: validatorServicosValor.getValue()
                            };
                            postJsonToRoute("Gerenciador/Movimentos/UpdateTotalServico", JSON.stringify(params)).done(function (data) {
                                if (data.IsAlert) {
                                    u.alert(data.Message, getAlertBehavior(data.Level));
                                    $("#waiting").hide();
                                }
                                else {
                                    validatorServicosTotal.setValue(data);
                                    $("#waiting").hide();
                                }
                            });
                        }
                    }

                    function setDefaultServicos() {
                        if (config.CodigoTabelaPrecoServicoDefault) {
                            validatorServicosTabelaPrecoServico.setValues(config.CodigoTabelaPrecoServicoDefault, config.NomeCodigoTabelaPrecoServicoDefault);
                        }

                        validatorServicosExecutor.setValue(params.User.Nome);

                        validatorServicosTotalHoras.setValue("000:00");
                        validatorServicosQuantidade.setValue("0,00");
                        validatorServicosValor.setValue("0,00");
                        validatorServicosTotal.setValue("0,00");
                    }

                    function checkServicos() {
                        if (validatorServicosServico.invalid) {
                            u.alert("Campo \"Serviço\" é obrigatório", alertBehavior.error);
                            validatorServicosServico.focus();
                            return false;
                        }

                        if (!validatorServicosDataRetorno.isEmptyValid && !validatorServicosDataSaida.isEmptyValid && compareDataSaidaComDataRetorno.compare()) {
                            compareDataSaidaComDataRetorno.onInvalid(compareDataSaidaComDataRetorno);
                            return false;
                        }

                        if (isChecked("inputServicosCobrar") && isChecked("inputServicosRealizado") && validatorServicosValor.isEmptyOrZeros()) {
                            u.alert("Campo \"Valor\" é obrigatório", alertBehavior.error);
                            validatorServicosExecutor.focus();
                            return false;
                        }

                        return true;
                    }

                    function setTotalHorasOuQuantidade(ConsiderarFormatoHorario, NumeroCasasDecimaisQuantidade) {
                        if (ConsiderarFormatoHorario) {
                            $("#inputServicosTotalHoras").css("display", "inline-block");
                            $("#inputServicosQuantidade").css("display", "none");
                            $("#spanTotalHorasQuantidade").html("Total Horas:");
                            $("#linkButtonModalServicosQuantidade").css("display", "inline-block");
                            validatorServicosQuantidade.changeMask("radar-valor-14-" + NumeroCasasDecimaisQuantidade + "-R");
                        }
                        else {
                            $("#inputServicosTotalHoras").css("display", "none");
                            $("#inputServicosQuantidade").css("display", "inline-block");
                            $("#spanTotalHorasQuantidade").html("Quant.:");
                            $("#linkButtonModalServicosQuantidade").css("display", "none");
                            validatorServicosQuantidade.changeMask("radar-valor-14-" + NumeroCasasDecimaisQuantidade + "-R");
                        }
                    }

                    function setServicos(data) {
                        validatorServicosTabelaPrecoServico.setValues(data.DadosVM.CodigoTabelaPrecoServico, data.DadosVM.NomeCodigoTabelaPrecoServico);

                        validatorServicosServico.setValues(data.DadosVM.CodigoServico, data.DadosVM.NomeCodigoServico);
                        validatorServicosServico.oldValue = {
                            Codigo: validatorServicosServico.getValue(),
                            UnidadeMedida: {
                                ConsiderarFormatoHorario: data.DadosVM.ConsiderarFormatoHorario,
                                CasasDecimais: data.DadosVM.NumeroCasasDecimaisQuantidade
                            }
                        };

                        setVal("inputServicosDescricao", data.DadosVM.Descricao);

                        validatorServicosDataSaida.setValueNoValidate(data.DadosVM.DataSaida);
                        validatorServicosDataRetorno.setValueNoValidate(data.DadosVM.DataRetorno);
                        validatorServicosExecutor.setValue(data.DadosVM.CodigoExecutor);

                        setVal("inputServicosComentarios", data.DadosVM.Comentarios);
                        setVal("inputServicosResultado", data.DadosVM.Resultado);

                        setTotalHorasOuQuantidade(data.DadosVM.ConsiderarFormatoHorario, data.DadosVM.NumeroCasasDecimaisQuantidade);
                        validatorServicosTotalHoras.setValue(data.DadosVM.TotalHoras);
                        if (data.DadosVM.TemSessoes)
                            validatorServicosTotalHoras.enable(false);
                        else
                            validatorServicosTotalHoras.enable(true);
                        validatorServicosQuantidade.setValue(data.DadosVM.Quantidade);
                        validatorServicosValor.setValue(data.DadosVM.Valor);
                        validatorServicosTotal.setValue(data.DadosVM.Total);

                        setChecked("inputServicosCobrar", data.DadosVM.Cobrar);
                        setChecked("inputServicosPendente", data.DadosVM.Pendente);
                        setChecked("inputServicosRealizado", data.DadosVM.Realizado);

                        if (permissoes.PodeAlterarAttecOutrem) {
                            $("#buttonServicosAdicionar").attr("disabled", "disabled");
                            $("#buttonServicosAlterar").removeAttr("disabled");
                            $("#buttonServicosRemover").removeAttr("disabled");
                        } else {
                            $("#buttonServicosAdicionar").attr("disabled", "disabled");
                            $("#buttonServicosAlterar").attr("disabled", "disabled");
                            $("#buttonServicosRemover").attr("disabled", "disabled");
                            validatorServicosTotalHoras.enable(false);
                            validatorServicosQuantidade.enable(false);
                        }
                    }

                    function getObjServico(alt) {
                        var index = alt ? gridServicos.getSelectedDataIndex() : -1;
                        return {
                            index: index,
                            CodigoTabelaPrecoServico: validatorServicosTabelaPrecoServico.value,
                            CodigoServico: validatorServicosServico.value,

                            Descricao: getVal("inputServicosDescricao"),

                            DataSaida: validatorServicosDataSaida.getValue(),
                            DataRetorno: validatorServicosDataRetorno.getValue(),
                            CodigoExecutor: validatorServicosExecutor.value,

                            Comentarios: getVal("inputServicosComentarios"),
                            Resultado: getVal("inputServicosResultado"),

                            ConsiderarFormatoHorario: validatorServicosServico.oldValue.UnidadeMedida.ConsiderarFormatoHorario,
                            TotalHoras: validatorServicosTotalHoras.getValue(),
                            Quantidade: validatorServicosQuantidade.getValue(),
                            Valor: validatorServicosValor.getValue(),
                            Total: validatorServicosTotal.getValue(),

                            Cobrar: isChecked("inputServicosCobrar"),
                            Pendente: isChecked("inputServicosPendente"),
                            Realizado: isChecked("inputServicosRealizado")
                        }
                    }

                    function clearServicos() {
                        validatorServicosTabelaPrecoServico.setValues("", "");
                        validatorServicosServico.setValues("", "");

                        setVal("inputServicosDescricao", "");

                        validatorServicosDataSaida.setValueNoValidate("");
                        validatorServicosDataRetorno.setValueNoValidate("");
                        validatorServicosExecutor.setValues("", "");

                        setVal("inputServicosComentarios", "");
                        setVal("inputServicosResultado", "");

                        validatorServicosTotalHoras.setValue("000:00");
                        validatorServicosQuantidade.setValue("0,00");
                        validatorServicosValor.setValue("0,00");
                        validatorServicosTotal.setValue("0,00");

                        setChecked("inputServicosCobrar", false);
                        setChecked("inputServicosPendente", true);

                        $("#buttonServicosAdicionar").removeAttr("disabled");
                        $("#buttonServicosAlterar").attr("disabled", "disabled");
                        $("#buttonServicosRemover").attr("disabled", "disabled");
                    }

                    // botoes servico
                    byId("buttonServicosAdicionar").onclick = function () {
                        if (!$("#buttonServicosAdicionar").attr("disabled")) {
                            $("#waiting").show();

                            if (!checkServicos()) {
                                $("#waiting").hide();
                                return;
                            }

                            postJsonToRoute("Gerenciador/Movimentos/AddServico", JSON.stringify(getObjServico(false))).done(function (data) {
                                if (data.IsAlert) {
                                    u.alert(data.Message, getAlertBehavior(data.Level));
                                    $("#waiting").hide();
                                }
                                else {
                                    loadGridServicos(data);
                                    clearServicos();
                                    setDefaultServicos();
                                    $("#waiting").hide();
                                }
                            });
                        }
                    }

                    byId("buttonServicosAlterar").onclick = function () {
                        if (!$("#buttonServicosAlterar").attr("disabled")) {
                            $("#waiting").show();

                            if (!checkServicos()) {
                                $("#waiting").hide();
                                return;
                            }

                            postJsonToRoute("Gerenciador/Movimentos/UpdateServico", JSON.stringify(getObjServico(true))).done(function (data) {
                                if (data.IsAlert) {
                                    u.alert(data.Message, getAlertBehavior(data.Level));
                                    $("#waiting").hide();
                                }
                                else {
                                    loadGridServicos(data);
                                    clearServicos();
                                    setDefaultServicos();
                                    $("#waiting").hide();
                                }
                            });
                        }
                    }

                    byId("buttonServicosRemover").onclick = function () {
                        if (!$("#buttonServicosRemover").attr("disabled")) {
                            $("#waiting").show();

                            postJsonToRoute("Gerenciador/Movimentos/DeleteServico", JSON.stringify({ index: gridServicos.getSelectedDataIndex() })).done(function (data) {
                                if (data.IsAlert) {
                                    u.alert(data.Message, getAlertBehavior(data.Level));
                                    $("#waiting").hide();
                                }
                                else {
                                    loadGridServicos(data);
                                    clearServicos();
                                    setDefaultServicos();
                                    $("#waiting").hide();
                                }
                            });
                        }
                    }

                    // aba sessoes

                    var gridSessoes = new Grid({
                        id: "divGridSessoes",
                        columns: [
                            { field: "HoraInicial", title: "H. Inicial", width: 60, headerAttributes: { style: "color: black; text-align: center;" }, attributes: { style: "text-align: center;" } },
                            { field: "HoraFinal", title: "H. Final", width: 60, headerAttributes: { style: "color: black; text-align: center;" }, attributes: { style: "text-align: center;" } }
                        ],
                        onChange: function (data) {
                            setSessoes(data);
                        },
                        height: 142
                    });

                    // hora inicial
                    var validatorSessoesHoraInicial = new ValidatorMask({
                        idInput: "inputSessoesHoraInicial",
                        mask: "time-sessoes",
                        onChange: function () {
                            var hora = parseInt(validatorSessoesHoraInicial.getValue().substr(0, 2));
                            if (hora > 23) {
                                u.alert("Hora Inválida", alertBehavior.error);
                                validatorSessoesHoraInicial.setValue("00:00");
                                validatorSessoesHoraInicial.focus();
                            }
                        }
                    });

                    // hora final
                    var validatorSessoesHoraFinal = new ValidatorMask({
                        idInput: "inputSessoesHoraFinal",
                        mask: "time-sessoes",
                        onChange: function () {
                            var hora = parseInt(validatorSessoesHoraFinal.getValue().substr(0, 2));
                            if (hora > 23) {
                                u.alert("Hora Inválida", alertBehavior.error);
                                validatorSessoesHoraFinal.setValue("00:00");
                                validatorSessoesHoraFinal.focus();
                            }
                        }
                    });

                    // rotinas sessoes
                    function loadGridSessoes(data) {
                        gridSessoes.setValue(data, function (reg) {
                            return {
                                HoraInicial: reg.HoraInicial,
                                HoraFinal: reg.HoraFinal,
                                DadosVM: reg
                            }
                        });
                        validatorSessoesHoraInicial.focus();
                    }

                    function checkSessoes() {
                        if (validatorSessoesHoraInicial.getValue() === "00:00" && validatorSessoesHoraFinal.getValue() === "00:00") {
                            u.alert("Informar Hora", alertBehavior.error);
                            validatorSessoesHoraInicial.focus();
                            return false;
                        }
                        else if (validatorSessoesHoraInicial.getValue() === validatorSessoesHoraFinal.getValue()) {
                            u.alert("Informar \"Hora Final\" diferente de \"Hora Inicial\"", alertBehavior.error);
                            validatorSessoesHoraFinal.focus();
                            return false;
                        }
                        return true;
                    }

                    function setSessoes(data) {
                        validatorSessoesHoraInicial.setValue(data.HoraInicial);
                        validatorSessoesHoraFinal.setValue(data.HoraFinal);

                        if (permissoes.PodeAlterarAttecOutrem) {
                            validatorSessoesHoraInicial.focus();
                            $("#buttonSessoesAlterar").removeAttr("disabled");
                            $("#buttonSessoesRemover").removeAttr("disabled");
                        } else {
                            $("#buttonSessoesAdicionar").attr("disabled", "disabled");
                            $("#buttonSessoesRemover").attr("disabled", "disabled");
                            $("#buttonSessoesAlterar").attr("disabled", "disabled");
                            $("#buttonSessoesOk").attr("disabled", "disabled");
                        }
                    }

                    function getObjSessao(alt) {
                        var indexServico = validatorServicosServico.isEmpty() ? -1 : gridServicos.getSelectedDataIndex();
                        var index = alt ? gridSessoes.getSelectedDataIndex() : -1;
                        return {
                            indexServico: indexServico,
                            index: index,
                            HoraInicial: validatorSessoesHoraInicial.getValue(),
                            HoraFinal: validatorSessoesHoraFinal.getValue()
                        }
                    }

                    function getObjSessoes() {
                        return gridSessoes.getDadosVM();
                    }

                    function clearSessoes() {
                        validatorSessoesHoraInicial.setValue("00:00");
                        validatorSessoesHoraFinal.setValue("00:00");

                        $("#buttonSessoesAlterar").attr("disabled", "disabled");
                        $("#buttonSessoesRemover").attr("disabled", "disabled");
                    }

                    // botoes sessoes
                    byId("buttonSessoesAdicionar").onclick = function () {
                        if (!$("#buttonSessoesAdicionar").attr("disabled")) {
                            $("#waiting").show();
                            if (!checkSessoes()) {
                                $("#waiting").hide();
                                return;
                            }

                            postJsonToRoute("Gerenciador/Movimentos/AddSessao", JSON.stringify(getObjSessao(false))).done(function (data) {
                                if (data.IsAlert) {
                                    u.alert(data.Message, getAlertBehavior(data.Level));
                                    $("#waiting").hide();
                                }
                                else {
                                    loadGridSessoes(data);
                                    clearSessoes();
                                    $("#waiting").hide();
                                }
                            });
                        }
                    }

                    byId("buttonSessoesAlterar").onclick = function () {
                        if (!$("#buttonSessoesAlterar").attr("disabled")) {
                            $("#waiting").show();
                            if (!checkSessoes()) {
                                $("#waiting").hide();
                                return;
                            }

                            postJsonToRoute("Gerenciador/Movimentos/UpdateSessao", JSON.stringify(getObjSessao(true))).done(function (data) {
                                if (data.IsAlert) {
                                    u.alert(data.Message, getAlertBehavior(data.Level));
                                    $("#waiting").hide();
                                }
                                else {
                                    loadGridSessoes(data);
                                    clearSessoes();
                                    $("#waiting").hide();
                                }
                            });
                        }
                    }

                    byId("buttonSessoesRemover").onclick = function () {
                        if (!$("#buttonSessoesRemover").attr("disabled")) {
                            $("#waiting").show();

                            postJsonToRoute("Gerenciador/Movimentos/DeleteSessao", JSON.stringify(getObjSessao(true))).done(function (data) {
                                if (data.IsAlert) {
                                    u.alert(data.Message, getAlertBehavior(data.Level));
                                    $("#waiting").hide();
                                }
                                else {
                                    loadGridSessoes(data);
                                    clearSessoes();
                                    $("#waiting").hide();
                                }
                            });
                        }
                    }

                    byId("buttonSessoesOK").onclick = function () {
                        $("#waiting").show();

                        postJsonToRoute("Gerenciador/Movimentos/SumSessoes", JSON.stringify(getObjSessoes())).done(function (data) {
                            if (data.IsAlert) {
                                u.alert(data.Message, getAlertBehavior(data.Level));
                                $("#waiting").hide();
                            }
                            else {
                                if (data.TemSessoes) {
                                    validatorServicosTotalHoras.setValue(data.Result);
                                    validatorServicosTotalHoras.enable(false);
                                }
                                else {
                                    validatorServicosTotalHoras.setValue("000:00");
                                    validatorServicosTotalHoras.enable(true);
                                }
                                updateTotalServico(true);
                                $("#waiting").hide();
                            }
                        });
                    }

                    // aba despesas

                    var gridDespesas = new Grid({
                        id: "divGridDespesas",
                        columns: [
                            { field: "Descricao", title: "Descrição", width: 100, headerAttributes: { style: "color: black; text-align: left;" }, attributes: { style: "text-align: left;" } },
                            { field: "Valor", title: "Valor", width: 100, headerAttributes: { style: "color: black; text-align: right;" }, attributes: { style: "text-align: right;" }, format: "{0:C}" }
                        ],
                        onChange: function (data) {
                            setDespesas(data);
                        },
                        height: 142
                    });

                    // valor
                    var validatorDespesasValor = new ValidatorMask({
                        idInput: "inputDespesasValor",
                        mask: "radar-valor-14-2-R"
                    });

                    // rotinas despesa
                    function loadGridDespesas(dados) {
                        gridDespesas.setValue(dados, function (reg) {
                            return {
                                Descricao: reg.Descricao,
                                Valor: reg.Valor,
                                Comentarios: reg.Comentarios,
                                DadosVM: reg
                            }
                        });
                    }

                    function checkDespesas() {
                        if (getVal("inputDespesasDescricao") === "") {
                            u.alert("Informe uma descrição", alertBehavior.error);
                            $("#inputDespesasDescricao").focus();
                            return false;
                        }
                        return true;
                    }

                    function setDespesas(data) {
                        setVal("inputDespesasDescricao", data.Descricao);
                        validatorDespesasValor.setValue(data.Valor);
                        setVal("inputDespesasComentarios", data.Comentarios);

                        if (permissoes.PodeAlterarAttecOutrem) {
                            $("#buttonDespesasAdicionar").attr("disabled", "disabled");
                            $("#buttonDespesasAlterar").removeAttr("disabled");
                            $("#buttonDespesasRemover").removeAttr("disabled");
                        } else {
                            $("#buttonDespesasAdicionar").attr("disabled", "disabled");
                            $("#buttonDespesasAlterar").attr("disabled", "disabled");
                            $("#buttonDespesasRemover").attr("disabled", "disabled");
                        }
                    }

                    function getObjDespesa(alt) {
                        var index = alt ? gridDespesas.getSelectedDataIndex() : -1;
                        return {
                            index: index,
                            Descricao: getVal("inputDespesasDescricao"),
                            Valor: validatorDespesasValor.getValue(),
                            Comentarios: getVal("inputDespesasComentarios")
                        }
                    }

                    function setDefaultDespesas() {
                        validatorDespesasValor.setValue("0,00");
                    }

                    function clearDespesas() {
                        setVal("inputDespesasDescricao", "");
                        validatorDespesasValor.setValue("0,00");
                        setVal("inputDespesasComentarios", "");

                        $("#buttonDespesasAdicionar").removeAttr("disabled");
                        $("#buttonDespesasAlterar").attr("disabled", "disabled");
                        $("#buttonDespesasRemover").attr("disabled", "disabled");
                    }

                    // botoes despesa
                    byId("buttonDespesasAdicionar").onclick = function () {
                        if (!$("#buttonDespesasAdicionar").attr("disabled")) {
                            $("#waiting").show();
                            if (!checkDespesas()) {
                                $("#waiting").hide();
                                return;
                            }

                            postJsonToRoute("Gerenciador/Movimentos/AddDespesa", JSON.stringify(getObjDespesa(false))).done(function (data) {
                                if (data.IsAlert) {
                                    u.alert(data.Message, getAlertBehavior(data.Level));
                                    $("#waiting").hide();
                                }
                                else {
                                    loadGridDespesas(data);
                                    clearDespesas();
                                    setDefaultDespesas();
                                    $("#waiting").hide();
                                }
                            });
                        }
                    }

                    byId("buttonDespesasAlterar").onclick = function () {
                        if (!$("#buttonDespesasAlterar").attr("disabled")) {
                            $("#waiting").show();
                            if (!checkDespesas()) {
                                $("#waiting").hide();
                                return;
                            }

                            postJsonToRoute("Gerenciador/Movimentos/UpdateDespesa", JSON.stringify(getObjDespesa(true))).done(function (data) {
                                if (data.IsAlert) {
                                    u.alert(data.Message, getAlertBehavior(data.Level));
                                    $("#waiting").hide();
                                }
                                else {
                                    loadGridDespesas(data);
                                    clearDespesas();
                                    setDefaultDespesas();
                                    $("#waiting").hide();
                                }
                            });
                        }
                    }

                    byId("buttonDespesasRemover").onclick = function () {
                        if (!$("#buttonDespesasRemover").attr("disabled")) {
                            $("#waiting").show();

                            postJsonToRoute("Gerenciador/Movimentos/DeleteDespesa", JSON.stringify({ index: gridDespesas.getSelectedDataIndex() })).done(function (data) {
                                if (data.IsAlert) {
                                    u.alert(data.Message, getAlertBehavior(data.Level));
                                    $("#waiting").hide();
                                }
                                else {
                                    loadGridDespesas(data);
                                    clearDespesas();
                                    setDefaultDespesas();
                                    $("#waiting").hide();
                                }
                            });
                        }
                    }

                    // regras inclusao/alteracao tela

                    var dados = params.GetAtendimentoTecnicoViewModel;
                    var config = params.GetAtendimentoTecnicoViewModel.Configuracoes;
                    var permissoes = params.GetAtendimentoTecnicoViewModel.Permissoes;

                    if (dados.IsAlert) {
                        u.dialogOk(null, dados.Message, null, true, null, alertBehavior.error);
                    } else {
                        validatorPrincipalNumeroAtendimento.enable(config.AlterarNumeroAtendimentoTecnico);

                        if (!dados.IsAlteracao) {
                            // principal
                            idAtendimentoTecnico = 0; // 0 = inclusao
                            setFilialDefault(validatorPrincipalFilial);

                            if (!config.AlterarNumeroAtendimentoTecnico)
                                validatorPrincipalNumeroAtendimento.setValue("");
                            else
                                validatorPrincipalNumeroAtendimento.setValue(dados.Principal.NumeroAtendimento);

                            validatorPrincipalDataEmissao.enable(config.AlterarDataEmissao);
                            validatorPrincipalDataEmissao.setValue(dados.Principal.DataEmissao);
                            setDefaultServicos();
                            setDefaultDespesas();

                            $("#buttonGerarPDF").attr("disabled", "disabled");

                            if (!permissoes.PodeGravarAttec)
                                $("#buttonOK").attr("disabled", "disabled");
                        } else {
                            // principal
                            idAtendimentoTecnico = dados.Principal.id;
                            $("#buttonGerarPDF").removeAttr("disabled");

                            if (permissoes.PodeVisualizarAttecOutrem) {
                                validatorPrincipalFilial.setValues(dados.Principal.CodigoFilial, dados.Principal.NomeCodigoFilial);
                                validatorPrincipalNumeroAtendimento.setValue(dados.Principal.NumeroAtendimento);
                                validatorPrincipalCliente.setValues(dados.Principal.CodigoCliente, dados.Principal.NomeCodigoCliente);
                                setVal("inputPrincipalContato", dados.Principal.Contato);
                                setVal("inputPrincipalCargoSetor", dados.Principal.CargoSetor);
                                validatorPrincipalDataEmissao.enable(config.AlterarDataEmissao);

                                if (dados.Principal.DataEmissao)
                                    validatorPrincipalDataEmissao.setValue(dados.Principal.DataEmissao);
                                if (dados.Principal.DataFaturamento)
                                    validatorPrincipalDataFaturamento.setValue(dados.Principal.DataFaturamento);
                                if (dados.Principal.DataVencimento)
                                    validatorPrincipalDataVencimento.setValue(dados.Principal.DataVencimento);

                                setVal("inputPrincipalComentarios", dados.Principal.Comentarios);

                                // servicos
                                loadGridServicos(dados.Servicos);
                                setDefaultServicos();
                                setDefaultDespesas();

                                // depesas
                                loadGridDespesas(dados.Despesas);
                            } else {
                                u.dialogOk(null, "Atendimento bloqueado para visualização.", null, true, null, alertBehavior.warning);

                                validatorPrincipalFilial.setValues("", "");
                                validatorPrincipalNumeroAtendimento.setValue("");
                                validatorPrincipalCliente.setValues("", "");
                                validatorPrincipalDataEmissao.setValue("");
                                validatorPrincipalDataFaturamento.setValue("");
                                validatorPrincipalDataVencimento.setValue("");
                                setVal("inputPrincipalComentarios", "");
                                setVal("inputPrincipalContato", "");
                                setVal("inputPrincipalCargoSetor", "");
                                validatorPrincipalDataEmissao.enable(false);

                                clearDespesas();
                                clearServicos();
                                disableAllInputs();

                                $("#buttonOK").attr("disabled", "disabled");
                            }

                            if (!permissoes.PodeAlterarAttecOutrem) {
                                u.dialogOk(null, "Atendimento bloqueado para alteração.", null, true, null, alertBehavior.warning);
                                disableAllInputs();
                                $("#buttonGerarPDF").attr("disabled", "disabled");
                                $("#buttonOK").attr("disabled", "disabled");
                                $("#buttonServicosAdicionar").attr("disabled", "disabled");
                                $("#buttonDespesasAdicionar").attr("disabled", "disabled");
                            }
                        }

                        if (config.PodeIncluirNovoAtendimento)
                            $("#buttonNovo").removeAttr("disabled");
                    }

                    // rotinas tela
                    function checkAtendimentoTecnico() {
                        var temCobrar = false;
                        $.each(gridServicos.getDadosVM(), function (i, el) {
                            if (el.Cobrar) {
                                temCobrar = true;
                                return false;
                            }
                        });

                        if (temCobrar && validatorPrincipalDataFaturamento.isEmpty) {
                            u.dialogOk(null, "O campo \"Faturamento\" deve ser informado", null, true, function () {
                                u.changeTab(tabs.Principal);
                                validatorPrincipalDataFaturamento.focusError();
                            }, alertBehavior.error);
                            return false;
                        }

                        if (temCobrar && validatorPrincipalDataVencimento.isEmpty) {
                            u.dialogOk(null, "O campo \"Vencimento\" deve ser informado", null, true, function () {
                                u.changeTab(tabs.Principal);
                                validatorPrincipalDataVencimento.focusError();
                            }, alertBehavior.error);
                            return false;
                        }

                        if (!validatorPrincipalDataEmissao.isEmpty && !validatorPrincipalDataFaturamento.isEmpty) {
                            var $result = validatorPrincipalDataEmissao.getValue().toDate().compare(validatorPrincipalDataFaturamento.getValue().toDate());
                            if ($result !== "less" && $result !== "equal") {
                                u.dialogOk(null, "Data de Faturamento deve ser posterior a data Emissão", null, true, function () {
                                    validatorPrincipalDataFaturamento.focusError();
                                    validatorPrincipalDataFaturamento.alterBehavior(controlGroupBehavior.error);
                                }, alertBehavior.error);
                                return false;
                            }
                        }

                        if (!validatorPrincipalDataFaturamento.isEmpty && !validatorPrincipalDataVencimento.isEmpty) {
                            var $result = validatorPrincipalDataFaturamento.getValue().toDate().compare(validatorPrincipalDataVencimento.getValue().toDate());
                            if ($result !== "less" && $result !== "equal") {
                                u.dialogOk(null, "Data de Vencimento deve ser posterior a data de Faturamento", null, true, function () {
                                    validatorPrincipalDataVencimento.focusError();
                                    validatorPrincipalDataVencimento.alterBehavior(controlGroupBehavior.error);
                                }, alertBehavior.error);
                                return false;
                            }
                        }

                        return true;
                    }

                    function salveAtendimentoTecnino() {
                        $("#waiting").show();
                        postJsonToRoute("Gerenciador/Movimentos/SaveAtendimentoTecnico", JSON.stringify({ Principal: getPrincipal() })).done(function (data) {
                            if (data.IsAlert) {
                                u.alert(data.Message, getAlertBehavior(data.Level));
                                $("#waiting").hide();
                            } else {
                                $("#waiting").hide();
                                u.dialogOk(
                                    null,
                                    "Atendimento técnico salvo com sucesso.",
                                    function () {
                                        window.location.href = window.baseUrl + "Gerenciador/Movimentos/AtendimentoTecnico?id=" + data.Principal.id + "&DataEmissao=" + data.Principal.DataEmissao;
                                    },
                                    true,
                                    null,
                                    alertBehavior.success
                                );
                            }
                        });
                    }

                    // botoes tela
                    byId("buttonOK").onclick = function () {
                        if (!$("#buttonOK").attr("disabled")) {
                            $("#waiting").show();

                            if (!checkAtendimentoTecnico()) {
                                $("#waiting").hide();
                                return;
                            }

                            var params = {
                                CodigoCliente: validatorPrincipalCliente.getValue(),
                            };
                            requestNoAsync(window.baseUrl + "Gerenciador/Movimentos/ValidateTitulosEmAtraso", params,
                                function (data) {
                                    $("#waiting").hide();
                                    if (data.IsAlert) {
                                        if (data.Level === alertLevel.warning) {
                                            u.dialogOk(null, data.Message, null, true, null, alertBehavior.error);
                                        } else if (data.Level === alertLevel.question) {
                                            u.dialog(
                                                null,
                                                data.Message.replace("\n", "<br />"),
                                                function () {
                                                    salveAtendimentoTecnino();
                                                }, null, null, true
                                            );
                                        } else {
                                            u.alert(data.Message, getAlertBehavior(data.Level));
                                        }
                                    } else {
                                        salveAtendimentoTecnino();
                                    }
                                },
                                function (data) {
                                    $("#waiting").hide();
                                }, true
                            );
                        }
                    }

                    byId("buttonCancelar").onclick = function () {
                        u.dialog(
                            null,
                            "Deseja realmente abandonar as alterações?",
                            function () {
                                window.location.href = window.baseUrl + "Gerenciador/Movimentos/AtendimentosTecnicos";
                            }
                        );
                    }

                    byId("buttonNovo").onclick = function () {
                        if (!$("#buttonNovo").attr("disabled")) {
                            u.dialog(
                                null,
                                "Deseja realmente abandonar as alterações?",
                                function () {
                                    window.location.href = window.baseUrl + "Gerenciador/Movimentos/AtendimentoTecnico";
                                }
                            );
                        }
                    }

                    //byId("buttonCopiar").onclick = function () {
                    //    if (!$("#buttonCopiar").attr("disabled")) {
                    //    }
                    //}

                    // relatorio

                    byId("buttonGerarPDF").onclick = function () {
                        if (!$("#buttonGerarPDF").attr("disabled")) {
                            window.open(window.baseUrl + "Gerenciador/Relatorios/GeraRelatorioAtendimentoTecnico?"
                                + "&AtendimentoTecnico=" + idAtendimentoTecnico
                                + "&DataEmissao=" + validatorPrincipalDataEmissao.getValue()
                                + "&LayoutAtendimento=" + getHtml("inputLayoutAtendimento_option_selected")
                            );
                        }
                    }

                    var inputLayoutAtendimento = $("#inputLayoutAtendimento").kendoDropDownList({
                        dataSource: config.LayoutsAtendimento,
                        dataTextField: "Text",
                        dataValueField: "Value",
                        value: config.LayoutAtendimentoDefault
                    });
                })(params);
            }
        };
    })();

    return {
        PedidosMain: (function (params) {
            Pedidos.Manager.Main(params);
        }),

        PedidoMain: (function (params) {
            Pedido.Manager.Main(params);
        }),

        ConsultasMain: (function (params) {
            return {
                HistoricoClientes: Consultas.Manager.HistoricoClientes,
                SaldoProdutoNoEstoque: Consultas.Manager.SaldoProdutoNoEstoque
            };
        }),

        RelatoriosMain: (function (params) {
            return {
                RelacaoDePedidos: Relatorios.Manager.RelacaoDePedidos,
                ComissoesAPagar: Relatorios.Manager.ComissoesAPagar,
                Movimentos: Relatorios.Manager.Movimentos
            };
        }),

        TestMain: (function (params) {
            return {
                Treeview: Test.Manager.Treeview,
                GrupoContas: Test.Manager.GrupoContas,
                MultipleModals: Test.Manager.MultipleModals,
                JsonParams: Test.Manager.JsonParams,
                ModeloTest: Test.Manager.ModeloTest
            };
        }),

        ModelosMain: (function (params) {
            return {
                Modelo1: Modelos.Manager.Modelo1,
                Modelo2: Modelos.Manager.Modelo2,
                Modelo3: Modelos.Manager.Modelo3
            };
        }),

        EmpresarialMain: function () {
            return {
                Cadastros: Empresarial.Manager.Cadastros,
                Listar: Empresarial.Manager.Listar,
                RelatoriosPlanoEmpresarial: Empresarial.Manager.RelatoriosPlanoEmpresarial,
                RelatoriosPlanoGerencial: Empresarial.Manager.RelatoriosPlanoGerencial
            };
        },

        ContabilMain: function () {
            return {
                ConsultasSaldoContabil: Contabil.Manager.ConsultasSaldoContabil,
                ConsultasAcompanhamento: Contabil.Manager.ConsultasAcompanhamento,
                RelatoriosBalancete: Contabil.Manager.RelatoriosBalancete,
                RelatoriosRazao: Contabil.Manager.RelatoriosRazao,
                RelatoriosDiarioDetalhado: Contabil.Manager.RelatoriosDiarioDetalhado,
                RelatoriosAcompanhamentoMensal: Contabil.Manager.RelatoriosAcompanhamentoMensal,
                RelatoriosInversaoGerencialBalancete: Contabil.Manager.RelatoriosInversaoGerencialBalancete,
                RelatoriosGerador: Contabil.Manager.RelatoriosGerador
            };
        },

        EstoqueMain: function () {
            return {
                RelatoriosInventario: Estoque.Manager.RelatoriosInventario,
                RelatoriosMovimentos: Estoque.Manager.RelatoriosMovimentos,
                RelatoriosPontoDeReposicao: Estoque.Manager.RelatoriosPontoDeReposicao,
                RelatoriosRegistroEstoque: Estoque.Manager.RelatoriosRegistroEstoque
            };
        },

        GerenciadorMain: (function (params) {
            return {
                AtendimentoTecnico: Gerenciador.Manager.AtendimentoTecnico,
                AtendimentosTecnicos: Gerenciador.Manager.AtendimentosTecnicos
            };
        })
    };
})();
