var globalurl=".";
var coll = document.getElementsByClassName("collapsible");
var view = "";

for (let i = 0; i < coll.length; i++) {
  coll[i].addEventListener("click", function() {
    this.classList.toggle("active");
    var content = this.nextElementSibling;
    if (content.style.display === "block") {
      content.style.display = "none";
    } else {
      content.style.display = "block";
    } 
  });
}



// SW loginmain
 var WS_waitscreen = false;
// var WS_wstimeout;
sessionValid()

//PARA LLAMAR A TODOS LOS SERVICIOS
function callWS(type, service, params, response){
    var url = globalurl + "/api/"+service+".php";
    var wait = document.createElement("div");
    wait.classList.add("waitScreen")
    wait.setAttribute("id", "waitScreen");
    var spin = document.createElement("div");
    spin.classList.add("spinChar");
    spin.innerHTML = '<i class="fas fa-circle-notch fa-spin"></i>';
    wait.appendChild(spin);
    document.body.appendChild(wait);
    WS_waitscreen = true;
    
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if (this.readyState == 4) {
            var rsp = "";
            if(this.responseText !== ""){
                rsp = JSON.parse(this.responseText);
                response(this.status, this.responseText);
            }else{
                response(this.status, this.responseText);
            }
            var waitScreen = document.getElementById("waitScreen");
            if(document.getElementById("waitScreen")!==null){
                document.getElementById("waitScreen").style.opacity=0;
            }
            setTimeout(function(){
                if(document.getElementById("waitScreen")!==null)
                    document.body.removeChild(document.getElementById("waitScreen"));
            },600);
            WS_waitscreen = false;
        }
    }
    switch (type){
        case "GET":
            var parsedPars = Object.keys(params).map(function(k) {
                return encodeURIComponent(k) + '=' + encodeURIComponent(params[k]);
            }).join('&');
            xhttp.open(type.toUpperCase(), url + "?" + parsedPars, true);
            xhttp.send();
        break;
        case"POST":
            xhttp.open("POST", url, true);
            var formdata = new FormData();
            for(var key in params){
                formdata.append(key, params[key]);
            }
            xhttp.send(formdata);
        break;
    }
}
//CERRAR SESION no se si en este caso funciona igual
function myLogout(){
    var par = {};
    par.sessionid = sessionStorage.getItem("sessionId");
   callWS("GET", "login/logout", par, respuesta);
    
    function respuesta(status, rsp){
        switch(status){
            case 200:
                sessionStorage.clear();
                gotoPage("login","main","");
                break;
            case 400:
                console.log(JSON.parse(rsp));
                break;
            case 401:
                console.log(JSON.parse(rsp));
                break;
            case 500:
              // console.log(JSON.parse(rsp));
                break;
            default:
               // console.log(rsp);
        }
    }
}

//Va a una pagina
function gotoPage(id, sid, params){
    esconderHTML(true);
    var url = globalurl + "/";
    var parsedPars = Object.keys(params).map(function(k) {
        return encodeURIComponent(k) + '=' + encodeURIComponent(params[k]);
    }).join('&');
    if (parsedPars.length)
        parsedPars = "&" + parsedPars;
    location.href=url+"?id="+id+"&sid="+sid+parsedPars;
}
//Va a una pagina en una ventana nueva
function gotoNewPage(id, sid){
    var url = globalurl + "/";
    window.open(url+"?id="+id+"&sid="+sid, '_blank');
}

function esconderHTML(hide){
    var html = document.getElementsByTagName("body")[0];
    if (html !== null)
        if (!hide)
            html.setAttribute("style", "opacity:1");
        else
            html.removeAttribute("style");
}


function getParameterByName(name) {
    name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
    var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
    results = regex.exec(location.search);
    return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}

//Javier
//funcion usada para cargar los botones contraer/expanir en formularios extensos
function expandBtns(){
    var btns = document.getElementsByClassName("expand");
    for(var i=0; i<btns.length; i++){
        btns[i].addEventListener("click", function(){
            cnt = document.getElementById(this.getAttribute("sect"));
            if(this.innerHTML == "+"){
                cnt.style.height = cnt.scrollHeight+"px";
                this.style.lineHeight = "";
                this.innerHTML = "-";
            }else{
                cnt.style.height = "";
                this.style.lineHeight = "17px";
                this.innerHTML = "+";
            }
        });
    }
}
function expandAll(){
    var btns = document.getElementsByClassName("expand");
    for(var i=0; i<btns.length; i++){
        btns[i].innerHTML = "-";
        var cnt = document.getElementById(btns[i].getAttribute("sect"));
        cnt.style.height = cnt.scrollHeight+"px";
    }
}
function closesecAll(){
    var btns = document.getElementsByClassName("expand");
    for(var i=0; i<btns.length; i++){
        btns[i].innerHTML = "+";
        var cnt = document.getElementById(btns[i].getAttribute("sect"));
        cnt.style.height = "";
    }
}

function drawSelect(select, read, rsp, selected, first = ""){
    //rsp - (array) Registros
    //select - donde se insertan las opciones
    //first - si no está vacío crea un opcion sin value
    //selected - selecciona una opción especifica
    //read - campo a partir del cual muestra el LBL
    select.innerHTML = "";
    var opt;
    if(first !== ""){
        opt = "";
        opt = document.createElement("option");
        opt.setAttribute("value", "");
        opt.innerHTML = first;
        select.appendChild(opt);
    }
    for(var i=0; i<rsp.length; i++){
        opt = document.createElement("option");
        opt.setAttribute("value", rsp[i].id);
        opt.innerHTML = rsp[i][read];
        if(selected !== null && selected !== "" && selected !== undefined){
            if(rsp[i].id == selected)
                opt.setAttribute("selected", "");
        }
        select.appendChild(opt);
    }
}

// Magui
// No more error
function noError(inputId,messageId){
    document.getElementById(inputId).style.border ="1px solid #D5DCE5";
    document.getElementById(messageId).innerHTML = "";
}

// Error
function error(inputId, messageId, message){
    document.getElementById(inputId).style.border ="2px solid #D0021B";
    document.getElementById(messageId).innerHTML = message;
}

// Focus in inputs and submit
function focusE(event, idnext) {
    if (event.keyCode == 13) {
        document.getElementById(idnext).focus();
    }
}
// Ej formatFields({"campo1", "campo2"}, {"rif","phone"})
//Por ahora solo se usa el amount
function formatFields2(campos, formato){
    var e;
    for (var i=0; i<campos.length; i++){
        e = document.getElementById(campos[i]);
        if (e !== null){
            switch (formato[i]){
                case "text":
                    setTextFormat(document.getElementById(campos[i]));
                    break;
                case "rif":
                    // definir formato de entrada
                    document.getElementById(campos[i]).addEventListener("keyup", function(e){
                        var cursorStart = e.target.selectionStart,
                            cursorEnd = e.target.selectionEnd;
                        this.value = formatRIF(this.value); 
                        e.target.setSelectionRange(cursorStart, cursorEnd);
                    });
                    // definir validacion
                    document.getElementById(campos[i]).addEventListener("change", function(){
                        if(isRIF(this.value) || !this.value.length){
                            showError(this, "",this.id);
                        }else{
                            //showError(this, "Formato de RIF/Cedula Invalido");
                            showError(this, "Formato de RIF/Cédula Inválido",this.id);
                            //alert("Formato de RIF/Cédula Inválido");
                        }
                    });
                    break;
                case "email":
                    document.getElementById(campos[i]).addEventListener("keyup", function(e){
                        var cursorStart = e.target.selectionStart,
                            cursorEnd = e.target.selectionEnd;
                        this.value = formatEmail(this.value); 
                        e.target.setSelectionRange(cursorStart, cursorEnd);
                    });
                    document.getElementById(campos[i]).addEventListener("change", function(){
                        if(isEmail(this.value) || !this.value.length){
                            showError(this, "",this.id);
                        }else{
                            showError(this, "Formato de Correo Inválido",this.id);
                            //alert("Formato de Correo Inválido");
                        }
                    });
                    break;
                case "phone":
                   // console.log("hello");
                    document.getElementById(campos[i]).addEventListener("keyup", function(e){
                        //var cursorStart = e.target.selectionStart,
                        //    cursorEnd = e.target.selectionEnd;
                        var codigo = e.which || e.keyCode;
                        if(codigo !== 8){
                            this.value = formatPhone(this.value); 
                        }
                        //e.target.setSelectionRange(cursorEnd, cursorEnd);
                    });
                    document.getElementById(campos[i]).addEventListener("change", function(){
                        if(isPhone(this.value) || !this.value.length){
                            showError(this, "",this.id);
                        }else{
                            showError(this, "Teléfono Inválido", this.id);
                           // alert("Teléfono Inválido");
                        }
                    });
                    break;
                case "amount":
                    document.getElementById(campos[i]).addEventListener("keyup", function(e){
                        //var cursorStart = e.target.selectionStart,
                        //    cursorEnd = e.target.selectionEnd;
                        var currency = this.getAttribute("data-currency");
                        //if(currency == "" || currency == undefined)currency = "VBS";
                        this.value = puntito(this, this.value.charAt(this.value.length-1));
                        var cnt;
                        if (this.getAttribute("data-cnt")===null)
                            cnt = 1;
                        else
                            cnt = parseInt(this.getAttribute("data-cnt"));
                        
                        if (cnt===0)    {
                            this.value = puntito(this,this.value.charAt(this.value.length-1));
                        }else{
                            this.setAttribute("data-amount", (parseFloat(this.value.replace(/\D/g,''))/100)/cnt);
                        }
                    });
                    break;
            }
        }else{
            console.log("Validando el campo '"+campos[i]+"' como '" + formato + "' que no existe");
        }
    }
}
//Formateo de amount real;
function puntito(donde,caracter,campo)
{
    var decimales = false
    dec = 2;
    if (dec != 0){decimales = true}
    
    pat = /[\*,\+,\(,\),\?,\\,\$,\[,\],\^]/
    valor = donde.value
    largo = valor.length
    crtr = true
    
    if(isNaN(caracter) || pat.test(caracter) == true){
    	if (pat.test(caracter)==true){caracter = "\\" + caracter}
    	carcter = new RegExp(caracter,"g")
    	valor = valor.replace(carcter,"")
    	donde.value = valor
    	crtr = false
    }else{
    	var nums = new Array()
    	cont = 0
    	for(m=0;m<largo;m++){
    		if(valor.charAt(m) == "." || valor.charAt(m) == " " || valor.charAt(m) == ","){
    		    continue;
	 		}else{
    			nums[cont] = valor.charAt(m)
    			cont++
    		}
    	}
    }
    if(decimales == true) {
    	ctdd = eval(1 + dec);
    	nmrs = 1
    }else {
        ctdd = 1; nmrs = 3
    }
    var cad1="",cad2="",cad3="",tres=0;
    if(nums.length > nmrs && crtr == true){
    	for (k=nums.length-ctdd;k>=0;k--){
    		cad1 = nums[k]
    		cad2 = cad1 + cad2
    		tres++
    		if((tres%3) == 0){
    			if(k!=0){
    				cad2 = "." + cad2
    			}
    		}
    	}
    	for (dd = dec; dd > 0; dd--){
    	    cad3 += nums[nums.length-dd] 
    	}
        if(decimales == true){cad2 += "," + cad3}
    }else{
        if(nums.length>0)cad2 = nums[0];
    }
    return(cad2);
    
    donde.focus();
}
/******
  recaud:{
            uploadFile:function(){
                var recaudos = document.getElementsByClassName("inptRecaudo");
                // alert(file.name+" | "+file.size+" | "+file.type);
                var formdata = new FormData();
                var docids = "";
                var files = "";
                for(var i=0; i<recaudos.length; i++){
                    if(recaudos[i].value !== ""){
                        docids  += recaudos[i].getAttribute("label")+"-"; 
                        formdata.append(recaudos[i].getAttribute("label"), recaudos[i].files[0]);
                    }
                }
                docids = docids.slice(0,-1);
                formdata.append("uploadids", docids);
                var ajax = new XMLHttpRequest();
                ajax.upload.addEventListener("progress", app.utils.recaud.progressHandler, false);
                ajax.addEventListener("load", app.utils.recaud.completeHandler, false);
                ajax.addEventListener("error", app.utils.recaud.errorHandler, false);
                ajax.addEventListener("abort", app.utils.recaud.abortHandler, false);
                ajax.onreadystatechange = function() {
                    if (this.readyState == 4) {
                        if(this.responseText !== "")var rsp = JSON.parse(this.responseText);
                        switch(this.status){
                            case 200:
                                //alert(JSON.stringify(rsp));
                            break;
                            default:
                                console.log(rsp);
                            break;
                        }
                    }else{
                        console.log("Estoy en ready state distinto de 4");
                    }
                }
                ajax.open("POST", app.server+"api/docs/upload2?sessionid="+app.user.sessionid);
                ajax.send(formdata);
                var id = "waitrecaud";
                app.utils.waiton(id);
            },
            progressHandler:function (event){
                var percent = (event.loaded / event.total) * 100;
                if(Math.round(percent) < 100){
                    app.utils.recaud._("waitrecaud").getElementsByClassName("spinChar")[0].innerHTML = Math.round(percent)+"%";
                }else{
                    app.utils.recaud._("waitrecaud").getElementsByClassName("spinChar")[0].innerHTML = '<i class="fas fa-circle-notch fa-spin"></i>';
                    
                }
            },
            completeHandler:function(event){
                app.utils.ventana.close("addRecaudos");
                var id = "waitrecaud";
                app.utils.waitoff(id);
                app.pages.perfil.user.entry();
            },
            errorHandler:function(event){
                alert("Error al subir los archivos");
                var id = "waitrecaud";
                app.utils.waitoff(id);
            },
            abortHandler:function(event){
                var id = "waitrecaud";
                app.utils.waitoff(id);
            }
        },

 *******/
 function moveCursorToEnd(el) {
    if (typeof el.selectionStart == "number") {
        el.selectionStart = el.selectionEnd = el.value.length;
    } else if (typeof el.createTextRange != "undefined") {
        el.focus();
        var range = el.createTextRange();
        range.collapse(false);
        range.select();
    }
}
/*AJUSTE PARA CAER SIEMPRE CON CURSOR A LA DERECHA AGREGADO-PROBAR*/
function formatAmount(fields){
    for(var i=0;i<fields.length;i++){
        var ele = document.getElementById(fields[i]);
        ele.addEventListener("keyup",function(e){
            //debugger;
            if(e.keyCode !== 190 && e.keyCode !== 188 && e.keyCode !== 110){
                if(this.value.indexOf('e-') == -1) this.value = this.value.replace(new RegExp('-', 'g'),'');   
            }
        });
        ele.addEventListener("focusin",function(){
            var val = this.getAttribute("dataNumber");
            this.value = parseFloat(val).noExponents();
            this.setAttribute("type","number");
            eletmp=this;
            setTimeout(function(){
                eletmp.dispatchEvent(new Event("click"));
            },100);
        });
        ele.addEventListener("focusout",function(){
            this.setAttribute("dataNumber",parseFloat(this.value).noExponents());
            this.value = "";
            this.setAttribute("type","text");
            this.value = number_format(this.getAttribute("dataNumber"),decimCoin);
        });
        ele.addEventListener("click",function(){
            moveCursorToEnd(this); 
        });
    }
    
}

/* Magui */
/* Funcion que se aplica a tipos numericos para eliminar los exponentes */
Number.prototype.noExponents= function(){
    var data= String(this).split(/[eE]/);
    if(data.length== 1) return data[0]; 

    var  z= '', sign= this<0? '-':'',
    str= data[0].replace('.', ''),
    mag= Number(data[1])+ 1;

    if(mag<0){
        z= sign + '0.';
        while(mag++) z += '0';
        return z + str.replace(/^\-/,'');
    }
    mag -= str.length;  
    while(mag--) z += '0';
    return str + z;
}

function formatCurrency (fractionDigits, number) {
    var ln = window.navigator.language;
    var decim = "";
    maxDig = false;
    var num = "";
    //debugger;
    if(number.split(".").length>1){
        num = number.split(".")[0];
        decim = number.split(".")[1];
        if(decim.length>=fractionDigits){
            decim = decim.substr(0,fractionDigits);
            maxDig = true;
        }
    }else if(number.split(".").length>0){
        num = number.split(".")[0];
    }else if(number.split(",").length>1){
        num = number.split(",")[0];
        decim = number.split(",")[1];
        if(decim.length>=fractionDigits){
            decim = decim.substr(0,fractionDigits);
            maxDig = true;
        }
    }else if(number.split(",").length>1){
        num = number.split(",")[0];
    }
    var formatted="";
    if(decim!=="")formatted=num+"."+decim;
    else formatted = num;
    if(maxDig == true && (number.split(".").length==2 || number.split(",").length==2))return formatted;
    else return "";
    
    /*
    if(ln == 'en'){
        var formatted = new Intl.NumberFormat('en-US',{
            maximumFractionDigits: fractionDigits,
        }).format(number);
        return formatted.replace(new RegExp(',', 'g'),'');
    }else if(ln == 'es-ES' || ln == 'es'){
        //debugger;
       var formatted = new Intl.NumberFormat('en-US',{
            maximumFractionDigits: fractionDigits,
        }).format(number);
        return  formatted.replace(new RegExp(',', 'g'),'');
    }
    */
}

/**Copio la función 2 para evitar daños en otros lugares donde se use*/
function formatCurrency2(fractionDigits, number) {
    var ln = window.navigator.language;
    var decim = "";
    maxDig = false;
    var num = "";
    //debugger;
    if(number.split(".").length>1){
        num = number.split(".")[0];
        decim = number.split(".")[1];
        if(decim.length>=fractionDigits){
            decim = decim.substr(0,fractionDigits);
            maxDig = true;
        }
    }else if(number.split(".").length>0){
        num = number.split(".")[0];
    }else if(number.split(",").length>1){
        num = number.split(",")[0];
        decim = number.split(",")[1];
        if(decim.length>=fractionDigits){
            decim = decim.substr(0,fractionDigits);
            maxDig = true;
        }
    }else if(number.split(",").length>1){
        num = number.split(",")[0];
    }
    var formatted="";
    if(decim!=="")formatted=num+"."+decim;
    else formatted = num;
    
    if(maxDig == true && (number.split(".").length==2 || number.split(",").length==2))return formatted;
    else return formatted;
    
    /*
    if(ln == 'en'){
        var formatted = new Intl.NumberFormat('en-US',{
            maximumFractionDigits: fractionDigits,
        }).format(number);
        return formatted.replace(new RegExp(',', 'g'),'');
    }else if(ln == 'es-ES' || ln == 'es'){
        //debugger;
       var formatted = new Intl.NumberFormat('en-US',{
            maximumFractionDigits: fractionDigits,
        }).format(number);
        return  formatted.replace(new RegExp(',', 'g'),'');
    }
    */
}


function formatVisual(number){
    var formatted = new Intl.NumberFormat('es-ES',{maximumFractionDigits: decimCoin,minimunFractionDigits: decimCoin}).format(number);
    return formatted;
}
function number_format(amount, decimals) {

    amount += ''; // por si pasan un numero en vez de un string
    amount = parseFloat(amount.replace(/[^0-9\.]/g, '')); // elimino cualquier cosa que no sea numero o punto

    decimals = decimals || 0; // por si la variable no fue fue pasada

    // si no es un numero o es igual a cero retorno el mismo cero
    if (isNaN(amount) || amount === 0) 
        return parseFloat(0).toFixed(decimals);

    // si es mayor o menor que cero retorno el valor formateado como numero
    amount = '' + amount.toFixed(decimals);

    var amount_parts = amount.split('.'),
        regexp = /(\d+)(\d{3})/;

    while (regexp.test(amount_parts[0]))
        amount_parts[0] = amount_parts[0].replace(regexp, '$1' + '.' + '$2');

    return amount_parts.join(',');
}


//funcion md5 formateo
function MD5(string) {
   function RotateLeft(lValue, iShiftBits) {
       return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits));
   }

   function AddUnsigned(lX,lY) {
       var lX4,lY4,lX8,lY8,lResult;
       lX8 = (lX & 0x80000000);
       lY8 = (lY & 0x80000000);
       lX4 = (lX & 0x40000000);
       lY4 = (lY & 0x40000000);
       lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF);
       if (lX4 & lY4) {
            return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
        }
        if (lX4 | lY4) {
            if (lResult & 0x40000000) {
               return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
            } else {
                                   return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
                           }
                   } else {
                           return (lResult ^ lX8 ^ lY8);
                   }
           }
        
           function F(x,y,z) { return (x & y) | ((~x) & z); }
           function G(x,y,z) { return (x & z) | (y & (~z)); }
           function H(x,y,z) { return (x ^ y ^ z); }
           function I(x,y,z) { return (y ^ (x | (~z))); }
        
           function FF(a,b,c,d,x,s,ac) {
                   a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
                   return AddUnsigned(RotateLeft(a, s), b);
           };
        
           function GG(a,b,c,d,x,s,ac) {
                   a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
                   return AddUnsigned(RotateLeft(a, s), b);
           };
        
           function HH(a,b,c,d,x,s,ac) {
                   a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
                   return AddUnsigned(RotateLeft(a, s), b);
           };
        
           function II(a,b,c,d,x,s,ac) {
                   a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
                   return AddUnsigned(RotateLeft(a, s), b);
           };
        
           function ConvertToWordArray(string) {
                   var lWordCount;
                   var lMessageLength = string.length;
                   var lNumberOfWords_temp1=lMessageLength + 8;
                   var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
                   var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
                   var lWordArray=Array(lNumberOfWords-1);
                   var lBytePosition = 0;
                   var lByteCount = 0;
                   while ( lByteCount < lMessageLength ) {
                           lWordCount = (lByteCount-(lByteCount % 4))/4;
                           lBytePosition = (lByteCount % 4)*8;
                           lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount)<<lBytePosition));
                           lByteCount++;
                   }
                   lWordCount = (lByteCount-(lByteCount % 4))/4;
                   lBytePosition = (lByteCount % 4)*8;
                   lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80<<lBytePosition);
                   lWordArray[lNumberOfWords-2] = lMessageLength<<3;
                   lWordArray[lNumberOfWords-1] = lMessageLength>>>29;
                   return lWordArray;
           };
        
        function WordToHex(lValue) {
            var WordToHexValue="",WordToHexValue_temp="",lByte,lCount;
            for (lCount = 0;lCount<=3;lCount++) {
               lByte = (lValue>>>(lCount*8)) & 255;
               WordToHexValue_temp = "0" + lByte.toString(16);
               WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2);
            }
            return WordToHexValue;
        };
        
        function Utf8Encode(string) {
            string = string.replace(/\r\n/g,"\n");
                   
            var utftext = "";
        
            for (var n = 0; n < string.length; n++) {
        
                var c = string.charCodeAt(n);
                if (c < 128) {
                   utftext += String.fromCharCode(c);
                }
                else if((c > 127) && (c < 2048)) {
                    utftext += String.fromCharCode((c >> 6) | 192);
                    utftext += String.fromCharCode((c & 63) | 128);
                }
                else {
                    utftext += String.fromCharCode((c >> 12) | 224);
                    utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                    utftext += String.fromCharCode((c & 63) | 128);
                }
            }
            return utftext;
        };
    
    var x=Array();
    var k,AA,BB,CC,DD,a,b,c,d;
    var S11=7, S12=12, S13=17, S14=22;
    var S21=5, S22=9 , S23=14, S24=20;
    var S31=4, S32=11, S33=16, S34=23;
    var S41=6, S42=10, S43=15, S44=21;
        
    string = Utf8Encode(string);
    x = ConvertToWordArray(string);
    a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;
    for (k=0;k<x.length;k+=16) {
        AA=a; BB=b; CC=c; DD=d;
        a=FF(a,b,c,d,x[k+0], S11,0xD76AA478);
        d=FF(d,a,b,c,x[k+1], S12,0xE8C7B756);
        c=FF(c,d,a,b,x[k+2], S13,0x242070DB);
        b=FF(b,c,d,a,x[k+3], S14,0xC1BDCEEE);
        a=FF(a,b,c,d,x[k+4], S11,0xF57C0FAF);
        d=FF(d,a,b,c,x[k+5], S12,0x4787C62A);
        c=FF(c,d,a,b,x[k+6], S13,0xA8304613);
        b=FF(b,c,d,a,x[k+7], S14,0xFD469501);
        a=FF(a,b,c,d,x[k+8], S11,0x698098D8);
        d=FF(d,a,b,c,x[k+9], S12,0x8B44F7AF);
        c=FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);
        b=FF(b,c,d,a,x[k+11],S14,0x895CD7BE);
        a=FF(a,b,c,d,x[k+12],S11,0x6B901122);
        d=FF(d,a,b,c,x[k+13],S12,0xFD987193);
        c=FF(c,d,a,b,x[k+14],S13,0xA679438E);
        b=FF(b,c,d,a,x[k+15],S14,0x49B40821);
        a=GG(a,b,c,d,x[k+1], S21,0xF61E2562);
        d=GG(d,a,b,c,x[k+6], S22,0xC040B340);
        c=GG(c,d,a,b,x[k+11],S23,0x265E5A51);
        b=GG(b,c,d,a,x[k+0], S24,0xE9B6C7AA);
        a=GG(a,b,c,d,x[k+5], S21,0xD62F105D);
        d=GG(d,a,b,c,x[k+10],S22,0x2441453);
        c=GG(c,d,a,b,x[k+15],S23,0xD8A1E681);
        b=GG(b,c,d,a,x[k+4], S24,0xE7D3FBC8);
        a=GG(a,b,c,d,x[k+9], S21,0x21E1CDE6);
        d=GG(d,a,b,c,x[k+14],S22,0xC33707D6);
        c=GG(c,d,a,b,x[k+3], S23,0xF4D50D87);
        b=GG(b,c,d,a,x[k+8], S24,0x455A14ED);
        a=GG(a,b,c,d,x[k+13],S21,0xA9E3E905);
        d=GG(d,a,b,c,x[k+2], S22,0xFCEFA3F8);
        c=GG(c,d,a,b,x[k+7], S23,0x676F02D9);
        b=GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);
        a=HH(a,b,c,d,x[k+5], S31,0xFFFA3942);
        d=HH(d,a,b,c,x[k+8], S32,0x8771F681);
        c=HH(c,d,a,b,x[k+11],S33,0x6D9D6122);
        b=HH(b,c,d,a,x[k+14],S34,0xFDE5380C);
        a=HH(a,b,c,d,x[k+1], S31,0xA4BEEA44);
        d=HH(d,a,b,c,x[k+4], S32,0x4BDECFA9);
        c=HH(c,d,a,b,x[k+7], S33,0xF6BB4B60);
        b=HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);
        a=HH(a,b,c,d,x[k+13],S31,0x289B7EC6);
        d=HH(d,a,b,c,x[k+0], S32,0xEAA127FA);
        c=HH(c,d,a,b,x[k+3], S33,0xD4EF3085);
        b=HH(b,c,d,a,x[k+6], S34,0x4881D05);
        a=HH(a,b,c,d,x[k+9], S31,0xD9D4D039);
        d=HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);
        c=HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);
        b=HH(b,c,d,a,x[k+2], S34,0xC4AC5665);
        a=II(a,b,c,d,x[k+0], S41,0xF4292244);
        d=II(d,a,b,c,x[k+7], S42,0x432AFF97);
        c=II(c,d,a,b,x[k+14],S43,0xAB9423A7);
        b=II(b,c,d,a,x[k+5], S44,0xFC93A039);
        a=II(a,b,c,d,x[k+12],S41,0x655B59C3);
        d=II(d,a,b,c,x[k+3], S42,0x8F0CCC92);
        c=II(c,d,a,b,x[k+10],S43,0xFFEFF47D);
        b=II(b,c,d,a,x[k+1], S44,0x85845DD1);
        a=II(a,b,c,d,x[k+8], S41,0x6FA87E4F);
        d=II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);
        c=II(c,d,a,b,x[k+6], S43,0xA3014314);
        b=II(b,c,d,a,x[k+13],S44,0x4E0811A1);
        a=II(a,b,c,d,x[k+4], S41,0xF7537E82);
        d=II(d,a,b,c,x[k+11],S42,0xBD3AF235);
        c=II(c,d,a,b,x[k+2], S43,0x2AD7D2BB);
        b=II(b,c,d,a,x[k+9], S44,0xEB86D391);
        a=AddUnsigned(a,AA);
        b=AddUnsigned(b,BB);
        c=AddUnsigned(c,CC);
        d=AddUnsigned(d,DD);
    }
        
    var temp = WordToHex(a)+WordToHex(b)+WordToHex(c)+WordToHex(d);
        
    return temp.toLowerCase();
}

const capitalize = (str, lower = false) =>
  (lower ? str.toLowerCase() : str).replace(/(?:^|\s|["'([{])+\S/g, match => match.toUpperCase());
;

/* Magui */
function sessionValid(){
    var req = {
        'sessionid': getParameterByName('sessionid')
    }
    callWSWithoutWS('GET', 'session/valid', req, response);
    function response(status, rsp){
        switch(status){
            case 200: 
                view = JSON.parse(rsp).view
                setTimeout(function(){ 
                    sessionValid()
                }, 10000);
                break;
            case 400:
                break;
            case 401:
                expiredSession();
                break;
            default:
                setTimeout(function(){ 
                    sessionValid()
                }, 10000);
                break;
        }
    }   
}

function sessionValidUpdate(id){
    var req = {
        'sessionid': getParameterByName('sessionid'),
        'view' : id
    }
    view = id;
    callWS('GET', 'session/valid', req, response);
    function response(status, rsp){
        switch(status){
            case 401:
                expiredSession();
                break;
            default:
                break;
        }
    }   
}

/* Magui - call WS without WS_waitscreen */
function callWSWithoutWS(type, service, params, response){
    var url = globalurl + "/api/"+service+".php";
    var spin = document.createElement("div");
    spin.classList.add("spinChar");
    spin.innerHTML = '<i class="fas fa-circle-notch fa-spin"></i>';
    
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if (this.readyState == 4) {
            var rsp = "";
            if(this.responseText !== ""){
                rsp = JSON.parse(this.responseText);
                response(this.status, this.responseText);
            }else{
                response(this.status, this.responseText);
            }
        }
    }
    switch (type){
        case "GET":
            var parsedPars = Object.keys(params).map(function(k) {
                return encodeURIComponent(k) + '=' + encodeURIComponent(params[k]);
            }).join('&');
            xhttp.open(type.toUpperCase(), url + "?" + parsedPars, true);
            xhttp.send();
        break;
        case"POST":
            xhttp.open("POST", url, true);
            var formdata = new FormData();
            for(var key in params){
                formdata.append(key, params[key]);
            }
            xhttp.send(formdata);
        break;
    }
}

/* Magui - go to dashboard or step */
function goToStart(){
    if(view == 1){
        gotoPage('step','main',{ 'sessionid': getParameterByName('sessionid') });
    }else{
        gotoPage('dashboard','home',{ 'sessionid': getParameterByName('sessionid') });
    }
}
 