var Sinisa = Class.extend({
/** seletores jQuery | {fk_campo: '#fk_campo'} **/
_s: {},
_popUp: {},
/** retorna um objeto jQuery via id do seletor **/
s: function (idSeletor) {
if (typeof (this._s[idSeletor]) == 'undefined') {
throw 'Seletor não encontrado: ' + idSeletor;
}
return $(this._s[idSeletor]);
},
init: function () {
this.log('[sinisa.init] Inicializando aplicação');
this.unAlert();
$('.popover-item').popover({
container: 'body',
placement: 'bottom',
trigger: 'hover'
});
},
config: function () {
//this._configToastr();
this.stickyMenu();
this._configChosen();
$.blockUI.defaults['message'] = '
Aguarde...
';
},
unAlert: function () {
this.log('[sinisa.unAlert] time alert');
$(".alert-danger, .alert-success").delay(4000).fadeTo(1000, 0).slideUp(200, function () {
$(this).alert('close');
});
},
alert: function (message, callback, iconType) {
if (!iconType) {
iconType = 'info'
}
swal({
type: iconType,
html: message,
closeOnConfirm: true,
allowOutsideClick: false,
imageSize: '60x60'
}, (callback || function () {
}));
},
confirm: function (message, fnConfirm, fnCancel) {
swal({
title: 'Confirme',
html: message,
type: 'warning',
showCancelButton: true,
allowOutsideClick: false,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'Sim',
cancelButtonText: 'Não',
confirmButtonClass: 'confirm-class',
cancelButtonClass: 'cancel-class',
}, function (isConfirm) {
if (isConfirm) {
$.isFunction(fnConfirm) && fnConfirm();
} else {
$.isFunction(fnCancel) && fnCancel();
}
});
},
_configToastr: function () {
this.log('[sinisa.config] Configurando o toastr js');
toastr = toastr || {};
toastr.options = {
"closeButton": true,
"debug": false,
"newestOnTop": true,
"progressBar": true,
"positionClass": "toast-top-right",
"preventDuplicates": false,
"onclick": null,
"showDuration": "300",
"hideDuration": "1000",
"timeOut": "5000",
"extendedTimeOut": "1000",
"showEasing": "swing",
"hideEasing": "linear",
"showMethod": "fadeIn",
"hideMethod": "fadeOut"
}
},
_configChosen: function () {
this.log('[sinisa.config] Configurando o Chosen combobox');
$('.chosen-select').each(function (k, v) {
var $chosen = $(v);
$chosen.chosen({
width: $chosen.attr('data-chosen-width') || '100%',
allow_single_deselect: $chosen.attr('data-chosen-allow-single-deselect') || false
});
});
},
log: function (mxMsg, strID, strTipo) {
if (_.isUndefined(console) || !_.isObject(console) || !console) {
return false;
}
strTipo = strTipo || 'log';
if (_.isUndefined(console[strTipo])) {
throw('[sinisa.log] Erro de referência: console.' + strTipo + '()');
}
if (strID) {
console[strTipo](strID + ': ', mxMsg);
} else {
console[strTipo](mxMsg);
}
},
toggleInfo: function (codInfo) {
$('.hint-' + codInfo).toggle('fast', function () {
var $this = $(this);
var isOpened = $this.css('display') != 'none';
if (isOpened) {
$('.btn-info-' + codInfo).find('i')
.removeClass('fa-plus')
.addClass('fa-minus')
;
} else {
$('.btn-info-' + codInfo).find('i')
.removeClass('fa-minus')
.addClass('fa-plus')
;
}
});
},
/**
* função que fixa o menu no topo quando rola o scroll
*/
stickyMenu: function () {
$sticky_nav = $('div#box-cabecalho');
// $sticky_header = $('section.content-header');
// não está dentro dos forms da coleta
if ($sticky_nav.length == 0) {
return;
}
$sticky_nav_offset = $sticky_nav.offset();
$sticky_nav_top = $sticky_nav_offset.top;
$sticky_nav_width = $sticky_nav.width();
// $sticky_header_offset = $sticky_header.offset();
// $sticky_header_top = $sticky_header_offset.top;
var sticky_navigation = function () {
var scroll_top = $(window).scrollTop();
// var headerHeight = $('.navbar-static-top').outerHeight();
var headerHeight = $('section.content').offset().top - 4;
var offset = $('.sidebar-collapse').length > 0
? 80 // menu lateral aberto
: 260 // menu lateral fechado;
// console.log($sticky_nav.get(0));
if (scroll_top >= headerHeight + 30) {
$sticky_nav.css({
'background-color': '#ecf0f5',
'padding-top': '10px',
'margin-bottom': '-15px',
'padding-bottom': '-15px !important',
'position': 'fixed',
'top': '50px',
'width': `calc(100% - ${offset}px)`,
'z-index': 299,
// 'border-bottom': '3px solid #d2d6de'
});
// $sticky_header.css({
// 'background-color' : '#ecf0f5',
// 'padding-top' : '2px',
// 'padding-bottom' : '2px',
// 'position' : 'fixed',
// 'top' : '50px',
// 'width' : $sticky_nav_width,
// 'z-index' : 299
// });
} else {
$sticky_nav.css({
'background-color': '#ecf0f5',
'padding-top': '10px',
'margin-bottom': '-15px',
'padding-bottom': '-15px !important',
'position': 'fixed',
'top': '50px',
'width': `calc(100% - ${offset}px)`,
'z-index': 299,
// 'border-bottom': '3px solid #d2d6de'
});
// $sticky_header.css({
// 'background-color' : '',
// 'padding-top' : '0',
// 'padding-bottom' : '0',
// 'position' : 'relative',
// 'top' : '0'
// });
}
};
sticky_navigation();
$(window).scroll(function () {
sticky_navigation();
});
$(window).resize(function () {
$sticky_nav_width = $('section.content-header').width();
var offset = $('.sidebar-collapse').length > 0
? 80 // menu lateral aberto
: 260 // menu lateral fechado;
var headerHeight = $('section.content').offset().top - 4;
$sticky_nav.css({
'background-color': '#ecf0f5',
'padding-top': '10px',
'margin-bottom': '-15px',
'position': 'fixed',
'top': headerHeight + 'px',
'width': `calc(100% - ${offset}px)`,
'z-index': 299,
'border-bottom': '3px solid #d2d6de'
});
});
},
maskIt: function (w, e, m, r, a) {
String.prototype.reverse = function () {
return this.split('').reverse().join('');
};
// Cancela se o evento for Backspace
if (!e)
var e = window.event
if (e.keyCode)
code = e.keyCode;
else if (e.which)
code = e.which;
// Variaveis da funcao
var txt = (!r) ? w.value.replace(/[^\d]+/gi, '') : w.value.replace(/[^\d]+/gi, '').reverse();
var mask = (!r) ? m : m.reverse();
var pre = (a) ? a.pre : "";
var pos = (a) ? a.pos : "";
var ret = "";
if (code == 9 || code == 8 || txt.length == mask.replace(/[^#]+/g, '').length)
return false;
// Loop na máscara para aplicar os caracteres
for (var x = 0, y = 0, z = mask.length; x < z && y < txt.length; ) {
if (mask.charAt(x) != '#') {
ret += mask.charAt(x);
x++;
} else {
ret += txt.charAt(y);
y++;
x++;
}
}
// Retorno da função
ret = (!r) ? ret : ret.reverse()
w.value = pre + ret + pos;
},
showPopupContatos: function (urlPopUp) {
if (typeof (this._popUp["ContatoPsv"]) == 'undefined' || this._popUp.ContatoPsv.closed) {
this._popUp["ContatoPsv"] = window.open(urlPopUp, "ContatoPsv", "height=750,width=1100, scrollbars=yes,statusbar=no,resizable=no,toolbar=0");
} else {
this._popUp["ContatoPsv"].focus();
}
},
closePopupContatos: function (opner) {
if (typeof (this._popUp["ContatoPsv"]) != 'undefined' && this._popUp.ContatoPsv.closed) {
this._popUp["ContatoPsv"].parent.close();
} else if (opner) {
window.close();
}
}
});/**
* Funções utilitárias de uso geral
*/
Sinisa.prototype.util = new (Sinisa.extend({
flash: function (element) {
var $el = $(element),
delay = arguments[arguments.length - 1] || 55,
initialBgColor = $el.css('background-color'),
opacity = 100,
color = "255, 255, 20" // has to be in this format since we use rgba
;
var interval = setInterval(function () {
opacity -= 3;
if (opacity <= 0) {
clearInterval(interval);
setTimeout(function () {
$el.css('background-color', initialBgColor);
}, 1);
}
$el.css({background: "rgba(" + color + ", " + opacity / 100 + ")"});
}, delay);
},
jr: function (seletor) {
return $(seletor).val();
},
jw: function (seletor, value) {
$(seletor).val(value);
},
attrId: function (mxObj) {
return Number(this._extractAttrVlr(mxObj)[0]);
},
attrVal: function (mxObj) {
return String(this._extractAttrVlr(mxObj)[1]);
},
/**
* Extrai o par "id@sigla" dos campos que implementam a tabela tab_atributos_valores
* Aceita:
* 1. seletor jQuery. ex: #id | .classe
* 2. objeto jQuery. ex: $('#id')
* 3. objeto html. ex:
* 4. string. ex: '22@DN'
*/
_extractAttrVlr: function (mxObj) {
var r, m, s = '@';
if (!mxObj)
return '';
if (_.isString(mxObj)) {
// string
if (mxObj.indexOf(s) > 0) {
r = mxObj.split(s);
}
// seletor jQuery
else if ((s = $(mxObj)).length > 0) {
r = s.val().split(s);
} else {
throw new Error('[sinisa.util._extractAttrVlr] tipo do objeto "mxObj" não reconhecido como string válida.');
}
}
// objeto jquery $(..)
else if (mxObj instanceof jQuery) {
r = mxObj.val().split(s);
}
// objeto javascript
else if (typeof mxObj == 'object') {
r = $(mxObj).val().split(s);
} else {
throw new Error('[sinisa.util._extractAttrVlr] tipo do objeto "mxObj" não reconhecido como objeto válido.');
}
return r;
},
retiraFormatoMoeda: function (valor, casas) {
var indexPont = valor.substr((-1 * (parseInt(casas) +1) ), 1);
if(casas && casas>0 && indexPont=='.'){
valor = (valor) ? valor.replace(",", ".") : 0;
}else{
valor = (valor) ? valor.replace(/\./g, "").replace(",", ".") : 0;
}
return parseFloat(valor);
},
colocaFormatoMoeda: function (n, c, d, t) {
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) : "");
},
scrollTo: function (el, top) {
top = top || 60;
var _el = typeof (el) == 'jQuery' ? el : $("#" + el);
if (_el.length > 0) {
$("html, body").animate({scrollTop: _el.offset().top - top}, 2000);
}
},
scrollTop: function () {
$("html, body").animate({scrollTop: 0}, 2000);
},
tiraZeros: function (valor) {
var tam = valor.length;
var cont = 0;
var comzero = new String;
for (var i = 0; i < tam; i++) {
if (valor.substring(i, i + 1) == 0) {
comzero = comzero;
if (cont == 1) {
comzero = comzero + valor.substring(i, i + 1);
}
} else {
comzero = comzero + valor.substring(i, i + 1);
cont = 1;
}
}
return (comzero == "") ? "0" : comzero;
},
lpad: function (str, valor, max) {
str = str.toString();
valor = valor.toString();
return str.length < max ? sinisa.util.lpad(valor + str, valor, max) : str;
},
rpad: function (str, valor, max) {
str = str.toString();
valor = valor.toString();
return str.length < max ? sinisa.util.rpad(str + valor, valor, max) : str;
},
formataDecimal: function (campo, casas) {
//se o valor for null ou não numerico
casas = Math.trunc(casas);
//se o numero de casas decimais for zero chama a funcao numerica
if (!casas) {
return sinisa.util.formataNumerico(campo);
}
var campoOriginal = campo.value;
campo.value = sinisa.util.filtraCampo(campo);
var vr = sinisa.util.tiraZeros(campo.value);
var tam = vr.length;
/*
console.log('campoOriginal:'+campoOriginal);
console.log('valor:'+campo.value);
console.log('tam:'+tam);
console.log('casas:'+casas);
console.log('vr:'+vr);
*/
//campo nulo
if (campo.value === "" || campoOriginal == (sinisa.util.rpad("0,", "0", casas + 1))) {
campo.value = "";
tam = 0;
}
//campo igual a 0
else if (vr === "0") {
campo.value = "0," + sinisa.util.rpad("0", '0', casas);
tam = 0;
}
//inicia com zero
else {
campo.value = '0,' + sinisa.util.lpad(vr, '0', casas);
}
//de 9,9 ate 999,9
if ((tam > casas) && (tam <= 3 + casas)) {
campo.value = vr.substr(0, tam - casas) + ',' + vr.substr(tam - casas, tam);
}
//de 9.999,9 ate 999,999,9
if ((tam >= 4 + casas) && (tam <= 6 + casas)) {
campo.value = vr.substr(0, tam - (3 + casas)) + '.' + vr.substr(tam - (3 + casas), 3) + ',' + vr.substr(tam - casas, tam);
}
//de 9.999.999,9 ate 999.999,999,9
if ((tam >= 7 + casas) && (tam <= 9 + casas)) {
campo.value = vr.substr(0, tam - (6 + casas)) + '.' + vr.substr(tam - (6 + casas), 3) + '.' + vr.substr(tam - (3 + casas), 3) + ',' + vr.substr(tam - casas, tam);
}
//de 9.999.999.999,9 ate 999.999,999.999,9
if ((tam >= 10 + casas) && (tam <= 12 + casas)) {
campo.value = vr.substr(0, tam - (9 + casas)) + '.' + vr.substr(tam - (9 + casas), 3) + '.' + vr.substr(tam - (6 + casas), 3) + '.' + vr.substr(tam - (3 + casas), 3) + ',' + vr.substr(tam - casas, tam);
}
//define o limite maximo
if (tam > 12 + casas) {
vr = vr.substr(0, 12 + casas);
tam = 12 + casas;
campo.value = vr.substr(0, tam - (9 + casas)) + '.' + vr.substr(tam - (9 + casas), 3) + '.' + vr.substr(tam - (6 + casas), 3) + '.' + vr.substr(tam - (3 + casas), 3) + ',' + vr.substr(tam - casas, tam);
}
},
formataNumerico: function (campo) {
campo.value = sinisa.util.filtraCampo(campo);
var vr = sinisa.util.tiraZeros(campo.value);
var tam = vr.length;
//se 000 ate 000.000
if ((tam > 3) && (tam <= 6)) {
campo.value = vr.substr(0, tam - 3) + '.' + vr.substr(tam - 3, 3);
}
//se 000.000 ate 000.000.000
if ((tam >= 7) && (tam <= 9)) {
campo.value = vr.substr(0, tam - 6) + '.' + vr.substr(tam - 6, 3) + '.' + vr.substr(tam - 3, 3);
}
//se 000.000.000 ate 000.000.000.000
if ((tam >= 10) && (tam <= 12)) {
campo.value = vr.substr(0, tam - 9) + '.' + vr.substr(tam - 9, 3) + '.' + vr.substr(tam - 6, 3) + '.' + vr.substr(tam - 3, 3);
}
//define o limite maximo
if (tam > 12) {
tam = 12;
campo.value = vr.substr(0, tam - 9) + '.' + vr.substr(tam - 9, 3) + '.' + vr.substr(tam - 6, 3) + '.' + vr.substr(tam - 3, 3);
}
},
filtraCampo: function(campo) {
var s = "";
var cp = "";
vr = campo.value;
vr = vr.replace(/[^0-9]+/g, '');
tam = vr.length;
for (i = 0; i < tam; i++) {
if (vr.substring(i, i + 1) != "/" && vr.substring(i, i + 1) != "-" && vr.substring(i, i + 1) != "." && vr.substring(i, i + 1) != ",") {
s = s + vr.substring(i, i + 1);
}
}
campo.value = s;
return cp = campo.value;
},
formataDecimalDoBanco: function (v, c) {
if (v.indexOf(',') == -1) {
var regex1 = new RegExp('(\\d{' + c + '})$');
var regex2 = new RegExp('(\\d+)(\\d{3},\\d{' + c + '})$');
var numero = v.split('.');
if (numero[1] && c > 0) {
var decimal = sinisa.util.rpad(numero[1], '0', c);
decimal = decimal.substring(0, c);
v = numero[0];
}
v = v.replace(/\D/g, ""); //Remove tudo o que não é dígito
v = v.replace(regex2, "$1.$2"); //Coloca o primeiro ponto
var qtdLoop = ((v.length) - (3)) / 3;
var count = 0;
while (qtdLoop > count)
{
count++;
v = v.replace(/(\d+)(\d{3}.*)/, "$1.$2"); //Coloca o resto dos pontos
}
v = v.replace(/^(0)(\d)/g, "$2"); //Coloca hífen entre o quarto e o quinto dígitos
if (decimal) {
v = v + ',' + decimal;
}
}
return v;
},
formataDecimalParaBanco: function (v) {
if (v) {
var vlor = v.replaceAll('.', '');
v = vlor.replaceAll(',', '.');
} else {
v = 0.00;
}
return parseFloat(v);
},
/**
* Limpa os campos de um formulário modal
* @param {*} formId : identificador do formulário modal a ser carregado
* conforme aparece no div do modal-body
*/
limparCampos: function (formId) {
// Checkboxes
$(`#${formId} .box-body :checkbox`).each((i, box) => {box.checked = false;});
// Demais campos
let campos = $(`#${formId} .box-body input, #${formId} .box-body select, #${formId} .box-body textArea`).not(':checkbox');
campos.val(null);
},
/**
* Carrega dados para um formulário modal; para uso em loadForm
* @param {string} formId : identificador do formulário modal a ser
* carregado (conforme aparece no div do modal-body)
* @param {string} prefix : o prefixo usado para os campos do formulário
* @param {object} response : a resposta ajax contendo os dados a serem
* carregados no modal
*/
carregarDadosModal: function (formId, prefix, response) {
$.each(response, function (i, val) {
let seletor = `#${formId} #${prefix}-` + i;
let campo = $(`${seletor}`);
if (campo.length > 0) {
// Seletores múltiplos e únicos
if(campo.hasClass('checkboxAE')){
if(Array.isArray(val)){
// Checkboxes
val.forEach((opt) => {
campo.find(
`.checkbox input[value=${opt}]`
)[0].checked = true;
});
}
else campo.val(val);
}
else campo.val(val);
}
});
// Força validação no formulário
$(`#${formId} input`).not(':hidden').not('[onchange]').first().trigger('blur');
},
/**
* Remove asteriscos de obrigatoriedade associados aos campos informados.
* Útil para simular, de forma estritamente visual, campos condicionalmente
* obrigatórios (e.g. obrigatórios apenas para regionais etc).
* @param {String} base : a base do nome da classe no formulário
* @param {Array} campos : array de campos a terem asteriscos removidos
*/
removerAsteriscos: function (base, campos) {
let baseSeletor = `.field-${base}-`;
campos.forEach(function (codigo){
let campo = `${baseSeletor}${codigo}`;
// Oculta span com asterisco associado ao campo, caso exista
$($(`${campo}`).find('span')).each(function(){
if($(this).html() == '*'){
$(this).css('display', 'none');
}
});
});
}
}));
/**
* Tratamento de conexões via ajax
*/
Sinisa.prototype.ajax = new (Sinisa.extend({
intContadorReq: 0, // contador de requisições ajax
init: function () {
this.log('[sinisa.ajax] ajax pronto para uso');
},
defaultBlockUI: function(){
$.blockUI();
},
defaultUnblockUI: function(){
$.unblockUI();
},
blockUI: null,
unblockUI: null,
fnAjaxFail: function (jqXhr, textStatus, errorThrown) {
console && console.log('[sinisa.ajax.fail] Falha na requisição [#'+ jqXhr.status +']: ' + errorThrown, null, 'error');
var msg = 'Erro interno';
if (typeof(jqXhr.responseJSON) !== 'undefined' && jqXhr.responseJSON.msg) {
msg = jqXhr.responseJSON.msg;
}
if (typeof(sinisa.ajax.unblockUI) === 'function') {
sinisa.ajax.unblockUI();
sinisa.ajax.unblockUI = null;
}
else {
sinisa.ajax.defaultUnblockUI();
}
sweetAlert('Houve um problema na requisição', msg, 'error');
},
fnAjaxAlways: function (mxDataOrJqXhr, textStatus, jqXhrOrErrorThrown) {
var resposta = {
mxDataOrJqXhr: mxDataOrJqXhr,
textStatus: textStatus,
jqXhrOrErrorThrown: jqXhrOrErrorThrown,
};
if (typeof(sinisa.ajax.unblockUI) === 'function') {
sinisa.ajax.unblockUI();
sinisa.ajax.unblockUI = null;
}
else {
sinisa.ajax.defaultUnblockUI();
}
console && console.log(resposta, '[sinisa.ajax.always] Resposta da requisição ['+
mxDataOrJqXhr.sinisaAjaxIntContadorReq +']');
},
fnAjaxDone: function (data, textStatus, jqXhr) {
if (typeof(sinisa.ajax.unblockUI) === 'function') {
sinisa.ajax.unblockUI();
sinisa.ajax.unblockUI = null;
}
else {
sinisa.ajax.defaultUnblockUI();
}
},
/**
* Requisição genérica
*/
request: function (strUrl, objDados, fnCallback, strTipoRequisicao) {
var me = this;
// function(data) {}
fnCallback = fnCallback || function() {};
// par {chave: valor, ...}
objDados = objDados || {};
// POST | GET | JSON
strTipoRequisicao = strTipoRequisicao || 'POST';
/**
* Yii 2.0 CSRF validation for AJAX request
*/
if ($.inArray(strTipoRequisicao.toUpperCase(), ['GET', 'POST', 'OPTIONS'])) {
var csrfParam = $('meta[name="csrf-param"]').attr("content");
var csrfToken = $('meta[name="csrf-token"]').attr("content");
objDados[csrfParam] = csrfToken;
}
objDados.sinisaAjaxIntContadorReq = ++this.intContadorReq;
var jqXhr = $.ajax({
type: strTipoRequisicao,
url: strUrl,
data: objDados,
success: function(data, textStatus, jqXHR){
if (typeof(sinisa.ajax.unblockUI) === 'function') {
sinisa.ajax.unblockUI();
sinisa.ajax.unblockUI = null;
}
else {
sinisa.ajax.defaultUnblockUI();
}
if (typeof(jqXHR.responseJSON) !== 'undefined' && jqXHR.responseJSON.status == 'undefined') {
$.error('Erro ao receber a resposta da requisição. "status" precisa estar presente na resposta.');
}
else if (typeof(jqXHR.responseJSON) !== 'undefined' && jqXHR.responseJSON.status == 'erro') {
sweetAlert('Houve um problema na requisição', (jqXHR.responseJSON.msg || ''), 'error');
}
else {
fnCallback(data, textStatus, jqXHR);
}
},
cache: false,
async: true,
beforeSend: function(jqXhr) {
if (typeof(sinisa.ajax.blockUI) === 'function') {
sinisa.ajax.blockUI();
sinisa.ajax.blockUI = null;
}
else {
sinisa.ajax.defaultBlockUI();
}
// log das requisições
var ac = this.intContadorReq,
msg = '[sinisa.ajax.request] ['+ ac +'] Requisição Ajax Efetuada: ' + strUrl
;
me.log(objDados || {}, msg);
}
})
.then(function(dataJSON, textStatus, xhr) {
if (strTipoRequisicao == 'POST' || _.isObject(dataJSON)) {
if (dataJSON.status == 'erro') {
return $.Deferred()
.reject(xhr, dataJSON, dataJSON.msg)
.promise();
}
}
return dataJSON;
})
.always(this.fnAjaxAlways)
.fail(this.fnAjaxFail)
.done(this.fnAjaxDone);
return jqXhr;
},
post: function (strUrl, objDados, fnCallback) {
if (_.isFunction(objDados)) {
fnCallback = objDados;
objDados = {};
}
else if (_.isUndefined(objDados)) {
objDados = {};
}
return this.request(strUrl, objDados, fnCallback, 'POST');
},
get: function (strUrl, fnCallback) {
return this.request(strUrl, {}, fnCallback, 'GET');
}
}));
sinisa = new Sinisa();sinisa.config();