var Conf = { appName: 'Verdnatura', dsName: 'verdnatura', dsPath: 'HKCU\\Software\\ODBC\\ODBC.INI\\verdnatura', regPath: 'HKCU\\Software\\Verdnatura\\vn-access', remoteUrl: 'https://www.verdnatura.es/vn-access', dbHost: 'db.verdnatura.es', defaultModule: 'tpv' }; var App = { shell: new ActiveXObject ('WScript.Shell'), fso: new ActiveXObject ('scripting.filesystemobject'), init: function () { var width = 420; var height = 360; window.resizeTo (width, height); window.moveTo ((screen.width - width) / 2, (screen.height - height) / 2); }, _onLoad: function () { // Inicializa variables globales var split = Verdnatura.commandLine.match(/(?:[^\s"]+|"[^"]*")+/g); if (split.length > 1) this.module = split[1].replace (/^"+|"+$/g, ''); if (!this.module) this.module = Conf.defaultModule; this.appDir = this.getEnv ('ProgramFiles') +'\\'+ Conf.appName; this.moduleDir = this.shell.SpecialFolders ('AppData') +'\\'+ Conf.appName; this.remoteFile = Conf.remoteUrl +'/'+ this.module +'.7z'; this.compressFile = this.getEnv ('TEMP') +'\\'+ this.module +'.7z'; this.mdbFile = this.moduleDir +'\\'+ this.module +'.mdb'; // Crea las entradas necesarias en el registro var configured = this.regRead (Conf.regPath, 'configured'); if (!configured) { var path; // Crea las entradas de configuración de Access path = 'HKCU\\Software\\Microsoft\\Office\\11.0\\Access\\Settings'; this.regWrites (path, 'REG_DWORD', { 'Confirm Document Deletions' : 0, 'Confirm Action Queries' : 0, 'Confirm Record Changes' : 0 }); path = 'HKCU\\Software\\Microsoft\\Office\\11.0\\Access\\Security'; this.regWrite (path, 'Level', 1, 'REG_DWORD'); // Crea el ODBC de MySQL var driverPath = this.getEnv ('ProgramFiles') +'\\MySQL\\Connector ODBC 5.1\\myodbc5.dll'; var params = { 'Driver' : driverPath, 'DESCRIPTION' : Conf.appName, 'SERVER' : Conf.dbHost, 'DATABASE' : 'vn2008', 'SSLCA' : this.appDir +'\\cacert.pem', 'SSLVERIFY' : 1, 'AUTO_RECONNECT' : 1 }; this.createOdbc ( Conf.dsName, 'Mysql ODBC 5.1 Driver', params ); // Crea el ODBC de PosgreSQL var driverPath = this.getEnv ('ProgramFiles') +'\\psqlODBC\\0804\\bin\\psqlodbc35w.dll'; var params = { 'Driver' : driverPath, 'DESCRIPTION' : Conf.appName, 'Servername' : Conf.dbHost, 'DATABASE' : 'vn', 'UID' : '', 'USERNAME' : '', 'PASSWORD' : '' }; this.createOdbc ( 'verdnaturapg', 'PostgreSQL Unicode', params ); // Marca la aplicación como configurada this.regWrite (Conf.regPath, 'configured', 1, 'REG_DWORD'); } // Carga los datos del formulario var user = this.regRead (Conf.dsPath, 'UID'); var password = this.regRead (Conf.dsPath, 'PWD'); var remember = this.regRead (Conf.regPath, 'remember'); if (user) this.$('user').value = user; if (remember && password) { this.$('password').value = password; this.$('remember').checked = true; this._onEnterClick (); } else this.resetForm (); }, createOdbc: function (dsName, driverName, params) { var odbcPath = 'HKCU\\Software\\ODBC\\ODBC.INI\\'; this.regWrites (odbcPath + dsName, 'REG_SZ', params); this.regWrite (odbcPath + 'ODBC Data Sources', dsName, driverName, 'REG_SZ'); }, resetForm: function () { this.$('user').focus (); this.$('user').select (); this.$('password').value = ''; }, _disableUi: function (disabled, loadMessage) { if (disabled) this._hideMessage (); else loadMessage = ''; this.$('loading-message').innerHTML = loadMessage; this.$('user').disabled = disabled; this.$('password').disabled = disabled; this.$('remember').disabled = disabled; this.$('enter').disabled = disabled; var display = disabled ? 'block' : 'none'; this.$('background').style.display = display; this.$('spinner').style.display = display; }, _onKeyPress: function (e) { switch (e.keyCode) { case 13: // Enter this._onEnterClick (); break; case 27: // Esc window.close (); break; } }, _onEnterClick: function () { this._disableUi (true, 'Cargando'); setTimeout (function () {App.login();}, 0); }, login: function () { var user = this.$('user').value; var password = this.$('password').value; try { if (!user || user === '') throw new Error ('Introduce un nombre de usuario'); if (!password || password === '') throw new Error ('Introduce una contraseña'); this.regWrite (Conf.dsPath, 'UID', user, 'REG_SZ'); this.regWrite (Conf.dsPath, 'PWD', password, 'REG_SZ'); // Obtiene la última versión usando la conexión ODBC de MySQL var mysqlConn = new ActiveXObject ('ADODB.Connection'); try { mysqlConn.open (Conf.dsName); } catch (e) { throw new Error ('Usuario o contraseña incorrectos'); } var sql = 'SELECT version FROM versiones WHERE programa = \''+ this.module +'\''; var rs = mysqlConn.execute (sql); var lastVersion = parseInt (rs.fields(0).value); rs.close (); mysqlConn.close (); // Obtiene el número de versión local del archivo MDB var localVersion = -1; if (this.fso.fileExists (this.mdbFile)) try { var mdbConn = new ActiveXObject ('ADODB.Connection'); mdbConn.open ('Provider=Microsoft.Jet.OLEDB.4.0; Data Source='+ this.mdbFile +';'); var oRs = new ActiveXObject ('ADODB.Recordset'); oRs.Open ('SELECT Version FROM tblVariables', mdbConn); localVersion = oRs.EOF ? -1 : parseInt (oRs('Version')); oRs.close (); mdbConn.close (); } catch (e) {} // Compara la versión local con la última versión if (localVersion < lastVersion) { this._disableUi (true, 'Actualizando'); var request = new ActiveXObject ('MSXML2.XMLHTTP'); request.open ('GET', this.remoteFile +'?'+ new Date().getTime(), true); request.onreadystatechange = function () {App._onRequestReady (request);}; request.send (); } else this.openMdb (); } catch (e) { this.regWrite (Conf.dsPath, 'PWD', '', 'REG_SZ'); this._disableUi (false); this.resetForm (); this.showMessage (e.message); } }, _onRequestReady: function (request) { if (request.readyState !== 4) return; try { if (request.status !== 200) throw new Error ('HTTP: '+ request.statusText); if (this.fso.fileExists (this.compressFile)) this.fso.deleteFile (this.compressFile); var stream = new ActiveXObject ('ADODB.Stream'); stream.open (); stream.Type = 1; //adTypeBinary stream.write (request.responseBody); stream.Position = 0; stream.saveToFile (this.compressFile, 2); stream.close (); if (this.fso.fileExists (this.mdbFile)) this.fso.deleteFile (this.mdbFile); // XXX: Code for the old installer modules var oldModules = { 'tpv': 'TPV_MySQL2', 'ent': 'ENT_MySQL', 'com': 'COM_MySQL', 'enc': 'ENC_MySQL', 'eti': 'ETI', 'lab': 'LAB_MySQL' }; var oldMdb = this.moduleDir +'\\'+ oldModules[this.module] +'.mdb'; if (this.fso.fileExists (oldMdb)) this.fso.deleteFile (oldMdb); // XXX: End this.run ('7za e "'+ this.compressFile +'" -o"'+ this.moduleDir +'"', true); this.fso.deleteFile (this.compressFile); // XXX: Code for the old installer modules if (!this.fso.fileExists (this.mdbFile) && this.fso.fileExists (oldMdb)) this.fso.moveFile (oldMdb, this.mdbFile); // XXX: End } catch (e) { alert ('Error al actualizar: '+ e.message); } this._disableUi (false); if (this.fso.fileExists (this.mdbFile)) this.openMdb (); }, openMdb: function () { var remember = this.$('remember').checked ? 1 : 0; this.regWrite (Conf.regPath, 'remember', remember, 'REG_DWORD'); this.shell.exec ('"%ProgramFiles%\\Microsoft Office\\OFFICE11\\MSACCESS.EXE" "'+ this.mdbFile +'" /cmd "'+ this.$('user').value +'"'); window.close (); }, showMessage: function (message) { if (this.messageTimeout) clearTimeout (this.messageTimeout); var messageDiv = this.$('message'); messageDiv.innerHTML = message; messageDiv.style.display = 'block'; this.messageTimeout = setTimeout (function () {App._hideMessage();}, 10000); }, _onBodyClick: function () { this._hideMessage (); }, _hideMessage: function () { if (this.messageTimeout) { this.$('message').style.display = 'none'; clearTimeout (this.messageTimeout); this.messageTimeout = null; } }, _onUnload: function () { this._disableUi (false); }, $: function (id) { return document.getElementById (id); }, run: function (command, wait) { if (!wait) wait = false; this.shell.run (command, 0, wait); }, getEnv: function (varName) { return this.shell.expandEnvironmentStrings ('%'+ varName +'%'); }, regRead: function (path, key) { try { var value = this.shell.regRead (path +'\\'+ key); } catch (e) { var value = null; } return value; }, regWrite: function (path, key, value, type) { this.shell.regWrite (path +'\\'+ key, value, type); }, regWrites: function (path, type, values) { for (var key in values) this.regWrite (path, key, values[key], type); } }; App.init ();