suwell_ofdReader.js 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111
  1. (function (w) {
  2. /*
  3. * 方法和控件方法的映射. 一般来说,名称相同.key为js的方法名称;
  4. * value中,real为控件的方法名,如果省略,则认为和js的方法相同.args为控件中该方法接受的参数名称
  5. */
  6. w._METHOD = {
  7. // 3.2.1 设置元素可用性
  8. "setCompsiteEnable": {
  9. args: ["cmpName", "isEnable"]
  10. },
  11. // 3.2.2 设置元素可见性
  12. "setCompsiteVisible": {
  13. args: ["cmpName", "isVisible"]
  14. },
  15. // 兼容四院要求
  16. "setCompositeVisible": {
  17. real: "setCompsiteVisible",
  18. args: ["cmpName", "isVisible"]
  19. },
  20. // 3.2.3 设置插件的背景
  21. "setBackGroundInfo": {
  22. args: ["config"]
  23. },
  24. // 3.2.4 设置插件的前景
  25. "setForeGroundInfo": {
  26. args: ["config"]
  27. },
  28. // 3.2.5 设置视图缩放率
  29. "setScale": {
  30. args: ["scale"]
  31. },
  32. // (兼容原有版本)
  33. "setZoomRadio": {
  34. args: ["scale"]
  35. },
  36. // (兼容原有版本)
  37. "getZoomRadio": {
  38. args: []
  39. },
  40. // 3.2.6 设置多文档模式
  41. "setSingleMode": {
  42. args: ["mode"]
  43. },
  44. // 3.2.7 设置阅读器模式
  45. "setReaderMode": {
  46. args: ["mode"]
  47. },
  48. // 3.2.8 设置视图首选项
  49. "setViewPreference": {
  50. args: ["key", "value"]
  51. },
  52. // 3.2.8 设置导航栏不能移动
  53. "setToolbarMovable": {
  54. args: ["value"]
  55. },
  56. // 3.2.9 设置回调函数.已不推荐使用)
  57. "setCallback": {
  58. args: ["name", "func", "after"]
  59. },
  60. // 3.2.9 设置回调函数
  61. "registListener": {
  62. args: ["name", "func", "after"]
  63. },
  64. // 3.2.9 设置回调函数.移除监听
  65. "unRegistListener": {
  66. args: ["listenerID"]
  67. },
  68. // 3.2.10 设置剪贴板模式
  69. "setClipMode": {
  70. args: ["mode"]
  71. },
  72. // 3.2.11 设置掩膜生效模式
  73. "setMaskMode": {
  74. args: ["mode"]
  75. },
  76. // 3.3.1 设置用户信息
  77. "setUserInfo": {
  78. args: ["userInfo"]
  79. },
  80. // 3.3.1 设置用户信息.设置当前用户名
  81. "setUserName": {
  82. args: ["name"]
  83. },
  84. // 3.3.1 设置用户信息.获取当前用户名
  85. "getUserName": {
  86. args: []
  87. },
  88. // 3.3.1 设置用户信息.设置用户ID。
  89. "setUserID": {
  90. args: ["id"]
  91. },
  92. "setDataTag": {
  93. args: ["dataTage"]
  94. },
  95. //获取当前用户标识
  96. "getUserID": {
  97. args: []
  98. },
  99. // 设置登录身份标识
  100. "setUserToken": {
  101. args: ["sessionId"]
  102. },
  103. //设置当前用户会话标识
  104. "setCookie": {
  105. args: ["sessionId"]
  106. },
  107. // 3.3.2 设置文档信息
  108. "setDocInfo": {
  109. args: ["docInfo"]
  110. },
  111. // 3.3.2 设置文档信息.设置元数据.
  112. "setMetaData": {
  113. args: ["id", "val"]
  114. },
  115. // 3.3.2 设置文档信息.获取元数据。
  116. "getMetaData": {
  117. args: ["id"]
  118. },
  119. // 3.3.3 设置权限信息
  120. "setRightInfo": {
  121. args: ["rightInfo"]
  122. },
  123. // 3.3.4 设置追踪水印
  124. "setBarcodeInfo": {
  125. args: ["param"]
  126. },
  127. // 3.3.4 添加追踪水印
  128. "addTrackInfo": {
  129. args: ["param"]
  130. },
  131. // 3.3.4 清除所有水印。
  132. "clearTrackInfo": {
  133. args: []
  134. },
  135. // 3.3.5 高亮关键词
  136. "addDynamicLink": {
  137. args: ["key", "url", "color"]
  138. },
  139. // 3.3.5 清除所有高亮关键词
  140. "clearDynamicLink": {
  141. args: []
  142. },
  143. // 3.3.6 获取日志文件地址
  144. "getLogFilePath": {
  145. args: []
  146. },
  147. // 3.3.7 设置服务地址
  148. "setServiceAddr": {
  149. args: ["key", "url"]
  150. },
  151. // 设置内容服务地址
  152. "setContentSvrAddr": {
  153. args: ["url"]
  154. },
  155. // 设置转换服务地址
  156. "setConvertSvrAddr": {
  157. args: ["url"]
  158. },
  159. //设置注册服务地址
  160. "setRegistSvrAddr": {
  161. args: ["url"]
  162. },
  163. //设置封装服务地址
  164. "setEnvelopSvrAddr": {
  165. real: "setEncryptSvrAddr",
  166. args: ["url"]
  167. },
  168. //设置日志服务地址
  169. "setLogSvrAddr": {
  170. args: ["url"]
  171. },
  172. //更新阅读器下载地址
  173. "setUpdateSvrAddr": {
  174. args: ["url"]
  175. },
  176. //3.3.8 设置代理菜单项
  177. "setSendtoInfo": {
  178. args: ["sendtoXML"]
  179. },
  180. //3.3.9 设置配置信息项
  181. "setConfigInfo": {
  182. args: ["configKey", "configValue"]
  183. },
  184. // 设置最大可打印份数
  185. "setPrintCopies": {
  186. args: ["number"]
  187. },
  188. //设置可使用打印机名
  189. "setPrinterName": {
  190. args: ["printer"]
  191. },
  192. //设置可使用打印分辨率
  193. "setPrintResolution": {
  194. args: ["printDpi"]
  195. },
  196. // 3.4.1 设置内容(兼容老版本,已不推荐使用)
  197. "setEDFContent": {
  198. args: ["content"]
  199. },
  200. // 3.4.2 获取内容(兼容老版本,已不推荐使用)
  201. "getEDFContent": {
  202. args: []
  203. },
  204. // 3.4.3 获取语义内容
  205. "getTaggedText": {
  206. args: ["fieldId"]
  207. },
  208. // 3.4.4 获取语义位置
  209. "getTaggedPosition": {
  210. args: ["fieldId"]
  211. },
  212. // 3.4.5 获取全文文本内容
  213. "getDocumentText": {
  214. args: []
  215. },
  216. // 3.4.6 获取打开文档的页数
  217. "getPageCount": {
  218. args: []
  219. },
  220. //3.4.7设置监视并清空剪切板
  221. "setClipboardMonitor": {
  222. args: ["bMonitor"]
  223. },
  224. //3.4.8 火狐关闭网页有弹出对话框崩溃的解决
  225. "closeFireFox": {
  226. args: [""]
  227. },
  228. // 3.5.1 打开文件
  229. "openFile": {
  230. real: "openFile2",
  231. args: ["path", "readeOnly"]
  232. },
  233. "openurl": {
  234. args: ["open_url", "save_url", "readeOnly"]
  235. },
  236. // 3.5.2 打开内容服务文件
  237. "openFileOld": {
  238. real: "openFile",
  239. args: ["path"]
  240. },
  241. // 3.5.2 打开内容服务文件
  242. "openSvcFile": {
  243. args: ["svcAddr", "docId"]
  244. },
  245. // 3.5.3 保存文件
  246. "saveFile": {
  247. args: ["filename"]
  248. },
  249. // 3.5.4 下载安全文件
  250. "downloadFile": {
  251. args: ["filename", "param"]
  252. },
  253. // 3.5.5 打印文件
  254. "printFileCopies": {
  255. args: ["copies"]
  256. },
  257. // 3.5.5 打印文件
  258. "printFile": {
  259. real: "printFile3",
  260. args: ["docName", "bGrayPrint"]
  261. },
  262. // 3.5.5 关闭文件
  263. "closeFile": {
  264. args: []
  265. },
  266. // 3.5.7 转换文件
  267. "convertFile": {
  268. args: ["srcpath", "destFile", "metaContent"]
  269. },
  270. // 3.5.8 执行拷贝
  271. "editCopy": {
  272. args: []
  273. },
  274. // 3.5.9 执行粘贴
  275. "editPaste": {
  276. args: []
  277. },
  278. // 3.5.10 模拟点击
  279. "performClick": {
  280. args: ["commandId"]
  281. },
  282. // 3.5.11 添加注释
  283. "addPageAnnot": {
  284. args: ["type", "index", "xPos", "yPos", "width", "height", "parms"]
  285. },
  286. // 3.5.12 执行跳转
  287. "gotoDest": {
  288. args: ["pageIndex", "xpost", "ypost"]
  289. },
  290. // 3.5.13 执行操作
  291. "excuteOperation": {
  292. args: ["commandXML"]
  293. },
  294. // 3.5.14 导入语义模板
  295. "importSinemaTemp": {
  296. args: ["param"]
  297. },
  298. //3.5.15 验证签名
  299. "validSignature": {
  300. args: ["online", "signIds"]
  301. },
  302. "version": {
  303. args: []
  304. },
  305. //3.5.6设置远程打开文件的临时文件模式
  306. "setEncryptTempFile": {
  307. args: ["bEncrypt"]
  308. },
  309. "readerFullScreen": {
  310. args: []
  311. },
  312. //3.6.1 异步下载接口
  313. "downloadHttpFile": {
  314. args: ["url", "localFileName", "md5"]
  315. },
  316. //3.6.2 删除本地文件接口
  317. "deleteLocalFile": {
  318. args: ["localFileName"]
  319. },
  320. //3.6.3上传本地文件接口
  321. "uploadLocalFile": {
  322. args: ["url", "localFileName"]
  323. },
  324. //3.5.22查找文本接口
  325. "searchText": {
  326. args: ["keyword", "bCaseSensitive", "bWholeWord", "bForward"]
  327. },
  328. //1.2.23清空所有注释
  329. "clearHandwrittenAnnotation": {
  330. args: []
  331. },
  332. //设置退出按钮是否生效
  333. "setExit": {
  334. args: ["isExit"]
  335. },
  336. //3.3.10保存配置信息项
  337. "saveConfigInfoToIni": {
  338. args: ["tag", "tagVal"]
  339. },
  340. //3.3.11设置用户User Agent标示
  341. "setUserAgent": {
  342. args: ["url"]
  343. },
  344. //3.1.2退出插件及阅读器
  345. "exit": {
  346. args: []
  347. },
  348. "addWaterMakerAnnot": {
  349. args: ["watermaker"]
  350. },
  351. "delWaterMakerAnnot": {
  352. args: ["userid", "isall"]
  353. }
  354. },
  355. /*
  356. * 初始化时需要隐藏的
  357. */
  358. w._HIDDEN = ["menu"]
  359. })(this);
  360. var OFD = (function (_w) {
  361. /*
  362. * 常量
  363. */
  364. var Constant = {
  365. // CLSID
  366. CLSID: "C7F277DC-6C47-AB2C-FB6A-070DC8BE7533",
  367. // 控件的注册名
  368. ACTIVE_NAME_OLD: "suwellreaderax.SuwellOfdActiveX",
  369. ACTIVE_NAME: "suwellreaderax.OFDReaderActiveX",
  370. // 嵌入类型
  371. EMBED_TYPE: "application/ofd",
  372. // 随机字符种子
  373. RANDOM_SEED: "0123456789qwertyuioplkjhgfdsazxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM"
  374. };
  375. var Method = {
  376. // 控件组件的显示或隐藏
  377. "setCompsiteVisible": {
  378. args: ["name", "visible"]
  379. },
  380. // 兼容旧版
  381. "setCompositeVisible": {
  382. real: "setCompsiteVisible",
  383. args: ["name", "visible"]
  384. },
  385. // 打文件(包括本地和远程)
  386. "openFile": {
  387. args: ["path", "readOnly"]
  388. },
  389. // 关闭当前文件
  390. "closeFile": {
  391. args: []
  392. }
  393. };
  394. /*
  395. * 一些简单的css
  396. */
  397. var CSS = {
  398. info: "margin: 10px 0px; padding: 12px; border-radius:10px; color: #00529B; background-color: #BDE5F8;",
  399. success: "margin: 10px 0px; padding: 12px; border-radius:10px; color: #4F8A10; background-color: #DFF2BF;",
  400. warn: "margin: 10px 0px; padding: 12px; border-radius:10px; color: #9F6000; background-color: #FEEFB3;",
  401. error: "margin: 10px 0px; padding: 12px; border-radius:10px; color: #D8000C; background-color: #FFBABA;"
  402. };
  403. /*
  404. * 工具
  405. */
  406. var Tool = {
  407. // 合并对象
  408. extend: function (defs, target) {
  409. var r = target;
  410. if (this.isNull(r)) {
  411. if (this.isArray(defs)) {
  412. r = [];
  413. } else {
  414. r = {};
  415. }
  416. }
  417. this.each(defs, function (n, v) {
  418. if (!(n in r)) {
  419. r[n] = v;
  420. }
  421. });
  422. return r;
  423. },
  424. // 判断参数是否是数组
  425. isArray: function (v) {
  426. return Object.prototype.toString.call(v) === "[object Array]";
  427. },
  428. // 判断是否为纯粹对象,like jquery.isPlainObject
  429. isPlainObject: function (v) {
  430. if (!v || v.toString() !== "[object Object]" || v.nodeType
  431. || "setInterval" in v) {
  432. return false;
  433. }
  434. try {
  435. if (v.constructor
  436. && !v.hasOwnProperty("constructor")
  437. && !v.constructor.prototype
  438. .hasOwnProperty("isPrototypeOf")) {
  439. return false;
  440. }
  441. } catch (e) {
  442. return false;
  443. }
  444. var key;
  445. for (key in v) {
  446. }
  447. return key === undefined || v.hasOwnProperty(key);
  448. },
  449. // 判断参数是否是undefined或null
  450. isNull: function (v) {
  451. return typeof v == "undefined" || (v != 0 && !v);
  452. },
  453. // 判断参数是有有效值
  454. isValid: function (v) {
  455. return this.isNull(v) !== true;
  456. },
  457. // getElementById
  458. _$: function (id) {
  459. return document.getElementById(id);
  460. },
  461. // createElement
  462. _new: function (tag) {
  463. return document.createElement(tag);
  464. },
  465. // for-each like jquery
  466. each: function (o, fn) {
  467. if (this.isNull(o)) {
  468. return o;
  469. }
  470. if (this.isArray(o)) {
  471. for (var i = 0, ol = o.length, val = o[0]; i < ol
  472. && fn.call(val, i, val) !== false; val = o[++i]) {
  473. }
  474. } else {
  475. for (var i in o) {
  476. if (fn.call(o[i], i, o[i]) === false) {
  477. break;
  478. }
  479. }
  480. }
  481. return o;
  482. },
  483. // 对字符串进行转义
  484. escape: function (s) {
  485. return ('' + s).replace(/["'\\\n\r\u2028\u2029]/g, function (
  486. character) {
  487. // http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.4
  488. switch (character) {
  489. case '"':
  490. case "'":
  491. case '\\':
  492. return '\\' + character
  493. case '\n':
  494. return '\\n'
  495. case '\r':
  496. return '\\r'
  497. case '\u2028':
  498. return '\\u2028'
  499. case '\u2029':
  500. return '\\u2029'
  501. }
  502. });
  503. },
  504. /*
  505. * 浏览器类型判断 http://
  506. * stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser
  507. */
  508. Browser: {
  509. // Opera 8.0+ (UA detection to detect Blink/v8-powered Opera)
  510. isOpera: function () {
  511. return !!window.opera
  512. || navigator.userAgent.indexOf(' OPR/') >= 0;
  513. },
  514. // Firefox 1.0+
  515. isFirefox: function () {
  516. return typeof InstallTrigger !== 'undefined';
  517. },
  518. // At least Safari 3+: "[object HTMLElementConstructor]"
  519. isSafari: function () {
  520. return Object.prototype.toString.call(window.HTMLElement)
  521. .indexOf('Constructor') > 0;
  522. },
  523. // Chrome 1+
  524. isChrome: function () {
  525. return !!window.chrome && !this.isOpera();
  526. },
  527. // IE6-11
  528. isIE: function () {// At least IE6
  529. // 此处防止编辑器把正则误认为注释而出现问题
  530. return eval('/*@cc_on!@*/false || !!document.documentMode');
  531. }
  532. },
  533. /*
  534. * 系统和浏览器位数
  535. */
  536. Bit: {
  537. // 操作系统位数
  538. os: function () {
  539. var agent = navigator.userAgent;
  540. var isX64OS = agent.indexOf("WOW64") != -1
  541. || agent.indexOf("Win64") != -1;
  542. return isX64OS ? 64 : 32;
  543. },
  544. // ie的位数
  545. ie: function () {
  546. var agent = navigator.userAgent;
  547. var o = OFD.Bit.os;
  548. var isX64IE = (o == 64) && agent.indexOf("MSIE") != -1
  549. && agent.indexOf("x64") != -1;
  550. return isX64IE ? 64 : 32;
  551. }
  552. },
  553. /*
  554. * 页面方法
  555. */
  556. Page: {
  557. // 获取窗口宽度
  558. width: function () {
  559. var w = 0;
  560. if (window.innerWidth) {
  561. w = window.innerWidth;
  562. } else if ((document.body) && (document.body.clientWidth)) {
  563. w = document.body.clientWidth;
  564. }
  565. // 通过深入Document内部对body进行检测,获取窗口大小
  566. if (document.documentElement
  567. && document.documentElement.clientHeight
  568. && document.documentElement.clientWidth) {
  569. w = document.documentElement.clientWidth;
  570. }
  571. return w;
  572. },
  573. // 获取窗口高度
  574. height: function () {
  575. var h = 0;
  576. if (window.innerHeight) {
  577. h = window.innerHeight;
  578. } else if ((document.body) && (document.body.clientHeight)) {
  579. h = document.body.clientHeight;
  580. }
  581. // 通过深入Document内部对body进行检测,获取窗口大小
  582. if (document.documentElement
  583. && document.documentElement.clientHeight
  584. && document.documentElement.clientWidth) {
  585. h = document.documentElement.clientHeight;
  586. }
  587. return h;
  588. }
  589. }
  590. };
  591. var _Private = function (reader, config) {
  592. // reader对象本身
  593. this.reader = reader;
  594. // object的id
  595. this.id;
  596. // 控件对象
  597. this.obj;
  598. // 配置
  599. this.cfg = Tool
  600. .extend(
  601. // 合并配置
  602. {
  603. // 容纳控件的div的id
  604. div: undefined,
  605. // 控件宽度
  606. width: "auto",
  607. // 控件高度
  608. height: "auto",
  609. // 组件初始化时的状态
  610. compsite: {
  611. // 显示的控件
  612. show: [],
  613. // 隐藏的控件
  614. hide: []
  615. },
  616. // 控件安装程序的下载路径
  617. // downURL : undefined,
  618. downURL: "http://localhost:8080/cpcns-content-server/installer/SuwellReader_Pro_2.0_setup_windows_i386.exe",
  619. // 是否检查控件已经安装
  620. checkInstalled: false,
  621. // 是否在未给定容纳控件的div时自动新建
  622. autoNewDiv: false,
  623. // codebase
  624. codebase: undefined
  625. }, config);
  626. if (_w._HIDDEN) {// 如果没有设置,则使用默认的隐藏
  627. var h = this.cfg.compsite.hide;
  628. if (h == undefined || h.length == 0) {
  629. this.cfg.compsite.hide = _w._HIDDEN;
  630. }
  631. }
  632. // 缓存未完成的操作,key为函数名称,value为每次操作的参数的数组
  633. this.operates = {
  634. // openFile : [ [ "doc1" ], [ "doc2" ] ]
  635. };
  636. // ready后的回调函数
  637. this.callback = [];
  638. /*
  639. * 缓存操作
  640. */
  641. this.cache = function (fnName, fnArgs) {
  642. var o = this.operates[fnName];
  643. if (Tool.isNull(o)) {
  644. o = new Array();
  645. this.operates[fnName] = o;
  646. }
  647. o.push(fnArgs);
  648. };
  649. /*
  650. * 生成随机串
  651. */
  652. this.randomText = function (length) {
  653. var x = Constant.RANDOM_SEED;
  654. var s = "";
  655. for (var i = 0; i < length; i++) {
  656. s += x.charAt(Math.ceil(Math.random() * 100000000) % x.length);
  657. }
  658. return s;
  659. };
  660. /*
  661. * 写出HTML信息
  662. */
  663. this.message = function (html, level) {
  664. var div = Tool._$(this.cfg.div);
  665. if (Tool.isValid(div)) {
  666. if (Tool.isNull(level)) {
  667. level = "error";
  668. }
  669. if (level == "none") {
  670. div.innerHTML = html;
  671. } else {
  672. div.innerHTML = "<span style='" + CSS[level] + "'>" + html
  673. + "</span>";
  674. }
  675. } else {
  676. alert(html);
  677. }
  678. };
  679. /*
  680. * 判断组件是否已经安装
  681. */
  682. this.checkComponent = function () {
  683. // alert("判断组件是否已经安装");
  684. if (Tool.Browser.isIE()) {
  685. return this.hasActiveX();
  686. } else if (Tool.Browser.isFirefox()) {
  687. return this.hasEmbed();
  688. } else if (Tool.Browser.isChrome()) {
  689. return this.hasEmbed();
  690. }
  691. return "不支持的浏览器类型";
  692. }
  693. /*
  694. * 判断Firefox是否已经安装了OFD控件
  695. */
  696. this.hasEmbed = function () {
  697. var version = navigator.plugins['Suwell Reader Plugin'];
  698. if (typeof (version) == "undefined") {
  699. var html = "OFD阅读控件没有正确安装,请下载安装!";
  700. if (Tool.isValid(this.cfg.downURL)) {
  701. html += "<a href='"//
  702. + this.cfg.downURL //
  703. + "' target='_blank'>&gt;&gt;&gt;&gt;&nbsp;&nbsp;下载&nbsp;&nbsp;&lt;&lt;&lt;&lt;</a>";
  704. }
  705. // html +=
  706. // "<br>由于安装程序会更改IE的安全设置并注册dll文件,安全软件可能会弹出安全警告,允许本软件继续即可。<br>建议使用管理员权限运行本软件。";
  707. this.message(html, "warn");
  708. return false;
  709. } else {
  710. return true;
  711. }
  712. }
  713. /*
  714. * 判断IE是否安装了OFD控件
  715. */
  716. this.hasActiveX = function () {
  717. // alert("判断是否安装了ofd插件");
  718. if ("ActiveXObject" in window) {// 判断是否IE
  719. if (this.cfg.checkInstalled !== true) {
  720. return true;
  721. }
  722. try {// 判断是否安装OFD阅读器
  723. var axo = new ActiveXObject(Constant.ACTIVE_NAME);
  724. return true;
  725. } catch (e) {
  726. try {// 判断是否安装OFD阅读器
  727. var axo = new ActiveXObject(Constant.ACTIVE_NAME_OLD);
  728. return true;
  729. } catch (e) {
  730. var html = "OFD阅读控件没有正确安装,请下载安装!";
  731. if (Tool.isValid(this.cfg.downURL)) {
  732. html += "<a href='"//
  733. + this.cfg.downURL //
  734. + "' target='_blank'>&gt;&gt;&gt;&gt;&nbsp;&nbsp;下载&nbsp;&nbsp;&lt;&lt;&lt;&lt;</a>";
  735. }
  736. // html +=
  737. // "<br>由于安装程序会更改IE的安全设置并注册dll文件,安全软件可能会弹出安全警告,允许本软件继续即可。<br>建议使用管理员权限运行本软件。";
  738. this.message(html, "warn");
  739. }
  740. }
  741. } else {
  742. this.message("无法显示ActiveX控件,请使用IE访问", "warn");
  743. }
  744. return false;
  745. };
  746. /*
  747. * 输出控件的HTML
  748. */
  749. this.write = function () {
  750. var w = this.cfg.width;
  751. if (Tool.isNull(w) || w == "auto") {
  752. w = "100%";
  753. }
  754. var h = this.cfg.height;
  755. if (Tool.isNull(h) || h == "auto") {
  756. h = (Tool.Page.height() - 10) + "px";
  757. }
  758. if (Tool.Browser.isIE()) {
  759. this
  760. .message(
  761. "<object id='"
  762. + this.id // id
  763. + "' width='"
  764. + w// width
  765. + "' height='"
  766. + h// heigth
  767. + "' classid='CLSID:"
  768. + Constant.CLSID // clsid
  769. // + "' codebase='" + this.cfg.codebase
  770. // //
  771. // codebase,不使用cab时注释掉此行
  772. + "'><param name='object_id' value = '"
  773. + this.id
  774. + "'><param name='inited_call' value = '__OFD_OCX_Ready'><param name='object_width' value = '" + w
  775. + "'><param name='object_height' value = '" + h + "'> "
  776. + "</object>", "none");
  777. } else if (Tool.Browser.isFirefox()) {
  778. this.message("<embed id='" + this.id // id
  779. + "' width='" + w// width
  780. + "' height='" + h// heigth
  781. + "' type='" + Constant.EMBED_TYPE// type
  782. + "' object_id='" + this.id
  783. + "' wmode='transparent"
  784. + "' inited_call='__OFD_OCX_Ready"// callback
  785. + "' >", "none");
  786. } else if (Tool.Browser.isChrome()) {
  787. this.message("<embed id='" + this.id // id
  788. + "' width='" + w// width
  789. + "' height='" + h// heigth
  790. + "' type='" + Constant.EMBED_TYPE// type
  791. + "' object_id='" + this.id
  792. + "' wmode='transparent"
  793. + "' inited_call='__OFD_OCX_Ready"// callback
  794. + "' >", "none");
  795. } else {
  796. this.message("不支持的浏览器类型", "error");
  797. }
  798. };
  799. /*
  800. * 加载控件
  801. */
  802. this.load = function () {
  803. var rand = this.randomText(10);
  804. if (Tool.isNull(this.cfg.div)) {
  805. if (this.cfg.autoNewDiv === true) {
  806. // 新建一个div放置控件,并追加到body的最后
  807. var div = Tool._new("div");
  808. div.id = "ofd_div_" + rand;
  809. var body = document.body;
  810. if (Tool.isNull(body)) {
  811. this.message("请在onload中调用本方法", "warn");
  812. return;
  813. } else {
  814. body.appendChild(div);
  815. }
  816. this.cfg.div = div.id;
  817. } else {
  818. this.message("请指定一个div,以便写入控件!");
  819. return;
  820. }
  821. }
  822. var check = this.checkComponent();
  823. if (check === true) {
  824. this.message("正在加载控件,请稍候...", "info");
  825. this.id = "ofd_ocx_" + rand;
  826. this.write();
  827. } else if (check === false) {
  828. // alert("控制加载失败");
  829. // this.message("控件加载失败", "error");
  830. } else {
  831. this.message(check);
  832. }
  833. };
  834. /*
  835. * 加载配置,完成准备工作,只执行一次
  836. */
  837. this.ready = function () {
  838. if (this.reader.valid()) {// 已经初始化
  839. return;
  840. }
  841. var o = Tool._$(this.id);
  842. if (Tool.isNull(o)) {// 判断是否有对象
  843. this.message("控件未正确初始化!");
  844. return;
  845. }
  846. // 赋值,很重要
  847. this.obj = o;
  848. // private
  849. var T = this;
  850. // 控制初始化时的组件显示
  851. Tool.each(["show", "hide"], function (i, n) {
  852. var v = T.cfg.compsite[n];
  853. if (Tool.isValid(v) && v.length > 0) {
  854. reader.setCompsiteVisible(v, n == "show");
  855. }
  856. });
  857. // 加载完毕前的动作都执行一遍
  858. Tool.each(this.operates, function (n, v) {
  859. if (Tool.isArray(v) && v.length > 0) {
  860. var fn = T.reader[n];// 得到reader对象的函数
  861. if (fn) {// 如果正确,执行函数
  862. Tool.each(v, function (i, args) {
  863. try {
  864. fn.apply(T.reader, args);
  865. } catch (e) {
  866. }
  867. });
  868. } else {
  869. _log("Not found function " + n + " from Reader");
  870. }
  871. v.length = 0;// 清除缓存
  872. }
  873. });
  874. };
  875. }
  876. // 缓存所有的Reader对象,id为reader的id,value为private对象实例
  877. var _ = {};
  878. /*
  879. * 控件封装
  880. */
  881. function Reader(config) {
  882. // 构建私有
  883. var _p = new _Private(this, config);
  884. // 加载
  885. _p.load();
  886. // 控件的id
  887. this.id = _p.id;
  888. // 缓存
  889. _[this.id] = _p;
  890. // 当调用控件方法时回调
  891. this.onInvoke = function (fnName, fnRet) {
  892. };
  893. }
  894. /*
  895. * 检查组件是否准备完毕
  896. */
  897. Reader.prototype.valid = function () {
  898. return Tool.isValid(_[this.id].obj);
  899. };
  900. /*
  901. * 控件版本号
  902. */
  903. Reader.prototype.version = function () {
  904. var o = Tool._$(this.id);
  905. try {
  906. return o.version();
  907. } catch (e) {
  908. }
  909. return false;
  910. };
  911. // 遍历注册所有的方法
  912. Tool.each(Tool.isValid(_w._METHOD) ? _w._METHOD : Method, function (name,
  913. val) {
  914. Reader.prototype[name] = function () {
  915. // 方法名
  916. var n = val.real;
  917. if (Tool.isNull(n)) {
  918. n = name;
  919. }
  920. // 参数
  921. var l = val.args.length, al = arguments.length;
  922. if (l > al) {
  923. l = al;
  924. }
  925. var arg = [];
  926. for (var i = 0; i < l; i++) {
  927. arg[i] = arguments[i];
  928. }
  929. var _p = _[this.id];
  930. var T = this;
  931. // 返回值
  932. var result;
  933. if (this.valid()) {
  934. var o = _p.obj;
  935. if (Tool.isArray(arg[0])) {// 第一个参数是数组,拆开执行
  936. var A = arg.slice();// clone
  937. Tool.each(arg[0], function (i, v) {
  938. A[0] = v;
  939. result = doEval(T, o, n, A, val.ret);
  940. });
  941. } else {// 执行并返回值
  942. result = doEval(T, o, n, arg, val.ret);
  943. }
  944. } else {// 缓存操作
  945. _p.cache(name, arg);
  946. }
  947. var ret = val.ret;
  948. if (Tool.isNull(ret)) {
  949. return result;
  950. } else if (Tool.isFunction(ret)) {
  951. return ret.call(this, result);
  952. } else {
  953. return ret;
  954. }
  955. }
  956. });
  957. // 执行方法,并回调
  958. var doEval = function (reader, o, n, args) {
  959. var ret = _eval(o, n, args);
  960. if (reader.onInvoke) {
  961. try {
  962. // if (ret == undefined) {
  963. // reader.onInvoke.call(reader, n);
  964. // } else {
  965. reader.onInvoke.call(reader, n, ret);
  966. // }
  967. } catch (e) {
  968. _log("onInvoke " + n + " : " + e);
  969. }
  970. }
  971. return ret;
  972. }
  973. // 执行控件的方法
  974. var _eval = function (o, m, args) {
  975. var arg = "";
  976. Tool.each(args, function (i, v) {
  977. if (i > 0) {
  978. arg += ", ";
  979. }
  980. if (typeof (v) === "string") {
  981. arg += "\"" + Tool.escape(v) + "\"";
  982. } else {
  983. arg += v;
  984. }
  985. });
  986. try {
  987. return eval("o." + m + "(" + arg + ")");
  988. } catch (e) {
  989. _log("Eval " + m + " : " + e);
  990. }
  991. };
  992. // 记录日志
  993. var _log = function (msg) {
  994. window.console && console.log(msg);
  995. }
  996. // 缓存所有的定时结果
  997. var cache = {};
  998. return {// 防止外界的非法访问
  999. OCX: {
  1000. // 初始化一个控件
  1001. init: function (a) {
  1002. var config = {};
  1003. if (Tool.isPlainObject(a)) {
  1004. config = Tool.extend(config, a);
  1005. } else {
  1006. var name = ["div", "width", "height", "downURL"];
  1007. for (var i = 0; i < arguments.length; i++) {
  1008. if (i > name.length - 1) {
  1009. break;
  1010. }
  1011. var n = name[i], v = arguments[i];
  1012. if (Tool.isValid(v)) {
  1013. config[n] = arguments[i];
  1014. }
  1015. }
  1016. }
  1017. // 新对象
  1018. var r = new Reader(config);
  1019. // 尝试用版本号来确定是否已经加载
  1020. var T = this;
  1021. cache[r.id] = setInterval(function () {
  1022. if (r.version() !== false) {
  1023. T.ready(r.id);
  1024. }
  1025. }, 500);// 缓存起来
  1026. return r;
  1027. },
  1028. // 控件已准备好
  1029. ready: function (id) {
  1030. var _p = _[id];
  1031. if (Tool.isValid(_p)) {
  1032. _p.ready();
  1033. clearInterval(cache[id]);
  1034. _log("Reader is ready, version is " + _p.reader.version());
  1035. }
  1036. return _p;
  1037. }
  1038. }
  1039. }
  1040. })(this);// 立即执行函数,使其成为单例
  1041. var suwell = {};
  1042. // 加载并初始化阅读器OCX控件
  1043. var width;
  1044. var height;
  1045. suwell.ofdReaderInit = function (divID, width, height) {
  1046. this.width = width;
  1047. this.height = height;
  1048. return OFD.OCX.init(divID, width, height);
  1049. };
  1050. // 加载并初始化转换器OCX控件
  1051. suwell.ofdCreatorInit = function (divID, width, height) {
  1052. this.width = width;
  1053. this.height = height;
  1054. return OFD.OCX.init(divID, width, height);
  1055. };