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 () { // Initializes the global variables 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'; // Creates the necessary registry entries var configured = this.regRead (Conf.regPath, 'configured'); if (!configured) { var path; // Creates the Access configuration entries 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'); // Creates the MySQL ODBC connection 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 ); // Creates the PosgreSQL ODBC connection 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 ); // Marks the application as configured this.regWrite (Conf.regPath, 'configured', 1, 'REG_DWORD'); } // Loads the form data 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) { var target = event.target || event.srcElement; switch (e.keyCode) { case 13: // Enter this._onEnterPress (target); break; case 27: // Esc window.close (); break; } }, _onEnterPress: function (target) { if ( target && target.id == 'user' && this.$('password').value == '') { this.$('password').focus (); return; } this._onEnterClick (); }, _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'); // Gets the last version number usign the MySQL ODBC connection var mysqlConn = new ActiveXObject ('ADODB.Connection'); var dbErrors = mysqlConn.errors; try { dbErrors.clear (); mysqlConn.open (Conf.dsName); } catch (e) { if (dbErrors.count > 0) { var errorMsg; var dbError = dbErrors.item(0); alert (dbError.description ); switch (dbError.NativeError) { case 1045: // Access denied errorMsg = 'Usuario o contraseña incorrectos'; break; case 2003: // Can't connect errorMsg = 'No se ha podido conectar con el ' +'servidor, comprueba que tienes conexión a ' +'Internet y que el servidor está accesible'; break; default: errorMsg = dbError.description; } dbErrors.clear(); throw new Error (errorMsg); } else throw e; } 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 (); // Obtains the local version number from the MDB file 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) {} // Compares the local version with the las version 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); this.run ('7za e "'+ this.compressFile +'" -o"'+ this.moduleDir +'"', true); this.fso.deleteFile (this.compressFile); } 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 ();