// Comprobar jQuery if( typeof jQuery === 'undefined' || ! $ ) { throw new Error('gvHidra necesita jQuery'); } // Comprobar versión de jQuery var version = $.fn.jquery.split(' ')[0].split('.'); if ((version[0] < 3) || (version[0] == 3 && version[1] < 2)) { throw new Error('gvHidra necesita jQuery v3.2.0 (o superior)'); } // Comprobar versión de Bootstrap var version = $.fn.button.Constructor.VERSION.split('.'); if ((version[0] < 3) || (version[0] == 3 && (version[1] < 3 && (version[1] == 3 || version[2] < 5)))) { throw new Error('gvHidra necesita Bootstrap JS v3.3.5 (o superior)'); } var gvh = gvh || {}; +function($){/** LIBRERÍA: gvh_init **/ /****************************/ // Constantes //var NAMESPACE_MAIN = 'gvh'; //var NAMESPACE_ALTERNATE = 'gvHidra'; gvh.VERSION = '5.0.2'; gvh.STOPONWARNING = true; // Solo se garantiza que parará si además está activado gvh.DEBUG gvh.onSelectionActive= false; // Para distinguir entre los eventos clic y seleccionar texto. gvh.orderTable; gvh.orderFieldTable; gvh.rewireUI = new Array(); gvh.dialogs = {}; gvh.dialogWS; gvh.dialogIdWM = new Array(); gvh.dialogWM; gvh.ambito = ''; gvh.aplTitle = ''; gvh.endLoading = true; //gvh.datosJSON; gvh.pagAct_edi = 'undefined'; gvh.pagAct_lis = 'undefined'; gvh.pagAct_ediDetalle = 'undefined'; gvh.pagAct_lisDetalle = 'undefined'; gvh.lang = 'esp'; gvh.urlLang = 'igep/include/gvh_lang/esp.json'; gvh.msgLoad = ''; gvh.semaphoreActive = false; gvh.semaphoreCounter = 0; gvh.semaphoreDelay = 100; gvh.cancelUI = false; gvh.semaphoreQueue = new Array(); // // Amplia la funcionalidad de jQuery, permitiendo unicidad en la definición de un evento // (elimina antes las definiciones previas del mismo evento, pero solo las idénticas). // jQuery.fn.extend( { /** * Amplia la funcionalidad de jQuery, permitiendo unicidad en la definición de un evento * (elimina antes las definiciones previas del mismo evento, pero solo las idénticas). * * Detach and attach an event handler function for one or more events to the selected elements. * * @param {object} elem * @param {string} types - Required. Specifies one or more event(s) or namespaces to attach to the selected elements. Multiple event values are separated by space. Must be a valid event. * @param {string} selector - Optional. Specifies that the event handler should only be attached to the specified child elements (and not the selector itself, like the deprecated delegate() method). * @param {anything} data - Optional. Specifies additional data to pass along to the function. * @param {function} fn - Required. Specifies the function to run when the event occurs. * @param {string} one - Specifies an event map ({event:function, event:function, ...}) containing one or more event to attach to the selected elements, and functions to run when the events occur. * * @return {jQuery} */ offon: function( elem, types, selector, data, fn, one ) { return this.off( types, selector, fn ).on( elem, types, selector, data, fn, one ); } , /* offon: function( types, selector, data, fn ) { this.off( types, selector, fn ); return this.on( this, types, selector, data, fn ); }, */ /** * Amplia la funcionalidad de jQuery, permitiendo unicidad en la definición de un evento * (elimina antes las definiciones previas del mismo evento, pero solo las idénticas) y * garantizando que como mucho se ejecutará una vez para cada elemento y tipo de evento. * * Detach and attach a handler to an event for the elements. The handler is executed at most once per element per event type. * * @param {string} types - Required. Specifies one or more event(s) or namespaces to attach to the selected elements. Multiple event values are separated by space. Must be a valid event. * @param {string} selector - Optional. Specifies that the event handler should only be attached to the specified child elements (and not the selector itself, like the deprecated delegate() method). * @param {anything} data - Optional. Specifies additional data to pass along to the function. * @param {function} fn - Required. Specifies the function to run when the event occurs. * * @return {jQuery} */ offone: function( types, selector, data, fn ) { return this.off( types, selector, fn ).one( this, types, selector, data, fn, 1 ); } } ); gvh.DEBUG = false; gvh.debugJS = function (debugJS) { if (debugJS == "LOG_ALL") { gvh.DEBUG = true; } } //gvh.debugJS /** * Muestra un mensaje en la consola del navegador. * * @param {string} type - Tipo del mensaje a mostrar en consola: [dir, beginGroup, endGroup, error, group, groupCollapsed, groupEnd, log, table, time, timelog, timeEnd, warn] * @param {string} msg - Texto del mensaje a mostrar en consola. * * @example * * gvh.showConsoleMsg ('group', 'nuevoGrupo'); * gvh.showConsoleMsg ('log', 'Mensaje de prueba'); * gvh.showConsoleMsg ('warn', 'Advertencia de prueba'); * gvh.showConsoleMsg ('error', 'Error de prueba'); * gvh.showConsoleMsg ('groupEnd'); */ gvh.showConsoleMsg = function (type, msg) { if (!gvh.DEBUG) return; switch (type) { case 'log': console.log (msg); break; case 'error': console.error (msg); break; case 'warn': console.warn (msg); break; case 'dir': console.dir (msg); break; case 'table': console.table (msg); break; case 'group': console.group (msg); break; case 'groupCollapsed': console.groupCollapsed (msg); break; case 'groupEnd': console.groupEnd (); break; case 'beginGroup': console.groupCollapsed (msg); break; case 'endGroup': console.groupEnd (); break; case 'time': console.time (msg); break; case 'timelog': console.time (msg); break; case 'timeEnd': console.timeEnd (msg); break; } } //gvh.showConsoleMsg /** * gvh.findInRewireUI * * @param {string} key * @param {string} val */ gvh.findInRewireUI = function (key, val) { var ar = gvh.rewireUI; var len = ar.length; if (!len) return -1; for (var i = 0; i < len; i++) { if (ar[i][key] === val) { return i; } } return -1; }//gvh.findInRewireUI /** * gvh.subscribeRewireUI * * @param {string} claseM * @param {int} callback */ gvh.subscribeRewireUI = function (claseM, callback) { gvh.showConsoleMsg ('log', ' - subscribeRewireUI() SE SUBSCRIBE LA CLASE '+claseM ); if (gvh.findInRewireUI ('clase',claseM) == -1) { var claseFuncion = {'clase': claseM, 'funcion': callback}; gvh.rewireUI.push (claseFuncion); } // Ejecutamos la función recién suscrita. if (callback && typeof callback === "function" ) { try { callback (); } catch (error) { console.error (error); } } }//gvh.subscribeRewireUI /** * gvh.unSubscribeUI * * @param {string} claseM * @param {int} index */ gvh.unSubscribeUI = function (claseM, index) { index = index || ''; var ar = gvh.rewireUI; gvh.showConsoleMsg('log',ar); if (index != '') { gvh.showConsoleMsg('log', ' unSubscribeUI ¡¡¡SE DA DE BAJA LA SUBSCRIPCIÓN DE LA CLASE MANEJADORA '+ar[index]['clase']+'!!!' ); ar.splice( index ,1 ); gvh.showConsoleMsg('log',ar); } else { gvh.showConsoleMsg('log', ' unSubscribeUI ¡¡¡SE DA DE BAJA LA SUBSCRIPCIÓN DE LA CLASE MANEJADORA '+claseM+'!!!' ); for( var i = 0,len = ar.length; i < len; i++ ) { var nameFuncion = ar[i]['funcion']; var ar_claseM = ar[i]['clase']; //if (($.isArray(gvh.datosJSON[claseM])) && (gvh.datosJSON[claseM].length == 0)) // si existe la clase manejadora en gvh.datosJSON pero está vacía if (claseM == ar_claseM) { //ar.splice( index ,1 ); gvh.showConsoleMsg('log',ar); } } } } /** * Comparar versiones de componentes software. * * Extraído de: https://stackoverflow.com/questions/6832596/how-to-compare-software-version-number-using-js-only-number */ gvh.versionCompare = function( v1, v2, options ) { var lexicographical = ''; var v1parts = ''; var v2parts = ''; var zeroExtend = ''; if (options != '') { lexicographical = options && options.lexicographical , zeroExtend = options && options.zeroExtend , v1parts = v1.split('.') , v2parts = v2.split('.'); } else { lexicographical = options, zeroExtend = options, v1parts = v1.split('.') , v2parts = v2.split('.'); } function isValidPart(x) { return (lexicographical ? /^\d+[A-Za-z]*$/ : /^\d+$/).test(x); } if( (v1parts.isArray && !v1parts.every(isValidPart)) || (v2parts.isArray && !v2parts.every(isValidPart)) ) { return NaN; } if( zeroExtend ) { while( v1parts.length < v2parts.length ) { v1parts.push( "0" ); } while( v2parts.length < v1parts.length ) { v2parts.push( "0" ); } } if( !lexicographical ) { v1parts = v1parts.map( Number ); v2parts = v2parts.map( Number ); } for( var i=0; i v2parts[i] ) return 1; else return -1; } if( v1parts.length != v2parts.length ) return -1; return 0; } //gvh.versionCompare /** * Comprobar si dos arrays (o dos objetos) son iguales, es decir, contienen los mismos elementos * * Extraído de: https://gomakethings.com/check-if-two-arrays-or-objects-are-equal-with-javascript/ */ gvh.isEqual = function (value, other) { // Get the value type var type = Object.prototype.toString.call(value); // If the two objects are not the same type, return false if (type !== Object.prototype.toString.call(other)) return false; // If items are not an object or array, return false if (['[object Array]', '[object Object]'].indexOf(type) < 0) return false; // Compare the length of the length of the two items var valueLen = type === '[object Array]' ? value.length : Object.keys(value).length; var otherLen = type === '[object Array]' ? other.length : Object.keys(other).length; if (valueLen !== otherLen) return false; // Compare two items var compare = function (item1, item2) { // Get the object type var itemType = Object.prototype.toString.call(item1); // If an object or array, compare recursively if (['[object Array]', '[object Object]'].indexOf(itemType) >= 0) { if (!isEqual(item1, item2)) return false; } // Otherwise, do a simple comparison else { // If the two items are not the same type, return false if (itemType !== Object.prototype.toString.call(item2)) return false; // Else if it's a function, convert to a string and compare // Otherwise, just compare if (itemType === '[object Function]') { if (item1.toString() !== item2.toString()) return false; } else { if (item1 !== item2) return false; } } }; // Compare properties if (type === '[object Array]') { for (var i = 0; i < valueLen; i++) { if (compare(value[i], other[i]) === false) return false; } } else { for (var key in value) { if (value.hasOwnProperty(key)) { if (compare(value[key], other[key]) === false) return false; } } } // If nothing failed, return true return true; }; var utils = {}; utils.inArray = function(searchFor, property) { var self = this; for(var index=0; index < self.length; index++){ var item = self[index]; if (item[property] === searchFor) { return index; } }; return -1; }; Array.prototype.inArray = utils.inArray; var utils = {}; utils.inArray = function(searchFor, property) { var self = this; for(var index=0; index < self.length; index++){ var item = self[index]; if (item[property] === searchFor) { return index; } }; return -1; }; Array.prototype.inArray = utils.inArray; // // Polifill para 'Array.isArray' // if (typeof Array.isArray === 'undefined') { Array.isArray = function(obj) { return Object.prototype.toString.call(obj) === '[object Array]'; } }; // // Polifill para 'Array.from' // // (extraído de https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from) // Production steps of ECMA-262, Edition 6, 22.1.2.1 // if( !Array.from ) { Array.from = (function () { var toStr = Object.prototype.toString; var isCallable = function (fn) { return typeof fn === 'function' || toStr.call(fn) === '[object Function]'; }; var toInteger = function (value) { var number = Number(value); if (isNaN(number)) { return 0; } if (number === 0 || !isFinite(number)) { return number; } return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number)); }; var maxSafeInteger = Math.pow(2, 53) - 1; var toLength = function (value) { var len = toInteger(value); return Math.min(Math.max(len, 0), maxSafeInteger); }; // The length property of the from method is 1. return function from(arrayLike/*, mapFn, thisArg */) { // 1. Let C be the this value. var C = this; // 2. Let items be ToObject(arrayLike). var items = Object(arrayLike); // 3. ReturnIfAbrupt(items). if (arrayLike == null) { throw new TypeError('Array.from requires an array-like object - not null or undefined'); } // 4. If mapfn is undefined, then let mapping be false. var mapFn = arguments.length > 1 ? arguments[1] : void undefined; var T; if (typeof mapFn !== 'undefined') { // 5. else // 5. a If IsCallable(mapfn) is false, throw a TypeError exception. if (!isCallable(mapFn)) { throw new TypeError('Array.from: when provided, the second argument must be a function'); } // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined. if (arguments.length > 2) { T = arguments[2]; } } // 10. Let lenValue be Get(items, "length"). // 11. Let len be ToLength(lenValue). var len = toLength(items.length); // 13. If IsConstructor(C) is true, then // 13. a. Let A be the result of calling the [[Construct]] internal method // of C with an argument list containing the single item len. // 14. a. Else, Let A be ArrayCreate(len). var A = isCallable(C) ? Object(new C(len)) : new Array(len); // 16. Let k be 0. var k = 0; // 17. Repeat, while k < len… (also steps a - h) var kValue; while (k < len) { kValue = items[k]; if (mapFn) { A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k); } else { A[k] = kValue; } k += 1; } // 18. Let putStatus be Put(A, "length", len, true). A.length = len; // 20. Return A. return A; }; }()); } // // Polifill para 'Array.isArray' // // (only implement if no native implementation is available) // if (typeof Array.isArray === 'undefined') { Array.isArray = function(obj) { return Object.prototype.toString.call(obj) === '[object Array]'; } }; // // Polifill para 'Object.assign' // // (extraído de Mozilla Developer: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign ) // (opción B: https://www.npmjs.com/package/es6-object-assign/v/1.1.0) // if (typeof Object.assign != 'function') { // Must be writable: true, enumerable: false, configurable: true Object.defineProperty(Object, "assign", { value: function assign(target, varArgs) { // .length of function is 2 'use strict'; if (target == null) { // TypeError if undefined or null throw new TypeError('Cannot convert undefined or null to object'); } var to = Object(target); for (var index = 1; index < arguments.length; index++) { var nextSource = arguments[index]; if (nextSource != null) { // Skip over if undefined or null for (var nextKey in nextSource) { // Avoid bugs when hasOwnProperty is shadowed if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) { to[nextKey] = nextSource[nextKey]; } } } } return to; }, writable: true, configurable: true }); } // // Polifill para 'history' // // (extraído de HTML-History-API: https://github.com/devote/HTML5-History-API // /*! * History API JavaScript Library v4.1.2 * * Support: IE6+, FF3+, Opera 9+, Safari, Chrome and other * * Copyright 2011-2013, Dmitrii Pakhtinov ( spb.piksel@gmail.com ) * * http://spb-piksel.ru/ * * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html * * Update: 2014-04-29 15:30 */ (function(window) { // Prevent the code from running if there is no window.history object if (!window.history) return; // symlink to document var document = window.document; // HTML element var documentElement = document.documentElement; // symlink to constructor of Object var Object = window['Object']; // symlink to JSON Object var JSON = window['JSON']; // symlink to instance object of 'Location' var windowLocation = window.location; // symlink to instance object of 'History' var windowHistory = window.history; // new instance of 'History'. The default is a reference to the original object instance var historyObject = windowHistory; // symlink to method 'history.pushState' var historyPushState = windowHistory.pushState; // symlink to method 'history.replaceState' var historyReplaceState = windowHistory.replaceState; // if the browser supports HTML5-History-API var isSupportHistoryAPI = !!historyPushState; // verifies the presence of an object 'state' in interface 'History' var isSupportStateObjectInHistory = 'state' in windowHistory; // symlink to method 'Object.defineProperty' var defineProperty = Object.defineProperty; // new instance of 'Location', for IE8 will use the element HTMLAnchorElement, instead of pure object var locationObject = redefineProperty({}, 't') ? {} : document.createElement('a'); // prefix for the names of events var eventNamePrefix = ''; // String that will contain the name of the method var addEventListenerName = window.addEventListener ? 'addEventListener' : (eventNamePrefix = 'on') && 'attachEvent'; // String that will contain the name of the method var removeEventListenerName = window.removeEventListener ? 'removeEventListener' : 'detachEvent'; // String that will contain the name of the method var dispatchEventName = window.dispatchEvent ? 'dispatchEvent' : 'fireEvent'; // reference native methods for the events var addEvent = window[addEventListenerName]; var removeEvent = window[removeEventListenerName]; var dispatch = window[dispatchEventName]; // default settings var settings = {"basepath": '/', "redirect": 0, "type": '/'}; // key for the sessionStorage var sessionStorageKey = '__historyAPI__'; // Anchor Element for parseURL function var anchorElement = document.createElement('a'); // last URL before change to new URL var lastURL = windowLocation.href; // Control URL, need to fix the bug in Opera var checkUrlForPopState = ''; // trigger event 'onpopstate' on page load var isFireInitialState = false; // store a list of 'state' objects in the current session var stateStorage = {}; // in this object will be stored custom handlers var eventsList = {}; // stored last title var lastTitle = document.title; /** * Properties that will be replaced in the global * object 'window', to prevent conflicts * * @type {Object} */ var eventsDescriptors = { "onhashchange": null, "onpopstate": null }; /** * Fix for Chrome in iOS * See https://github.com/devote/HTML5-History-API/issues/29 */ var fastFixChrome = function(method, args) { var isNeedFix = window.history !== windowHistory; if (isNeedFix) { window.history = windowHistory; } method.apply(windowHistory, args); if (isNeedFix) { window.history = historyObject; } }; /** * Properties that will be replaced/added to object * 'window.history', includes the object 'history.location', * for a complete the work with the URL address * * @type {Object} */ var historyDescriptors = { /** * @namespace history * @param {String} [type] * @param {String} [basepath] */ "redirect": function(type, basepath) { settings["basepath"] = basepath = basepath == null ? settings["basepath"] : basepath; settings["type"] = type = type == null ? settings["type"] : type; if (window.top == window.self) { var relative = parseURL(null, false, true)._relative; var path = windowLocation.pathname + windowLocation.search; if (isSupportHistoryAPI) { path = path.replace(/([^\/])$/, '$1/'); if (relative != basepath && (new RegExp("^" + basepath + "$", "i")).test(path)) { windowLocation.replace(relative); } } else if (path != basepath) { path = path.replace(/([^\/])\?/, '$1/?'); if ((new RegExp("^" + basepath, "i")).test(path)) { windowLocation.replace(basepath + '#' + path. replace(new RegExp("^" + basepath, "i"), type) + windowLocation.hash); } } } }, /** * The method adds a state object entry * to the history. * * @namespace history * @param {Object} state * @param {string} title * @param {string} [url] */ pushState: function(state, title, url) { var t = document.title; if (lastTitle != null) { document.title = lastTitle; } historyPushState && fastFixChrome(historyPushState, arguments); changeState(state, url); document.title = t; lastTitle = title; }, /** * The method updates the state object, * title, and optionally the URL of the * current entry in the history. * * @namespace history * @param {Object} state * @param {string} title * @param {string} [url] */ replaceState: function(state, title, url) { var t = document.title; if (lastTitle != null) { document.title = lastTitle; } delete stateStorage[windowLocation.href]; historyReplaceState && fastFixChrome(historyReplaceState, arguments); changeState(state, url, true); document.title = t; lastTitle = title; }, /** * Object 'history.location' is similar to the * object 'window.location', except that in * HTML4 browsers it will behave a bit differently * * @namespace history */ "location": { set: function(value) { window.location = value; }, get: function() { return isSupportHistoryAPI ? windowLocation : locationObject; } }, /** * A state object is an object representing * a user interface state. * * @namespace history */ "state": { get: function() { return stateStorage[windowLocation.href] || null; } } }; /** * Properties for object 'history.location'. * Object 'history.location' is similar to the * object 'window.location', except that in * HTML4 browsers it will behave a bit differently * * @type {Object} */ var locationDescriptors = { /** * Navigates to the given page. * * @namespace history.location */ assign: function(url) { if (('' + url).indexOf('#') === 0) { changeState(null, url); } else { windowLocation.assign(url); } }, /** * Reloads the current page. * * @namespace history.location */ reload: function() { windowLocation.reload(); }, /** * Removes the current page from * the session history and navigates * to the given page. * * @namespace history.location */ replace: function(url) { if (('' + url).indexOf('#') === 0) { changeState(null, url, true); } else { windowLocation.replace(url); } }, /** * Returns the current page's location. * * @namespace history.location */ toString: function() { return this.href; }, /** * Returns the current page's location. * Can be set, to navigate to another page. * * @namespace history.location */ "href": { get: function() { return parseURL()._href; } }, /** * Returns the current page's protocol. * * @namespace history.location */ "protocol": null, /** * Returns the current page's host and port number. * * @namespace history.location */ "host": null, /** * Returns the current page's host. * * @namespace history.location */ "hostname": null, /** * Returns the current page's port number. * * @namespace history.location */ "port": null, /** * Returns the current page's path only. * * @namespace history.location */ "pathname": { get: function() { return parseURL()._pathname; } }, /** * Returns the current page's search * string, beginning with the character * '?' and to the symbol '#' * * @namespace history.location */ "search": { get: function() { return parseURL()._search; } }, /** * Returns the current page's hash * string, beginning with the character * '#' and to the end line * * @namespace history.location */ "hash": { set: function(value) { changeState(null, ('' + value).replace(/^(#|)/, '#'), false, lastURL); }, get: function() { return parseURL()._hash; } } }; /** * Just empty function * * @return void */ function emptyFunction() { // dummy } /** * Prepares a parts of the current or specified reference for later use in the library * * @param {string} [href] * @param {boolean} [isWindowLocation] * @param {boolean} [isNotAPI] * @return {Object} */ function parseURL(href, isWindowLocation, isNotAPI) { var re = /(?:([\w0-9]+:))?(?:\/\/(?:[^@]*@)?([^\/:\?#]+)(?::([0-9]+))?)?([^\?#]*)(?:(\?[^#]+)|\?)?(?:(#.*))?/; if (href != null && href !== '' && !isWindowLocation) { var current = parseURL(), _pathname = current._pathname, _protocol = current._protocol; // convert to type of string href = '' + href; // convert relative link to the absolute href = /^(?:[\w0-9]+\:)?\/\//.test(href) ? href.indexOf("/") === 0 ? _protocol + href : href : _protocol + "//" + current._host + ( href.indexOf("/") === 0 ? href : href.indexOf("?") === 0 ? _pathname + href : href.indexOf("#") === 0 ? _pathname + current._search + href : _pathname.replace(/[^\/]+$/g, '') + href ); } else { href = isWindowLocation ? href : windowLocation.href; // if current browser not support History-API if (!isSupportHistoryAPI || isNotAPI) { // get hash fragment href = href.replace(/^[^#]*/, '') || "#"; // form the absolute link from the hash // https://github.com/devote/HTML5-History-API/issues/50 href = windowLocation.protocol.replace(/:.*$|$/, ':') + '//' + windowLocation.host + settings['basepath'] + href.replace(new RegExp("^#[\/]?(?:" + settings["type"] + ")?"), ""); } } // that would get rid of the links of the form: /../../ anchorElement.href = href; // decompose the link in parts var result = re.exec(anchorElement.href); // host name with the port number var host = result[2] + (result[3] ? ':' + result[3] : ''); // folder var pathname = result[4] || '/'; // the query string var search = result[5] || ''; // hash var hash = result[6] === '#' ? '' : (result[6] || ''); // relative link, no protocol, no host var relative = pathname + search + hash; // special links for set to hash-link, if browser not support History API var nohash = pathname.replace(new RegExp("^" + settings["basepath"], "i"), settings["type"]) + search; // result return { _href: result[1] + '//' + host + relative, _protocol: result[1], _host: host, _hostname: result[2], _port: result[3] || '', _pathname: pathname, _search: search, _hash: hash, _relative: relative, _nohash: nohash, _special: nohash + hash } } /** * Initializing storage for the custom state's object */ function storageInitialize() { var sessionStorage; /** * sessionStorage throws error when cookies are disabled * Chrome content settings when running the site in a Facebook IFrame. * see: https://github.com/devote/HTML5-History-API/issues/34 * and: http://stackoverflow.com/a/12976988/669360 */ try { sessionStorage = window['sessionStorage']; sessionStorage.setItem(sessionStorageKey + 't', '1'); sessionStorage.removeItem(sessionStorageKey + 't'); } catch(_e_) { sessionStorage = { getItem: function(key) { var cookie = document.cookie.split(key + "="); return cookie.length > 1 && cookie.pop().split(";").shift() || 'null'; }, setItem: function(key, value) { var state = {}; // insert one current element to cookie if (state[windowLocation.href] = historyObject.state) { document.cookie = key + '=' + JSON.stringify(state); } } } } try { // get cache from the storage in browser stateStorage = JSON.parse(sessionStorage.getItem(sessionStorageKey)) || {}; } catch(_e_) { stateStorage = {}; } // hang up the event handler to event unload page addEvent(eventNamePrefix + 'unload', function() { // save current state's object sessionStorage.setItem(sessionStorageKey, JSON.stringify(stateStorage)); }, false); } /** * This method is implemented to override the built-in(native) * properties in the browser, unfortunately some browsers are * not allowed to override all the properties and even add. * For this reason, this was written by a method that tries to * do everything necessary to get the desired result. * * @param {Object} object The object in which will be overridden/added property * @param {String} prop The property name to be overridden/added * @param {Object} [descriptor] An object containing properties set/get * @param {Function} [onWrapped] The function to be called when the wrapper is created * @return {Object|Boolean} Returns an object on success, otherwise returns false */ function redefineProperty(object, prop, descriptor, onWrapped) { // test only if descriptor is undefined descriptor = descriptor || {set: emptyFunction}; // variable will have a value of true the success of attempts to set descriptors var isDefinedSetter = !descriptor.set; var isDefinedGetter = !descriptor.get; // for tests of attempts to set descriptors var test = {configurable: true, set: function() { isDefinedSetter = 1; }, get: function() { isDefinedGetter = 1; }}; try { // testing for the possibility of overriding/adding properties defineProperty(object, prop, test); // running the test object[prop] = object[prop]; // attempt to override property using the standard method defineProperty(object, prop, descriptor); } catch(_e_) { } // If the variable 'isDefined' has a false value, it means that need to try other methods if (!isDefinedSetter || !isDefinedGetter) { // try to override/add the property, using deprecated functions if (object.__defineGetter__) { // testing for the possibility of overriding/adding properties object.__defineGetter__(prop, test.get); object.__defineSetter__(prop, test.set); // running the test object[prop] = object[prop]; // attempt to override property using the deprecated functions descriptor.get && object.__defineGetter__(prop, descriptor.get); descriptor.set && object.__defineSetter__(prop, descriptor.set); } // Browser refused to override the property, using the standard and deprecated methods if ((!isDefinedSetter || !isDefinedGetter) && object === window) { try { // save original value from this property var originalValue = object[prop]; // set null to built-in(native) property object[prop] = null; } catch(_e_) { } // This rule for Internet Explorer 8 if ('execScript' in window) { /** * to IE8 override the global properties using * VBScript, declaring it in global scope with * the same names. */ window['execScript']('Public ' + prop, 'VBScript'); window['execScript']('var ' + prop + ';', 'JavaScript'); } else { try { /** * This hack allows to override a property * with the set 'configurable: false', working * in the hack 'Safari' to 'Mac' */ defineProperty(object, prop, {value: emptyFunction}); } catch(_e_) { } } // set old value to new variable object[prop] = originalValue; } else if (!isDefinedSetter || !isDefinedGetter) { // the last stage of trying to override the property try { try { // wrap the object in a new empty object var temp = Object.create(object); defineProperty(Object.getPrototypeOf(temp) === object ? temp : object, prop, descriptor); for(var key in object) { // need to bind a function to the original object if (typeof object[key] === 'function') { temp[key] = object[key].bind(object); } } try { // to run a function that will inform about what the object was to wrapped onWrapped.call(temp, temp, object); } catch(_e_) { } object = temp; } catch(_e_) { // sometimes works override simply by assigning the prototype property of the constructor defineProperty(object.constructor.prototype, prop, descriptor); } } catch(_e_) { // all methods have failed return false; } } } return object; } /** * Adds the missing property in descriptor * * @param {Object} object An object that stores values * @param {String} prop Name of the property in the object * @param {Object|null} descriptor Descriptor * @return {Object} Returns the generated descriptor */ function prepareDescriptorsForObject(object, prop, descriptor) { descriptor = descriptor || {}; // the default for the object 'location' is the standard object 'window.location' object = object === locationDescriptors ? windowLocation : object; // setter for object properties descriptor.set = (descriptor.set || function(value) { object[prop] = value; }); // getter for object properties descriptor.get = (descriptor.get || function() { return object[prop]; }); return descriptor; } /** * Wrapper for the methods 'addEventListener/attachEvent' in the context of the 'window' * * @param {String} event The event type for which the user is registering * @param {Function} listener The method to be called when the event occurs. * @param {Boolean} capture If true, capture indicates that the user wishes to initiate capture. * @return void */ function addEventListener(event, listener, capture) { if (event in eventsList) { // here stored the event listeners 'popstate/hashchange' eventsList[event].push(listener); } else { // FireFox support non-standart four argument aWantsUntrusted // https://github.com/devote/HTML5-History-API/issues/13 if (arguments.length > 3) { addEvent(event, listener, capture, arguments[3]); } else { addEvent(event, listener, capture); } } } /** * Wrapper for the methods 'removeEventListener/detachEvent' in the context of the 'window' * * @param {String} event The event type for which the user is registered * @param {Function} listener The parameter indicates the Listener to be removed. * @param {Boolean} capture Was registered as a capturing listener or not. * @return void */ function removeEventListener(event, listener, capture) { var list = eventsList[event]; if (list) { for(var i = list.length; --i;) { if (list[i] === listener) { list.splice(i, 1); break; } } } else { removeEvent(event, listener, capture); } } /** * Wrapper for the methods 'dispatchEvent/fireEvent' in the context of the 'window' * * @param {Event|String} event Instance of Event or event type string if 'eventObject' used * @param {*} [eventObject] For Internet Explorer 8 required event object on this argument * @return {Boolean} If 'preventDefault' was called the value is false, else the value is true. */ function dispatchEvent(event, eventObject) { var eventType = ('' + (typeof event === "string" ? event : event.type)).replace(/^on/, ''); var list = eventsList[eventType]; if (list) { // need to understand that there is one object of Event eventObject = typeof event === "string" ? eventObject : event; if (eventObject.target == null) { // need to override some of the properties of the Event object for(var props = ['target', 'currentTarget', 'srcElement', 'type']; event = props.pop();) { // use 'redefineProperty' to override the properties eventObject = redefineProperty(eventObject, event, { get: event === 'type' ? function() { return eventType; } : function() { return window; } }); } } // run function defined in the attributes 'onpopstate/onhashchange' in the 'window' context ((eventType === 'popstate' ? window.onpopstate : window.onhashchange) || emptyFunction).call(window, eventObject); // run other functions that are in the list of handlers for(var i = 0, len = list.length; i < len; i++) { list[i].call(window, eventObject); } return true; } else { return dispatch(event, eventObject); } } /** * dispatch current state event */ function firePopState() { var o = document.createEvent ? document.createEvent('Event') : document.createEventObject(); if (o.initEvent) { o.initEvent('popstate', false, false); } else { o.type = 'popstate'; } o.state = historyObject.state; // send a newly created events to be processed dispatchEvent(o); } /** * fire initial state for non-HTML5 browsers */ function fireInitialState() { if (isFireInitialState) { isFireInitialState = false; firePopState(); } } /** * Change the data of the current history for HTML4 browsers * * @param {Object} state * @param {string} [url] * @param {Boolean} [replace] * @param {string} [lastURLValue] * @return void */ function changeState(state, url, replace, lastURLValue) { if (!isSupportHistoryAPI) { // normalization url var urlObject = parseURL(url); // if current url not equal new url if (urlObject._relative !== parseURL()._relative) { // if empty lastURLValue to skip hash change event lastURL = lastURLValue; if (replace) { // only replace hash, not store to history windowLocation.replace("#" + urlObject._special); } else { // change hash and add new record to history windowLocation.hash = urlObject._special; } } } if (!isSupportStateObjectInHistory && state) { stateStorage[windowLocation.href] = state; } isFireInitialState = false; } /** * Event handler function changes the hash in the address bar * * @param {Event} event * @return void */ function onHashChange(event) { // https://github.com/devote/HTML5-History-API/issues/46 var fireNow = lastURL; // new value to lastURL lastURL = windowLocation.href; // if not empty fireNow, otherwise skipped the current handler event if (fireNow) { // if checkUrlForPopState equal current url, this means that the event was raised popstate browser if (checkUrlForPopState !== windowLocation.href) { // otherwise, // the browser does not support popstate event or just does not run the event by changing the hash. firePopState(); } // current event object event = event || window.event; var oldURLObject = parseURL(lastURL, true); var newURLObject = parseURL(); // HTML4 browser not support properties oldURL/newURL if (!event.oldURL) { event.oldURL = oldURLObject._href; event.newURL = newURLObject._href; } if (oldURLObject._hash !== newURLObject._hash) { // if current hash not equal previous hash dispatchEvent(event); } } } /** * The event handler is fully loaded document * * @param {*} [noScroll] * @return void */ function onLoad(noScroll) { // Get rid of the events popstate when the first loading a document in the webkit browsers setTimeout(function() { // hang up the event handler for the built-in popstate event in the browser addEvent('popstate', function(e) { // set the current url, that suppress the creation of the popstate event by changing the hash checkUrlForPopState = windowLocation.href; // for Safari browser in OS Windows not implemented 'state' object in 'History' interface // and not implemented in old HTML4 browsers if (!isSupportStateObjectInHistory) { e = redefineProperty(e, 'state', {get: function() { return historyObject.state; }}); } // send events to be processed dispatchEvent(e); }, false); }, 0); // for non-HTML5 browsers if (!isSupportHistoryAPI && noScroll !== true && historyObject.location) { // scroll window to anchor element scrollToAnchorId(historyObject.location.hash); // fire initial state for non-HTML5 browser after load page fireInitialState(); } } /** * Finds the closest ancestor anchor element (including the target itself). * * @param {HTMLElement} target The element to start scanning from. * @return {HTMLElement} An element which is the closest ancestor anchor. */ function anchorTarget(target) { while (target) { if (target.nodeName === 'A') return target; target = target.parentNode; } } /** * Handles anchor elements with a hash fragment for non-HTML5 browsers * * @param {Event} e */ function onAnchorClick(e) { var event = e || window.event; var target = anchorTarget(event.target || event.srcElement); var defaultPrevented = "defaultPrevented" in event ? event['defaultPrevented'] : event.returnValue === false; if (target && target.nodeName === "A" && !defaultPrevented) { var current = parseURL(); var expect = parseURL(target.getAttribute("href", 2)); var isEqualBaseURL = current._href.split('#').shift() === expect._href.split('#').shift(); if (isEqualBaseURL && expect._hash) { if (current._hash !== expect._hash) { historyObject.location.hash = expect._hash; } scrollToAnchorId(expect._hash); if (event.preventDefault) { event.preventDefault(); } else { event.returnValue = false; } } } } /** * Scroll page to current anchor in url-hash * * @param hash */ function scrollToAnchorId(hash) { var target = document.getElementById(hash = (hash || '').replace(/^#/, '')); if (target && target.id === hash && target.nodeName === "A") { var rect = target.getBoundingClientRect(); window.scrollTo((documentElement.scrollLeft || 0), rect.top + (documentElement.scrollTop || 0) - (documentElement.clientTop || 0)); } } /** * Library initialization * * @return {Boolean} return true if all is well, otherwise return false value */ function initialize() { /** * Get custom settings from the query string */ var scripts = document.getElementsByTagName('script'); var src = (scripts[scripts.length - 1] || {}).src || ''; var arg = src.indexOf('?') !== -1 ? src.split('?').pop() : ''; arg.replace(/(\w+)(?:=([^&]*))?/g, function(a, key, value) { settings[key] = (value || (key === 'basepath' ? '/' : '')).replace(/^(0|false)$/, ''); }); /** * Includes support for IE6+ */ ie6DriverStart(); /** * hang up the event handler to listen to the events hashchange */ addEvent(eventNamePrefix + 'hashchange', onHashChange, false); // a list of objects with pairs of descriptors/object var data = [locationDescriptors, locationObject, eventsDescriptors, window, historyDescriptors, historyObject]; // if browser support object 'state' in interface 'History' if (isSupportStateObjectInHistory) { // remove state property from descriptor delete historyDescriptors['state']; } // initializing descriptors for(var i = 0; i < data.length; i += 2) { for(var prop in data[i]) { if (data[i].hasOwnProperty(prop)) { if (typeof data[i][prop] === 'function') { // If the descriptor is a simple function, simply just assign it an object data[i + 1][prop] = data[i][prop]; } else { // prepare the descriptor the required format var descriptor = prepareDescriptorsForObject(data[i], prop, data[i][prop]); // try to set the descriptor object if (!redefineProperty(data[i + 1], prop, descriptor, function(n, o) { // is satisfied if the failed override property if (o === historyObject) { // the problem occurs in Safari on the Mac window.history = historyObject = data[i + 1] = n; } })) { // if there is no possibility override. // This browser does not support descriptors, such as IE7 // remove previously hung event handlers removeEvent(eventNamePrefix + 'hashchange', onHashChange, false); // fail to initialize :( return false; } // create a repository for custom handlers onpopstate/onhashchange if (data[i + 1] === window) { eventsList[prop] = eventsList[prop.substr(2)] = []; } } } } } // redirect if necessary if (settings['redirect']) { historyObject['redirect'](); } // If browser does not support object 'state' in interface 'History' if (!isSupportStateObjectInHistory && JSON) { storageInitialize(); } // track clicks on anchors if (!isSupportHistoryAPI) { document[addEventListenerName](eventNamePrefix + "click", onAnchorClick, false); } if (document.readyState === 'complete') { onLoad(true); } else { if (!isSupportHistoryAPI && parseURL()._relative !== settings["basepath"]) { isFireInitialState = true; } /** * Need to avoid triggering events popstate the initial page load. * Hang handler popstate as will be fully loaded document that * would prevent triggering event onpopstate */ addEvent(eventNamePrefix + 'load', onLoad, false); } // everything went well return true; } /** * Starting the library */ if (!initialize()) { // if unable to initialize descriptors // therefore quite old browser and there // is no sense to continue to perform return; } /** * If the property history.emulate will be true, * this will be talking about what's going on * emulation capabilities HTML5-History-API. * Otherwise there is no emulation, ie the * built-in browser capabilities. * * @type {boolean} * @const */ historyObject['emulate'] = !isSupportHistoryAPI; /** * Replace the original methods on the wrapper */ window[addEventListenerName] = addEventListener; window[removeEventListenerName] = removeEventListener; window[dispatchEventName] = dispatchEvent; // ====================================================================================== // // Driver for IE6+ or below // ====================================================================================== // function ie6DriverStart() { /** * Creates a static object * * @param object * @returns {*} */ function createVBObjects(object) { var properties = []; var className = 'VBHistoryClass' + (new Date()).getTime() + msie++; var staticClassParts = ["Class " + className]; for(var prop in object) { if (object.hasOwnProperty(prop)) { var value = object[prop]; if (value && (value.get || value.set)) { if (value.get) { staticClassParts.push( 'Public ' + (prop === '_' ? 'Default ' : '') + 'Property Get [' + prop + ']', 'Call VBCVal([(accessors)].[' + prop + '].get.call(me),[' + prop + '])', 'End Property' ); } if (value.set) { staticClassParts.push('Public Property Let [' + prop + '](val)', (value = 'Call [(accessors)].[' + prop + '].set.call(me,val)\nEnd Property'), 'Public Property Set [' + prop + '](val)', value); } } else { properties.push(prop); staticClassParts.push('Public [' + prop + ']'); } } } staticClassParts.push( 'Private [(accessors)]', 'Private Sub Class_Initialize()', 'Set [(accessors)]=' + className + 'FactoryJS()', 'End Sub', 'End Class', 'Function ' + className + 'Factory()', 'Set ' + className + 'Factory=New ' + className, 'End Function' ); window['execScript'](staticClassParts.join('\n'), 'VBScript'); window[className + 'FactoryJS'] = function() { return object; }; var result = window[className + 'Factory'](); for(var i = 0; i < properties.length; i++) { result[properties[i]] = object[properties[i]]; } return result; } /** * Escape special symbols * * @param string * @returns {string} */ function quote(string) { var escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; var meta = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"': '\\"', '\\': '\\\\'}; return escapable.test(string) ? '"' + string.replace(escapable, function(a) { return a in meta ? meta[a] : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); }) + '"' : '"' + string + '"'; } // testing IE browser var msie = window['eval'] && eval("/*@cc_on 1;@*/"); if (!msie || (document.documentMode && document.documentMode > 7)) { // If it is not IE or a version greater than seven return; } // save original links to methods var originalChangeState = changeState; var originalRedefineProperty = redefineProperty; var currentHref = parseURL()._href; var iFrame = document.createElement('iframe'); // insert IFRAME element to DOM iFrame.src = "javascript:true;"; iFrame = documentElement.firstChild.appendChild(iFrame).contentWindow; // correction value for VB Script window['execScript']( 'Public history\nFunction VBCVal(o,r) If IsObject(o) Then Set r=o Else r=o End If End Function', 'VBScript' ); // renew standard object locationObject = {"_": {get: locationDescriptors.toString}}; historyObject = { // properties to create an object in IE "back": windowHistory.back, "forward": windowHistory.forward, "go": windowHistory.go, "emulate": null, "_": {get: function() { return '[object History]'; }} }; JSON = { /** * Analogue of JSON.parse() * * @param value * @returns {*} */ "parse": function(value) { try { return new Function('', 'return ' + value)(); } catch(_e_) { return null; } }, /** * Analogue of JSON.stringify() * * @param value * @returns {*} */ "stringify": function(value) { var n = (typeof value).charCodeAt(2); return n === 114 ? quote(value) : n === 109 ? isFinite(value) ? String(value) : 'null' : n === 111 || n === 108 ? String(value) : n === 106 ? !value ? 'null' : (function(isArray) { var out = isArray ? '[' : '{'; if (isArray) { for(var i = 0; i < value.length; i++) { out += (i == 0 ? "" : ",") + JSON.stringify(value[i]); } } else { for(var k in value) { if (value.hasOwnProperty(k)) { out += (out.length == 1 ? "" : ",") + quote(k) + ":" + JSON.stringify(value[k]); } } } return out + (isArray ? ']' : '}'); })(Object.prototype.toString.call(value) === '[object Array]') : 'void 0'; } }; /** * Change the data of the current history for IE6+ */ changeState = function(state, url, replace, lastURLValue, lfirst) { var iFrameDocument = iFrame.document; var urlObject = parseURL(url); isFireInitialState = false; if (urlObject._relative === parseURL()._relative && !lfirst) { if (state) { stateStorage[windowLocation.href] = state; } return; } lastURL = lastURLValue; if (replace) { if (iFrame["lfirst"]) { history.back(); changeState(state, urlObject._href, 0, lastURLValue, 1); } else { windowLocation.replace("#" + urlObject._special); } } else if (urlObject._href != currentHref || lfirst) { if (!iFrame['lfirst']) { iFrame["lfirst"] = 1; changeState(state, currentHref, 0, lastURLValue, 1); } else if (lfirst) { lfirst = 0; state = stateStorage[windowLocation.href]; } iFrameDocument.open(); iFrameDocument.write('\x3Cscript\x3Elfirst=1;parent.location.hash="' + urlObject._special.replace(/"/g, '\\"') + '";\x3C/script\x3E'); iFrameDocument.close(); } if (!lfirst && state) { stateStorage[windowLocation.href] = state; } }; /** * See original method */ redefineProperty = function(object, prop, descriptor, onWrapped) { if (!originalRedefineProperty.apply(this, arguments)) { if (object === locationObject) { locationObject[prop] = descriptor; } else if (object === historyObject) { historyObject[prop] = descriptor; if (prop === 'state') { locationObject = createVBObjects(locationObject); window.history = historyObject = createVBObjects(historyObject); // hack for IE7 window['execScript']('var history = window.history;', 'JavaScript'); } } else { object[prop] = descriptor.get && descriptor.get(); } } return object; }; /** * Tracking changes in the hash in the address bar */ var interval = setInterval(function() { var href = parseURL()._href; if (href != currentHref) { var e = document.createEventObject(); e.oldURL = currentHref; e.newURL = currentHref = href; e.type = 'hashchange'; onHashChange(e); } }, 100); window['JSON'] = JSON; } })(window); $(function() { /* * Note, this is the only difference when using this library, * because the object window.location cannot be overriden, * so library the returns generated "location" object within * an object window.history, so get it out of "history.location". * For browsers supporting "history.pushState" get generated * object "location" with the usual "window.location". */ var location = window.history.location || window.location; } ); gvh.iniWindowVar = function(ambito, barTitle, dataJSON, lang, modal) { if(gvh.DEBUG) console.time('gvh.iniWindowVar...'); gvh.aplTitle = barTitle; gvh.ambito = ambito; gvh.datosJSON = Object.assign({},gvh.datosJSON, dataJSON); if (typeof gvh.pagAct_edi === 'undefined') { gvh.pagAct_edi = 0; } if (typeof gvh.pagAct_lis === 'undefined') { gvh.pagAct_lis = 0; } if (typeof gvh.pagAct_ediDetalle === 'undefined') { gvh.pagAct_ediDetalle = 0; } if (typeof gvh.pagAct_lisDetalle === 'undefined') { gvh.pagAct_lisDetalle = 0; } if (lang != '') gvh.lang = lang; gvh.urlLang = 'igep/include/gvh_lang/'+gvh.lang+'.json'; $.getJSON(gvh.urlLang, function(data) { gvh.msgLoad = data['gvhlang_load']; } ); if (typeof gvh.msgLoad === 'undefined') { gvh.msgLoad = $('body').attr('data-gvhMsgLoad'); } if (typeof gvh.objSliders === 'undefined') gvh.objSliders = []; if (typeof gvh.objColResizables === 'undefined') gvh.objColResizables = []; $.getScript( 'igep/smarty/plugins/gvh_calendar/js/jquery-ui-sliderAccess.js', function() { //console.log('Load jquery-ui-sliderAccess.js performed.'); $.getScript( 'igep/smarty/plugins/gvh_calendar/js/jquery-ui-timepicker-addon.js', function() { //console.log('Load jquery-ui-timepicker-addon.js performed.'); $.getScript( 'igep/js/gvh_iniCalendar.js', function() { //console.log('Load gvh_calendar.js performed.'); } ); } ); } ); if(gvh.DEBUG) console.timeEnd('gvh.iniWindowVar...'); } //gvh.iniWindowVar gvh.getUrlParameter = function(sParam) { var sPageURL = decodeURIComponent(location.search.substring(1)), sURLVariables = sPageURL.split('&'), sParameterName, i; for (i = 0; i < sURLVariables.length; i++) { sParameterName = sURLVariables[i].split('='); if (sParameterName[0] === sParam) { return sParameterName[1] === undefined ? true : sParameterName[1]; } } } //gvh.getUrlParameter /** * Tipo de error a utilizar por el semáforo para el log. * @type {string} */ gvh.tipoErrorLogSemaphore = 'log'; /** * Función que actúa como semaforo regulador de la interfaz de usuario. * * @param {semaphoreQueueNode} node - Elemento a ejecutar cuando el semáforo esté libre * @param {boolean} retry - Indica si es un reintento de ejecución en caso de que el semáforo estuviera ocupado. */ gvh.semaphoreFn = function (node, retry) { // // REVIEW : jsdoc callback... // https://stackoverflow.com/questions/24214962/whats-the-proper-way-to-document-callbacks-with-jsdoc // // Si el usuario ha cancelado la ejecución, salimos sin hacer nada. if (gvh.cancelUI) { gvh.semaphoreCleanQueue (); gvh.semaphoreActive = false; gvh.semaphoreCounter = 0; return; } // Retraso por defecto delay = node.delay || gvh.semaphoreDelay; // Es un reintento o no retry = retry || false; if (retry) { gvh.showConsoleMsg (gvh.tipoErrorLogSemaphore, 'Semaphore #' + gvh.semaphoreCounter + ' (@' + node.id + '): Comprobando de nuevo si el semáforo está libre...'); } // Si el semáforo está activo, esperamos un intervalo más hasta volver a comprobar el semáforo de nuevo. if (gvh.semaphoreActive && gvh.semaphoreCounter > 1) { gvh.showConsoleMsg (gvh.tipoErrorLogSemaphore, 'Semaphore #' + gvh.semaphoreCounter + ' (@' + node.id + '): Dejamos en espera el callback...'); setTimeout (gvh.semaphoreFn, delay, node, true); return; } // Activamos el semáforo. gvh.semaphoreActive = true; // Ejecutamos la función pasada como parámetro. gvh.showConsoleMsg (gvh.tipoErrorLogSemaphore, 'Semaphore #' + gvh.semaphoreCounter + ' (@' + node.id + '): Ejecuto callback...'); try { node.callback (); } catch (e) { gvh.showConsoleMsg ('error', 'Semaphore #' + gvh.semaphoreCounter + ' (@' + node.id + '): Error ejecutando callback del semáforo!!!'); if(gvh.DEBUG) console.timeEnd ('gvh.semaphoreFn (@' + node.id + ')'); gvh.semaphoreCleanQueue (); gvh.semaphoreCounter = 0; gvh.semaphoreActive = false; throw e; return ; } gvh.showConsoleMsg (gvh.tipoErrorLogSemaphore, 'Semaphore #' + gvh.semaphoreCounter + ' (@' + node.id + '): ... callback ejecutado.'); // // Esperamos a que las tareas de semáforo hayan terminado. // fnFinishWhenSemaphoreDone = function (delay) { if (gvh.semaphoreCounter > 1) { setTimeout (fnFinishWhenSemaphoreDone, delay, delay); return; } else if (gvh.semaphoreCounter == 1 && gvh.semaphoreQueue.length > 0) { // Desencolamos la siguiente función, la ejecutamos tras timeout y salimos. var newNode = gvh.semaphoreDequeue (); if (newNode) { gvh.showConsoleMsg (gvh.tipoErrorLogSemaphore, 'Semaphore #' + gvh.semaphoreCounter + ' (@' + newNode.id + '): Desencolamos el siguiente callback...'); setTimeout (gvh.semaphoreFn, delay, newNode, false); return; } } // Hemos acabado y liberamos el semáforo. gvh.semaphoreActive = false; gvh.semaphoreCounter--; gvh.semaphoreCleanQueue (); if (gvh.semaphoreCounter !== 0) { console.error ('Semaphore #' + gvh.semaphoreCounter + ' (@' + node.id + '): El contador del semáforo debería ser CERO y sin embargo está a ' + gvh.semaphoreCounter + '!!!'); } gvh.showConsoleMsg (gvh.tipoErrorLogSemaphore, 'Semaphore #' + gvh.semaphoreCounter + ' (@' + node.id + '): Hemos terminado!!!'); if(gvh.DEBUG) console.timeEnd ('gvh.semaphoreFn (@' + node.id + ')'); }; fnFinishWhenSemaphoreDone (delay*2); } //gvh.semaphoreFn /** * Función que evalúa un script teniendo en cuenta el semáforo * * @param {string} script - Código javascript a evaluar * @param {string} id - Identificador para mostrar en el log */ gvh.semaphoreEval = function (script, id) { if (!script) return; if (gvh.semaphoreActive) { script = "gvh.semaphoreCounter++; \n" + "gvh.showConsoleMsg('"+gvh.tipoErrorLogSemaphore+"', 'script (id: "+id+"): +Semaforo #' + gvh.semaphoreCounter); \n" + script + "\n gvh.semaphoreCounter--; \n" + "gvh.showConsoleMsg('"+gvh.tipoErrorLogSemaphore+"', 'script (id: "+id+"): -Semaforo #' + gvh.semaphoreCounter); \n"; } try { eval (script); } catch (e) { if (gvh.semaphoreActive) { gvh.semaphoreCounter--; gvh.showConsoleMsg (gvh.tipoErrorLogSemaphore, "script (id: "+id+"): -Semaforo #" + gvh.semaphoreCounter); } throw e; } } //gvh.semaphoreEval /** * Función que incrementa el nivel de profundidad del semáforo * * @param {string} id - Identificador para mostrar en el log */ gvh.semaphoreAddLevel = function(id) { if (gvh.semaphoreActive) { gvh.semaphoreCounter++; gvh.showConsoleMsg (gvh.tipoErrorLogSemaphore, id + ': +Semaforo #' + gvh.semaphoreCounter); } } //gvh.semaphoreAddLevel /** * Función que decrementa el nivel de profundidad del semáforo * * @param {string} id - Identificador para mostrar en el log */ gvh.semaphoreSubLevel = function(id) { if (gvh.semaphoreActive) { gvh.semaphoreCounter--; gvh.showConsoleMsg (gvh.tipoErrorLogSemaphore, id + ': -Semaforo #' + gvh.semaphoreCounter); } } //gvh.semaphoreSubLevel /** * @typedef semaphoreQueueNode * @type {Object} * @property {string} id - Identificador del nodo * @property {number} delay - Milisegundos de espera hasta la siguiente comprobación. * @property {int} callback - Función callback a invocar */ /** * gvh.semaphoreEnqueue * * @param {semaphoreQueueNode} node - Elemento a guardar en la cola */ gvh.semaphoreEnqueue = function (node) { if ( !(node && node.callback && typeof node.callback === 'function') ) { alert('error'); // No es una función callback // TODO : Registrar error. return; } if (gvh.semaphoreActive) { gvh.showConsoleMsg (gvh.tipoErrorLogSemaphore, 'Semaphore #' + gvh.semaphoreCounter + ' (@' + node.id + '): Encolamos el callback...'); gvh.semaphoreQueue.push (node); return; } gvh.showConsoleMsg (gvh.tipoErrorLogSemaphore, 'Semaphore #' + gvh.semaphoreCounter + ' (@' + node.id + '): Iniciamos la cola del semáforo...'); gvh.semaphoreCounter++ gvh.semaphoreActive = true; //gvh.semaphoreQueue.push (node); setTimeout (gvh.semaphoreFn, gvh.semaphoreDelay, node, true); } //gvh.semaphoreEnqueue /** * gvh.semaphoreDequeue * * @return {semaphoreQueueNode} Elemento desencolado. */ gvh.semaphoreDequeue = function () { var first; if (gvh.semaphoreQueue.length > 0) { first = gvh.semaphoreQueue[0]; gvh.semaphoreQueue.shift (); } return first; } //gvh.semaphoreDequeue /** * gvh.semaphoreCleanQueue */ gvh.semaphoreCleanQueue = function () { gvh.semaphoreQueue.length = 0; } //gvh.semaphoreCleanQueue /** LIBRERÍA: gvh_dataJSON **/ /*******************************/ /* * Codificación UTF-8 * Métodos para obtener y modificar información del JSON que se envía a negocio con la información a tratar. * * FUNCIONES: * getRoot(claseM,panel) * * //*** MÉTODOS CAMPOS * getFieldsJSON(rootJSON) * getExistField(rootJSON,field,nReg,external) * ! setEnableTrigger(rootJSON,field,nReg,value,external) // deprecated * ! getEnableTrigger(rootJSON,field,nReg,external) // deprecated * getValue(rootJSON,field,nReg,external) * getValueOld(rootJSON,field,nReg,external) * setValue(rootJSON,field,nReg,value,external) * setValueOld(rootJSON,field,nReg,value,external) * setFilesUp(rootJSON,field,nReg,value) * setValueCheckbox(rootJSON,field,nReg,value,check,external) * getValueCheckbox(rootJSON,field,nReg,check,external) * getIdField(rootJSON,field,nReg,external) * getTextField(rootJSON,field,nReg,external) * getPlugin(rootJSON,field,nReg,external) * getDependPanelField(rootJSON,field,nReg,external) * getStateField(rootJSON,field,nReg,external) * setStateField(rootJSON,field,nReg,state,external) * getClassField(rootJSON,field,nReg,external) * setClassField(rootJSON,field,nReg,css,external) * getVisibleField(rootJSON,field,nReg,external) * setVisibleField(rootJSON,field,nReg,visible,external) * getFieldList(rootJSON,field,external) * isDependenceList(rootJSON,field,nReg,external) * isHidden(rootJSON,field,nReg,external) * isVisible(rootJSON,field,nReg,external) * getTypeField(rootJSON,field,nReg,external) * * * //*** MÉTODOS PANEL Y REGISTRO * * indexDataJSON(rootJSON,row, modoPanel) * getClassRow(rootJSON,nReg) * setClassRow(rootJSON,nReg,class) * getRowsPag(rootJSON) * getRegIns(rootJSON) * getRegVisibles(rootJSON) * setAllSelected(rootJSON,selected) * * getExistReg(rootJSON,nReg) * getStateReg(rootJSON,nReg,state) * setStateReg(rootJSON,state,nReg,operation) * getSelectedReg(rootJSON,nReg) * setSelectedReg(rootJSON,nReg,operation) * getNumReg(rootJSON) * getPagActive(rootJSON) * setPagActive(rootJSON,pag) * getFieldsRow(rootJSON, row) * getDataRequired(rootJSON) * getPagIns(rootJSON) * getRegAlter(rootJSON) * getRegSelected(rootJSON) * getFieldExternal(rootJSON, field) */ // TODO : Refactorizar las funciones del fichero /** * getRoot: Obtiene el gvh.datosJSON correspondiente a la clase manejadora y panel correspondiente * @access private * @param claseM: clase del panel sobre el que queremos calcular el índice * @param panel: tipo de panel (indice del objeto JSON) sobre el que se está trabajando ['lis','edi'] */ gvh.getRoot = function( claseM, panel ) { gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - getRoot() - '+claseM+' '+panel); gvh.showConsoleMsg('log',gvh.datosJSON[claseM][panel]); return gvh.datosJSON[claseM][panel]; }; /* ************************* * MÉTODOS CAMPOS */ /** * getFieldsJSON: Obtiene el array de los campos correspondientes a un panel * @access private * @param rootJSON: raiz del gvh.datosJSON, clase manejadora y panel * @param nReg: registro seleccionado * @return array */ gvh.getFieldsJSON = function(rootJSON,nReg) { gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - getFieldsJSON() '+nReg); var vFields = rootJSON['data'][nReg]['gvhJS_fields']; return vFields; }; /** * getExistField: Devuelve si existe o no el registro en ['data'] del gvh.datosJSON * @access private * @param rootJSON: raiz del gvh.datosJSON, clase manejadora y panel * @param nReg: fila seleccionada del panel * @param field: identificador del campo * @param external: booleano Solo en paneles tabulares, campo externo a la tabla * @return boolean */ gvh.getExistField = function( rootJSON, field, nReg, external ) { external = external || false; gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - getExistField() field '+field+' '+nReg+' external? '+external); //gvh.showConsoleMsg('log',rootJSON); if ((external == false)) // || (external == 0) || (external == '')) { if ((rootJSON['data'][nReg] == undefined) || (rootJSON['data'][nReg]['gvhJS_fields'][field] == undefined)) { gvh.showConsoleMsg('error','El campo '+field+' no existe en el datosJSON.'); return false; } else { return true; //rootJSON['data'][nReg]['gvhJS_fields'][field]; } } else { if (rootJSON['external'] != undefined ) { if (rootJSON['external'][field] == undefined) { gvh.showConsoleMsg('error','El campo '+field+' no existe.'); return false; } else { return true; //rootJSON['external'][field]; } } else { gvh.showConsoleMsg('error','No hay campos external.'); return false; } } }; /** * setEnableTrigger: Si el campo tiene una acción de interfaz, habilitarla/deshabilitarla * @deprecated * @access private * @param rootJSON: raiz del gvh.datosJSON, clase manejadora y panel * @param field: campo a modificar * @param nReg: número de registro al que pertenece el campo * @param value: valor a asignar * @param external: booleano Solo en paneles tabulares, campo externo a la tabla * @return boolean */ gvh.setEnableTrigger = function( rootJSON, field, nReg, value, external ) { external = external || false; gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - setEnableTrigger() => '+value); if( !gvh.getExistField(rootJSON, field, nReg, external) ) { gvh.showConsoleMsg('error',' *** gvh_dataJSON.js - setEnableTrigger() '+field+' no existe el campo'); return false; } if( (external == false) ) // || (external == 0) || (external == '') || (external == undefined )) { rootJSON['data'][nReg]['gvhJS_fields'][field]['onTrigger'] = value; rootJSON['dataPerform']['data'][nReg]['gvhJS_fields'][field]['onTrigger'] = value; } else { rootJSON['external'][field]['onTrigger'] = value; rootJSON['dataPerform']['external'][field]['onTrigger'] = value; } return true; } /** * getEnableTrigger: Si el campo tiene una acción de interfaz, habilitarla/deshabilitarla * @deprecated * @access private * @param rootJSON: raiz del gvh.datosJSON, clase manejadora y panel * @param field: campo a modificar * @param nReg: número de registro al que pertenece el campo * @param value: valor a asignar * @param external: booleano Solo en paneles tabulares, campo externo a la tabla * @return boolean */ gvh.getEnableTrigger = function( rootJSON, field, nReg, external ) { external = external || false; gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - getEnableTrigger() => '+field); if( !gvh.getExistField(rootJSON, field, nReg, external) ) { gvh.showConsoleMsg('error',' *** gvh_dataJSON.js - setEnableTrigger() '+field+' no existe el campo'); return false; } if ((external == false)) // || (external == 0) || (external == '') || (external == undefined )) { return rootJSON['data'][nReg]['gvhJS_fields'][field]['onTrigger']; } else { return rootJSON['external'][field]['onTrigger']; } return true; } /** * getValue: Obtiene el valor del campo indicado * @access private * @param rootJSON: raiz del gvh.datosJSON, clase manejadora y panel * @param field: campo a modificar * @param nReg: número de registro al que pertenece el campo * @param external: booleano Solo en paneles tabulares, campo externo a la tabla * @return mixed */ gvh.getValue = function( rootJSON, field, nReg, external ) { external = external || false; var value; if( !gvh.getExistField(rootJSON, field, nReg, external) ) { gvh.showConsoleMsg('error',' *** gvh_dataJSON.js - getValue() '+field+' no existe el campo.'); return value; } if ((external == false)) // || (external == 0) || (external == '')) { value = rootJSON['data'][nReg]['gvhJS_fields'][field]['value']; } else { value = rootJSON['external'][field]['value']; } gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - getValue() => '+value); return value; } /** * getValueOld: Obtiene el valor anterior del campo indicado * @access private * @param rootJSON: raiz del gvh.datosJSON, clase manejadora y panel * @param field: campo a modificar * @param nReg: número de registro al que pertenece el campo * @param external: booleano Solo en paneles tabulares, campo externo a la tabla * @return mixed */ gvh.getValueOld = function( rootJSON, field, nReg, external ) { external = external || false; gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - getValueOld()'); var valueOld; if( !gvh.getExistField(rootJSON, field, nReg, external) ) { gvh.showConsoleMsg('error',' *** gvh_dataJSON.js - getValueOld() '+field+' no existe el campo.'); return valueOld; } if ((external == false)) // || (external == 0) || (external == '')) { valueOld = rootJSON['data'][nReg]['gvhJS_fields'][field]['valueOld']; } else { valueOld = rootJSON['external'][field]['valueOld']; } return valueOld; } /** * setValue: Asigna un valor al campo indicado * @access private * @param rootJSON: raiz del gvh.datosJSON, clase manejadora y panel * @param field: campo a modificar * @param nReg: número de registro al que pertenece el campo * @param value: valor a asignar * @param external: booleano Solo en paneles tabulares, campo externo a la tabla * @return boolean */ gvh.setValue = function( rootJSON, field, nReg, value, external) { external = external || false; gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - setValue() => '+field+' valor '+value+' // '+nReg); if( !gvh.getExistField(rootJSON, field, nReg, external) ) { gvh.showConsoleMsg('error',' *** gvh_dataJSON.js - setValue() '+field+' no existe el campo'); return false; } if( (external == false) ) // || (external == 0) || (external == '') || (external == undefined )) { if (Array.isArray(rootJSON['data'][nReg]['gvhJS_fields'][field]['value'])) { rootJSON['data'][nReg]['gvhJS_fields'][field]['value'].push(value); rootJSON['dataPerform']['data'][nReg]['gvhJS_fields'][field]['value'].push(value); } else { rootJSON['data'][nReg]['gvhJS_fields'][field]['value'] = value; rootJSON['dataPerform']['data'][nReg]['gvhJS_fields'][field]['value'] = value; } } else { rootJSON['external'][field]['value'] = value; rootJSON['dataPerform']['external'][field]['value'] = value; } return true; } /** * setValueOld: Asigna un valor anterior al campo indicado * @access private * @param rootJSON: raiz del gvh.datosJSON, clase manejadora y panel * @param field: campo a modificar * @param nReg: número de registro al que pertenece el campo * @param value: valor a asignar * @param external: booleano Solo en paneles tabulares, campo externo a la tabla * @return boolean */ gvh.setValueOld = function( rootJSON, field, nReg, value, external ) { external = external || false; gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - setValueOld()'); if( !gvh.getExistField(rootJSON, field, nReg, external) ) { gvh.showConsoleMsg('error',' *** gvh_dataJSON.js - setValueOld() '+field+' no existe el campo.'); return false; } if( (external == false) ) // || (external == 0) || (external == '')) { rootJSON['data'][nReg]['gvhJS_fields'][field]['valueOld'] = value; rootJSON['dataPerform']['data'][nReg]['gvhJS_fields'][field]['valueOld'] = value; } else { rootJSON['external'][field]['valueOld'] = value; rootJSON['dataPerform']['external'][field]['valueOld'] = value; } return true; } /** * setFilesUp: Asigna los ficheros anexados al campo correspondiente * @access private * @param rootJSON: raiz del gvh.datosJSON, clase manejadora y panel * @param field: campo a modificar * @param nReg: número de registro al que pertenece el campo * @param value: valor a asignar * @param external: booleano Solo en paneles tabulares, campo externo a la tabla * @return boolean */ gvh.setFilesUp = function( rootJSON, field, nReg, value ) { gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - setFilesUp()'); if( !gvh.getExistField(rootJSON,field,nReg) ) { gvh.showConsoleMsg('error',' *** gvh_dataJSON.js - setFilesUp() no existe el campo '+field); return false; } rootJSON['data'][nReg]['gvhJS_fields'][field]['files'] = value; rootJSON['dataPerform']['data'][nReg]['gvhJS_fields'][field]['files'] = value; return true; } /** * getValueCheckbox: Devuelve el valor de un checkbox (chequeado o no) * @access private * @param rootJSON: raiz del gvh.datosJSON, clase manejadora y panel * @param field: campo a modificar * @param nReg: número de registro al que pertenece el campo * @param check: Booleano. True, corresponderá al valor del checkbox chequeado. False, corresponderá al valor del checkbox no chequeado. * @param external: booleano Solo en paneles tabulares, campo externo a la tabla * @return mixed */ gvh.getValueCheckbox = function( rootJSON, field, nReg, check, external ) { external = external || false; gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - getValueCheckbox()'); var value; if( !gvh.getExistField(rootJSON, field, nReg, external) ) { gvh.showConsoleMsg('error',' *** gvh_dataJSON.js - getValueCheckbox() no existe el campo '+field); return value; } var valueField = ( check ? 'valueCheck' : 'valueUnCheck' ); if ((external == false)) // || (external == 0) || (external == '')) { value = rootJSON['data'][nReg]['gvhJS_fields'][field][valueField]; } else { value = rootJSON['external'][field][valueField]; } return value; } /** * setValueCheckbox: Devuelve el valor de un checkbox (chequeado o no) * @access private * @param rootJSON: raiz del gvh.datosJSON, clase manejadora y panel * @param field: campo a modificar * @param value: valor a asigna al checkbox * @param nReg: número de registro al que pertenece el campo * @param check: Booleano. True, corresponderá al valor del checkbox chequeado. False, corresponderá al valor del checkbox no chequeado. * @param external: booleano Solo en paneles tabulares, campo externo a la tabla */ /*gvh.setValueCheckbox = function( rootJSON, field, value, nReg, check, external ) { external = external || false; gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - setValueCheckbox()'); if ((external == false)) // || (external == 0) || (external == '')) { if (check) rootJSON['data'][nReg]['gvhJS_fields'][field]['valueCheck'] = value; else rootJSON['data'][nReg]['gvhJS_fields'][field]['valueUnCheck'] = value; } else { if (check) rootJSON['external'][field]['valueCheck'] = value; else rootJSON['external'][field]['valueUnCheck'] = value; } }*/ /** * getId: Obtiene el valor anterior del campo indicado * @access private * @param rootJSON: raiz del gvh.datosJSON, clase manejadora y panel * @param field: campo a modificar * @param nReg: número de registro al que pertenece el campo * @param external: booleano Solo en paneles tabulares, campo externo a la tabla * @return string */ gvh.getIdField = function( rootJSON, field, nReg, external ) { external = external || false; if( !gvh.getExistField(rootJSON, field, nReg, external) ) { gvh.showConsoleMsg('error',' *** gvh_dataJSON.js - getIdField() -> '+field+' no existe el campo en el objeto gvh.datosJSON.'); return ''; } var id; if( (external == false) ) // || (external == 0) || (external == '')) { id = rootJSON['data'][nReg]['gvhJS_fields'][field]['id']; } else { id = rootJSON['external'][field]['id']; } gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - getIdField() -> '+field+' id '+id); return id; } /** * getTextField: Obtiene el texto asociado al campo * @access private * @param rootJSON: raiz del gvh.datosJSON, clase manejadora y panel * @param field: campo a modificar * @param nReg: número de registro al que pertenece el campo * @param external: booleano Solo en paneles tabulares, campo externo a la tabla * @return string */ gvh.getTextField = function( rootJSON, field, nReg, external ) { external = external || false; if( !gvh.getExistField(rootJSON,field,nReg,external) ) { gvh.showConsoleMsg('error',' *** gvh_dataJSON.js - getTextField() no existe el campo '+field); return ''; } var id; if( (external == false) ) // || (external == 0) || (external == '')) { id = rootJSON['data'][nReg]['gvhJS_fields'][field]['text']; } else { id = rootJSON['external'][field]['text']; } gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - getTextField() -> '+id); return id; } /** * getPlugin: Devuelve el tipo de plugin del campo * @access private * @param field: campo * @param nReg: número de registro al que pertenece el campo * @param external: booleano Solo en paneles tabulares, campo externo a la tabla * @return mixed */ gvh.getPlugin = function( rootJSON, field, nReg, external ) { external = external || false; if( !gvh.getExistField(rootJSON, field, nReg, external) ) { gvh.showConsoleMsg('error',' *** gvh_dataJSON.js - getPlugin() no existe el campo '+field); return ''; } var plugin; if ((external == false) || (external == 0) || (external == '') || (external == undefined ) ) { plugin = rootJSON['data'][nReg]['gvhJS_fields'][field]['CWPlugin']; } else { plugin = rootJSON['external'][field]['CWPlugin']; } gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - getPlugin() -> '+plugin); return plugin; } /** * getClassField: Devuelve el atributo class que corresponde al campo * @access private * @param rootJSON: gvh.datosJSON[claseM][panelJSON] * @param field: campo * @param nReg: número de registro al que pertenece el campo * @param external: booleano Solo en paneles tabulares, campo externo a la tabla * @return string */ gvh.getClassField = function( rootJSON, field, nReg, external ) { external = external || false; if( !gvh.getExistField(rootJSON, field, nReg, external) ) { gvh.showConsoleMsg('error',' *** gvh_dataJSON.js - getClassField() no existe el campo '+field); return ''; } var cssClass; if( (external == false) ) // || (external == 0) || (external == '')) { cssClass = rootJSON['data'][nReg]['gvhJS_fields'][field]['class']; } else { cssClass = rootJSON['external'][field]['class']; } gvh.showConsoleMsg( 'log',' *** gvh_dataJSON.js - getClassField() -> '+cssClass ); return cssClass; } /** * setClassField: Devuelve el atributo class que corresponde al campo * @access private * @param rootJSON: gvh.datosJSON[claseM][panelJSON] * @param field: campo * @param nReg: número de registro al que pertenece el campo * @param css: nuevo estilo * @param external: booleano Solo en paneles tabulares, campo externo a la tabla * @return string */ gvh.setClassField = function( rootJSON, field, nReg, css, external ) { external = external || false; if( !gvh.getExistField(rootJSON, field, nReg, external) ) { gvh.showConsoleMsg('error',' *** gvh_dataJSON.js - setClassField() no existe el campo '+field); return ''; } if( (external == false) ) // || (external == 0) || (external == '')) { rootJSON['data'][nReg]['gvhJS_fields'][field]['class'] = css; } else { rootJSON['external'][field]['class'] = css; } gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - setClassField() -> '+css); return css; } /** * getVisibleField: Devuelve si el campo es visible o no * @access private * @param rootJSON: gvh.datosJSON[claseM][panelJSON] * @param field: campo * @param nReg: número de registro al que pertenece el campo * @param external: booleano Solo en paneles tabulares, campo externo a la tabla * @return mixed */ gvh.getVisibleField = function( rootJSON, field, nReg, external ) { external = external || false; if( !gvh.getExistField( rootJSON, field, nReg, external) ) { gvh.showConsoleMsg('error',' *** gvh_dataJSON.js - getVisibleField() no existe el campo '+field); return ''; } if( (external == false) ) // || (external == 0) || (external == '')) { var visible = rootJSON['data'][nReg]['gvhJS_fields'][field]['visible']; } else { var visible = rootJSON['external'][field]['visible']; } gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - getVisibleField() -> '+visible); return visible; } /** * setVisibleField: Devuelve si el campo es visible o no * @access private * @param rootJSON: gvh.datosJSON[claseM][panelJSON] * @param field: campo * @param nReg: número de registro al que pertenece el campo * @param visible: booleano * @param external: booleano Solo en paneles tabulares, campo externo a la tabla * @return mixed */ gvh.setVisibleField = function( rootJSON, field, nReg, visible, external ) { external = external || false; if( !gvh.getExistField(rootJSON, field, nReg, external) ) { gvh.showConsoleMsg('error',' *** gvh_dataJSON.js - setVisibleField() no existe el campo '+field); return ''; } if ((external == false)) // || (external == 0) || (external == '')) { rootJSON['data'][nReg]['gvhJS_fields'][field]['visible'] = visible; } else { rootJSON['external'][field]['visible'] = visible; } gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - setVisibleField() -> '+visible); return visible; } /** * getDependPanelField: Devuelve si el estado del elemento (boton tooltip) es dependiente del panel * @access public * @param rootJSON: gvh.datosJSON[claseM][panelJSON] * @param field: campo * @param nReg: número de registro al que pertenece el campo * @param external: booleano Solo en paneles tabulares, campo externo a la tabla */ gvh.getDependPanelField = function( rootJSON, field, nReg, external ) { external = external || false; var depend = false; if (gvh.getExistField(rootJSON,field,nReg,external)) { var fields = undefined; if ((external == false)) // || (external == 0) || (external == '')) { fields = rootJSON['data'][nReg]['gvhJS_fields']; } else { fields = rootJSON['external']; } if( fields != undefined && fields[field]['dependPanel'] != undefined ) { depend = fields[field]['dependPanel']; } gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - getDependPanelField() -> '+depend); return depend; } else { gvh.showConsoleMsg('error',' *** gvh_dataJSON.js - getDependPanelField() no existe el campo '+field); return ''; } } /** * setDependPanelField: Devuelve si el estado del elemento (boton tooltip) es dependiente del panel * @access private * @param rootJSON: gvh.datosJSON[claseM][panelJSON] * @param field: campo * @param nReg: número de registro al que pertenece el campo * @param external: booleano Solo en paneles tabulares, campo externo a la tabla */ gvh.setDependPanelField = function( rootJSON, field, nReg, depend, external ) { external = external || false; if (gvh.getExistField(rootJSON,field,nReg,external)) { if ((external == false)) // || (external == 0) || (external == '')) { rootJSON['data'][nReg]['gvhJS_fields'][field]['dependPanel'] = depend; } else { rootJSON['external'][field]['dependPanel'] = depend; } gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - setDependPanelField() -> '+depend); } else { gvh.showConsoleMsg('error',' *** gvh_dataJSON.js - setDependPanelField() no existe el campo '+field); } } /** * getStateField: Devuelve el estado correspondiente al campo * @access private * @param rootJSON: gvh.datosJSON[claseM][panelJSON] * @param field: campo * @param nReg: número de registro al que pertenece el campo * @param external: booleano Solo en paneles tabulares, campo externo a la tabla */ gvh.getStateField = function( rootJSON, field, nReg, external ) { external = external || false; if (gvh.getExistField(rootJSON,field,nReg,external)) { if ((external == false)) // || (external == 0) || (external == '')) { var state = rootJSON['data'][nReg]['gvhJS_fields'][field]['state']; } else { var state = rootJSON['external'][field]['state']; } gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - getStateField() -> '+field+' '+state); return state; } else { gvh.showConsoleMsg('error',' *** gvh_dataJSON.js - getStateField() no existe el campo '+field); return ''; } } /** * setStateField: Asigna el estado a un campo * @access private * @param rootJSON: gvh.datosJSON[claseM][panelJSON] * @param field: campo * @param nReg: número de registro al que pertenece el campo * @param value: true/false/new * @param external: booleano Solo en paneles tabulares, campo externo a la tabla */ gvh.setStateField = function( rootJSON, field, nReg, state, external ) { external = external || false; if (gvh.getExistField(rootJSON,field,nReg,external)) { if ((external == false)) // || (external == 0) || (external == '')) { rootJSON['data'][nReg]['gvhJS_fields'][field]['state'] = state; } else { rootJSON['external'][field]['state'] = state; } gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - setStateField() -> '+state); return state; } else { gvh.showConsoleMsg('error',' *** gvh_dataJSON.js - setStateField() no existe el campo '+field); return ''; } } /** * getFieldList: Devuelve los valores de una lista correspondiente a un campo * @access private * @param rootJSON: gvh.datosJSON[claseM][panelJSON] * @param field: campo * @param dependence: booleano si la lista es dependiente o no * @param nReg: número de registro al que pertenece el campo * @param external: booleano Solo en paneles tabulares, campo externo a la tabla */ gvh.getFieldList = function( rootJSON, field, dependence, nReg, external ) { external = external || false; gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - getFieldList() '+field+' nReg '+nReg); if (nReg != undefined) { if (gvh.getExistField(rootJSON,field,nReg,external)) { gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - getFieldList() '+field+' nReg '+nReg); if (dependence == false) return rootJSON['components']['gvh_list'][field]; else { if ((external == false)) // || (external == 0) || (external == '')) { return rootJSON['data'][nReg]['gvhJS_fields'][field]['lista']; } else { return rootJSON['external'][field]['lista']; } } } else { gvh.showConsoleMsg('error',' *** gvh_dataJSON.js - getFieldList() no existe el campo '+field); return ''; } } else { gvh.showConsoleMsg('error',' *** gvh_dataJSON.js - getFieldList() no se ha especificado el número de registro (nReg)'); return ''; } } /** * isDependenceList: Devuelve si es una lista dependiente o no * @access private * @param rootJSON: gvh.datosJSON[claseM][panelJSON] * @param field: campo * @param nReg: número de registro al que pertenece el campo * @param external: booleano Solo en paneles tabulares, campo externo a la tabla */ gvh.isDependenceList = function( rootJSON, field, nReg, external ) { external = external || false; if (gvh.getExistField(rootJSON,field,nReg,external)) { gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - isDependenceList() field '+field+' nReg '+nReg); if ((external == false)) // || (external == 0) || (external == '')) { return rootJSON['data'][nReg]['gvhJS_fields'][field]['dependence']; } else { return rootJSON['external'][field]['dependence']; } } else { gvh.showConsoleMsg('error',' *** gvh_dataJSON.js - isDependenceList() no existe el campo '+field); return ''; } }; /** * isHidden: Devuelve true/false si el campo es un campo oculto * @access private * @param rootJSON: gvh.datosJSON[claseM][panelJSON] * @param field: campo * @param nReg: número de registro al que pertenece el campo * @param external: booleano Solo en paneles tabulares, campo externo a la tabla */ gvh.isHidden = function( rootJSON, field, nReg, external ) { external = external || false; if (gvh.getExistField(rootJSON,field,nReg,external)) { if ((external == false)) // || (external == 0) || (external == '')) { var hidden = rootJSON['data'][nReg]['gvhJS_fields'][field]['hidden']; } else { var hidden = rootJSON['external'][field]['hidden']; } gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - isHidden() => '+hidden ); return hidden; } else { gvh.showConsoleMsg('error',' *** gvh_dataJSON.js - isHidden() no existe el campo '+field); return ''; } }; /** * isVisible: Devuelve true/false si el campo es visible * @access private * @param rootJSON: gvh.datosJSON[claseM][panelJSON] * @param field: campo * @param nReg: número de registro al que pertenece el campo * @param external: booleano Solo en paneles tabulares, campo externo a la tabla * @param isInnerCall: booleano Usado para llamadas internas de métodos * @return mixed */ gvh.isVisible = function( rootJSON, field, nReg, external, innerCall ) { external = external || false; innerCall = innerCall || false; if( !gvh.getExistField(rootJSON, field, nReg, external) ) { gvh.showConsoleMsg('error',' *** gvh_dataJSON.js - isVisible() no existe el campo '+field); return ''; } var visible; if( (external == false) ) { visible = rootJSON['data'][nReg]['gvhJS_fields'][field]['visible']; } else { visible = rootJSON['external'][field]['visible']; } if( !innerCall ) gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - isVisible() ? ' + visible); return visible; }; /** * getTypeField: Obtiene el tipo del campo * @access private * @param rootJSON: raiz del gvh.datosJSON, clase manejadora y panel * @param field: campo a modificar * @param nReg: número de registro al que pertenece el campo * @param external: booleano Solo en paneles tabulares, campo externo a la tabla */ gvh.getTypeField = function(rootJSON,field,nReg,external) { external = external || false; if (gvh.getExistField(rootJSON,field,nReg,external)) { gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - getTypeField()'); if ((external == false)) // || (external == 0) || (external == '')) { return rootJSON['data'][nReg]['gvhJS_fields'][field]['type']; } else { return rootJSON['external'][field]['type']; } } else { gvh.showConsoleMsg('error',' *** gvh_dataJSON.js - getTypeField() no existe el campo '+field ); return ''; } } /* ************************* * MÉTODOS PANEL Y REGISTRO */ /** * indexDataJSON: Calcula el índice del array gvh.datosJSON sobre el que queremos trabajar. * Útil para calcularlo cuando se trabaja con paneles lis. * @access private * @param rootJSON: raiz del gvh.datosJSON, clase manejadora y panel * @param row: fila seleccionada del panel * @param modoPanel: 'I' solo en el caso de estar en modo inserción para calcular el índice correspondiente */ gvh.indexDataJSON = function( rootJSON, row, modoPanel ) { if( modoPanel === undefined ) { modoPanel = rootJSON['panel']['state']; } //gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - indexDataJSON()'); var idPanel = rootJSON['panel']['id']; var panelJSON = idPanel.substr( 2, 3 ); var indice; if (panelJSON == 'fil') // Panel filtro siempre es posición 0 de datosJSON { indice = 0; } else { if (modoPanel == 'I') { if (panelJSON == 'edi') // panel edi en modo inserción { indice = gvh.getPagIns( rootJSON ); } else { // panel lis en modo inserción if (row == 0) { indice = parseInt(rootJSON['panel']['rowIniInsercion']); } else { indice = parseInt(row); } } } else { if (panelJSON == 'edi') // panel edi en modo edición { indice = gvh.getPagActive( rootJSON ); } else { // panel lis en modo edición var rowsPag = parseInt(rootJSON['panel']['rowsPag']); var pagAct = parseInt(rootJSON['panel']['pagActive']); indice = parseInt(pagAct*rowsPag) + parseInt(row); //gvh.showConsoleMsg( 'log', ' *** indexDataJSON() pagAct ' + pagAct ); //gvh.showConsoleMsg( 'log', ' *** indexDataJSON() rowsPag ' + rowsPag ); //gvh.showConsoleMsg( 'log', ' *** indexDataJSON() row ' + row ); } } } gvh.showConsoleMsg( 'log', ' *** gvh_dataJSON.js - indexDataJSON() ' + indice ); return indice; }; /** * getClassRow: actualización del array correspondiente a la operación con el número de registro afectado * @access private * @param rootJSON: gvh.datosJSON[claseM][panelJSON] * @param state: ['selected' | 'insert' | 'updated' | 'deleted'] * @param nReg: indice del array gvh.datosJSON[claseM][panel][data], número de registro/fila sobre el que se aplica el estado * @param operation: add,sub * @retur mixed */ gvh.getClassRow = function( rootJSON, nReg ) { return rootJSON['data'][nReg]['gvhJS_rowColor']; } /** * getClassRow: actualización del array correspondiente a la operación con el número de registro afectado * @access private * @param rootJSON: gvh.datosJSON[claseM][panelJSON] * @param state: ['selected' | 'insert' | 'updated' | 'deleted'] * @param nReg: indice del array gvh.datosJSON[claseM][panel][data], número de registro/fila sobre el que se aplica el estado * @param operation: add,sub */ gvh.setClassRow = function( rootJSON, nReg, css ) { rootJSON['data'][nReg]['gvhJS_rowColor'] = css; } /** * getRowsPag: Devuelve el número de filas de una página de una tabla * @access private * @param rootJSON: gvh.datosJSON[claseM][panelJSON] * @return integer */ gvh.getRowsPag = function( rootJSON ) { gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - getRowsPag()'); return parseInt( rootJSON['panel']['rowsPag'] ); } /** * getRegInsert: Devuelve los registros donde se insertarán valores * @access private * @param rootJSON: gvh.datosJSON[claseM][panelJSON] * @return array Registros seleccionados */ gvh.getRegInsert = function( rootJSON ) { gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - getRegInsert()'); var vReg = []; var numReg = rootJSON['panel']['pagInsercion']; var rowsPag = rootJSON['panel']['rowsPag']; for(var i=0;i'+operation ); var ini = nReg; var fin = nReg+1; if( Array.isArray(nReg) ) { ini = nReg[0]; fin = nReg[1]; } if( operation == 'add' ) { for(var i=ini; i'+state); var jsonOp = []; if( state != 'nada' ) { jsonOp = rootJSON['dataPerform']['gvhJS_'+state]; } var operacion = ''; switch( state ) { case 'find': operacion = 'buscar'; break; case 'inserted': operacion = 'insertada'; rootJSON['dataPerform']['gvhJS_inserted'].push(nReg); break; case 'deleted': operacion = 'borrada'; rootJSON['dataPerform']['gvhJS_deleted'].push(nReg); break; case 'updated': operacion = 'modificada'; rootJSON['dataPerform']['gvhJS_updated'].push(nReg); break; default: operacion = 'nada'; if (rootJSON['dataPerform']['gvhJS_inserted'].indexOf(nReg) != -1) { rootJSON['dataPerform']['gvhJS_inserted'].splice( $.inArray(nReg, rootJSON['dataPerform']['gvhJS_inserted']), 1 ); } else if (rootJSON['dataPerform']['gvhJS_updated'].indexOf(nReg) != -1) { rootJSON['dataPerform']['gvhJS_updated'].splice( $.inArray(nReg, rootJSON['dataPerform']['gvhJS_updated']), 1 ); } else if (rootJSON['dataPerform']['gvhJS_deleted'].indexOf(nReg) != -1) { rootJSON['dataPerform']['gvhJS_deleted'].splice( $.inArray(nReg, rootJSON['dataPerform']['gvhJS_deleted']), 1 ); } break; } rootJSON['data'][nReg]['gvhJS_state'] = operacion; if (rootJSON['panel']['patron'] == 'tabular') { rootJSON['panel']['rowActive'] = nReg; } rootJSON['dataPerform']['data'][nReg]['gvhJS_state'] = operacion; } /** * getNumReg: Devuelve el número de registros de un panel * @access private * @param rootJSON: gvh.datosJSON[claseM][panelJSON] */ gvh.getNumReg = function(rootJSON) { gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - getNumReg()'); return rootJSON['panel']['numReg']; } /** * getPagActive: Devuelve la página activa del panel * @access private * @param rootJSON: gvh.datosJSON[claseM][panelJSON] */ gvh.getPagActive = function(rootJSON) { gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - getPagActive()'); return parseInt( rootJSON['panel']['pagActive'] ); } /** * setPagActive: Devuelve la página activa del panel * @access private * @param rootJSON: gvh.datosJSON[claseM][panelJSON] * @param pag: número de página */ gvh.setPagActive = function(rootJSON,pag) { gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - setPagActive()'); //gvh.showConsoleMsg('log',rootJSON); rootJSON['panel']['pagActive'] = parseInt( pag ); } /** * getFieldsRow: Devuelve los campos de una fila * @access private * @param rootJSON: gvh.datosJSON[claseM][panelJSON] * @param nReg: fila */ gvh.getFieldsRow = function(rootJSON,nReg) { if( !gvh.getExistReg(rootJSON,nReg) ) { gvh.showConsoleMsg('error',' *** gvh_dataJSON.js - getFieldsRow() el registro '+nReg+' no existe.'); return ''; } gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - getFieldsRow()'); return rootJSON['data'][nReg]['gvhJS_fields']; } /** * getFieldsRow: Devuelve los campos de una fila * @access private * @param rootJSON: gvh.datosJSON[claseM][panelJSON] * @param nReg: fila */ gvh.getDataRequired = function(rootJSON) { gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - getDataRequired()'); return rootJSON['dataRequired']; } /** * getPagIns: Devuelve los campos de una fila * @access private * @param rootJSON: gvh.datosJSON[claseM][panelJSON] * @return nReg: fila */ gvh.getPagIns = function(rootJSON) { var pagIns = rootJSON['panel']['pagInsercion']; gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - getPagIns() => '+pagIns); return pagIns; } /** * getRegAlter: Devuelve los registros que han sido modificados (insertar, modificar) * @access private * @param rootJSON: gvh.datosJSON[claseM][panelJSON] * @return vReg: array registros modificados */ gvh.getRegAlter = function(rootJSON) { gvh.showConsoleMsg('log',' *** gvh_dataJSON.js - getRegAlter()'); var vReg = []; var numReg = rootJSON['panel']['numReg']; for(var i=0;i 0) { regIni = pag * (rowsPag); regFin = parseInt(regIni) + parseInt(rowsPag - 1); } gvh.showConsoleMsg( 'log',' ini: '+regIni+' fin: '+regFin ); bloque['ini'] = regIni; bloque['fin'] = regFin; gvh.showConsoleMsg('endGroup'); return bloque; } /** * setStateFieldsHTML_paginar(): modificar el aspecto visual del cambio conforme al estado correspondiente * * @access private * @param raizJSON: * @param panel: tipo de panel sobre el que se está trabajando ['lis','lisDetalle'] * @param claseM: clase del panel sobre el que queremos calcular el índice * @param row: fila seleccionada del panel */ gvh.setStateFieldsHTML_paginar = function( raizJSON, panel, claseM, row ) { var sufijo = panel+'_'+row; var panelJSON = panel.substr( 0, 3 ); var numReg = gvh.getNumReg( raizJSON ); var sufijoRow; var rowTab; var objCheckRow; var jsonReg = gvh.getFieldsJSON( raizJSON, row ); var tipoCheck = ''; var stateRow = gvh.getStateReg( raizJSON, row, 'state' ); var color = ''; if (panelJSON == 'lis') { var rowsPag = gvh.getRowsPag( raizJSON ); rowTab = row%rowsPag; sufijoRow = panel+'_'+rowTab; var idCheck if ( claseM == 'WSelection' ) { tipoCheck = 'radio'; idCheck = 'vsCheck_'+sufijoRow; } else { tipoCheck = 'checkbox'; idCheck = 'check_' +sufijoRow; } objCheckRow = $( '#'+idCheck+'[data-gvhClaseManejadora='+claseM+']' ); } var selectedRow = gvh.getSelectedReg( raizJSON, row ); var objPanel = $( '#P_'+panel+'[data-gvhClaseManejadora='+claseM+']' ); gvh.showConsoleMsg('beginGroup',' ** gvh_paginar.js - setStateFieldsHTML_paginar() '); if (row < numReg) // Comprobación necesaria cuando es un panel tabular, en panel ficha siempre se cumplirá { // Capa IGEPVisible var idIgepVisible = 'IGEPVisible'+sufijo; var IgepVisible = $( '#'+idIgepVisible+'[data-gvhClaseManejadora='+claseM+']' ); if (IgepVisible.is(':hidden')) { IgepVisible.show(); } if (panelJSON == 'lis') { $( 'tr[id='+sufijoRow+']' ).attr( 'data-gvhStateRow', stateRow ); // Color de la fila var fila = $( '#'+sufijoRow+'[data-gvhClaseManejadora='+claseM+']' ); var color = gvh.getClassRow( raizJSON, row ); var cssRow = fila.attr( 'class' ); fila.removeClass( cssRow ); fila.addClass( color ); // Checkbox de la fila var selectedJSONDecode = gvh.getSelectedReg( raizJSON, row ); switch( selectedJSONDecode ) { case 'undefined' : selectedJSONDecode = false; break; case 'selected' : objCheckRow.prop( 'checked', true ); // REVIEW : ¿Por qué marcar como deshabilitado el checkbox de selección de las filas //if( tipoCheck == 'checkbox' ) //{ // objCheckRow.prop( 'disabled', true ); //} fila.addClass( 'rowOn' ); fila.removeClass( 'none' ); break; default: objCheckRow.prop( 'checked', false ); // REVIEW : ¿Por qué marcar como deshabilitado el checkbox de selección de las filas //if( tipoCheck == 'checkbox' ) //{ // objCheckRow.prop( 'disabled', false ); //} fila.removeClass( 'rowOn' ); if (color == '') { fila.addClass( 'none' ); } }//switch selectedJSONDecode switch( stateRow ) { case 'borrada' : fila.removeClass( 'rowOn' ); fila.addClass( 'rowDeleted' ); break; default: fila.removeClass( 'rowDeleted' ); break; } } //if panel tabular var idCampo; var idIcono; var external = false; for (var field in jsonReg) // Recorremos los campos correspondientes al registro para obtener su valor y asignarlo al componente HTML { // Comprobamos si el campo es visible o no var visible = gvh.isVisible( raizJSON, field, row, external, true ); if (visible) { idCampo = 'cam___'+field+'___'+sufijoRow; idIcono = 'icon_cam___'+field+'___'+sufijoRow; /*if (panelJSON == 'lis') { idCampo = 'cam___'+field+'___'+panel+'_'+rowTab; idIcono = 'icon_cam___'+field+'___'+panel+'_'+rowTab; }*/ var id = jsonReg[field]['id']; objField = $( '[id='+idCampo+'][data-gvhClaseManejadora='+claseM+']' ); var stateField = jsonReg[field]['edit']; //var stateField = objField.attr( 'data-gvhState' ); var plugin = gvh.getPlugin( raizJSON, field, row ); switch( stateRow ) { case 'modificada': if (stateField) { objField.prop('readonly',false); if( plugin !== '' && plugin !== 'cwcampotexto' ) { objField.prop('disabled',false); } objField.removeClass('new'); objField.removeClass('delete'); objField.addClass('modify'); } break; case 'borrada': objField.prop('readonly',true); if( plugin !== '' && plugin !== 'cwcampotexto' ) { objField.prop('disabled',true); } objField.removeClass('edit'); objField.removeClass('new'); objField.addClass('delete'); break; case 'nada': objField.prop('readonly',true); if( plugin !== '' && plugin !== 'cwcampotexto' ) { objField.prop('disabled',true); } objField.removeClass('modify'); objField.removeClass('new'); objField.removeClass('delete'); objField.addClass('edit'); break; case 'selected': if (gvh.getStatePanel( objPanel ) == 'W') { objField.prop('readonly',true); if( plugin !== '' && plugin !== 'cwcampotexto' && plugin !== 'noMatching' ) { objField.prop('disabled',true); } objField.removeClass('modify'); objField.removeClass('new'); objField.removeClass('delete'); objField.addClass('edit'); } break; default: objField.prop('readonly',true); if( plugin !== '' && plugin !== 'cwcampotexto' && plugin !== 'noMatching' ) { objField.prop('disabled',true); } objField.removeClass('new'); objField.removeClass('modify'); fiobjFieldeld.removeClass('delete'); objField.addClass('edit'); break; }//switch stateRow }//if visible }//for field // Tratamiento del editor enriquecido porque tiene otro prefijo distinto de 'cam__' if ((stateRow == 'modificada') && (panelJSON == 'edi')) { var editor = $( 'div[id^=editor_cam_][data-gvhClaseManejadora='+claseM+']' ); if (editor.length > 0) { editor.filter('[id$='+panel+'][data-gvhPanelOn='+panel+'][data-gvhstate=edit]').each( function() { $(this).attr( 'contenteditable', 'true' ); }) } }//if } else if (panelJSON == 'lis') { for (var field in jsonReg) { var idIGEPVisible = "IGEPvisiblecam___"+field+"___"+sufijoRow; $( 'span[id='+idIGEPVisible+'][data-gvhClaseManejadora='+claseM+']' ).hide(); $( '#'+sufijoRow+'[data-gvhClaseManejadora='+claseM+']' ).removeClass(); $( '#'+sufijoRow+'[data-gvhClaseManejadora='+claseM+']' ).addClass( 'rowNoData' ); } } // else filas inserción - panel tabular gvh.showConsoleMsg( 'endGroup' ); }; /** * setValueFieldsHTML_paginar(): cambia los valores de los campos al paginar * @access private * @param raizJSON: * @param panel: tipo de panel sobre el que se está trabajando ['lis','lisDetalle'] * @param claseM: clase del panel sobre el que queremos calcular el índice * @param row: fila seleccionada del panel */ gvh.setValueFieldsHTML_paginar = function( raizJSON, panel, claseM, row ) { gvh.showConsoleMsg( 'beginGroup', ' ** gvh_paginar.js - setValueFieldsHTML_paginar()' ); var sufijo = panel+'_'+row; var jsonReg = gvh.getFieldsRow( raizJSON, row ); var panelJSON = panel.substr( 0, 3 ); var numReg = gvh.getNumReg( raizJSON ); var rowsPag; var rowTab; var sufijoRow; if (panelJSON == 'lis'){ rowsPag = gvh.getRowsPag( raizJSON ); rowTab = row%rowsPag; sufijoRow = panel+'_'+rowTab; } if (row < numReg) // Comprobación necesaria cuando es un panel tabular, en panel ficha siempre se cumplirá { if (panelJSON == 'lis') { var idIGEPVisibleRow = "IGEPVisible"+sufijoRow; var objIGEPVisibleRow = $( '#'+idIGEPVisibleRow+'[data-gvhClaseManejadora='+claseM+']' ); if (objIGEPVisibleRow.is(':hidden')) { objIGEPVisibleRow.show(); } } var external = false; for (var field in jsonReg) // Recorremos los campos correspondientes al registro para obtener su valor y asignarlo al componente HTML { // Comprobamos si el campo es visible o no var visible = gvh.isVisible( raizJSON, field, row, external, true ); var idIGEPVisible = "IGEPVisiblecam___"+field+"___"+sufijoRow; var objIGEPVisible = $( '#'+idIGEPVisible+'[data-gvhClaseManejadora='+claseM+']' ); if (visible) { if (objIGEPVisible.is(':hidden')) { objIGEPVisible.show(); } } else { if (objIGEPVisible.is(':visible')) { objIGEPVisible.hide(); } } var idCampo = 'cam___'+field+'___'+panel; var idIcono = 'icon_cam___'+field+'___'+panel; if (panelJSON == 'lis') { idCampo = 'cam___'+field+'___'+panel+'_'+rowTab; idIcono = 'icon_cam___'+field+'___'+panel+'_'+rowTab; } var css = jsonReg[field]['class']; var plugin = jsonReg[field]['CWPlugin']; var valueJSONDecode = jsonReg[field]['value']; if ((valueJSONDecode == 'undefined')) { valueJSONDecode = ''; } var inputField; var tipo; var cssField; switch( plugin ) { case 'noMatching': inputField = $( 'input[id*='+idCampo+'][data-gvhClaseManejadora='+claseM+']' ); inputField.val( valueJSONDecode ); inputField.attr( 'value', valueJSONDecode ); inputField.attr( 'title', valueJSONDecode ); break; case 'cwcampotexto': inputField = $( 'input[id*='+idCampo+'][data-gvhClaseManejadora='+claseM+']' ); inputField.val( valueJSONDecode ); inputField.attr( 'value', valueJSONDecode ); inputField.attr( 'title', valueJSONDecode ); // css campo tipo = inputField.attr( 'type' ); if (tipo != 'hidden') { cssField = inputField.attr( 'class' ); if (cssField != css) { inputField.removeClass(); inputField.addClass( css ); } } break; case 'cwrichareatexto': inputField = $( 'textarea[id*='+idCampo+'][data-gvhClaseManejadora='+claseM+']' ); $( '#editor_'+idCampo ).html( valueJSONDecode ); //inputField.val(valueJSONDecode); // css campo tipo = inputField.attr( 'type' ); if (tipo != 'hidden') { cssField = inputField.attr( 'class' ); if (cssField != css) { inputField.removeClass(); inputField.addClass( css ); } } break; case 'cwareatexto': inputField = $( 'textarea[id*='+idCampo+'][data-gvhClaseManejadora='+claseM+']' ); inputField.val( valueJSONDecode ); // css campo tipo = inputField.attr( 'type' ); if (tipo != 'hidden') { cssField = inputField.attr( 'class' ); if (cssField != css) { inputField.removeClass(); inputField.addClass( css ); } } break; case 'cwlista': case 'cwlista_select2': inputField = $( 'select[id*='+idCampo+'][data-gvhClaseManejadora='+claseM+']' ); var dependencia = gvh.isDependenceList( raizJSON, field, row ); if ((dependencia != undefined) && (dependencia != 'NO')) // es una lista dependiente { var listOptions = jsonReg[field]['lista']; if ((listOptions != undefined) && (listOptions.length > 0)) { if (plugin == 'cwlista') { gvh.addList( inputField, listOptions, valueJSONDecode ); } else { gvh.addListSelect2( inputField, listOptions, valueJSONDecode ); } } } else { var jsonListaField = gvh.getFieldList( raizJSON, field, false, row ); var idCampo = inputField.attr( 'id' ); var valuesList = (Array.isArray (valueJSONDecode) ? valueJSONDecode : valuesList = [valueJSONDecode]); $( '#'+idCampo+' option' ).prop( 'selected', false ); //$( '#'+idCampo+' option' ).attr( 'selected', false ); for (var currentIndex = 0; currentIndex < valuesList.length; currentIndex++) { $( '#'+idCampo+' option[value="'+valuesList[currentIndex]+'"]' ).prop( 'selected', true ); //$( '#'+idCampo+' option[value="'+valuesList[currentIndex]+'"]' ).attr( 'selected', true ); $( '#'+idCampo+' option[value="'+valuesList[currentIndex]+'"]' ).trigger('change.select2'); } } // Al paginar podemos pasar de la última página que no sea completa a una página completa, hay que volver a rellenar los valores (option) de la lista if (panel == 'lis') { var listOptions = ''; if (inputField.length == 0) { if ((dependencia != undefined) && (dependencia != 'NO')) { // Si la lista es dependiente, las opciones de la lista están en el campo listOptions = jsonReg[field]['lista']; } else { // Si la lista no es dependiente, las opciones están en la zona común listOptions = jsonListaField[field]; } if ((listOptions != '') && (listOptions.length > 0)) { if (plugin == 'cwlista') { gvh.addList( inputField, listOptions, valueJSONDecode ); } else { gvh.addListSelect2( inputField, listOptions, valueJSONDecode ); } } } else { var dependencia = jsonReg[field]['dependence']; if ((dependencia != undefined) && (dependencia != 'NO')) { //Hay dependencia listOptions = jsonReg[field]['lista']; if (listOptions.length > 0) { if (plugin == 'cwlista') { gvh.addList( inputField, listOptions, valueJSONDecode ); } else { gvh.addListSelect2( inputField, listOptions, valueJSONDecode ); } } } else { $( '#'+idCampo+' option[value="'+valueJSONDecode+'"]' ).prop( 'selected', true ); } } } cssField = inputField.attr( 'class' ).trim().match(/\S+/g); var cssList = css.trim().match(/\S+/g); if (plugin == 'cwlista_select2' && cssList.length) { cssList.push('select2-hidden-accessible'); } if (gvh.isEqual (cssField, cssList)) { cssList = cssList.join(' '); inputField.removeClass(); inputField.addClass( cssList ); } break; case 'cwbotontooltip': break; case 'cwcheckbox': inputField = $('input[id*='+idCampo+']').filter('[data-gvhClaseManejadora='+claseM+']'); var valueJSONDecode = jsonReg[field]['checked']; if ((valueJSONDecode == 'undefined') || (valueJSONDecode == 'false')) { inputField.prop('checked',false); } else { inputField.prop('checked',true); } cssField = inputField.attr( 'class' ); if (cssField != css) { inputField.removeClass(); inputField.addClass( css ); } break; case 'cwimagen': break; case 'cwinformation': // Botón tooltip con información var button = $( 'button[id*='+idCampo+'][data-gvhClaseManejadora='+claseM+']' ); button.attr( 'data-content', valueJSONDecode ); cssField = button.attr( 'class' ); if (cssField != css) { button.removeClass(); button.addClass( css ); } /*if ((color != '') && (color != undefined)) { button.addClass(color); }*/ // icono del botón var iconJSON = jsonReg[field]['icon']; if (iconJSON == 'undefined') iconJSON = ''; var idIconButton = 'iconInf_cam___'+field+'___'+sufijo; iconButton = $( '#'+idIconButton+'[data-gvhClaseManejadora='+claseM+']' ); iconButton.removeClass(); iconButton.addClass(iconJSON); break; case 'cwlabel icon': // Label que solamente es un icono inputField = $( 'span[id*='+idIcono+'][data-gvhClaseManejadora='+claseM+']' ); inputField.removeClass(); inputField.addClass(valueJSONDecode); break; case 'cwlabel': inputField = $( 'label[id*='+idCampo+'][data-gvhClaseManejadora='+claseM+']' ); if (inputField.length > 0) { inputField.html( valueJSONDecode ); inputField.attr( 'value', valueJSONDecode ); cssField = inputField.attr( 'class' ); if (cssField != css) { inputField.removeClass(); inputField.addClass( css ); } } // El label puede ir acompañado de un icono var icono = $('#'+idIcono+'[data-gvhClaseManejadora='+claseM+']'); if (icono.length > 0) { var iconJSONDecode; try { iconJSONDecode = decodeURIComponent(escape(jsonReg[field]['icon'])); } catch(e) { iconJSONDecode = jsonReg[field]['icon']; } if (iconJSONDecode == 'undefined') { iconJSONDecode = ''; } icono.removeClass(); icono.addClass( iconJSONDecode ); } break; case 'cwlistaradio': // RADIOBUTTON var radio = $( 'input:radio[name*='+idCampo+'][data-gvhClaseManejadora='+claseM+']' ); radio.filter( '[value='+valueJSONDecode+']' ).prop( 'checked', true ); letcssField = radio.attr( 'class' ); if (cssField != css) { radio.removeClass(); radio.addClass( css ); } break; case 'cwslider': // slider de imágenes if (gvh.objSliders.length > 0) { $.each( gvh.objSliders, function(i, slider) { slider.destroySlider(); }); gvh.objSliders.push( $('ul[id*=slider_][data-gvhIterActual='+row+']').bxSlider( { minSlides: 2, maxSlides: 3, slideWidth: 400, slideMargin: 10, caption: true, pager: true }) ); } break; default: break; } } } else if (panelJSON == 'lis') { var idIGEPVisibleRow = "IGEPVisible"+sufijoRow; var objIGEPVisibleRow = $( '#'+idIGEPVisibleRow+'[data-gvhClaseManejadora='+claseM+']' ); if (objIGEPVisibleRow.is(':visible')) { objIGEPVisibleRow.hide(); } if (jsonReg !== undefined) { for (var field in jsonReg) { var idCampo = "cam___"+field+"___"+panel+"_"+rowTab; var idIGEPVisible = "IGEPVisiblecam___"+field+"___"+sufijoRow; var objIGEPVisible = $( '#'+idIGEPVisible+'[data-gvhClaseManejadora='+claseM+']' ); if (objIGEPVisible.is(':visible')) { objIGEPVisible.hide(); } } } else { $('input[data-gvhClaseManejadora='+claseM+'][id$=___'+sufijoRow+']').val(''); $('input[data-gvhClaseManejadora='+claseM+'][id$=___'+sufijoRow+']').attr( 'title', '' ); } } gvh.showConsoleMsg( 'endGroup' ); } /** * paginar(): Al cambiar de página debemos volver a asignar los valores que vienen en el JSON a sus respectivos campos * * @access private * @param pagSource: * @param pagTarget: * @param panel: * @param claseM: */ gvh.paginar = function( pagSource, pagTarget, panel, claseM ) { gvh.showConsoleMsg('beginGroup',' ** gvh_paginar.js - paginar() - pag: '+pagTarget+' panel: '+panel+' claseManejadora '+claseM); var idPanel = "P_"+panel; var objPanel = $( '#'+idPanel ); var state = gvh.getStatePanel( objPanel ); var bloque = []; var panelJSON = panel.substr( 0, 3 ); var raizJSON = gvh.getRoot( claseM, panelJSON ); gvh.setPagActive( raizJSON, pagTarget ); var numReg = gvh.getNumReg( raizJSON ); var rowsPag = gvh.getRowsPag( raizJSON ); var valueJSONDecode = ''; if (panelJSON == 'lis') { bloque = gvh.blockRegPagina( raizJSON, pagTarget ); var regIni = bloque['ini']; var regFin = bloque['fin']; gvh.showConsoleMsg( 'log',' ... Panel tabular desde '+regIni+' a '+regFin ); for(var i=regIni; i<=regFin; i++ ) { gvh.setStateFieldsHTML_paginar( raizJSON, panel, claseM, i ); gvh.setValueFieldsHTML_paginar( raizJSON, panel, claseM, i ); } } else { var vFields = gvh.getFieldsRow(raizJSON,pagTarget); var sufijo = panel+'_'+pagTarget; var state = gvh.getStateReg(raizJSON,pagTarget,'state'); gvh.showConsoleMsg('log',' ... Panel registro '); // Visualmente des-seleccionamos todos los registros gvh.setSelectedReg( raizJSON, [0,numReg], 'sub', false ); // Visualmente seleccionamos los registros que estén seleccionados em la página actual. gvh.setSelectedReg( raizJSON, pagTarget, 'add', false ); gvh.setStateFieldsHTML_paginar( raizJSON, panel, claseM, pagTarget ); gvh.setValueFieldsHTML_paginar( raizJSON, panel, claseM, pagTarget ); } gvh.showConsoleMsg( 'endGroup' ); } /* * Codificación UTF-8 * Controlador de la parte JS. * openWS (destino, campo, formOrigen, iterActual, panelActua, claseM, modoPanelOrigen, message) * eventCloseModal (url, claseM, panel) * ¡¡¡¡closeWindowModal(WM)!! ¡¡ELIMINAR!! * compareViewsPath (pathActual, path) * formatBytes (a,b) * controllerJS (id, prefijo, css, panel) * * $(document).ajaxStart (handler ()) * $(document).ajaxStop (handler (jqXHR, textStatus, errorThrown)) */ /* * openMapa() * FUNCIӓN: abrir mapa */ // gvh.openMapa = function(objElemento, action, mapaJSON) gvh.openMapa = function(objElemento) { var id = objElemento.attr('id'); var idCampoJSON = id.split('___')[1]; var destino = objElemento.attr('data-gvhDestino'); var iterActual = objElemento.attr('data-gvhIterActual'); var panelActua = objElemento.attr('data-gvhPanelOn'); var claseManejadora = objElemento.attr('data-gvhClaseManejadora'); var formOrigen = objElemento.closest('form'); gvh.showConsoleMsg('log',' '); gvh.showConsoleMsg('log','** openMapa() '); gvh.showConsoleMsg('log',gvh.datosJSON); gvh.ambito = 'gvhModal'; var panelJSON = panelActua.substring(0,3); var raizJSON = gvh.getRoot(claseManejadora,panelJSON); var actionOrigen = $(formOrigen).attr('action'); var targetOrigen = $(formOrigen).attr('target'); var idForm = $(formOrigen).attr('id'); var regSelected = gvh.getRegSelected(raizJSON); var idPoligono = gvh.datosJSON[claseManejadora][panelJSON]['dataPerform']['data'][regSelected]['gvhJS_fields'][idCampoJSON]['value']['poligono']; var coordX = gvh.datosJSON[claseManejadora][panelJSON]['dataPerform']['data'][regSelected]['gvhJS_fields'][idCampoJSON]['value']['x']; var coordY = gvh.datosJSON[claseManejadora][panelJSON]['dataPerform']['data'][regSelected]['gvhJS_fields'][idCampoJSON]['value']['y']; var zoom = gvh.datosJSON[claseManejadora][panelJSON]['dataPerform']['data'][regSelected]['gvhJS_fields'][idCampoJSON]['value']['zoom']; var tipoProj = gvh.datosJSON[claseManejadora][panelJSON]['dataPerform']['data'][regSelected]['gvhJS_fields'][idCampoJSON]['value']['tipoProj']; var defProj = gvh.datosJSON[claseManejadora][panelJSON]['dataPerform']['data'][regSelected]['gvhJS_fields'][idCampoJSON]['value']['defProj']; var poligono = gvh.datosJSON[claseManejadora][panelJSON]['dataPerform']['data'][regSelected]['gvhJS_fields'][idPoligono]['value']; var latitud = gvh.datosJSON[claseManejadora][panelJSON]['dataPerform']['data'][regSelected]['gvhJS_fields'][coordX]['value']; var longitud = gvh.datosJSON[claseManejadora][panelJSON]['dataPerform']['data'][regSelected]['gvhJS_fields'][coordY]['value']; var idLatitud = gvh.datosJSON[claseManejadora][panelJSON]['data'][regSelected]['gvhJS_fields'][coordX]['id']; var idLongitud = gvh.datosJSON[claseManejadora][panelJSON]['data'][regSelected]['gvhJS_fields'][coordY]['id']; if ((coordX != '') && (coordY != '')) { if ( ((latitud === undefined) || (latitud === null) || (latitud == "")) && ((longitud === undefined) || (longitud === null) || (longitud == "")) && ((poligono === undefined) || (poligono === null) || (poligono == ""))) { longitud = 697583.8573836017; latitud = 4352605.147936047; } } var params = "x="+latitud+"&y="+longitud+"&zoomlevel="+zoom+"&campoLongitud="+coordX+"&campoLatitud="+coordY+"&tipoProj="+tipoProj+"&defProj="+defProj+"&action="+destino; var dialogomapa = "
"; //var dialogomapa = "
"; var myPos = { my: "center center", of: window, collision: "fit" } $('#gvhPage').append(dialogomapa); $('#dialogomapa').dialog({ height: 'auto', width: 'auto', modal: true, position: myPos, autoOpen: false, resizable: false, close: function(event, ui) { gvh.ambito = 'gvhMain'; gvh.changeField($('#'+idLatitud)); gvh.changeField($('#'+idLongitud)); $(this).dialog('destroy').remove(); }, open: function (event, ui) { $(this).css('overflow', 'hidden'); }, complete: function(event, ui) { } }); $('#dialogomapa').on('hidden.bs.modal', function (e) { $('#dialogomapa').remove(); }); $('#dialogomapa').dialog( 'open' ); } /* * openWS() * FUNCIӓN: abrir ventana de selección */ gvh.openWS = function(objElemento,modoPanelOrigen,message) { var destino = objElemento.attr('data-gvhDestino'); var campo = objElemento.attr('data-gvhActSobre'); var iterActual = objElemento.attr('data-gvhIterActual'); var panelActua = objElemento.attr('data-gvhPanelOn'); var claseM = objElemento.closest('[data-gvhClaseManejadora]').attr('data-gvhClaseManejadora'); var formOrigen = objElemento.closest('form'); gvh.showConsoleMsg('log','** openWS() '); gvh.showConsoleMsg('log',gvh.datosJSON); gvh.ambito = 'gvhModal'; var panelJSON = panelActua.substring(0,3); var raizJSON = gvh.getRoot(claseM,panelJSON); var actionOrigen = $(formOrigen).attr('action'); var targetOrigen = $(formOrigen).attr('target'); var idForm = $(formOrigen).attr('id'); if (campo == '') { gvh.showConsoleMsg('error',' ¡¡Falta la indicación del campo destino de la ventana de selección!!'); return; } actionNueva = destino + "&nomForm="+idForm+ "&nomCampo="+campo+ "&filaActual="+iterActual+ "&panelActua="+panelActua+ "&actionOrigen="+actionOrigen+ "&modoPanelOrigen="+modoPanelOrigen+ "&gvhpanel="+panelJSON; gvh.showConsoleMsg('log',' - Llamada a phrame: '+actionNueva); //Mostramos el progreso Pace.restart(); document.body.className = document.body.className; // Forzamos a actualizar la interfaz $.ajax({ data: raizJSON['dataPerform'], type: "POST", datatype: "json", cache: false, url: actionNueva, beforeSend: function() { gvh.showConsoleMsg('log',' ... Beforesend ...'); gvh.loading( 'on', message ); }, success: function(rspTpl) { try { rspTplJSON = JSON.parse(rspTpl); urlTpl = decodeURIComponent(rspTplJSON.path); idWS = "WS_"+claseM; idWS = "WS"; if ($('#'+idWS).length > 0) { if (rspTplJSON.context.action == 'gvHidraCloseJDialog') { gvh.showConsoleMsg('log',' ... Cerramos ventana => action: '+rspTplJSON.context.action); // REVIEW VERO: globalWS globalWS.dialog('destroy').remove(); if (gvh.dialogIdWM.length <= 0) gvh.ambito = 'gvhMain'; else gvh.ambito = 'gvhModal'; } else { gvh.showConsoleMsg('log',' ... Ya existe WS, cargamos => url: '+urlTpl); $('#'+idWS).load(urlTpl); gvh.loading( 'off' ); } } else { gvh.showConsoleMsg('log',' ... Abrimos WS => action: '+rspTplJSON.context.action); $('#gvhPage').append( '