﻿///

var ___realPath="/CMSVidaSecurity/";
//
//  Función que ejecuta llamada ajax al webservice principal
//  Recibe como parametros un objeto del tipo:
//  {
//      service:"servicio", //string con el nombre del servicio
//      params:'{"param1":"dato1","param2":dato2}', //string en formato json
//      fx:callbackFunction //funcion de callback que reciba los datos y procese
//      errorfx: errorFunction // [opcional]
//      logAction: true|false //si registrar en log o no
//      avoidAlerts: false|true //si se dejan mostrar alerts de error o no
//  }
//
function callWSjson(obj){
    try{
        ___realPath=___path;
    }catch(ex1){}
    
    var logAction=((obj.logAction!=undefined)?obj.logAction:true);
    var avoidAlerts=((obj.avoidAlerts!=undefined)?obj.avoidAlerts:false);
    
    $.ajax({
        async: ((obj.async!=undefined)?obj.async:true),
        cache: false,
        type: "POST",
        url: ___realPath + "WebService.asmx/"+obj.service,
        data: ""+obj.params, 
        dataType: "json",
        contentType: ((obj.contentType)?obj.contentType:"application/json; charset=utf-8"),
        timeout: 3600000,
        success: function(data){
            var mensajeError="";
            var excepcion=null;
            try{
                data.d=data.d.replace(/\\/g,"/").replace(/\'/g,"");
                var objJson = json_parse(data.d);
                if(objJson.length && objJson.length>0 && objJson[0]["StackTrace"]){
                        mensajeError="Se ha producido un error.\n\nMensaje: "+objJson[0]["Error"]+"\nTraza: "+objJson[0]["StackTrace"];
                        excepcion=objJson[0];
                        //if(obj.errorfx)obj.errorfx(data);
                }
                else if(objJson["StackTrace"]){
                        mensajeError="Se ha producido un error.\n\nMensaje: "+objJson["Error"]+"\n\nTraza: "+objJson["StackTrace"];
                        excepcion=objJson;
                        //if(obj.errorfx){obj.errorfx(data);}
                        //return;
                }                
             }catch(ex){
                mensajeError="Respuesta mal formada ["+ex.message+"]\n\n"+((data && data.d)?data.d:"");
                excepcion=ex;
             }
             if(mensajeError.length<1){
                 try{
                    if(logAction)log_accionWS(obj);
                    obj.fx(data);
                 }catch(ex2){
                    mensajeError="Fallo al ejecutar función de callback ["+obj.service+"] ["+ex2.message+"]";
                    excepcion=ex2;
                 }
             }
             if(mensajeError.length>0){
                if(excepcion["Error"] && excepcion["StackTrace"]=="#"){
                    if(!avoidAlerts)alert(excepcion["Error"]);
                    if(logAction)log_accionWS(obj,"Error",mensajeError);
                    if(obj.errorfx){
                        obj.errorfx(data);
                    }
                    //para este tipo de error se hace un reload de la pagina (ej. error de usuario sin sesion)
                    $("body").append("<form name='__reload__' id='__reload__' action='"+document.location.href+"' target='_parent' />");
                    document.__reload__.submit();
                    return;
                }
                if(logAction)log_accionWS(obj,"Error",mensajeError);
                if(!avoidAlerts)alert("Se ha producido un error. Por favor intente en unos momentos más");
                if(obj.errorfx){obj.errorfx(data);}
                processException(excepcion);                
             }
        },
        error:function(data){
            log_accionWS(obj,"Error",((data && data.responseText)?data.responseText:""+data));
            //if(!avoidAlerts)alert("Se ha producido un error al llamar al servicio. Por favor intente en unos momentos más");
            if(data && data.responseText){
                    //if(!avoidAlerts)alert("Error [callWSjson]:"+data.responseText);
                    processException(data)
            }
            if(obj.errorfx){
                obj.errorfx(data);
            }else{
                if(data && !data.responseText){
                    //if(!avoidAlerts)alert("Error [callWSjson]:"+data);
                    //processException(data)
                 }
            }            
        }
    });
}


///mandamos datos a Log
function log_accionWS(obj){
    try{
        try{
            ___realPath=___path;
        }catch(ex1){}
        
        var tipo="Servicio";//"Acceso"; //modificacion para que llamadas a servicios sean tipo "Servicio" [20110520][iisla]
        var errorData="";
        var opNA="";
        var opNU="0";
        if(__selectedOption__)opNU=__selectedOption__;
        if(__selectedOptionName__)opNA=__selectedOptionName__;
        if(arguments.length>1){
            tipo=arguments[1];
        }
        if(arguments.length>2){
            errorData=arguments[2];
        }
        var parametros=((obj.service=="ValidaUsuario")?obj.params.split("txtPsswd")[0]+"txtPsswd:XXXX":obj.params)+((errorData.length>0)?"],ErrorData=["+errorData:"");
        parametros=parametros.replace(/\{/g,"").replace(/\}/g,"").replace(/\'/g,"").replace(/\"/g,"").replace(/\,/g,", ");
        var texto="Llamada a servicio ["+obj.service+"], Parámetros=["+parametros+"]";
        $.ajax({
            type:"POST",
            url:___realPath + "WebService.asmx/LogAccion",
            data:"{texto:\""+texto+"\",tipo:\""+tipo+"\", optNumber:\""+opNU+"\", optName:\""+opNA+"\"}",
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            timeout: 3600000,
            success: function(data){
                //window.status="Log OK ["+tipo+"]: "+texto;
            },
            error: function(data){
                //window.status="Log FAIL ["+tipo+"]: "+texto;
            }
        });
    }catch(logex){}
}
///

var ___currexception="";
function processException(err){
    //[20110407] deshabilitado envio de correo en error
    return;
    
    var vDebug = ""; 
    if(err.message)
    {  
       vDebug = err.message;
    }else if(err.d){
        vDebug = err.d;
    }else if(err[0] && err[0]["StackTrace"]){
        vDebug = ((err[0]["Error"].length>320)?err[0]["Error"].substring(0,320)+"...":err[0]["Error"]);//+"\n "+((err[0]["StackTrace"].length>300)?err[0]["StackTrace"].substring(0,300)+"...":err[0]["StackTrace"]);
    }else if(err["StackTrace"]){
        vDebug = ((err["Error"].length>320)?err["Error"].substring(0,320)+"...":err["Error"]);//+"\n "+((err["StackTrace"].length>300)?err["StackTrace"].substring(0,300)+"...":err["StackTrace"]);
    }
    ___currexception=vDebug;
    jConfirm("Se ha producido una excepción, ¿Desea enviar un correo informando esto?","Excepción",
        function(res){
            if(res){
                emailForm(___currexception);
            }
            try{
                processUrl("Paginas/Error.aspx");
            }catch(ex2){
                $("#Contenido").load(___path+"Paginas/Error.aspx");
            }
        }
    );
}

///mantiene la persistencia "activa"
var __keepAlive__flag_=true;
function __keepAlive__(milsec){
    var frstcall=true;
    if(arguments.length>1){
        frstcall=arguments[1];
    }
    if(milsec<=0){
        __keepAlive__flag_=false;
        return;
    }else{
        if(frstcall)
        __keepAlive__flag_=true;
    }
    callWSjson({
        logAction:false,
        service:'keepAlive',
        params:'',
        fx:function(){
            //ok?
            if( __keepAlive__flag_){
                setTimeout("__keepAlive__("+milsec+",false);",milsec);
            }
        }
    });
}

  
////

// formatea texto en moneda, con separador de miles y decimales
// el segundo parametro es el idioma: en=english, es=spanish; por defecto es 'es'
//  ej. formatCurrency("123456,12","en") => 123,456.12
//  ej. formatCurrency("123456,12","es") => 123.456,12
//  ej. formatCurrency("-123456.12") => -123.456,12
//  ej. formatCurrency("123,456,789.123") => 123.456.789,123
function formatCurrency(s)
{
    var lang='es'; //idioma por defecto= es;
    var dec,mil,neg="-";
    if(arguments.length>1){
        lang=arguments[1];
    }
    //meter más idiomas si se requiere
    if(lang=='es'){
        dec=",";
        mil=".";
    }else if(lang='en'){
        dec=".";
        mil=",";
    }else{
        dec=",";
        mil=".";
    }
    //el punto '.' no es separador de decimales
    s=""+s;
    if((s.indexOf(".")>0 && s.indexOf(".")!=s.lastIndexOf(".")) ||
        (s.indexOf(",")>0 && s.indexOf(".")>0 && s.indexOf(",")>s.indexOf("."))
        ){
        s=s.replace(".","").replace(".","").replace(".","");
    }
    //la coma ',' no es separador de decimales
    if((s.indexOf(",")>0 && s.indexOf(",")!=s.lastIndexOf(","))||
        (s.indexOf(",")>0 && s.indexOf(".")>0 && s.indexOf(".")>s.indexOf(","))
        ){
        s=s.replace(",","").replace(",","").replace(",","");
    }else{
        s=s.replace(",","."); //si es que la coma es separador de decimales
    }
    if(Number(s)!=s){
        return s;
    }
    var ss=s.split(".");
    if(ss.length>2) return s; //error inesperado
    var miles=ss[0];
    if(miles.indexOf("-")>=0){miles=miles.replace("-","");}else{neg="";}
    var num="";
    var count=0;
    for(var i=(miles.length-1);i>=0;i--){
       if(count%3==0 && count!=0){
        num=""+mil+num;
       }
       num=""+miles.charAt(i)+num;
       count+=1;
    }
    if(ss.length>1){
        num+=""+dec+ss[1];
    }
    return neg+num;    	        
}
/////

/////

// ej formatNumber(123.233,'es',3)
//    formatNumber(123.233,3)
//    formatNumber(123.233,'es',3,true) //forzar decimales
//    formatNumber(123.233,3,true) 
function formatNumber(num){
    var lang='es';
    var dec=3;
    var sep=',';
    var force=false;
    if(num==undefined || num==null || (""+num).length<1)num=0;
    num=""+num;
    var neg="";
    if(num.indexOf("-")>=0)neg="-";
    if(arguments.length>=2){
        if(Number(arguments[1])==arguments[1]){
            dec=Number(arguments[1]);
            if(arguments.length>=3){
                if(arguments[2]==true || arguments[2]=="true"){
                    force=true;
                }
            }
        }else{
            lang=arguments[1];
            if(arguments.length>=3 && Number(arguments[2])==arguments[2]){
                dec=arguments[2];
                if(arguments.length>=4){
                    if(arguments[3]==true || arguments[3]=="true"){
                        force=true;
                    }
                }
            }
        }
    }
    var num=formatCurrency(num,lang);
    if(lang=='es'){
        sep=",";
    }else if(lang='en'){
        sep=".";
    }else{
        sep=",";
    }
    if(num.indexOf(sep)>=0 || force){
        var pre=num.split(sep)[0];
        var pos=(num.split(sep).length>1)?num.split(sep)[1]:"";
        var cant=((pos.length>dec)?dec:pos.length);
        var dif=dec-pos.length;
        var zer="";
        if(dif>0){
            for(var i=0;i<dif;i++){
                zer+="0";
            }
        }
        var npos=0;
        if(pos.length>dec && dec>0){//redondeo (no truncar)
            pos="0."+pos;
            var factor=Math.pow(10,dec);
            pos=""+Math.round(Math.round(Number(pos)*factor))/factor;
            if(pos.length==1 && pos=="1"){
                pos="0";
                npos=1;
            }else{
                npos=Number((pos.indexOf(".")>=0)?pos.split(".")[0]:"0");
                pos=(pos.indexOf(".")>=0)?pos.split(".")[1]:pos;
            }
            //el redondeo quita los ceros si existen a la derecha (ej: 0.00 => 0.0)            
            pos+="0000000000000000000000000000000000000000000000000000000000000";
        }
        if(dec>0){
            pre=(Number(pre.replace(/\,/g,"").replace(/\./g,""))+npos);
            pre=formatCurrency(pre,lang);
            num=pre+sep+pos.substring(0,cant)+zer;
        }else{
            if(pos.length>0){
                num=Math.round(Number(pre.replace(/\./g,"").replace(/\,/g,"")+"."+pos));
                num=formatCurrency(num,lang);
            }else{
                num=pre;
            }
        }
    }
    if((""+num).indexOf("-")<0)num=neg+num;
    return num;
}

/// formatea numeros para tipo= '$' peso, '%' porcentaje y 'UF' 
/// $: sin decimales
/// %: dos decimales
/// UF: cuatro decimales
function formatN(numero,tipo){
    switch(tipo){
        case '$':
            return formatNumber(numero,'es',0);
            break;
        case '%':
            return formatNumber(numero,'es',2,true);
            break;
        case 'UF':
            return formatNumber(numero,'es',4,true);
            break;
        default:
            return formatNumber(numero,'es');
    }
}

/// des-formatea un string numérico para transformarlo a número
function unformatNumber(s){
    var num=formatNumber(s,'en',50).replace(/\,/g,"");
    if(Number(num)!=NaN && Number(num)!=undefined){
        return Number(num);
    }
    return s;
}
/////
