-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathUFEBS_Viewer.hta
326 lines (307 loc) · 13.2 KB
/
UFEBS_Viewer.hta
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
<html>
<head>
<meta http-equiv=content-type content="text-html; charset=utf-8">
<meta http-equiv=MSThemeCompatible content=yes>
<hta:application
id="idUFEBS_Viewer"
applicationName="UFEBS Viewer"
icon="msxml3.dll"
innerBorder="no"
contextMenu="no"
version="1.4.2"
author="mozers™, mozers@mail.ru, icq#256106175"
/>
<style type="text/css">
* {margin:4px; cursor:default;} /*общие определения*/
table.help {position:relative; top:-8px; left:-8px; background-color:#FFFFCC; border:1px solid #999900;} /*подсказка*/
div.help {position:absolute; top:40px; left:expression(document.body.offsetWidth-idHelp.offsetWidth-40); background-color:#C0C0C0;} /*подсказка тень*/
.help td.key {font:normal 8pt Arial Black; color:#993300;} /*подсказка клавиши*/
.help td.text {font:8pt MS Shell Dlg; white-space:nowrap;} /*подсказка текст*/
#idPRE {font:normal 12px Courier New;} /*текст документа УФЭБС*/
</style>
<style type="text/css" media="print">
.help {display:none;}
</style>
<script type="text/javascript">
var filePathNameExt = ''; // путь\имя.расширение текущего файла
var fileNameExt = ''; // имя.расширение текущего файла
var fileName = ''; // имя текущего файла
var fileExt = ''; // расширение текущего файла
var oXML; // объект, хранящий содержимое текущего XML файла
var text = ''; // текст преобразованного файла
var msxml_version = ''; // версия Microsoft Core XML Services (MSXML)
var ED, reportID; // атрибуты УФЭБС документа
var script_path = unescape(document.URL).replace(/^file:\/\/(.+?)[^\\]+$/, '$1'); // путь к данному скрипту
// Чтение ini-файла в объект INI
var INI = ReadINIFile(script_path + "\\UFEBS_Viewer.ini");
// Чтение ini файла в объект со свойствами идентичными именам ключей
function ReadINIFile(ini_file) {
var oINI = {};
var FSO = new ActiveXObject("Scripting.FileSystemObject");
if ((FSO.FileExists(ini_file)) && (FSO.GetFile(ini_file).Size > 0)) {
with (FSO.OpenTextFile(ini_file)) {
var text = ReadAll();
Close();
}
var arr_lines = text.match(/[^\r\n]+/g);
var section, param, value;
for(var i = 0, line; line = arr_lines[i++];) {
line = line.replace(/^\s*/, '').replace(/\s*$/, '');
if (!/^[;#]/.test(line)) { // comment
if (/^\[(.+)\]/.test(line)) { // section
section = RegExp.$1;
if ((section) && (!oINI[section])) oINI[section] = {};
}
else if (/^(.+?)\s*=\s*(.+)/.test(line)){ // param=value
param = RegExp.$1;
value = RegExp.$2;
oINI[section][param] = value;
}
}
}
}
return oINI;
}
// Инициализируем самую последнюю доступную версию Microsoft Core XML Services (MSXML)
function MSXML_Init() {
var vers = ['4.0', '5.0', '6.0'];
for (var i = 0; i < vers.length; i++) {
try {
var msxml = new ActiveXObject('Msxml2.DOMDocument.'+vers[i]);
msxml_version = vers[i];
return msxml;
}
catch (e) {}
}
alert("Продолжение работы невозможно!\nУстановите MSXML 4.0 или более поздней версии.");
window.open("http://www.microsoft.com/downloads/ru-ru/details.aspx?FamilyID=d21c292c-368b-4ce1-9dab-3e9827b70604");
self.close();
}
// Связывание программы с xml файлами
function SetFileAssociation(){
var WshShell = new ActiveXObject("WScript.Shell");
var xml_viever_cmd = 'mshta.exe "' + unescape(document.URL).replace(/^file:\/\/(.+)$/, '$1') + '" "%1"';
var fclass = '';
var cmd = '';
try {
fclass = WshShell.RegRead('HKCR\\.'+fileExt+'\\');
cmd = WshShell.RegRead('HKCR\\'+fclass+'\\shell\\UFEBS_Viewer\\command\\');
} catch(e) {}
if (cmd != xml_viever_cmd) {
if (WshShell.Popup('Добавить в контестное меню '+fileExt.toUpperCase()+' файлов пункт "UFEBS Viewer"?', 0, "Установка ассоциаций", 36) == 6) {
if (fclass) {
WshShell.RegWrite('HKCR\\'+fclass+'\\shell\\UFEBS_Viewer\\command\\', xml_viever_cmd);
} else {
WshShell.RegWrite('HKCR\\.'+fileExt+'\\', 'UFEBSfile');
WshShell.RegWrite('HKCR\\UFEBSfile\\', 'Файл УФЭБС');
WshShell.RegWrite('HKCR\\UFEBSfile\\DefaultIcon\\', 'msxml3.dll,0');
WshShell.RegWrite('HKCR\\UFEBSfile\\shell\\UFEBS_Viewer\\command\\', xml_viever_cmd);
}
}
}
// Создание ярлыка в контекстном меню "Отправить"
with (WshShell.CreateShortcut(WshShell.SpecialFolders("SendTo") + "\\UFEBS Viewer.lnk")){
TargetPath = 'mshta.exe';
Arguments = unescape(document.URL).replace(/^file:\/\/(.+)$/, '$1');
IconLocation = 'msxml3.dll';
Description = "Просмотр файлов УФЭБС";
Save();
}
}
// Разбор полного имени файла по составляющим
function GetFileName(){
var FSO = new ActiveXObject("Scripting.FileSystemObject");
var file = FSO.GetFile(filePathNameExt);
fileNameExt = file.Name;
fileExt = fileNameExt.replace(/^.*\./, '');
fileName = fileNameExt.replace(/\..*?$/, '');
}
// Диалог выбора имени файла
// Присваивает глобальной переменной filePathNameExt полный путь к выбранному файлу.
function DialogOpenFile() {
var dialog = '<object id="HtmlDlgHelper" width=0 height=0 classid="clsid:3050F4E1-98B5-11CF-BB82-00AA00BDCE0B"></object>';
document.body.insertAdjacentHTML('beforeEnd', dialog);
var fname = HtmlDlgHelper.OpenFileDlg("","","XML-документы (*.xml)|*.xml|Все файлы (*.*)|*.*|", "Открытие документа УФЭБС");
HtmlDlgHelper.outerHTML = '';
if (!fname) self.close(); // при отказе от выбора закрываем приложение
return fname;
}
// Диалог выбора папки для сохранения файла
function DialogBrowseForFolder(msg_text) {
with (new ActiveXObject("Shell.Application")){
var objFolder = BrowseForFolder(0, msg_text, 0);
}
if (objFolder) return objFolder.Self.Path + '\\';
}
// Cохранение файла
function Save(out_fname, out_text){
var FSO = new ActiveXObject("Scripting.FileSystemObject");
with (FSO.OpenTextFile(out_fname, 2, true)) {
Write(out_text);
Close();
}
}
// Обработка нажатий на клавиши
function OnKeyDown(){
var folder_path, file, msg_text;
switch(event.keyCode){
case 27: // Esc
self.close();
break;
case 112: // F1
idHelp.style.display = "";
setTimeout('idHelp.style.display="none"', 4000); // через 4 секунды скрываем подсказку
break;
case 113: // F2
filePathNameExt = DialogOpenFile();
GetFileName();
LoadXMLFile();
break;
case 116: // F5
file = fileName + '.txt';
msg_text = "Выберите папку для сохранения файла " + file;
folder_path = DialogBrowseForFolder(msg_text);
if (folder_path) Save(folder_path + file, text);
event.returnValue = false; // отключаем перезагрузку страницы по F5
break;
case 117: // F6
file = fileName + '.xml';
msg_text = "Выберите папку для сохранения файла " + file;
folder_path = DialogBrowseForFolder(msg_text);
if (folder_path) oXML.save(folder_path + file);
break;
case 118: // F7
Print();
break;
case 121: // F10
SetFileAssociation();
break;
}
}
// Печать документа
function Print(auto){
// устанавливаем дополнительные параметры стиля печати в зависимости от типа документа
var add_style = 'font:bold ';
switch(ED){
case 'ED219':
switch(reportID){
case '0401301': // ответ на ED218 (запрос выходной формы)
add_style += '9px;'
break;
case '0401318': // ежемесячный счет за услуги РЦИ
add_style += '8px; writing-mode:tb-rl;'
break;
default:
add_style += '12px;'
}
break;
case 'ED243':
add_style += '14px;'
break;
case 'ED211':
add_style += '9px;'
break;
default:
add_style += '12px;'
}
document.styleSheets[1].addRule('#idPRE', add_style);
if (auto) setTimeout('with(new ActiveXObject("WScript.Shell")){SendKeys("{ENTER}")}', 6000);
window.print();
}
// Загрузка XML документа
function LoadXMLFile(){
oXML = MSXML_Init();
oXML.async = false;
oXML.load (filePathNameExt);
var err = oXML.parseError;
if (err.errorCode) {
alert("Ошибка в XML документе!");
} else {
var obj64 = oXML.getElementsByTagName("sen:Object")[0];
if (obj64) {
with (oXML.createElement("tmp")) {
dataType = "bin.base64";
text = obj64.text;
oXML.load(nodeTypedValue);
}
}
if (!oXML.documentElement) {
var WshShell = new ActiveXObject("WScript.Shell");
var msg = fileNameExt + '\nне является корректным файлом УФЭБС!\n(возможно файл зашифрован)';
WshShell.Popup(msg, 0, "UFEBS Viewer", 48);
self.close();
}
with (oXML.documentElement) {
ED = nodeName;
reportID = getAttribute("ReportID");
}
document.title = (obj64 ? '[base64 :: ' : '[') + ED + ' :: ' + fileNameExt + ' :: MSXML ' + msxml_version + '] - ' + idUFEBS_Viewer.applicationName + ' v.' + idUFEBS_Viewer.version;
var oXSLT = MSXML_Init();
oXSLT.async = false;
oXSLT.setProperty ("AllowXsltScript", true);
oXSLT.load ("forms.xslt");
with (oXML.documentElement) {
if (INI.Info.BIC) setAttribute('InfoBIC', INI.Info.BIC);
if (INI.Info.RKC) setAttribute('InfoRKC', INI.Info.RKC);
if (INI.Info.BANK) setAttribute('InfoBANK', INI.Info.BANK);
}
text = oXML.transformNode(oXSLT);
idPRE.innerText = text;
with (oXML.documentElement) {
removeAttribute('InfoBIC');
removeAttribute('InfoRKC');
removeAttribute('InfoBANK');
}
}
}
// Действия при старте программы
function on_load(){
// Проверка наличия в массиве ком.строки указанного ключа key
function IsKey (arr, key){
for(var i = 1, arg; arg = arr[i++];) {
if (arg.toLowerCase() == key) return arr[i] ? arr[i] : true;
}
}
// парсинг командной строки
var cmdline = idUFEBS_Viewer.commandLine;
var arr_cmd = cmdline.match(/[^" ]+|"[^"]+?"/g);
var fname = arr_cmd[1] ? arr_cmd[1].replace(/"/g, '') : '';
var isPrint = IsKey(arr_cmd, '/print');
var isSaveText = IsKey(arr_cmd, '/savetext');
var isSaveXML = IsKey(arr_cmd, '/savexml');
var isClose = IsKey(arr_cmd, '/close');
var isHelp = IsKey(arr_cmd, '/help') || IsKey(arr_cmd, '/?');
if (isHelp) {
var WshShell = new ActiveXObject("WScript.Shell");
var msg = 'Ключи командной строки:\n';
msg += ' /Print\t\t- печать файла\n /SaveText DIR\t- сохранить как текст в папке DIR\n /SaveXML DIR\t- сохранить как xml в папке DIR\n /Close\t- закрыть программу через 10 сек\n /help или /?\t- эта подсказка';
WshShell.Popup(msg, 0, "UFEBS Viewer", 64);
self.close();
}
filePathNameExt = fname ? fname : DialogOpenFile();
GetFileName();
document.title = idUFEBS_Viewer.applicationName.replace(/_/g,' ') + ' v.' + idUFEBS_Viewer.version;
LoadXMLFile(isSaveXML); // загрузка XML документа
setTimeout('idHelp.style.display="none"', 2000); // через 2 секунды скрываем подсказку
if (typeof(isSaveXML)=='string') oXML.save(isSaveXML + '\\' + fileName + '.xml');
if (typeof(isSaveText)=='string') Save(isSaveText + '\\' + fileName + '.txt', text);
if (isPrint) Print(true);
if (isClose) setTimeout('close()', 10000);
}
</script>
</head>
<body onload="on_load()" onkeydown="OnKeyDown();">
<pre id="idPRE"></pre>
<div id="idHelp" class="help">
<table class="help">
<tr><td class="key"> Esc<td class="text"> Выход из программы
<tr><td class="key"> F1<td class="text"> Эта подсказка
<tr><td class="key"> F2<td class="text"> Открыть файл
<tr><td class="key"> F5<td class="text"> Сохранить в TXT файл
<tr><td class="key"> F6<td class="text"> Сохранить в XML файл
<tr><td class="key"> F7<td class="text"> Печать
<tr><td class="key"> F10<td class="text"> Ассоциировать программу с файлом
</table>
</div>
</body>
</html>