include("lib.prototype"); if (!modularjs.loaded["lib.onload"]) { __onload__ = false; addOnLoad = function(f) { if (__onload__) { f(); } else { document.observe("dom:loaded", f); } } addOnLoad(function() { __onload__ = true; }); } modularjs.loaded["lib.onload"] = true; if (!modularjs.loaded["lib.css3hacks"]) { var CSS3Hacks = { STYLESHEET_ID: "__css3hacks__", IMPORT_REGEX: /@import ["'](.*)["'];/i, VARIABLES_REGEX: /@variables/i, VARIABLE_REGEX: /^\s*(.*)\s*:\s*(.*)\s*;\s*/i, VAR_REGEX: /var\(([^\)]+)\)/i, BR_REGEX: /border-radius/i, TR_REGEX: /transition/i, variables: $H(), init: function() { for (var s = 0; s < document.styleSheets.length; s++) { CSS3Hacks.process(document.styleSheets[s].href); } }, process: function(file) { file && new Ajax.Request(file, { method: "GET", onComplete: CSS3Hacks.parse, asynchronous: false // Should not block, file is in cache, but // needed in order to parse files in order }); }, parse: function(response) { var css = response.responseText.split("\n"); var selector = ""; for (var l = 0; l < css.length; l++) { // Process imports var import_res = CSS3Hacks.IMPORT_REGEX.exec(css[l]); if (import_res && import_res.length > 1 && import_res[1].length > 0) { var url = response.request.url; url = url.substring(0, url.lastIndexOf("/") + 1) + import_res[1]; CSS3Hacks.process(url); continue; } // Process variables definition if (CSS3Hacks.VARIABLES_REGEX.test(css[l])) { while (css[++l].indexOf("}") == -1) { var variable_res = CSS3Hacks.VARIABLE_REGEX.exec(css[l]); if (variable_res) { CSS3Hacks.variables.set(variable_res[1], variable_res[2]); } } continue; } // Process browser-specific tweaks var open = css[l].indexOf("{"); if (open > 0) { selector = css[l].substring(0, open); selector = selector.replace(/^\s*/, '').replace(/\s*$/, ''); } if (CSS3Hacks.BR_REGEX.test(css[l])) { CSS3Hacks.createCSS(selector, css[l].replace(CSS3Hacks.BR_REGEX, "-moz-border-radius") + css[l].replace(CSS3Hacks.BR_REGEX, "-webkit-border-radius") + css[l].replace(CSS3Hacks.BR_REGEX, "-khtml-border-radius") + css[l].replace(CSS3Hacks.BR_REGEX, "-o-border-radius") /*+ css[l].replace(CSS3Hacks.BR_REGEX, "-ms-border-radius") + "behavior:url(css/border-radius.htc);"*/); } if (CSS3Hacks.TR_REGEX.test(css[l])) { CSS3Hacks.createCSS(selector, css[l].replace(CSS3Hacks.TR_REGEX, "-moz-transition") + css[l].replace(CSS3Hacks.TR_REGEX, "-webkit-transition") + css[l].replace(CSS3Hacks.TR_REGEX, "-khtml-transition") + css[l].replace(CSS3Hacks.TR_REGEX, "-o-transition") + css[l].replace(CSS3Hacks.TR_REGEX, "-ms-transition")); } // Process variables var var_res = CSS3Hacks.VAR_REGEX.exec(css[l]); if (var_res) { CSS3Hacks.createCSS(selector, css[l].replace(CSS3Hacks.VAR_REGEX, CSS3Hacks.variables.get(var_res[1]))); } } }, getRule: function(selectorText) { for ( var s = 0; s < document.styleSheets.length; s++) { var rules = document.styleSheets[s].rules || document.styleSheets[s].cssRules; for ( var r = 0; r < rules.length; r++) { if (rules[r].selectorText == selectorText) { return rules[r]; } } } return null; }, createCSS: function(selector, declaration) { var styleElement = $(CSS3Hacks.STYLESHEET_ID); if (!styleElement) { styleElement = document.createElement("style"); styleElement.setAttribute("id", CSS3Hacks.STYLESHEET_ID); styleElement.setAttribute("type", "text/css"); styleElement.setAttribute("media", "screen"); document.getElementsByTagName("head")[0].appendChild(styleElement); } if (!Prototype.Browser.IE) { styleElement.appendChild(document.createTextNode(selector + " {" + declaration + "}")); } else { var last = document.styleSheets[document.styleSheets.length - 1]; last.addRule(selector, declaration); } } }; addOnLoad(CSS3Hacks.init); } modularjs.loaded["lib.css3hacks"] = true; if (!modularjs.loaded["fitbank.evento"]) { /** * Inicializa el evento si no está inicializado y lo devuelve. */ $E = function(e) { // Si está extendido, simplemente devolverlo if (window.event && window.event.inicializado) { return window.event.evento; } else if (e && e.inicializado) { return e.evento; } // Si se pasó un objeto tipo Evento usar ese. var evento = e && e.evento ? e : e && new Evento(e); if (evento) { evento.evento.evento = evento; } return evento; }; /** * Clase Evento - Clase que contiene los manejadores de eventos disparados desde * los elementos. Se recomienda usar mejor el método $E en lugar de esta clase * directamente. */ var Evento = Class.create( { /** * Es el evento en si */ evento: null, /** * Contiene la tecla si se apalastó una tecla */ tecla: null, /** * Verdadero si se aplastó alt */ alt: null, /** * Verdadero si se aplastó ctrl */ ctrl: null, /** * Verdadero si se aplastó shift */ shift: null, /** * Contiene el caracter correspondiente a la tecla */ caracter: null, /** * Contiene el elemento que lanzó el evento */ elemento: null, /** * Contiene la coordenada en x del elemento que lanzó el evento */ x: null, /** * Contiene la coordenada en y del elemento que lanzó el evento */ y: null, /** * @private */ initialize: function(e, debug) { // capturar el evento para todos los navegadores // capturar tecla del evento if (window.event) { this.evento = window.event; // IE this.tecla = window.event.keyCode; } else { this.evento = e; this.tecla = e.which; } this.initTeclas(); switch (this.tecla) { case this.SLASH: this.caracter = '/'; break; case this.DOT: this.caracter = '.'; break; case this.DASH: this.caracter = '-'; break; case this.BACKSLASH: this.caracter = '\\'; break; default: if (!this.esEspecial()) { this.caracter = String.fromCharCode(this.tecla); } else { this.caracter = 13; } break; } this.alt = this.evento.altKey; this.ctrl = this.evento.ctrlKey; this.shift = this.evento.shiftKey; // capturar posición del evento if (this.evento.layerX && this.evento.layerY) { this.x = this.evento.layerX; this.y = this.evento.layerY; } else { this.x = this.evento.offsetX; this.y = this.evento.offsetY; } if (window.scrollX && window.scrollY) { this.X = this.evento.clientX + window.scrollX; this.Y = this.evento.clientY + window.scrollY; } else { this.X = this.evento.clientX + document.documentElement.scrollLeft + document.body.scrollLeft; this.Y = this.evento.clientY + document.documentElement.scrollTop + document.body.scrollTop; } // capturar origen del evento if (this.evento.srcElement) { this.elemento = this.evento.srcElement; } else if (this.evento.target) { this.elemento = this.evento.target; } else { Logger.warning("No hay elemento que genere el evento!!!!"); } if (debug) { Logger.debug(this.toString()); } }, toString: function() { var string = ''; string += 'Evento\n'; string += 'evento:' + this.evento + '\n'; string += 'tecla:' + this.tecla + '\n'; string += 'caracter:' + this.caracter + '\n'; string += 'alt:' + this.alt + '\n'; string += 'ctrl:' + this.ctrl + '\n'; string += 'shift:' + this.shift + '\n'; string += 'elemento:' + this.elemento + '\n'; string += 'x:' + this.x + '\n'; string += 'y:' + this.y + '\n'; string += 'X:' + this.X + '\n'; string += 'Y:' + this.Y + '\n'; return string; }, /** * Cancela la propagación del evento. * * @param (Event) * e Evento pasado por el browser. */ cancelar: function(e) { if (!e || !this.esEspecial()) { try { event.keyCode = 0; } catch (e) { } try { event.returnValue = false; } catch (e) { } Event.stop(this.evento); } }, /** * Verifica si una tecla especial fue presionada. * * @return (Boolean) Verdadero si una tecla especial fue presionada */ esEspecial: function() { return !this.tecla || (this.tecla == this.TAB) || (this.tecla == this.BACKSPACE) || (this.tecla == this.ENTER) || (this.tecla == this.FIN) || (this.tecla == this.INICIO) || (this.tecla == this.IZQUIERDA) || (this.tecla == this.ARRIBA) || (this.tecla == this.DERECHA) || (this.tecla == this.ABAJO) || (this.tecla == this.ESC) || (this.tecla == this.SUPR); }, /** * Verifica si una tecla especial fue presionada. * * @return (Boolean) Verdadero si una tecla especial fue presionada */ esIngreso: function() { return !this.esEspecial() || (this.tecla == this.BACKSPACE) || (this.tecla == this.SUPR); }, esFuncion: function() { return !Object.isNumber(this.tecla) || (this.F1 == this.tecla) || (this.F2 == this.tecla) || (this.F3 == this.tecla) || (this.F4 == this.tecla) || (this.F5 == this.tecla) || (this.F6 == this.tecla) || (this.F7 == this.tecla) || (this.F8 == this.tecla) || (this.F9 == this.tecla) || (this.F10 == this.tecla) || (this.F11 == this.tecla) || (this.F12 == this.tecla); }, /** * Encuentra la longitud de la selección en el campo donde se disparó el * evento. * * @return (int) La longitud de la selección */ getSelLength: function() { if (document.getSelection) { return (document.getSelection() + '').length; } else if (this.evento.elemento && Object.isNumber(this.evento.elemento.selectionStart)) { return this.evento.elemento.selectionEnd - this.evento.elemento.selectionStart; } else if (window.getSelection) { return (window.getSelection() + '').length; } else if (document.selection) { return (document.selection.createRange().text + '').length; } else { return -1; } }, /** * @private */ initTeclas: function() { this.TAB = 9; this.BACKSPACE = 8; this.ENTER = 13; this.SHIFT = 16; this.CTRL = 17; this.ESC = 27; this.ESPACIO = 32; this.PGUP = 33; this.PGDOWN = 34; this.FIN = 35; this.INICIO = 36; this.IZQUIERDA = 37; this.ARRIBA = 38; this.DERECHA = 39; this.ABAJO = 40; this.INS = 45; this.SUPR = 46; this.PUNTO = 190; this.DECIMAL = 110; this.F1 = 112; this.F2 = 113; this.F3 = 114; this.F4 = 115; this.F5 = 116; this.F6 = 117; this.F7 = 118; this.F8 = 119; this.F9 = 120; this.F10 = 121; this.F11 = 122; this.F12 = 123; this.DOT = 190; this.SLASH = 191; if (Prototype.Browser.IE) { this.DASH = 189; } else { this.DASH = 109; } this.BACKSLASH = 220; } }); } modularjs.loaded["fitbank.evento"] = true; if (!modularjs.loaded["fitbank.util"]) { if (!modularjs.loaded["lib.split"]) { /*! * Cross-Browser Split 1.1.1 * Copyright 2007-2012 Steven Levithan * Available under the MIT License * ECMAScript compliant, uniform cross-browser split method */ /** * Splits a string into an array of strings using a regex or string separator. Matches of the * separator are not included in the result array. However, if `separator` is a regex that contains * capturing groups, backreferences are spliced into the result each time `separator` is matched. * Fixes browser bugs compared to the native `String.prototype.split` and can be used reliably * cross-browser. * @param {String} str String to split. * @param {RegExp|String} separator Regex or string to use for separating the string. * @param {Number} [limit] Maximum number of items to include in the result array. * @returns {Array} Array of substrings. * @example * * // Basic use * split('a b c d', ' '); * // -> ['a', 'b', 'c', 'd'] * * // With limit * split('a b c d', ' ', 2); * // -> ['a', 'b'] * * // Backreferences in result array * split('..word1 word2..', /([a-z]+)(\d+)/i); * // -> ['..', 'word', '1', ' ', 'word', '2', '..'] */ var split; // Avoid running twice; that would break the `nativeSplit` reference split = split || function (undef) { var nativeSplit = String.prototype.split, compliantExecNpcg = /()??/.exec("")[1] === undef, // NPCG: nonparticipating capturing group self; self = function (str, separator, limit) { // If `separator` is not a regex, use `nativeSplit` if (Object.prototype.toString.call(separator) !== "[object RegExp]") { return nativeSplit.call(str, separator, limit); } var output = [], flags = (separator.ignoreCase ? "i" : "") + (separator.multiline ? "m" : "") + (separator.extended ? "x" : "") + // Proposed for ES6 (separator.sticky ? "y" : ""), // Firefox 3+ lastLastIndex = 0, // Make `global` and avoid `lastIndex` issues by working with a copy separator = new RegExp(separator.source, flags + "g"), separator2, match, lastIndex, lastLength; str += ""; // Type-convert if (!compliantExecNpcg) { // Doesn't need flags gy, but they don't hurt separator2 = new RegExp("^" + separator.source + "$(?!\\s)", flags); } /* Values for `limit`, per the spec: * If undefined: 4294967295 // Math.pow(2, 32) - 1 * If 0, Infinity, or NaN: 0 * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296; * If negative number: 4294967296 - Math.floor(Math.abs(limit)) * If other: Type-convert, then use the above rules */ limit = limit === undef ? -1 >>> 0 : // Math.pow(2, 32) - 1 limit >>> 0; // ToUint32(limit) while (match = separator.exec(str)) { // `separator.lastIndex` is not reliable cross-browser lastIndex = match.index + match[0].length; if (lastIndex > lastLastIndex) { output.push(str.slice(lastLastIndex, match.index)); // Fix browsers whose `exec` methods don't consistently return `undefined` for // nonparticipating capturing groups if (!compliantExecNpcg && match.length > 1) { match[0].replace(separator2, function () { for (var i = 1; i < arguments.length - 2; i++) { if (arguments[i] === undef) { match[i] = undef; } } }); } if (match.length > 1 && match.index < str.length) { Array.prototype.push.apply(output, match.slice(1)); } lastLength = match[0].length; lastLastIndex = lastIndex; if (output.length >= limit) { break; } } if (separator.lastIndex === match.index) { separator.lastIndex++; // Avoid an infinite loop } } if (lastLastIndex === str.length) { if (lastLength || !separator.test("")) { output.push(""); } } else { output.push(str.slice(lastLastIndex)); } return output.length > limit ? output.slice(0, limit) : output; }; // For convenience String.prototype.split = function (separator, limit) { return self(this, separator, limit); }; return self; }(); } modularjs.loaded["lib.split"] = true; /** * Namespace Util - Define funciones utilitarias. */ var Util = { //Selectores para encontrar los elementos candidatos a verificar si su valor //ha cambiado, pueden agregarse mas filtros selectors: [ "input:not([readonly='']), select:not([readonly='']), textarea:not([readonly=''])", "[type!='hidden']", ".record, [class*='control']" ], getCaret: function(elemento) { var caret = ''; return caret; }, //Aplicar selectores para encontrar campos candidatos a revisar cambios applySelectors: function() { var target = new Element("input"); var first = true; this.selectors.each(function(selector) { if (first) { target = c.form; first = false; } var selected = Prototype.Selector.select(selector, target); target = new Element("input"); selected.each(function(el) { if(el.type === "select-one") { var tmpInput = new Element("input", { id: el.id, "class": el.className }); tmpInput.value = el.options[el.selectedIndex].value; target.appendChild(tmpInput); } else if(el.type === "checkbox") { var tmpInput = new Element("input", { id: el.id, "class": el.className }); tmpInput.value = el.value; target.appendChild(tmpInput); } else { target.appendChild(el.clone(true)); } }); }); return target.childElements(); }, //Obtener el estatos actual de campos y valores en el formulario getOriginalElements: function() { var elements = {}; var targetElements = Util.applySelectors(); targetElements.each(function(e) { elements[e.id] = e.value; }); return elements; }, //Revisar si hay cambios en los elementos candidatos, segun su estado original checkForChanges: function(originalElements) { if (!originalElements || !c.form || !c.formulario) { return false; } var changes = false; var currentElements = {}; var targetElements = Util.applySelectors(); targetElements.each(function(e) { if(e.type !== "select-one") { currentElements[e.id] = e.value; } else { currentElements[e.id] = e.options[e.selectedIndex].text; } }); $H(originalElements).each(function(pair) { if (currentElements[pair.key]) { var check = pair.value !== currentElements[pair.key]; changes = changes || check; } }); return changes; }, /** * Función que obtiene el valor del nombre de la clase css. * * @param className * Valor del nombre de la clase css. */ getStyleClass: function(className) { for ( var s = 0; s < document.styleSheets.length; s++) { if (document.styleSheets[s].rules) { for ( var r = 0; r < document.styleSheets[s].rules.length; r++) { if (document.styleSheets[s].rules[r].selectorText == '.' + className) { return document.styleSheets[s].rules[r]; } } } else if (document.styleSheets[s].cssRules) { for ( var r = 0; r < document.styleSheets[s].cssRules.length; r++) { if (document.styleSheets[s].cssRules[r].selectorText == '.' + className) { return document.styleSheets[s].cssRules[r]; } } } } return null; }, encodeHTML: function(string) { return string.replace(/&/g, "&").replace(//g, ">"); }, firstUpperOtherLower: function(string) { return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase(); }, getContentWindow: function(iframe) { iframe = $(iframe); return iframe.contentWindow || iframe; }, getMensaje: function(mensajes, msg) { var mobileMsg = msg + "_MOBILE"; if(window.Mobile && mensajes[mobileMsg]) { return mensajes[mobileMsg]; } else { return mensajes[msg]; } }, /** * Inicializa un elemento para que use un oculto. */ initHtmlElement: function(elementId, reverse) { var elemento = $(elementId); var oculto = $(elementId + "_oculto"); if (reverse && reverse == "1") { oculto.widget = oculto; oculto.oculto = oculto; } else { oculto.widget = elemento; oculto.oculto = oculto; } elemento.oculto = oculto; elemento.widget = elemento; oculto.hide = Element.hideCurry(elemento); oculto.show = Element.showCurry(elemento); }, /** * Inicializa un elemento para que use un oculto. */ initHiddenInput: function(elemento, suffix) { elemento = $(elemento); if (!elemento) { return; } elemento.sync = function(oculto, e) { elemento.changeValue(oculto.value, e && e.options || e); }; elemento.setValueOculto = function (oculto) { oculto.changeValue(elemento.value); }; Util._initHiddenInput(elemento, suffix); }, /** * Inicializa un checkbox para que use un oculto. */ initCheckBox: function(elemento) { elemento = $(elemento); elemento.valueOn = elemento.getAttribute("value-on"); elemento.valueOff = elemento.getAttribute("value-off"); elemento.hide = Element.hideCurry(elemento.next("label")); elemento.show = Element.showCurry(elemento.next("label")); elemento.sync = function(e) { elemento.setChecked(e.target.value == elemento.valueOn, e && e.options || e); }; elemento.fixValue = function() { var value = elemento.checked ? elemento.valueOn : elemento.valueOff; elemento.value = value; return value; }; elemento.setValueOculto = function (oculto) { oculto.value = elemento.fixValue(); }; Util._initHiddenInput(elemento, "checkbox"); }, /** * Inicializa un combobox para que use un oculto. */ initComboBox: function(elemento) { elemento = $(elemento); elemento.on("keyup", function(e) { elemento.fireDOMEvent("change", { generated: false }); }); elemento.sync = function(e) { for (var i = 0 ; i < elemento.options.length ; i++) { if (e.target && e.target.value == elemento.options[i].value) { elemento.selectedIndex = i; break; } } }; elemento.setValueOculto = function (oculto) { oculto.value = elemento.options[elemento.selectedIndex].value; }; Util._initHiddenInput(elemento, "combobox"); }, /** * Inicializa un elemento para que use un oculto. * Se sincronizan los cambios efectuados por evento onChange */ _initHiddenInput: function(elemento, suffix) { var name = elemento.name; elemento.name = name + "_" + (suffix || "widget"); var oculto = new Element("input", { type: "hidden", name: name, registro: elemento.registro }); elemento.insert( { before: oculto }); oculto.oculto = oculto; elemento.oculto = oculto; oculto.widget = elemento; elemento.widget = elemento; oculto.hide = Element.hide.curry(elemento); oculto.show = Element.show.curry(elemento); if (suffix) { oculto[suffix] = elemento; elemento[suffix] = elemento; } if (elemento.sync) { oculto.on("change", elemento.sync.curry(oculto)); oculto.on("widget:init", elemento.sync.curry(oculto, { load: true })); } if (elemento.setValueOculto) { elemento.on("change", elemento.setValueOculto.curry(oculto)); elemento.setValueOculto(oculto); } return oculto; }, /** * Inicializa una tabla para que tenga scroll. */ initTableScroll: function(elemento, rows, horizontal) { if (Mobile) { return; } elemento = $(elemento); if (elemento.visible()) { Tabs.removeListener(elemento.scrollHandler); Util._initTableScroll(elemento, rows, horizontal); c.resize(elemento); } else if (!elemento.scrollHandler) { elemento.scrollHandler = Util.initTableScroll.curry(elemento, rows, horizontal); Tabs.addListener(elemento.scrollHandler); } }, _initTableScroll: function(elemento, rows, horizontal) { var div = elemento.down("div"); if (div && !div.hasClassName('*-container')) { div = elemento; } var table = elemento.down("table"); var thead = table.down("thead"); var tbody = table.down("tbody"); var tfoot = table.down("tfoot"); var tr = tbody && tbody.down("tr"); var borders = 2; if (!tbody || !tr || (div && div.className.match('dynamic-*').length > 0)) { return; } if (!horizontal) { var resize = function(td) { var w = parseInt(td.getStyle("width")); td.setStyle("width:" + w + "px"); }; table && table.select("th, td").each(resize); var totalHeight = (((thead && thead.getHeight() || 0) + 4) + (rows * ((tr && tr.getHeight() || 0) + borders))); div && div.setStyle({ display: "block", overflowY: "auto", overflowX: "auto", height: totalHeight + "px" }); thead && thead.setStyle({ display: "block" }); tbody && tbody.setStyle({ display: "block" }); tfoot && tfoot.setStyle({ display: "block" }); } else if (horizontal) { // TODO implementar scroll horizontal } else { var height = rows * tr.getHeight() + (thead ? thead.getHeight() : 0) + (tfoot ? tfoot.getHeight() : 0); elemento.setStyle({ overflowY: "auto", overflowX: "hidden", paddingRight: "20px", height: height + "px" }); } }, initDeleteRecord: function(name) { c.$N(name).each(function(elemento) { if (elemento.widget) { elemento = elemento.widget; } elemento.setDisabled(true); elemento.on("change", function(e) { var tr = elemento.up("td").up("tr"); if (elemento.checked) { tr.addClassName("delete-record"); } else { tr.removeClassName("delete-record"); } c.formulario.evalFormulas(elemento); c.calcular(); }); }); }, generarIdUnicoTemporal: function() { // IMPORTANTE: Mantener sincronizado con Servicios.java var id = "_id_"; id += Math.round(Math.random() * 999); id += "_"; id += Math.round(Math.random() * 999); id += "_"; id += Math.round(Math.random() * 999); return id; }, generarIdUnicoPermanente: function() { // IMPORTANTE: Mantener sincronizado con Servicios.java return "ID_" + Util.generarIdUnicoTemporal(); }, eliminarReferenciasCirculares: function(obj) { var seen = {}; function isPrimitive(obj) { var t = typeof obj; return !obj || t == 'string' || t == 'number' || t == 'boolean'; } function deCycle(obj) { var deCycled; if (!isPrimitive(obj)) { seen[obj] = true; } if (obj instanceof Array) { deCycled = []; for (var i = 0; i < obj.length; i += 1) { if (!seen[obj[i]]) { deCycled[i] = deCycle(obj[i]); } } } else if (typeof obj == 'object' && obj) { deCycled = {}; for (var k in obj) { if (obj.hasOwnProperty(k) && !seen[obj[k]]) { try { deCycled[k] = deCycle(obj[k]); } catch(e) { // no hacer nada } } } } else { deCycled = obj; } return deCycled; } return deCycle(obj); }, clean: function(obj) { if (!obj) { return; } try { obj.initialize = null; obj.constructor = null; delete obj.initialize; delete obj.constructor; } catch(e) { // no hacer nada } return obj; }, isError: function(codigo) { // Esto debe ser igual a ManejoExcepcion.isError() return codigo && !/0|.*-0|ok-.*/i.test(codigo); }, /** * Hace un elemento que sea movible. * * @param movableElement El elemento movible * @param handlerElement El elemento que puede mover */ makeMovable: function(movableElement, handlerElement) { handlerElement.unselectable = "on"; handlerElement.onselectstart = function() { return false }; handlerElement.style.userSelect = handlerElement.style.MozUserSelect = "none"; handlerElement.on('mousedown', function(e) { e = $E(e); var initX = e.X; var initY = e.Y; var divx = movableElement.style.left; var divy = movableElement.style.top; var divLeft = divx.substr(0, divx.indexOf('px')) * 1; var divTop = divy.substr(0, divy.indexOf('px')) * 1; var divNewLeft = initX - divLeft; var divNewTop = initY - divTop; handlerElement.moveHandler = Event.on(document.body, 'mousemove', function(e) { e = $E(e); movableElement.style.left = Math.max(0, e.X - divNewLeft) + 'px'; movableElement.style.top = Math.max(0, e.Y - divNewTop) + 'px'; }); }); handlerElement.on('mouseup', function(e) { e = $E(e); if (handlerElement.moveHandler) { handlerElement.moveHandler.stop(); } }); } }; /** * Extensiones para elementos de html */ Element.addMethods({ ensureVisible: function(element) { element = $(element); var parent = element.parentNode; if (parent) { var parentPosition = parent.positionedOffset().top; var minScroll = parentPosition + parent.scrollTop; var maxScroll = parentPosition + parent.scrollTop + parent.getHeight(); var position = element.positionedOffset().top; if (position < minScroll) { parent.scrollTop = position - parentPosition; } else if (position + element.getHeight() > maxScroll) { parent.scrollTop = position + element.getHeight() - parent.getHeight() - parentPosition; } } }, ensureInside: function(element, parent) { element = $(element); parent = ($(parent) || document.viewport); var d = element.getDimensions(); var vd = parent.getDimensions(); var p = element.viewportOffset(); var diff = vd.height - p.top - d.height; if (diff < 0) { element.style.top = (parseInt("0" + element.style.top, 10) + diff) + "px"; } p = element.viewportOffset(); diff = p.top; if (diff < 0) { element.style.top = (parseInt("0" + element.style.top, 10) - diff) + "px"; } p = element.viewportOffset(); diff = vd.width - p.left - d.width; if (diff < 0) { element.style.left = (parseInt("0" + element.style.left, 10) + diff) + "px"; } p = element.viewportOffset(); diff = p.left; if (diff < 0) { element.style.left = (parseInt("0" + element.style.left, 10) - diff) + "px"; } }, center: function(element, parent) { parent = parent || element.getOffsetParent(); var top = (parent.getHeight() - element.getHeight()) / 2; var left = (parent.getWidth() - element.getWidth()) / 2; if (top < 0) { top = 0; } if (left < 0) { left = 0; } element.absolutize(); element.setStyle( { top: top + "px", left: left + "px" }); }, relativize2: function(element) { element = $(element); var pos = element.positionedOffset(); element.relativize(); var newPos = element.positionedOffset(); var dx = pos[0] - newPos[0]; var dy = pos[1] - newPos[1]; element.moveMargin(dx, dy); element.nextSiblings().each(function(sibling) { if (element.visible()) { sibling.moveMargin(dx, dy); } }); }, moveMargin: function(element, dx, dy) { if (dx != 0) { element.style.marginLeft = (parseInt(element.style.marginLeft) + dx) + "px"; } if (dy != 0) { element.style.marginTop = (parseInt(element.style.marginTop) + dy) + "px"; } }, fireDOMEvent: function(element, event, options) { element = $(element); options = Object.extend({ generated: true }, options); if (document.createEventObject){ // dispatch para IE var evt = document.createEventObject(); evt.options = options; return element.fireEvent('on' + event, evt) } else{ // dispatch para firefox + others var evt = document.createEvent("HTMLEvents"); evt.initEvent(event, true, true); // event type,bubbling,cancelable evt.options = options; return !element.dispatchEvent(evt); } }, getOriginalDimensions: function(element) { element = $(element); var currentW; var currentH; if (element.tagName == "IMG") { currentW = element.width; currentH = element.height; } else { currentW = element.getWidth(); currentH = element.getHeight(); } element.removeAttribute("width"); element.removeAttribute("height"); var h = element.getHeight(); var w = element.getWidth(); if (element.tagName == "IMG") { element.width = currentW; element.height = currentH; } else { element.setStyle({ width: currentW + "px", height: currentH + "px" }); } return {width: w, height: h}; }, hide: function(element) { element = $(element); element.style.display = 'none'; var nextElement = element.next(); if (nextElement && nextElement.hasClassName("asistente-icono")) { nextElement.style.display = 'none'; } return element; }, show: function(element) { element = $(element); element.style.display = ''; var nextElement = element.next(); if (nextElement && nextElement.hasClassName("asistente-icono")) { nextElement.style.display = ''; } return element; }, // Metodos para optimizar carga de formularios solamente hideCurry: function(element) { return function() { element.hide(); }; }, showCurry: function(element) { return function() { element.show(); }; }, syncCurry: function(element) { return function(e) { element.sync(e); }; }, setValueOcultoCurry: function(element, oculto) { return function() { element.setValueOculto(oculto); }; } }); /** * Estos metodos sirven para elementos de tipo Form.Element aunque hay que * registrarlos en Element directamente */ Element.addMethods({ /** * Cambia el valor de un elemento de un formulario. * * @param element Elemento donde se cambia el valor * @param newValue Nuevo valor del elemento * @param options Opciones donde se especifica si el evento es parcial */ changeValue: function(element, value, options) { if (element.nodeName == "SPAN" || element.nodeName == "LABEL") { var originalValue = element.innerHTML; if (value != originalValue) { element.update(value); return true; } else { return false; } } var originalValue = element.value; element._formatValue(value, options); if (originalValue != element.value) { element.fireDOMEvent("change", options); return true; } else { return false; } }, _processValue: function(element, options) { element = $(element); var originalValue = element.value; var cambios = false; if (element.value != "") { Validar.ok(element, "required"); } else { Validar.ok(element, "empty"); } element._formatValue(element.value, options); if (originalValue != element.value) { if (!options.partial) { element.fireDOMEvent("change", options); } cambios = true; } c.formulario.evalFormulas(element); return cambios; }, _formatValue: function(element, value, options) { var newValue = value; var className = null; options = options || {}; try { // Formatear valor con todos los formateadores (element.formatters || $A()).each(function(formatter) { className = formatter.constructor.simpleClassName; newValue = formatter.transform(newValue, options.partial); Validar.ok(element, className); }); } catch(e) { Validar.error(element, e, className); return element.value; } newValue = typeof newValue != "undefined" && newValue != null && newValue.toString() || ""; if (element.value != newValue) { var pos = element.value.length - element.getCaretPosition(); //Hack temporal. Ver Incidencia #8266, bug Chrome #152537 element.value = ""; element.value = newValue; element.setCaretPosition(element.value.length - pos, false); } (element.formatters || $A()).each(function(formatter) { formatter.changeValues(element, options.partial); }); }, /** * Obtiene el objectValue o value adecuadamente * * @param element Elemento de donde obtener el objectValue */ getObjectValue: function(element) { element = $(element); return typeof element.objectValue != "undefined" ? element.objectValue : element.value; }, /** * Obtiene el elemento visible de un objeto HTML * * @param element Elemento de referencia */ getWidget: function(element) { element = $(element); return typeof element.widget != "undefined" ? element.widget : element; }, getCaretPosition: function(element) { element = $(element); if (!element.focused) { return -1; } try { if (element.type === "date" || element.type === "number") { return element.value.length; } if (typeof document.selection != "undefined") { // IE var sel = document.selection.createRange(); sel.moveStart('character', -element.value.length); return sel.text.length; } else if (typeof element.selectionStart != "undefined") { // Otros browsers return element.selectionStart; } } catch(e) { console.log("No se puede obtener la posicion en el texto: " + e); } return element.value.length; }, setCaretPosition: function(element, pos, focus) { element = $(element); if (!element.focused && !focus) { return; } else { element.focus(); } if (element.type === "date" || element.type === "number") { return; } if (typeof element.createTextRange != "undefined") { // IE var range = element.createTextRange(); range.collapse(true); range.moveEnd('character', pos); range.moveStart('character', pos); range.select(); } else if (typeof element.setSelectionRange != "undefined") { // Otros browsers element.setSelectionRange(pos, pos); } }, setChecked: function(elemento, checked, options) { if (!Object.isElement(elemento)) { elemento = c.$(elemento); } if (elemento.widget) { elemento = elemento.widget; } elemento.checked = checked; elemento.fireDOMEvent("change", options); }, setDisabled: function(elemento, disabled) { if (!Object.isElement(elemento)) { elemento = c.$(elemento); } if (elemento.widget) { elemento = elemento.widget; } if (elemento.type != "checkbox" && elemento.type != "radio" && elemento.type != "image" && elemento.type != "select-one" && elemento.type != "button") { elemento.readOnly = disabled; } else { elemento.disabled = disabled; } if (elemento.hasDatePicker) { datePickerController[disabled ? "disable" : "enable"](elemento.id); } elemento.tabIndex = disabled ? -1 : elemento.originalTabIndex; }, getScrollFromBottom: function(elemento) { return elemento.scrollHeight - elemento.clientHeight - elemento.scrollTop; } }); String.prototype.hashCode = function(){ var hash = 0; for (var i = 0; i < this.length; i++) { hash = 31 * hash + this.charCodeAt(i); hash = hash & hash; } return hash; }; String.prototype.capitalizeFirstLetterWords = function() { var l = this.split(" "); var result = ""; var counter = 0; l.map(function(i) { result = result + Util.firstUpperOtherLower(i) + (counter === l.lenght ? "" : " "); }); return result; }; /** * Obtiene un array de elementos dado su name. Los parametros pueden ser así: * * $N(name) => Obtiene un array de elementos buscando en toda la página * $N(name, index) => Obtiene el elemento indicado del array * $N(base, name) => Obtiene un elemento con el name indicado dentro de la base * $N(base, name, index) => Obtiene el elemento indicado del array * * @param a Ver arriba. * @param b Ver arriba. * @param c Ver arriba. */ var $N = function(a, b, c) { var base = null; var index = null; var name = null; if (typeof c == "number") { base = a; name = b; index = c; } else if (typeof b == "number") { base = document; name = a; index = b; } else if (a && (a.querySelectorAll || base.getElementsByName || a.elements || a.select)) { base = a; name = b; } else { base = document; name = a; } var isNumber = (typeof index == "number"); if (!name) { return isNumber ? null : []; } var elements = null; if (base.querySelectorAll) { // Nativo rapido if (isNumber) { return base.querySelector("#c_" + name + "_" + index); } elements = $A(base.querySelectorAll("*[name='" + name + "']")); } else if (base.getElementsByName) { // También rápido elements = $A(base.getElementsByName(name)); } else if (base.elements) { // Optimizado elements = $A(); var els = base.elements; for (var i = 0; i < els.length; i++) { if (els[i].name == name) { elements.push(els[i]); } } } else { // Mas lento elements = base.select("*[name='" + name + "']"); } return isNumber ? elements[index] : elements; }; /** * Obtiene un array de valores de un elemento dado su name. * * @param i, j, k se pasan directo a $N */ var $V = function(i, j, k) { var n = $N(i, j, k); return Object.isArray(n) ? n.invoke("getObjectValue") : n && n.getObjectValue(); }; /** * Obtiene un array de widgets visibles de un elemento dado su name. * * @param i, j, k se pasan directo a $N */ var $W = function(i, j, k) { var n = $N(i, j, k); return Object.isArray(n) ? n.invoke("getWidget") : n && n.getWidget(); }; var trim = function(s) { Logger.trace("Usar mejor s.strip en vez de trim"); return s.strip(); }; var recargar = function(modulo) { modularjs.loading[modulo] = false; modularjs.loaded[modulo] = false; include(modulo); }; var rethrow = function(transport, e) { console && console.log("Exception", transport, e, arguments); Estatus.mensaje(e && e.message || Util.getMensaje(Mensajes, 'fitbank.validar.ERROR'), e && e.stack, "error"); throw e; }; var deepCopy = function(object) { if (!object || typeof object != "object") { return object; } else if (Object.isArray(object)) { var copy = $A(); object.each(function(value) { copy.push(deepCopy(value)); }); return copy; } else { var copy = new object.constructor(); $H(object).each(function(pair) { copy[pair.key] = deepCopy(pair.value); }); return copy; } }; var copyConstructor = function(params) { if (this.id && this.id.startsWith("_id_")) { this.id = Util.generarIdUnicoTemporal(); } $H(this).each(function(pair) { this[pair.key] = deepCopy(pair.value); }, this); if (params) { Object.extend(this, params); } if (this.constructor.className) { this.className = this.constructor.className; this.simpleClassName = this.constructor.simpleClassName; } }; var caducar = function () { window.onbeforeunload = null; document.location.href = "caducidad.html#cerrar"; } Object.extend(Function.prototype, (function() { var slice = Array.prototype.slice; function tryCatch() { var args = slice.call(arguments, 0); try { return this.apply(this, args); } catch (e) { Estatus.mensaje(e, e && e.stack, 'error'); throw e; } } function bindTryCatch() { var args = slice.call(arguments, 0); var f = this.bind.apply(this, args); return f.tryCatch.bind(f); } return { tryCatch: tryCatch, bindTryCatch: bindTryCatch, tryDefer: tryCatch.defer } })()); var tryEval = function(code) { return (function() { eval(code); }).tryCatch(); }; var tryEvent = function(nameOrId, event, func) { var elements = c.$N(nameOrId) || [ $(nameOrId) ]; elements.each(function(element) { if (element.widget) { element = element.widget; } element.on(event, func.bindTryCatch(element)); }); }; Ajax.Request.addMethods({ abort: function() { this.transport.onreadystatechange = Prototype.emptyFunction; this.transport.abort(); if (Ajax.activeRequestCount > 0) { Ajax.activeRequestCount--; } } }); document.disableContextMenu = function() { if (this.captureEvents) { this.captureEvents(Event.MOUSEDOWN); this.onmousedown = function(e) { if (e.which == 2 || e.which == 3) { return false; } }; } this.oncontextmenu = function() { return false; }; }; } modularjs.loaded["fitbank.util"] = true; var Plantilla = { init: function() { var href = document.location.href; var referrer = document.referrer; var partes = href.split("?"); if (partes.length > 1) { Plantilla.aplicar(partes[1].toQueryParams()); } if (window.opener) { var cerrar = new Element("button").update("Cerrar"); cerrar.on("click", Plantilla.cerrarVentana); Element.insert(document.body, cerrar); } if (document.location.hash == "#cerrar") { if(Mobile) { var cerrar = new Element("button").update("Cerrar"); cerrar.on("click", Plantilla.cerrarVentanaMobile); Element.insert(document.body, cerrar); } window.close.bind(window).delay(3); return; } if (history.length > 0 && !referrer.match("(clave|clavepreguntas|registroinicial|solicitud|desbloquear|entorno.*).html") && !href.match("(ingreso|clave|clavepreguntas|caducidad|navegador|deshabilitado|registroinicial|solicitud|desbloquear).html")) { var regresar = new Element("button").update("Regresar"); regresar.on("click", Plantilla.regresar); Element.insert(document.body, regresar); } if (referrer.match("error.html")) { var reportar = new Element("button", { disabled: true }).update("Reportar"); reportar.on("click", Plantilla.reportar); Element.insert(document.body, reportar); } if (!referrer.match("ingreso.html") && !href.match("(navegador|deshabilitado).html")) { var ingreso = new Element("button").update("Ingresar"); ingreso.on("click", Plantilla.ingreso); Element.insert(document.body, ingreso); } if (referrer.match("(entorno.*).html") && href.match("sesioncerrada.html")) { var cerrar = new Element("button").update("Cerrar"); cerrar.on("click", Plantilla.cerrarVentanaMobile); Element.insert(document.body, cerrar); } $$("button")[0].focus(); }, aplicar: function(valores) { $H(valores).each(function(a) { if ($(a.key)){ $(a.key).update(a.value); } }); }, regresar: function(e) { $E(e).cancelar(); history.back(); }, reportar: function(e) { // TODO: implementar alert("No implementado!"); }, ingreso: function(e) { document.location.href = "ingreso.html"; }, cerrarVentana: function(e) { $E(e).cancelar(); window.close(); }, cerrarVentanaMobile: function(e) { setTimeout( function() { var ww = window.open(window.location, '_self'); ww.close(); }, 1000); } } addOnLoad(Plantilla.init);