//////////////////////FUNCIONES DE LA APLICACION WEB//////////////////////// //indica si se verificara la sesion var timeOut = true; //contiene en segundo el tiempo de duracion de la sesion var IDLE_TIMEOUT = ""; //indica a donde sera la transition var slide = "right"; function pantallaBloqueoURI(uri) { if(uri.indexOf("/security/perfilblock")!=-1) uri="/action/web/security/perfilblock"; if(uri.indexOf("/security/userblock")!=-1) uri="/action/web/security/userblock"; return uri; } //desactivar boton derecho del mouse var sMensaje = '©Bancaribe.
Todos los derechos reservados.'; function anularBotonDerecho(e) { if (navigator.appName == 'Netscape' && (e.which == 3 || e.which == 2)){ alertBox(sMensaje,'Aceptar'); return false; } else if (navigator.appName == 'Microsoft Internet Explorer' && (event.button == 2)) { alertBox(sMensaje,'Aceptar'); } } document.onmousedown=anularBotonDerecho; document.oncontextmenu=new Function("return false"); //transition si la variable slide es nula usa la forma de mostrar el div function slideDIV(div) { if(slide!=null) $("#" + div).show("slide", {direction: slide}, "fast"); else document.getElementById(div).style.display=''; slide = "right"; } //ir al inicio de la ventana var isGoToTop = true; function goToTop() { if(isGoToTop) { if(iOS) window.scrollTo(0,0); else document.body.scrollTop = 0; } } //mensaje de error en la pantalla function mensajeError(mensaje) { document.getElementById('mensaje_informativo').innerHTML=mensaje + '

'; $('#modal').modal('show'); } //obtener nodo que esta atendiedo function nodo() { //llamada Ajax... return ajaxCall(httpMethod="GET", uri="/action/app/security/nodo", divResponse=null, divProgress=null, formName=null, afterResponseFn=null, onErrorFn=null); } var intervalTimer; var disabledTimer = false; /** * Muestra el tiempo restante del OTP */ function displayTimeLeftOTP (timeLeft){ //displays time on the input var minutes = Math.floor(timeLeft / 60); var seconds = timeLeft % 60; if(minutes<10) minutes = '0' + minutes; if(seconds<10) seconds = '0' + seconds; var displayString = minutes + ':' + seconds; document.getElementById("tiempoexpira").textContent = 'Su clave expira en: ' + displayString; document.getElementById("reenviaclave").style.display='none'; } /** * calcula el tiempo restante del OTP */ function timerOTP() { if(!disabledTimer) { var seconds = document.getElementById("expiraen").value; var remainTime = Date.now() + (seconds * 1000); displayTimeLeftOTP(seconds); clearInterval(intervalTimer); //var ctv = 0; intervalTimer = setInterval(function() { timeLeft = Math.round((remainTime - Date.now()) / 1000); if (timeLeft < 0) { seconds = 0; //colocar en cero para reiniciar contador clearInterval(intervalTimer); document.getElementById("tiempoexpira").style.display='none'; document.getElementById("reenviaclave").style.display=''; return; } displayTimeLeftOTP(timeLeft); //actualizar el tiempo de inactivad por si la clava tarde en vencerse mas de lo que dura la sesion _idleSecondsCounter=0; /* ctv++; if(ctv>=60) { ctv=0; nodo(); } */ }, 1000); } } /** * Invoca a un action que coloca en sesio la ruta del action y redireccion al action /security/homr * @param path nombre del directorio (la funcion asume que dentro del directorio existe template.htm) * @param params Query String si lo hubiera */ function redirectToAction(path, params, templateName) { if(path.indexOf('/action')==-1) { if(path=='exit') { params = ''; path = '/action/web/security/exit' } else path = '/action/web/business/' + path; } if(params!=null) params = '?' + params; else params = ''; //llamada Ajax... ajaxCall(httpMethod="GET", uri="/action/web/security/redirectto?path=" + path + params, divResponse=null, divProgress="status", formName=null, afterResponseFn=null, onErrorFn=null); } /** * Password strength indicator **/ function passwordStrength(password, id) { var desc = [{'width':'0px'}, {'width':'25%'}, {'width':'50%'}, {'width':'75%'}, {'width':'100%'}, {'width':'100%'}, {'width':'100%'}]; var descClass = ['', 'progress-bar-danger', 'progress-bar-danger', 'progress-bar-danger', 'progress-bar-success', 'progress-bar-success', 'progress-bar-success']; var score = 0; //if password has both lower and uppercase characters give 1 point if ((password.match(/[a-z]/)) && (password.match(/[A-Z]/))) {score++; } //if password has at least one number give 1 point if ( password.match(/[0-9]/)) {score++; } //if password has at least one special caracther give 1 point if ( password.match(/.[~!@#\$%*\(\)_\-\+=\{\}\[\]\|:;,\.\?/]/) ) {score++; } //si no se encuentra entre los siguientes caracteres bajar puntuacion if ( password.match(/.[^A-Za-z0-9~!@#\$%*\(\)_\-\+=\{\}\[\]\|:;,\.\?/]/) ) {score = score-1; } //no se pueden repetir 3 caracteres consecutivos if ( password.match(/(.)\1\1/) ) {score = score-1; } //if password bigger than 8 give another 1 point if (password.length >= 8 && score>=3) {score++; } if(score<0) score = 1; if(score>6) score = 0; // display indicator $(id).removeClass(descClass[1]) $(id).removeClass(descClass[2]) $(id).removeClass(descClass[3]) $(id).removeClass(descClass[4]) $(id).removeClass(descClass[5]) $(id).removeClass(descClass[6]) $(id).removeClass(descClass[score-1]).addClass(descClass[score]).css(desc[score]); } //ejecutar consulta function menuHeader() { //llamada Ajax... return ajaxCall( httpMethod="GET", uri="/action/web/security/menu/header", divResponse="header", divProgress="status", formName=null, afterResponseFn=null, onErrorFn=null); } //ejecutar consulta function menuFooter() { //llamada Ajax... return ajaxCall( httpMethod="GET", uri="/action/web/security/menu/footer", divResponse="footer", divProgress="status", formName=null, afterResponseFn=dropupMenu, onErrorFn=null); } var paddingChatIcon = ''; //configuracion del menu iconografico del pie de pagina function dropupMenu() { if(paddingChatIcon=='') { if(document.getElementById("chat-icon-footer")!=null) { paddingChatIcon = $('#chat-icon-footer').css('padding-bottom'); if(document.getElementById("chat-icon-footer").paddingBottom!=null) paddingChatIcon = document.getElementById("chat-icon-footer").paddingBottom; } } $( "#dropup_menu_click" ).click(function() { $( "#dropup_menu_icons" ).slideToggle( "slow", function() { if(document.getElementById("chat-icon-footer")!=null) { var x = $( "#dropup_menu_icons" ).height() + $( "#dropup_menu_icons_ini" ).height() + $( "#chat-icon-footer" ).height() - 30; document.getElementById("chat-icon-footer").style.paddingBottom = x + 'px'; } if ( document.getElementById("arrow_icon").className=='fas fa-arrow-down' ) { document.getElementById("arrow_icon").className='fas fa-arrow-up'; if(document.getElementById("chat-icon-footer")!=null) document.getElementById("chat-icon-footer").style.paddingBottom=paddingChatIcon; } else { document.getElementById("arrow_icon").className='fas fa-arrow-down'; } }); }); $( "#principal_container" ).click(function() { $( "#dropup_menu_icons" ).slideUp( "slow"); if(document.getElementById("chat-icon-footer")!=null) document.getElementById("chat-icon-footer").style.paddingBottom=paddingChatIcon; document.getElementById("arrow_icon").className='fas fa-arrow-up'; }); $( "#navbar_header" ).click(function() { $( "#dropup_menu_icons" ).slideUp( "slow"); if(document.getElementById("chat-icon-footer")!=null) document.getElementById("chat-icon-footer").style.paddingBottom=paddingChatIcon; document.getElementById("arrow_icon").className='fas fa-arrow-up'; }); $('#principal_container').on({ 'touchstart' : function(){ $( "#dropup_menu_icons" ).slideUp( "slow"); if(document.getElementById("chat-icon-footer")!=null) document.getElementById("chat-icon-footer").style.paddingBottom=paddingChatIcon; document.getElementById("arrow_icon").className='fas fa-arrow-up'; } }); $('#principal_container').on({ 'touchstart' : function(){ $( "#dropup_menu_icons" ).slideUp( "slow"); if(document.getElementById("chat-icon-footer")!=null) document.getElementById("chat-icon-footer").style.paddingBottom=paddingChatIcon; document.getElementById("arrow_icon").className='fas fa-arrow-up'; } }); } var iOS = ( navigator.userAgent.match(/(iPad|iPhone|iPod)/g) ? true : false ); var android = ( navigator.userAgent.match(/Android/i) ? true : false ); //asigna el tiempo en segundos que dura la sesion function setTimeOut(to) { IDLE_TIMEOUT = to; } //reinicia el contador de segundos cuando se toque la pantalla var _idleSecondsCounter = 0; document.onclick = function() { _idleSecondsCounter = 0; }; document.onkeypress = function() { _idleSecondsCounter = 0; }; document.onkeydown = function() { _idleSecondsCounter = 0; }; /** * Verifica que la sesion sigue activa */ function CheckIdleTime() { _idleSecondsCounter++; if (_idleSecondsCounter >= IDLE_TIMEOUT && timeOut) { document.location.href = "/bcm/action/web/security/sessiontimeout"; } } /** * Permite obtener el tiempo que durara la sesion * definida en el servidor */ function getTimeOut() { if(timeOut) { //llamada Ajax... ajaxCall(httpMethod="GET", uri="/action/app/security/timeout", divResponse=null, divProgress="status", formName=null, afterResponseFn=null, onErrorFn=null); } } /** * Mostrar pantalla de error */ function errorResponse() { if($("#asistentevirtual")!=null) $("#asistentevirtual").modal('hide'); paddingTop = document.body.style.paddingTop; $('#error-response').load("/bcm/action/error/general2 #container-error" , function( response, status, xhr ) { if ( status == "error" ) { document.location.href = "/bcm/action/error/general2"; } else { document.body.style.paddingTop='0px'; document.getElementById("error-response").style.display=''; } }); var divNeg = document.getElementById("container"); if(divNeg!=null) divNeg.style.display='none'; else document.location.href = "/bcm/action/error/general2"; var divFoo = document.getElementById("myFooter"); if(divFoo!=null) divFoo.style.display='none'; } /** * Mostrar la pagina anterior */ var paddingTop = ""; function goBackContainer(r) { var divNeg = document.getElementById("container"); if(divNeg==null) document.location.href = "/bcm/index.htm"; else { divNeg.style.display=''; document.body.style.paddingTop=paddingTop; document.getElementById("error-response").style.display='none'; if(r!=null) redirectToAction('/action/web/security/index'); var divFoo = document.getElementById("myFooter"); if(divFoo!=null) divFoo.style.display=''; } } ////////////////////////FUNCIONES DE LA APLICACION WEB//////////////////////// ////////////////////////FUNCIONES DE DINAMICA//////////////////////// //codigo de estatus de ajax var S_READY = 4; //separadores de decimales y miles usados por el servidor var _server_dsep = ","; var _server_tsep = "."; //formato para fechas var _server_formatDate = "dd-MM-yyyy"; /** * Crear objeto XmlHttpRequest de manera * portable entre browsers IE y FF. Retorna * una referencia al objeto listo para usarse * en comunicacion Ajax */ function getHttpObject() { var obj = null; if (window.XMLHttpRequest) { obj = new XMLHttpRequest(); } else if (window.ActiveXObject) { obj = new ActiveXObject("Microsoft.XMLHTTP"); } return obj; } /** * Invocar servicio Ajax * httpMethod: String GET o POST * uri: Path del servicio, no incluir el contexto. Ejemplo: /action/xxxx/yyyy * divResponse: ID del DIV donde se muestra la respuesta en caso de que sea HTML * divProgress: ID del DIV a mostrar mientras se ejecuta la llamada * formName: Nombre del formulario en caso que httpMethod sea igual a POST * 2014-06-23: Permite añadir mas de un formulario separado por punto y coma (;) Ejemplo: formName="form3;form5;form6" * afterResponseFn: Apuntador a funcion a ejecutar despues de mostrar una respuesta HTML * onErrorFn: Apuntador a funcion a ejecutar en caso de error http 500, 403, 404, 401, etc. * Puede utilizarse para restaurar los DIVs que se escondieron antes de invocar * esta funcion. */ function ajaxCall(httpMethod, uri, divResponse, divProgress, formName, afterResponseFn, onErrorFn) { //mostrar indicador de progreso var progress = document.getElementById(divProgress); if (progress!=null) progress.style.display=''; else { //mas de una barra de progreso if(divProgress!= null && divProgress.indexOf(";")!=-1) { var fnp = divProgress.split(";"); for (var i = 0; i < fnp.length; i++) { var prog = document.getElementById(fnp[i]) if (prog!=null) prog.style.display=''; } } } //ensamblar el URL var server = "https://www5.bancaribe.com.ve:443"; var url = server + "/bcm" + uri; if (url.indexOf("?")>0) url = url + "&random=" + Math.random(); else url = url + "?random=" + Math.random(); //ensamblar formulario var data = null; if (formName!=null) { //mas de un formulario? 2014-06-23 if(formName.indexOf(";")!=-1) { var fn = formName.split(";"); for (var i = 0; i < fn.length; i++) { data = data + "&" + getFormValues(fn[i]); } } else data = getFormValues(formName); } //send request var http = getHttpObject(); //manejador de respuesta AJAX http.onreadystatechange = function () { if (http.readyState == S_READY) { var contentType = http.getResponseHeader("Content-type"); var text = http.responseText; //verificacion de sesion de seguridad activa (redirect a login) if (text.indexOf("_ajax_VE8374yz_")>0) { window.location="/bcm/index.htm"; } else { //apagar indicador de progreso if (progress!=null) progress.style.display='none'; else { //pagar mas de una barra de progreso if(divProgress!= null && divProgress.indexOf(";")!=-1) { var fnp = divProgress.split(";"); for (var i = 0; i < fnp.length; i++) { var prog = document.getElementById(fnp[i]); if (prog!=null) prog.style.display='none'; } } } //verificacion de error y seguridad if (http.status == 500) errorResponse(); else if (http.status == 403) alertBox("Acceso denegado.","Aceptar"); else if (http.status == 404) alertBox("El servicio solicitado no esta disponible.","Aceptar"); else if (http.status == 401) alertBox("El servicio solicitado requiere comunicación vía SSL.","Aceptar"); else if (http.status == 406) window.location="/bcm/index.htm"; else { //tratar caso cuando no hay comunicacion con el servidor if (contentType==null || (http.status !=200 && http.status!=400)) { //indicador de progreso if (progress!=null) progress.style.display=''; else { //pagar mas de una barra de progreso if(divProgress!= null && divProgress.indexOf(";")!=-1) { var fnp = divProgress.split(";"); for (var i = 0; i < fnp.length; i++) { var prog = document.getElementById(fnp[i]); if (prog!=null) prog.style.display=''; } } } if (typeof errorConnection !== 'undefined') { errorConnection(); } return false; } //ok - responder de acuerdo al tipo de contenido if( contentType.indexOf("text/javascript")>=0 ) { eval(text); } else { if (divResponse!=null) { var div = document.getElementById(divResponse); div.innerHTML = text; div.style.display=''; } if (http.status == 200 && afterResponseFn!=null) afterResponseFn(); } } //invocar callback en caso de error if (http.status != 200) { if (onErrorFn!=null) onErrorFn(); } } } }; http.open(httpMethod, url, true); http.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"); http.send(data); return false; } /** * Limpiar los controles de un formulario, * los comboBox se ubican en el 1er elemento, el * atributo value del resto de los controles se * pone en "" vacio. El focus se pone en el 1er * control activo. * formName: nombre del formulario */ function clearForm(formName) { var f = document.forms[formName]; for (var i=0;i"); f.document.write("

"); f.document.write(""); f.document.write("Cargando..."); f.document.write(""); f.document.close(); f.location = url; } //patch 2013-02-27 if (html!=null) { var f = window.frames[objID + "_iframe"]; f.document.open(); f.document.write(html); f.document.close(); } if (centerPage==false) moveBox(obj, boxdiv); boxdiv.style.display='block'; //parche 20171111 if(pickControl!=null) { if(centerPage) overlayHeight(0); else { var h1 = (parseInt(boxdiv.style.top) + height); if(h1>pageHeight()) h1 = (h1-pageHeight())*2; else h1 = 0; overlayHeight(h1); } } else overlayHeight(0); } else boxdiv.style.display='none'; return false; } boxdiv = document.createElement('div'); boxdiv.className = "dialogbox"; boxdiv.setAttribute('id', newID); boxdiv.style.display = 'none'; boxdiv.style.position = 'absolute'; //parche 20171111 if(centerPage==true) boxdiv.style.position = 'fixed'; boxdiv.style.width = width + 'px'; boxdiv.style.height = height + 'px'; boxdiv.style.backgroundColor = 'white'; boxdiv.style.padding = "0px"; //si se desea que el DIV este alineado en el centro de la pagina if (centerPage==true) { boxdiv.style.top = (pageHeight() - height) / 2 + 'px'; boxdiv.style.left = (pageWidth() - width) / 2 + 'px'; } contents = document.createElement('iframe'); if (scrollActive==true) contents.scrolling = 'yes'; else contents.scrolling = 'no'; contents.style.overflowX = 'auto'; contents.style.overflowY = 'auto'; contents.frameBorder = '0'; contents.style.width = width + 'px'; contents.style.height = height + 'px'; contents.marginHeight = 0; contents.marginWidth = 0; contents.setAttribute('id', objID + "_iframe"); contents.setAttribute('name', objID + "_iframe"); boxdiv.appendChild(contents); document.body.appendChild(boxdiv); if (url!=null) { var f = window.frames[objID + "_iframe"]; f.document.open(); f.document.write("
"); f.document.write("

"); f.document.write(""); f.document.write("Cargando..."); f.document.write("
"); f.document.close(); f.location = url; } //patch 2013-02-27 if (html!=null) { var f = window.frames[objID + "_iframe"]; f.document.open(); f.document.write(html); f.document.close(); } /* soporte para lightbox */ overlay.style.display='block'; boxdiv.style.zIndex = 1002; /* ---- */ if (centerPage==false) moveBox(obj, boxdiv); boxdiv.style.display = 'block'; //parche 20171111 if(pickControl!=null) { if(centerPage) overlayHeight(0); else { var h1 = (parseInt(boxdiv.style.top) + height); if(h1>pageHeight()) h1 = (h1-pageHeight())*2; else h1 = 0; overlayHeight(h1); } } else overlayHeight(0); return false; } /** * Esconde un DIV + IFRAME abierto con la * funcion showBox() * objID: ID del DIV que sera ocultado */ function closeBox(objID) { document.getElementById(objID + "_popup").style.display = "none"; /* soporte para lightbox */ lightBoxOff(); } /** * Retorna TRUE si el navegador * es Internet Explorer */ function isIE() { if (navigator.appName.indexOf("Explorer")>0) return true; else return false; } /** * Retorna TRUE si el valor representa una fecha * de lo contrario retorna FALSE. Si el anio viene con 2 digitos * y en menor que 30, se asume el 20XX, de lo contrario 19XX. * value: String que representa una fecha con formato dd-mm-yyyy o dd/mm/yyyy */ function isValidDate(value) { var d = convertDate(value); if (d==null) return false; else return true; } /** * Retorna un objeto DATE si el valor representa una fecha * de lo contrario retorna NULL. Si el anio viene con 2 digitos * y es menor que 30, se asume el 20XX, de lo contrario 19XX. * value: String que representa una fecha con formato dd-mm-yyyy o dd/mm/yyyy */ function convertDate(value) { value = value.replace(new RegExp("/", "g") ,"-"); var values = value.split("-"); if (values.length!=3) return null; var day = values[0]; var month = values[1]; var year = values[2]; if (year.length!=2 && year.length!=4) return null; if (year.length==2 && parseInt(year)<30) year = "20" + year; else if (year.length==2 && parseInt(year)>=30) year = "19" + year; month = month-1; var dteDate = new Date(year,month,day); var r = ((day==dteDate.getDate()) && (month==dteDate.getMonth()) && (year==dteDate.getFullYear())); if (r) return dteDate; else return null; } /** * Mostrar un Calendario debajo y alineado * a la izquierda del elemento designado * por el parametro objID. El elemento debe * ser un textbox. * objID: ID del elemento en donde sera colocada la fecha seleccionada * lboundID: ID del elemento que contiene una fecha menor que sera usada para * no permitir seleccionar fechas menores en el calendario a la fecha en el elemento objID, * permite nulos cuando no se requiere. * uboundID: ID del elemento que contiene una fecha mayor que sera usada para * no permitir seleccionar fechas mayores en el calendario a la fecha en el elemento objID, * permite nulos cuando no se requiere. * isMovil: true para mostrar centrado en la pantalla del dispositivo * calUrl: Ruta del action por si se quiere usar un calendario alternativo al default. Ejem: /action/mycal */ function calendarOpen(objID, lboundID, uboundID, isMovil, calUrl) { pickControl = objID; var d = document.getElementById(objID).value; var url = "/bcm/action/calendar?id=" + objID + "&date=" + d; if (calUrl!=null) url = "/bcm" + calUrl + "?id=" + objID + "&date=" + d; if (lboundID != null) url = url + "&date.lbound=" + document.getElementById(lboundID).value; if (uboundID != null) url = url + "&date.ubound=" + document.getElementById(uboundID).value; var elem = document.getElementById(objID); if ( isMovil!=null ) { //si se usa bootstrap if(elem.className!=null && elem.className=='form-control') showBox(objID, 250 ,210, url, true); else showBox(objID, 240,154, url, true); } else { //si se usa bootstrap if(elem.className!=null && elem.className=='form-control') showBox(objID, 250 ,233, url, false, false); else showBox(objID, 240 ,154, url, false, false); } } /** * Retorna valor seleccionado en el calendario * poniendolo dentro del textbox asociado y * cierra el calendario * objID: ID del textbox asociado al calendario * sdate: String que representa una fecha en formato dd-mm-yyyy */ function calendarReturnValue(objID, sdate) { document.getElementById(objID + "_popup").style.display = "none"; document.getElementById(objID).value = sdate; /* soporte para lightbox */ lightBoxOff(); return false; } /** * Filtrar caracteres no permitidos en campos fecha, se usa * de esta manera: document.forms1.text1.onkeypress = keypressDate * en el evento onload del body. */ function keypressDate(e) { var mask = "0123456789-"; var keyCode = e ? e.which : window.event.keyCode; var key = String.fromCharCode(keyCode); if (mask.indexOf(key)==-1 && keyCode != 8 && keyCode!=0 && keyCode!=13) return false; } /** * Filtrar caracteres no permitidos en campos enteros, se usa * de esta manera: document.forms1.text1.onkeypress = keypressInteger * en el evento onload del body. */ function keypressInteger(e) { var mask = "0123456789"; var keyCode = e ? e.which : window.event.keyCode; var key = String.fromCharCode(keyCode); if (mask.indexOf(key)==-1 && keyCode != 8 && keyCode!=0 && keyCode!=13) return false; } /** * Filtrar caracteres no permitidos en campos con decimales, se usa * de esta manera: document.forms1.text1.onkeypress = keypressDouble * en el evento onload del body. Solo acepta el punto "." como separador * de decimales. */ function keypressDouble(e) { var mask = "0123456789."; var keyCode = e ? e.which : window.event.keyCode; var elem = e ? e.target : window.event.srcElement; var key = String.fromCharCode(keyCode); if (mask.indexOf(key)==-1 && keyCode != 8 && keyCode!=0 && keyCode!=13) return false; if (key=="." && elem.value.indexOf(".") > -1) return false; } /** * Retorna la trama requerida para hacer un POST del * formulario indicado usando Ajax * formName: Nombre del formulario */ function getFormValues(formName) { returnString =""; if( formName == "" ) return returnString; formElements=document.forms[formName].elements; for ( var i=formElements.length-1; i>=0; --i ) { if (formElements[i].name!=""){ //añade elementos radio y checkbox if (formElements[i].type=="checkbox" && !formElements[i].checked){ //este checkbox si no ha sido seleccionado es ignorado }else{ if (formElements[i].type=="radio" && !formElements[i].checked){ //este radio si no ha sido seleccionado es ignorado } else { var value = formElements[i].value; //NumericInput control? quitar formato de mascara antes de postear if (formElements[i].alt!=null && formElements[i].alt=="numeric") { value = value.replace(/[^\d,.-]/g,''); if(_server_dsep!=null && _server_dsep=='.') value = value.replace(/,/g ,""); else { value = value.replace(/\./g ,""); value = value.replace(/,/g ,"."); } } //chrome y safari dispositivo movil if (formElements[i].type!=null && formElements[i].type=="date" && value!=null && value!="") { var s = value.split("-"); var d = s[2]+'-'+s[1]+'-'+s[0]; value = d; } value = encodeURI(value); value = value.replace(new RegExp("&", "g") ,"%26"); //patch 2013-01-24 value = value.replace(new RegExp("\\+", "g") ,"%2B"); returnString = returnString + formElements[i].name + "=" + value + "&"; } } } } returnString = returnString.substring(0, returnString.length - 1); return returnString; } /** * Retorna checkboxes o radiobutton con la propiedad * checked = true * radioName: Nombre del checkbox o radiobutton * radioValue: Valor del checkbox o radiobutton * formName: Nombre del formulario */ function setCheckboxValue(radioName,radioValue,formName) { if( formName == "") { //si formName es nulo no hace nada return; }else{ formElements=document.forms[formName].elements; } for ( var i=formElements.length-1; i>=0; --i ) { if (formElements[i].name == radioName && (formElements[i].type=="radio" || formElements[i].type=="checkbox") ){ //añade elementos radio y checkbox if (formElements[i].value==radioValue){ formElements[i].checked = true; return; } } } } /** * Retorna combos con la propiedad * select = true * comboName: Nombre del combo * comboValue: Valor del combo * formName: Nombre del formulario */ function setComboValue(comboName,comboValue,formName) { var combo = document.forms[formName].elements[comboName]; var cantidad = combo.length; for (var i = 0; i < cantidad; i++) { if (combo[i].value == comboValue) { combo[i].selected = true; } } } /** * Remplazar el valor "," por "." en un elemento que contiene * un valor de tipo decimal. * elem: Elemento que contiene el valor a ser remplazado */ function replaceDecimal(elem) { var value = elem.value; elem.value = value.replace(new RegExp(",", "g") ,"."); } /** * Funciones de soporte para los grid * contiene funciones para la vista pagina, * panel de control, regresar a la pagina indicada, * y ordenamiento por columnas. */ //variables de control var lastPage=0; var currentPage=0; var recordsFound=0; /** * Ir a la primera pagina */ function pageFirst() { currentPage = 1; viewPage(); } /** * Ir a la ultima pagina */ function pageLast() { currentPage = lastPage; viewPage(); } /** * Ir a la pagina anterior */ function pagePrev() { if (currentPage>1) { currentPage=currentPage - 1; viewPage(); } } /** * Ir a la pagina siguiente */ function pageNext() { if (currentPage=0) lbox.remove(lbox.selectedIndex); } /** * Eliminar todos los items de un listbox * elementId: ID del control que representa al ListBox */ function listboxClear(elementId) { var lbox = document.getElementById(elementId); if (lbox==null) { alert("ERROR (listboxClear): no existe un elemento con ID: " + elementId); return; } while (lbox.length>0) { lbox.remove(0); } } /** * Obtener los IDs de los items de un listbox concatenados como un String * y separados por un caracter, por defecto es ";" si no se especifica * elementId: ID del control que representa al ListBox * separator: caracter a utilizar para separar los items * Nota: si el control esta vacio retorna un string vacio */ function listboxGetItemValues(elementId, separator) { if (separator==null) separator=";"; var lbox = document.getElementById(elementId); if (lbox==null) { alert("ERROR (listboxGetItemValues): no existe un elemento con ID: " + elementId); return; } var ids = ""; for (var i=0;i" + text; } obj.innerHTML = text; obj.style.display = ""; } /** * Verifica si existe el DIV que corresponde a un control * de un formulario para mostrar un mensaje de error, si no existe * lo crea y luego muestra el mensaje usando setInnerHtml. * Es utilizada por el servicio generico de validacion Ajax: * /action/error/validation/ajax * formElementId: Elemento donde sera mostrado el mensaje de error * text: Texto de error */ function setFormErrorMsg(formElementId,text) { var id = formElementId + "_error"; var obj = document.getElementById(id); var elem = document.getElementById(formElementId); if (obj==null) { try { obj= document.createElement( "div" ); obj.id = id; obj.className = "errormsg text-danger"; elem.parentNode.appendChild(obj); } catch (err) { alert("Error en setFormErrorMsg -> Element ID: " + formElementId); } } if(elem!=null && elem.dataset.tab!=null) { if(document.getElementById(elem.dataset.tab + "_error")!=null) { document.getElementById(elem.dataset.tab + "_error").style.display=''; obj.dataset.tab = elem.dataset.tab; } } else { if(elem==null && obj!=null && obj.dataset.tab!=null) { if(document.getElementById(obj.dataset.tab + "_error")!=null) document.getElementById(obj.dataset.tab + "_error").style.display=''; } } if(elem!=null && elem.dataset.section!=null) { if(document.getElementById(elem.dataset.section + "_error")!=null) { document.getElementById(elem.dataset.section + "_error").style.display=''; obj.dataset.section = elem.dataset.section; } } else { if(elem==null && obj!=null && obj.dataset.section!=null) { if(document.getElementById(obj.dataset.section + "_error")!=null) document.getElementById(obj.dataset.section + "_error").style.display=''; } } setInnerHtml(id, text); } /** * Mostrar TAB que contiene errores de validacion */ function showTabWithError() { var divs = getElementsByClass("errormsg text-danger"); for (var i=0;in)? s: pad(s+'0'); } return (isNaN(this))? this: (new String( Math.round(this*nT)/nT )).replace(/(\.\d*)?$/,pad); }; /** * Codigo tomado de: * http://www.webdeveloper.com/forum/showthread.php?t=68675 * Permite obtener tanto el alto como ancho de la pagina HTML que se esta usando */ function pageWidth() {return window.innerWidth != null? window.innerWidth: document.body != null? document.body.clientWidth:null;} function pageHeight() {return window.innerHeight != null? window.innerHeight: document.body != null? document.body.clientHeight:null;} /** * Soporte para DialogBox centrado en una pagina HTML */ //variable de control var dialogID = null; /** * Muestra un DIV + IFRAME en el centro de una pagina * dialogID: ID del dialog que sera centrado * url: URL del action que contiene la informacion que sera impresa dentro del DIV + IFRAME * ancho: Ancho del DIV + IFRAME * altura: Altura del DIV + IFRAME */ function openDialog(dialogID, url, ancho, altura) { this.dialogID = dialogID; //mostrar popup dhtml showBox(dialogID, ancho, altura, url, true, true); } /** * Oculta un DIV + IFRAME que se encuentra en el centro * de una pagina */ function closeDialog() { document.getElementById(dialogID + "_popup").style.display = "none"; /* soporte para lightbox */ lightBoxOff(); } /** * Mostrar caja de dialogo centrada con un mensaje y opciones Aceptar|Cancelar, al darle clic en Aceptar * se cierra el dialogo y se invoca la funcion con el script provisto. Debe existir en la pagina un DIV con id=response, este DIV no sera afectado. * message: Texto a mostrar en el DialogBox * btnOk: etiqueta para el boton Aceptar * btnCancel: opcional - etiqueta para el boton Cancelar, si es null el boton se omite * onOkFn: script para invocar la funcion en caso de clic en Aceptar, si es nulo solo se cierra el dialogo */ function confirmBox(message, btnOk, btnCancel, onOkFn) { var padTop = "10px"; if (message.length <= 40) padTop = "25px"; var fn = "parent.closeBox(\"response\")"; if (onOkFn!=null) fn = fn + ";" + onOkFn; var html = "" + "
" + message + "
"; html = html + "
"; if (btnCancel!=null) html = html + " "; html = html + "
"; showBox("response", 300,120, null, true, false, html); var f = window.frames["response_iframe"]; if (btnCancel==null) f.document.getElementById("btnOK").focus(); } /** * Code by Patrick Desjardins http://stackoverflow.com/questions/149055/how-can-i-format-numbers-as-money-in-javascript */ Number.prototype.format = function(c, d, t){ var p = Math.pow(10, c); var n = (this * p) * (1 + Number.EPSILON); if(isNaN(n)) { 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; } else { var n = (Math.round(n) / p), 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) : ""); }; /* Widget para convertir un input text en un control con mascara para ingreso de numeros con separadores de miles y decimales. La funcion getFormValues() le quita el formato para enviar el valor en formato americano como lo espera Dinamica. Soporta 0, 2 o 4 decimales. Se usa asi; onload = function() { var text1 = new MaskedTextDouble(document.form1.text1); } */ function NumericInput(elem, decimalPlaces, allowNegative) { var _decimals = ((decimalPlaces != null) ? decimalPlaces : 2); var _dSep = ((_server_dsep != null) ? _server_dsep : ","); var _tSep = ((_server_tsep != null) ? _server_tsep : "."); var _allowNegative = ((allowNegative != null) ? allowNegative : false); var _divisor = 100; if (_decimals==0) _divisor = 0; else if (_decimals==4) _divisor = 10000; else if (_decimals==8) _divisor = 100000000; elem.alt = "numeric"; if(elem.className!=null && elem.className!='') elem.className += " numeric"; else elem.className = "numeric"; var ml = elem.maxLength; if(elem.getAttribute('maxLengthDefault')==null) elem.setAttribute('maxLengthDefault', ml); else ml = elem.getAttribute('maxLengthDefault'); ml = Number(ml) var ml2 = ml + ((ml/3)>>0); elem.maxLength = ml2; elem.addEventListener('input', function() { var position = this.selectionStart; var l1 = (this.value.split(".").length - 1); this.value = this.value.replace(/[^\d,.-]/g, ''); var value = this.value; value = value.replace(/,/g ,""); value = value.replace(/\./g ,""); if (value.indexOf("-")!=-1 && _allowNegative) { value = value.replace(/-/g ,""); value = "-" + value; } else value = value.replace(/-/g ,""); var num = Number(value); if (_divisor>0) num = num / _divisor; elem.value = num.format(_decimals, _dSep ,_tSep); if(elem.value.indexOf(".")==-1) this.selectionEnd = elem.value.length; else { var l2 = (elem.value.split(".").length - 1); if(l2>l1) this.selectionEnd = position+1; else { if(l2==l1) this.selectionEnd = position; else this.selectionEnd = position-1; } } }); elem.addEventListener('paste', function() { var position = this.selectionStart; var l1 = (this.value.split(".").length - 1); this.value = this.value.replace(/[^\d,.-]/g, ''); var value = this.value; value = value.replace(/,/g ,""); value = value.replace(/\./g ,""); if (value.indexOf("-")!=-1 && _allowNegative) { value = value.replace(/-/g ,""); value = "-" + value; } else value = value.replace(/-/g ,""); var num = Number(value); if (_divisor>0) num = num / _divisor; elem.value = num.format(_decimals, _dSep ,_tSep); if(elem.value.indexOf(".")==-1) this.selectionEnd = elem.value.length; else { var l2 = (elem.value.split(".").length - 1); if(l2>l1) this.selectionEnd = position+1; else { if(l2==l1) this.selectionEnd = position; else this.selectionEnd = position-1; } } }); } //end widget NumericInput // funciones añadidas desde el 2013-04-03 //Mostrar DialogBox con efecto lightbox para alert o confirm //message: mensaje a mostrar, puede contener html //buttonOK: etiqueta del boton OK //buttonCancel: etiqueta del boton Cancel, si es nulo no se muestra este boton y el focus se pone el boton OK //OkFn: script con la funcion a invocar en el onclick del boton OK, si es nulo solo se cierra el dialogo function alertBox(message, buttonOK, buttonCancel, OkFn, invertirBotones) { var fn = "closeAlertBox()"; if (OkFn!=null) fn = fn + ";" + OkFn; var div = document.getElementById("alertbox"); if (div!=null) { div.parentNode.removeChild(div); } var ab = ""; document.body.insertAdjacentHTML("beforeEnd", ab); div = document.getElementById("alertbox"); if(isLightBoxOff==null) lightBoxOn(); var height; var width; if (!window.getComputedStyle) { //IE8 hack height = parseInt(div.currentStyle["min-height"]); if(height==0) height = parseInt(div.currentStyle["height"]); width = parseInt(div.currentStyle["min-width"]); if(height==0) width = parseInt(div.currentStyle["width"]); } else { height = parseInt(window.getComputedStyle(div, null).getPropertyValue("min-height")); if(height==0) height = parseInt(window.getComputedStyle(div, null).getPropertyValue("height")); width = parseInt(window.getComputedStyle(div, null).getPropertyValue("min-width")); if(width==0) width = parseInt(window.getComputedStyle(div, null).getPropertyValue("width")); } div.style.zIndex = 1002; div.style.left = (pageWidth() - width) / 2 + 'px'; div.style.display = "block"; var iOS = ( navigator.userAgent.match(/(iPad|iPhone|iPod)/g) ? true : false ); if (iOS) { var pageYOffset = window.pageYOffset; var innerHeight = window.innerHeight var i, frames; frames = parent.document.getElementsByTagName("iframe"); for (i = 0; i < frames.length; ++i) { if(frames[i].name.indexOf('_iframe')==-1) { pageYOffset = parent.window.pageYOffset; innerHeight = parent.window.innerHeight; } } var doc = document.body; var scrollTop = (pageYOffset || doc.scrollTop) - (doc.clientTop || 0); div.style.position = 'absolute'; div.style.top = (((innerHeight - div.offsetHeight) / 2) + scrollTop) + "px"; } else { div.style.position = 'fixed'; div.style.top = (pageHeight() - height) / 2 + 'px'; } if (buttonCancel==null) { var btn = document.getElementById("alertbox-ok"); btn.focus(); } } //Cierra un DialogBox desplegado con la funcion alertBox() var isLightBoxOff = null; function closeAlertBox() { var id ="alertbox"; if (document.getElementById(id)!=null) document.getElementById(id).style.display = "none"; if(isLightBoxOff==null) lightBoxOff(); } var overlay = null; //Activa efecto lightbox desactivando el fondo function lightBoxOn() { overlay = document.getElementById('_overlay'); if (overlay==null) { overlay = document.createElement("div"); overlay.className = "overlay"; overlay.setAttribute("id", "_overlay"); document.body.appendChild(overlay); } overlayHeight(0); overlay.style.display='block'; } //Desactiva el lightbox function lightBoxOff() { var overlay = document.getElementById('_overlay'); if (overlay!=null) overlay.style.display='none'; } /** * Permite definir la altura del lightbox * @param height Altura adicional de ser necesario */ function overlayHeight(height) { if(overlay!=null) { if (document.body.scrollHeight > pageHeight()) overlay.style.height = (document.body.scrollHeight + (height/2)) + 'px'; else overlay.style.height = (pageHeight() + (height/2)) + 'px'; if (document.body.scrollWidth > pageWidth()) overlay.style.width = document.body.scrollWidth + 'px'; else overlay.style.width = "100%"; } } /** * Crea un IFRAME * @param iFrameName Nombre del IFRAME * @param uri URI que sera cargada en el iframe */ function createIFrame(iFrameName, uri) { //existe iframe? var iFrame = document.getElementById(iFrameName); if(iFrame==null) { //crear iframe iFrame = document.createElement('iframe'); iFrame.style.padding = '0px'; iFrame.style.borderWidth = '0px'; iFrame.style.margin = '0px'; iFrame.style.height = '100%'; iFrame.style.width = '100%'; iFrame.setAttribute('id', iFrameName); iFrame.setAttribute('name', iFrameName); document.body.appendChild(iFrame); } //mostrar iframe iFrame.style.visibility = "visible"; //colocar mensaje de progreso mientras llega el request var f = window.frames[iFrameName]; f.document.open(); f.document.write("
"); f.document.write("

"); f.document.write(""); f.document.write("Cargando..."); f.document.write("
"); f.document.close(); f.location = uri; f.onLoad = document.getElementById(iFrameName).style.height = (pageHeight()-5) + 'px'; } /** * Muestra la caja de opciones para grid * alineada a la derecha del icono de opciones * @param id ID del icono de opciones */ function showOptionBox(id) { var divs = getElementsByClass("option-box"); for (var i=0;i=35 && keyCode <=40) return false; } elem.onkeyup = function(e) { var keyCode = e ? e.which : window.event.keyCode; var elem = e ? e.target : window.event.srcElement; //si tecla no es eliminar espacio if (keyCode!=8) { elem.value = fixDatePattern(elem.value, formatDate); elem.value = validDatePattern(elem.value, formatDate); } } elem.onclick = function(e) { moveCursorToEnd(elem); } } /** * Colocar cursor al final del control * @param el Elemento que representa el control */ 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(); } } /** * Verificar que la fecha sea valida segun calendario * @param currDate Valor tipeado en el control * @param formatDate Permite pasar un formato de fecha especifico para el control */ function validDatePattern(currDate, formatDate) { var currentDate = currDate; var currentLength = currentDate.length; var formatD = _server_formatDate; if(formatDate!=null) formatD = formatDate; var indexD = formatD.indexOf('dd'); var indexD2 = indexD + 2; var indexM = formatD.indexOf('MM'); var indexM2 = indexM + 2; var indexY = formatD.indexOf('yyyy'); var indexY2 = indexY + 4; var day = currentDate.substring(indexD, indexD2); var month = currentDate.substring(indexM, indexM2) - 1; if(currentDate.substring(indexM, indexM2)=='') month = ''; var year = currentDate.substring(indexY, indexY2); //verificar dia cuando no se tiene mes y anio if (day.length==2 && month == '' && year == '') { var dteDate = new Date(1972, 0, day); var r = day == dteDate.getDate(); if (r) return currentDate; else { if (currentDate[currentLength - 1] == '-' || currentDate[currentLength - 1] == '/') return currentDate.substring(0, (currentLength - 2)); else return currentDate.substring(0, (currentLength - 1)); } } //verificar mes cuando no se tiene dia y anio if (currentDate.substring(indexM, indexM2).length==2 && day=='' && year == '') { var dteDate = new Date(1972, month, 1); var r = month == dteDate.getMonth(); if (r) return currentDate; else { if (currentDate[currentLength - 1] == '-' || currentDate[currentLength - 1] == '/') return currentDate.substring(0, (currentLength - 2)); else return currentDate.substring(0, (currentLength - 1)); } } //verificar anio cuando no se tiene dia y mes if (year.length == 4 && day=='' && month == '') { var dteDate = new Date(year, 0, 1); var r = year == dteDate.getFullYear(); if (r) return currentDate; else { if (currentDate[currentLength - 1] == '-' || currentDate[currentLength - 1] == '/') return currentDate.substring(0, (currentLength - 2)); else return currentDate.substring(0, (currentLength - 1)); } } //verificar dia y mes cuando no se tiene el anio if (day.length==2 && currentDate.substring(indexM, indexM2).length==2 && year == '') { var dteDate = new Date(1972, month, day); var r = day == dteDate.getDate() && month == dteDate.getMonth(); if (r) return currentDate; else { if (month == 1 && day > 29) { if (currentDate[currentLength - 1] == '-' || currentDate[currentLength - 1] == '/') return currentDate.substring(0, (currentLength - 3)); else return currentDate.substring(0, (currentLength - 2)); } else { if (currentDate[currentLength - 1] == '-' || currentDate[currentLength - 1] == '/') return currentDate.substring(0, (currentLength - 2)); else return currentDate.substring(0, (currentLength - 1)); } } } //verificar mes y anio cuando no se tiene el dia if (currentDate.substring(indexM, indexM2).length==2 && year.length == 4 && day=='') { var dteDate = new Date(year, month, 1); var r = month == dteDate.getMonth() && year == dteDate.getFullYear(); if (r) return currentDate; else { if (currentDate[currentLength - 1] == '-' || currentDate[currentLength - 1] == '/') return currentDate.substring(0, (currentLength - 2)); else return currentDate.substring(0, (currentLength - 1)); } } //verificar dia y anio cuando no se tiene el mes if (day.length==2 && year.length == 4 && month=='') { var dteDate = new Date(year, 0, day); var r = day == dteDate.getDate() && year == dteDate.getFullYear(); if (r) return currentDate; else { if (currentDate[currentLength - 1] == '-' || currentDate[currentLength - 1] == '/') return currentDate.substring(0, (currentLength - 2)); else return currentDate.substring(0, (currentLength - 1)); } } //verificar dia mes y anio if (day.length==2 && currentDate.substring(indexM, indexM2).length==2 && year.length == 4) { var dteDate = new Date(year, month, day); var r = day == dteDate.getDate() && month == dteDate.getMonth() && year == dteDate.getFullYear(); if (r) return currentDate; else { if (currentDate[currentLength - 1] == '-' || currentDate[currentLength - 1] == '/') return currentDate.substring(0, (currentLength - 2)); else return currentDate.substring(0, (currentLength - 1)); } } return currentDate; } /** * Permite dar formato a una fecha * @param currDate Valor tipeado en el control * @param formatDate Permite pasar un formato de fecha especifico para el control */ function fixDatePattern(currDate, formatDate) { var currentDate = currDate; var currentLength = currentDate.length; var dateCountTracker = 0; var sep = "-"; var formatD = _server_formatDate; if(formatDate!=null) formatD = formatDate; if (formatD.indexOf("/") != -1) sep = "/"; if (currentLength > 10) return currentDate.substring(0, 10); var indexD = formatD.indexOf('dd'); var indexD2 = indexD + 2; var indexM = formatD.indexOf('MM'); var indexM2 = indexM + 2; var indexY = formatD.indexOf('yyyy'); indexY2 = indexY + 4; //dia con validacion por ser el primer digito mayor a 3 (31 dias) if (currentLength == (indexD + 1) && currentDate[indexD] > 3) { var transformedDate = currentDate.substring(0, indexD) + "0" + currentDate[indexD]; if (currentDate.indexOf(sep) == -1) transformedDate = "0" + currentDate[indexD]; if (transformedDate.length < 9) transformedDate = transformedDate + sep; dateCountTracker = indexD2; currentLength = transformedDate.length; return transformedDate; } //mes con validacion por ser el primer digito mayor a 1 (12 meses) if (currentLength == (indexM + 1) && currentDate[indexM] > 1) { var transformedDate = currentDate.substring(0, indexM) + "0" + currentDate[indexM]; if (currentDate.indexOf(sep) == -1) transformedDate = "0" + currentDate[indexM]; if (transformedDate.length < 9) transformedDate = transformedDate + sep; dateCountTracker = indexM2; currentLength = transformedDate.length; return transformedDate; } //dia correcto if (currentLength == indexD2 && dateCountTracker != indexD2) { dateCountTracker = currentLength; if (currentLength <= 9) currentDate = currentDate + sep; var day = currentDate.substring(indexD, indexD + 2); if (day > 31) { if (currentDate[currentLength - 1] == '-' || currentDate[currentLength - 1] == '/') currentDate = currentDate.substring(0, (indexD + 2) - 2); else currentDate = currentDate.substring(0, (indexD + 2) - 1); } return currentDate; } //mes correcto if (currentLength == indexM2 && dateCountTracker != indexM2) { dateCountTracker = currentLength; if (currentLength <= 9) currentDate = currentDate + sep; var month = currentDate.substring(indexM, indexM + 2); if (month > 12) { if (currentDate[currentLength - 1] == '-' || currentDate[currentLength - 1] == '/') currentDate = currentDate.substring(0, (indexM + 2) - 2); else currentDate = currentDate.substring(0, (indexM + 2) - 1); } return currentDate; } //anio if (currentLength == indexY2) { dateCountTracker = currentLength; if (currentLength > 9) return currentDate else return currentDate + sep; } dateCountTracker = currentLength; return currentDate; } function IntegerInput(elem, isActive) { var fActive = true; if(isActive==false) fActive = false; if(!fActive) { elem.removeEventListener('input', returnInteger); elem.removeEventListener('paste', returnInteger); } else { elem.addEventListener('input', returnInteger); elem.addEventListener('paste', returnInteger); } } function returnInteger() { var position = this.selectionStart; this.value = this.value.replace(/[^0-9]+/g, ''); this.selectionEnd = position; }