diff --git a/carrental/宁达租车2024-05-22 09,24.zip b/carrental/宁达租车2024-05-22 09,24.zip
new file mode 100644
index 0000000..81d0e86
Binary files /dev/null and b/carrental/宁达租车2024-05-22 09,24.zip differ
diff --git a/oaassist/.gitignore b/oaassist/.gitignore
new file mode 100644
index 0000000..0076954
--- /dev/null
+++ b/oaassist/.gitignore
@@ -0,0 +1,2 @@
+# WPS加载项快速上手说明源文件忽略
+/WPS加载项快速上手说明/
\ No newline at end of file
diff --git a/oaassist/EtOAAssist/LICENSE b/oaassist/EtOAAssist/LICENSE
new file mode 100644
index 0000000..3417144
--- /dev/null
+++ b/oaassist/EtOAAssist/LICENSE
@@ -0,0 +1,25 @@
+
+Copyright @ 2012-2019, Kingsoft office,All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+3. Neither the name of the copyright holder nor the names of its
+contributors may be used to endorse or promote products derived from this
+software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/oaassist/EtOAAssist/README.md b/oaassist/EtOAAssist/README.md
new file mode 100644
index 0000000..490a26a
--- /dev/null
+++ b/oaassist/EtOAAssist/README.md
@@ -0,0 +1,19 @@
+## Welcome to ET OAAssist Demo
+
+### 这个项目是什么?
+
+这个工程为WPS表格项目一个简单的OA场景集成的WPS加载项——OA助手,旨在帮助大家能够快速理解并熟悉WPS加载项机制以及和浏览器调用交互的流程。
+
+### 工程结构
+
+* icon 图标文件。
+* js WPS 加载项功能逻辑的js代码。
+* index.html 加载项的默认加载页面。
+* ribbon.xml 自定义选项卡配置。
+
+### 注意事项
+
+* 本工程只是演示demo
+* 我们建议您结合具体的应用场景修改示例代码,这样更能够体现OA助手集成的应用场景
+* 为了保护代码,建议代码上线前进行混淆
+* 使用该工程的时候,必须要安装WPS专业版,请咨询QQ:3253920855
diff --git a/oaassist/EtOAAssist/icon/w_Save.png b/oaassist/EtOAAssist/icon/w_Save.png
new file mode 100644
index 0000000..edcd53a
Binary files /dev/null and b/oaassist/EtOAAssist/icon/w_Save.png differ
diff --git a/oaassist/EtOAAssist/icon/w_SaveAs.png b/oaassist/EtOAAssist/icon/w_SaveAs.png
new file mode 100644
index 0000000..a5fe456
Binary files /dev/null and b/oaassist/EtOAAssist/icon/w_SaveAs.png differ
diff --git a/oaassist/EtOAAssist/index.html b/oaassist/EtOAAssist/index.html
new file mode 100644
index 0000000..095b758
--- /dev/null
+++ b/oaassist/EtOAAssist/index.html
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/oaassist/EtOAAssist/js/common/common.js b/oaassist/EtOAAssist/js/common/common.js
new file mode 100644
index 0000000..7a13c95
--- /dev/null
+++ b/oaassist/EtOAAssist/js/common/common.js
@@ -0,0 +1,229 @@
+// -------------------------- 通用方法 ---------------------------
+//扩展js string endwith,startwith方法
+String.prototype.endWith = function (str) {
+ if (str == null || str == "" || this.length == 0 || str.length > this.length)
+ return false;
+ if (this.substring(this.length - str.length) == str)
+ return true;
+ else
+ return false;
+}
+
+String.prototype.startWith = function (str) {
+ if (str == null || str == "" || this.length == 0 || str.length > this.length)
+ return false;
+ if (this.substr(0, str.length) == str)
+ return true;
+ else
+ return false;
+}
+
+//UTF-16转UTF-8
+function utf16ToUtf8(s) {
+ if (!s) {
+ return;
+ }
+ var i, code, ret = [],
+ len = s.length;
+ for (i = 0; i < len; i++) {
+ code = s.charCodeAt(i);
+ if (code > 0x0 && code <= 0x7f) {
+ //单字节
+ //UTF-16 0000 - 007F
+ //UTF-8 0xxxxxxx
+ ret.push(s.charAt(i));
+ } else if (code >= 0x80 && code <= 0x7ff) {
+ //双字节
+ //UTF-16 0080 - 07FF
+ //UTF-8 110xxxxx 10xxxxxx
+ ret.push(
+ //110xxxxx
+ String.fromCharCode(0xc0 | ((code >> 6) & 0x1f)),
+ //10xxxxxx
+ String.fromCharCode(0x80 | (code & 0x3f))
+ );
+ } else if (code >= 0x800 && code <= 0xffff) {
+ //三字节
+ //UTF-16 0800 - FFFF
+ //UTF-8 1110xxxx 10xxxxxx 10xxxxxx
+ ret.push(
+ //1110xxxx
+ String.fromCharCode(0xe0 | ((code >> 12) & 0xf)),
+ //10xxxxxx
+ String.fromCharCode(0x80 | ((code >> 6) & 0x3f)),
+ //10xxxxxx
+ String.fromCharCode(0x80 | (code & 0x3f))
+ );
+ }
+ }
+ return ret.join('');
+}
+
+//若要显示:当前日期加时间(如:200906121200)
+function currentTime() {
+ var now = new Date();
+
+ var year = now.getFullYear(); //年
+ var month = now.getMonth() + 1; //月
+ var day = now.getDate(); //日
+
+ var hh = now.getHours(); //时
+ var mm = now.getMinutes(); //分
+
+ var clock = year + "";
+
+ if (month < 10)
+ clock += "0";
+
+ clock += month + "";
+
+ if (day < 10)
+ clock += "0";
+
+ clock += day + "";
+
+ if (hh < 10)
+ clock += "0";
+
+ clock += hh + "";
+ if (mm < 10) clock += '0';
+ clock += mm;
+ return (clock);
+}
+
+/**
+ * 判断文件个数是否为0,若为0则关闭
+ * @param {*} name
+ */
+function closeEtIfNoDocument() {
+ var etApp = wps.EtApplication();
+ var docs = etApp.Workbooks;
+ if (docs && docs.Count == 0) {
+ etApp.Quit();
+ }
+}
+
+function activeTab() {
+ wps.ribbonUI.ActivateTab('WPSWorkExtTab');
+}
+
+function showOATab() {
+ wps.PluginStorage.setItem("ShowOATabDocActive", pCheckIfOADoc()); //根据文件是否为OA文件来显示OA菜单
+ wps.ribbonUI.Invalidate(); // 刷新Ribbon自定义按钮的状态
+}
+
+function pGetParamName(data, attr) {
+ var start = data.indexOf(attr);
+ data = data.substring(start + attr.length);
+ return data;
+}
+
+/**
+ * 从requst中获取文件名(确保请求中有filename这个参数)
+ * @param {*} request
+ * @param {*} url
+ */
+ function pGetFileName(request, url) {
+ var disposition = request.getResponseHeader("Content-Disposition");
+ var filename = "";
+ if (disposition) {
+ var matchs = pGetParamName(disposition, "filename=");
+ if (matchs) {
+ filename = decodeURIComponent(matchs);
+ } else {
+ filename = "petro" + Date.getTime();
+ }
+ } else {
+ filename = url.substring(url.lastIndexOf("/") + 1);
+ filename=filename.split("?")[0]
+ }
+ return filename;
+}
+
+function StringToUint8Array(string) {
+ var binLen, buffer, chars, i, _i;
+ binLen = string.length;
+ buffer = new ArrayBuffer(binLen);
+ chars = new Uint8Array(buffer);
+ for (var i = 0; i < binLen; ++i) {
+ chars[i] = String.prototype.charCodeAt.call(string, i);
+ }
+ return buffer;
+}
+
+function DownloadFile(url, callback) {
+ // 需要根据业务实现一套
+ var xhr = new XMLHttpRequest();
+ xhr.onreadystatechange = function () {
+ if (this.readyState == 4 && this.status == 200) {
+ var path = wps.Env.GetTempPath() + "/" + pGetFileName(xhr, url);
+ var reader = new FileReader();
+ reader.onload = function () {
+ wps.FileSystem.writeAsBinaryString(path, reader.result);
+ callback(path);
+ };
+ reader.readAsBinaryString(xhr.response);
+ }
+ }
+ xhr.open('GET', url);
+ xhr.responseType = 'blob';
+ xhr.send();
+}
+
+function UploadFile(strFileName, strPath, uploadPath, strFieldName, OnSuccess, OnFail) {
+ var xhr = new XMLHttpRequest();
+ xhr.open('POST', uploadPath);
+
+ function KFormData() {
+ this.fake = true;
+ this.boundary = "--------FormData" + Math.random();
+ this._fields = [];
+ }
+ KFormData.prototype.append = function (key, value) {
+ this._fields.push([key, value]);
+ }
+ KFormData.prototype.toString = function () {
+ var boundary = this.boundary;
+ var body = "";
+ this._fields.forEach(function (field) {
+ body += "--" + boundary + "\r\n";
+ if (field[1].name) {
+ var file = field[1];
+ body += "Content-Disposition: form-data; name=\"" + field[0] + "\"; filename=\"" + file.name + "\"\r\n";
+ body += "Content-Type: " + file.type + "\r\n\r\n";
+ body += file.getAsBinary() + "\r\n";
+ } else {
+ body += "Content-Disposition: form-data; name=\"" + field[0] + "\";\r\n\r\n";
+ body += field[1] + "\r\n";
+ }
+ });
+ body += "--" + boundary + "--";
+ return body;
+ }
+ var fileData = wps.FileSystem.readAsBinaryString(strPath);
+ var data = new KFormData();
+ data.append('file', {
+ name: strFileName,
+ type: "application/octet-stream",
+ getAsBinary: function () {
+ return fileData;
+ }
+ });
+ xhr.onreadystatechange = function () {
+ if (xhr.readyState == 4) {
+ if (xhr.status == 200)
+ OnSuccess(xhr.response)
+ else
+ OnFail(xhr.response);
+ }
+ };
+ xhr.setRequestHeader("Cache-Control", "no-cache");
+ xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
+ if (data.fake) {
+ xhr.setRequestHeader("Content-Type", "multipart/form-data; boundary=" + data.boundary);
+ var arr = StringToUint8Array(data.toString());
+ xhr.send(arr);
+ } else {
+ xhr.send(data);
+ }
+}
\ No newline at end of file
diff --git a/oaassist/EtOAAssist/js/common/func_docEvents.js b/oaassist/EtOAAssist/js/common/func_docEvents.js
new file mode 100644
index 0000000..e8cb455
--- /dev/null
+++ b/oaassist/EtOAAssist/js/common/func_docEvents.js
@@ -0,0 +1,251 @@
+// 打印前监听事件
+function OnWorkbookBeforePrint(doc) {
+ return;
+}
+
+
+//切换窗口时触发的事件
+function OnWindowActivate() {
+ console.log("OnWindowActivate" + "=======================");
+
+ var l_doc = wps.EtApplication().ActiveWorkbook;
+ SetCurrDocEnvProp(l_doc); // 设置当前文档对应的用户名
+ showOATab(); // 根据文件是否为OA文件来显示OA菜单再进行刷新按钮
+ setTimeout(activeTab, 2000); // 激活页面必须要页签显示出来,所以做1秒延迟
+ return;
+}
+
+/**
+ * 作用:判断OA文档是否被另存为了
+ */
+function CheckIfOADocSaveAs(doc) {
+ if (!doc) {
+ return;
+ }
+ // 获取OA文档的原始保存路径
+ var l_Path = GetDocParamsValue(doc, "SourcePath");
+ // 原路径和当前文件的路径对比
+ return l_Path == doc.FullName;
+}
+
+
+// 当文件保存前触发的事件
+function OnWorkbookBeforeSave(doc) {
+ console.log("OnWorkbookBeforeSave");
+
+ //设置变量,判断是否当前用户按了自定义的OA文件保存按钮
+ var l_IsOADocButtonSave = false;
+ l_IsOADocButtonSave = wps.PluginStorage.getItem("OADocUserSave");
+
+ //根据传入参数判断当前文档是否能另存为,默认不能另存为
+ if (pCheckCurrOADocCanSaveAs(doc) == false) { //先根据OA助手的默认设置判断是否允许OA文档另存为操作
+ //如果配置文件:OA文档不允许另存为,则再判断
+ //2、判断当前OA文档是否不落地文档
+ if (pIsOnlineOADoc(doc) == true) {
+ //如果是不落地文档,则判断是否是系统正在保存
+ if (l_IsOADocButtonSave == false) {
+ alert("来自OA的不落地文档,禁止另存为本地文档!");
+ //如果是OA文档,则禁止另存为
+ wps.ApiEvent.Cancel = true;
+ }
+ } else {
+ //这里要再判断OA文档是否被用户另存为
+ if (l_IsOADocButtonSave == false) {
+ doc.Save(); //直接保存本地就行
+ //如果是OA文档,则禁止另存为
+ wps.ApiEvent.Cancel = true;
+ } else {}
+ }
+
+ }
+
+ //保存文档后,也要刷新一下Ribbon按钮的状态
+ showOATab();
+ return;
+}
+
+
+//文档保存前关闭事件
+/**
+ * 作用:
+ * @param {*} doc
+ */
+function OnWorkbookBeforeClose(doc) {
+ console.log('OnWorkbookBeforeClose');
+
+ var l_fullName = doc.FullName;
+ var l_bIsOADoc = false;
+ l_bIsOADoc = CheckIfDocIsOADoc(doc); //判断是否OA文档要关闭
+ if (l_bIsOADoc == false) { // 非OA文档不做处理
+ return;
+ }
+ //判断是否只读的文档,或受保护的文档,对于只读的文档,不给予保存提示
+ if (pISOADocReadOnly(doc) == false) {
+ if (doc.Saved == false) { //如果OA文档关闭前,有未保存的数据
+ if (wps.confirm("系统文件有改动,是否提交后关闭?" + "\n" + "确认后请按上传按钮执行上传操作。取消则继续关闭文档。")) {
+ wps.ApiEvent.Cancel = true;
+ return;
+ }
+ }
+ }
+ doc.Close(false); //保存待定的更改。
+ closeEtIfNoDocument(); // 判断文件个数是否为0,若为0则关闭组件
+ wps.FileSystem.Remove(l_fullName);
+}
+
+
+//文档保存后关闭事件
+function OnWorkbookAfterClose(doc) {
+ console.log("OnWorkbookAfterClose");
+
+ var l_NofityURL = GetDocParamsValue(doc, "notifyUrl");
+ if (l_NofityURL) {
+ l_NofityURL = l_NofityURL.replace("{?}", "3"); //约定:参数为3则文档关闭
+ console.log("" + l_NofityURL);
+ NotifyToServer(l_NofityURL);
+ }
+
+ pRemoveDocParam(doc); // 关闭文档时,移除PluginStorage对象的参数
+ pSetetAppUserName(); // 判断文档关闭后,如果系统已经没有打开的文档了,则设置回初始用户名
+}
+
+//文档打开事件
+function OnWorkbookOpen(doc) {
+ //设置当前新增文档是否来自OA的文档
+ // if (wps.PluginStorage.getItem("IsInCurrOADocOpen") == false) {
+ // //如果是用户自己在WPS环境打开文档,则设置非OA文档标识
+ // pSetNoneOADocFlag(doc);
+ // }
+
+ OnWindowActivate();
+ ChangeOATabOnDocOpen(); //打开文档后,默认打开Tab页
+}
+
+//新建文档事件
+function OnWorkbookNew(doc) {
+ //设置当前新增文档是否来自OA的文档
+ // if (wps.PluginStorage.getItem("IsInCurrOADocOpen") == false) {
+ // //如果是用户自己在WPS环境打开文档,则设置非OA文档标识
+ // pSetNoneOADocFlag(doc);
+ // }
+ ChangeOATabOnDocOpen(); // 打开OA助手Tab菜单页
+ wps.ribbonUI.Invalidate(); // 刷新Ribbon按钮的状态
+}
+
+
+/**
+ * 作用:判断当前文档是否是只读文档
+ * 返回值:布尔
+ */
+function pISOADocReadOnly(doc) {
+ if (!doc) {
+ return false;
+ }
+ var l_openType = GetDocParamsValue(doc, "openType"); // 获取OA传入的参数 openType
+ if (l_openType == "") {
+ return false;
+ }
+ try {
+ if (!!l_openType.protectType) {
+ return true;
+ } // 保护
+ } catch (err) {
+ return false;
+ }
+}
+
+
+/**
+ * 作用:根据当前活动文档的情况判断,当前文档适用的系统参数,例如:当前文档对应的用户名称等
+ */
+function SetCurrDocEnvProp(doc) {
+ if (!doc) return;
+ var l_bIsOADoc = false;
+ l_bIsOADoc = pCheckIfOADoc(doc);
+
+ //如果是OA文件,则按OA传来的用户名设置WPS OA助手WPS用户名设置按钮冲突
+ if (l_bIsOADoc == true) {
+ var l_userName = GetDocParamsValue(doc, "userName");
+ if (l_userName != "") {
+ wps.EtApplication().UserName = l_userName;
+ return;
+ }
+ }
+ //如果是非OA文件或者参数的值是空值,则按WPS安装默认用户名设置
+ wps.EtApplication().UserName = wps.PluginStorage.getItem("WPSInitUserName");
+}
+
+/*
+ 入口参数:doc
+ 功能说明:判断当前文档是否能另存为本地文件
+ 返回值:布尔值true or false
+*/
+function pCheckCurrOADocCanSaveAs(doc) {
+ //如果是非OA文档,则允许另存为
+ if (CheckIfDocIsOADoc(doc) == false) return true;
+
+ //对于来自OA系统的文档,则获取该文档对应的属性参数
+ var l_CanSaveAs = GetDocParamsValue(doc, "CanSaveAs");
+
+ //判断OA传入的参数
+ if (typeof (l_CanSaveAs) == "boolean") {
+ return l_CanSaveAs;
+ }
+ return false;
+}
+
+/**
+ * 作用:判断文档关闭后,如果系统已经没有打开的文档了,则设置回初始用户名
+ */
+function pSetetAppUserName() {
+ //文档全部关闭的情况下,把WPS初始启动的用户名设置回去
+ if (wps.EtApplication().Workbooks.Count == 1) {
+ var l_strUserName = wps.PluginStorage.getItem("WPSInitUserName");
+ wps.EtApplication().UserName = l_strUserName;
+ }
+}
+
+/**
+ * 作用:文档关闭后,删除对应的PluginStorage内的参数信息
+ * 返回值:没有返回值
+ * @param {*} doc
+ */
+function pRemoveDocParam(doc) {
+ if (!doc) return;
+ wps.PluginStorage.removeItem(doc.FullName);
+ return;
+}
+
+/**
+ * 作用:判断当前文档是否从OA来的文档,如果非OA文档(就是本地新建或打开的文档,则设置EnumOAFlag 标识)
+ * 作用:设置非OA文档的标识状态
+ * @param {*} doc
+ * 返回值:无
+ */
+function pSetNoneOADocFlag(doc) {
+ if (!doc) return;
+ var l_param = wps.PluginStorage.getItem(doc.FullName); //定义JSON文档参数
+ var l_objParams = new Object();
+ if (l_param) {
+ l_objParams = JSON.parse(l_param);
+ }
+ l_objParams.isOA = EnumOAFlag.DocFromNoOA; // 新增非OA打开文档属性
+ wps.PluginStorage.setItem(doc.FullName, JSON.stringify(l_objParams)); // 存入内存中
+}
+
+
+/**
+ * 作用:根据设置判断打开文件是否默认激活OA助手工具Tab菜单
+ * 返回值:无
+ */
+function ChangeOATabOnDocOpen() {
+ var l_ShowOATab = true; //默认打开
+ l_ShowOATab = wps.PluginStorage.getItem("ShowOATabDocActive");
+
+ if (l_ShowOATab == true) {
+ if (wps.ribbonUI)
+ wps.ribbonUI.ActivateTab("WPSWorkExtTab"); //新建文档时,自动切换到OA助手状态
+ else
+ wps.ActivateTab("WPSWorkExtTab"); //新建文档时,自动切换到OA助手状态
+ }
+}
\ No newline at end of file
diff --git a/oaassist/EtOAAssist/js/common/func_docProcess.js b/oaassist/EtOAAssist/js/common/func_docProcess.js
new file mode 100644
index 0000000..f7a77bc
--- /dev/null
+++ b/oaassist/EtOAAssist/js/common/func_docProcess.js
@@ -0,0 +1,354 @@
+/**
+ * 从OA调用传来的指令,打开本地新建文件
+ * @param {*} fileUrl 文件url路径
+ */
+function NewFile(params) {
+ //获取ET Application 对象
+ var etApp = wps.EtApplication();
+ wps.PluginStorage.setItem("IsInCurrOADocOpen", true); //设置OA打开文档的临时状态
+ var doc = etApp.Workbooks.Add(); //新增OA端文档
+ wps.PluginStorage.setItem("IsInCurrOADocOpen", false);
+
+ //检查系统临时文件目录是否能访问
+ if (wps.Env && wps.Env.GetTempPath) {
+ if (params.newFileName) {
+ //按OA传入的文件名称保存
+ doc.SaveAs($FileName = wps.Env.GetTempPath() + "/" + params.newFileName, undefined, undefined, undefined, undefined, undefined, undefined, undefined, false);
+ } else {
+ //OA传入空文件名称,则保存成系统时间文件
+ doc.SaveAs($FileName = wps.Env.GetTempPath() + "/OA_" + currentTime(), undefined, undefined, undefined, undefined, undefined, undefined, undefined, false);
+ }
+ } else {
+ alert("文档保存临时目录出错!不能保存新建文档!请联系系统开发商。");
+ }
+
+ var l_NofityURL = GetParamsValue(params, "notifyUrl");
+ if (l_NofityURL) {
+ NotifyToServer(l_NofityURL.replace("{?}", "1"));
+ }
+
+ //Office文件打开后,设置该文件属性:从服务端来的OA文件
+ pSetOADocumentFlag(doc, params);
+ //设置当前文档为 本地磁盘落地模式
+ DoSetOADocLandMode(doc, EnumDocLandMode.DLM_LocalDoc);
+ //强制执行一次Activate事件
+ OnWindowActivate();
+
+ return doc; //返回新创建的Document对象
+}
+
+
+/**
+ * 打开服务器上的文件
+ * @param {*} fileUrl 文件url路径
+ */
+function OpenFile(params) {
+ var l_strFileUrl = params.fileName; //来自OA网页端的OA文件下载路径
+ var doc;
+ var l_IsOnlineDoc = false; //默认打开的是不落地文档
+ if (l_strFileUrl) {
+ //下载文档之前,判断是否已下载该文件
+ if (pCheckIsExistOpenOADoc(l_strFileUrl) == true) {
+ //如果找到相同OA地址文档,则给予提示
+ wps.EtApplication().Visible = true
+ //根据OA助手对是否允许再次打开相同文件的判断处理
+ var l_AllowOADocReOpen = false;
+ l_AllowOADocReOpen = wps.PluginStorage.getItem("AllowOADocReOpen");
+ if (l_AllowOADocReOpen == false) {
+ alert("已打开相同的OA文件,请关闭之前的文件,再次打开。");
+ wps.EtApplication().Visible = true
+ return null;
+ } else {
+ //处理重复打开相同OA 文件的方法
+ var nDocCount = wps.EtApplication().Workbooks.Count;
+ pReOpenOADoc(l_strFileUrl);
+ //重复打开的文档采用不落地的方式打开
+ // 不落地方式打开文档判断落地比较多,V1版本先暂时关闭
+ l_IsOnlineDoc = true;
+ var nDocCount_New = wps.EtApplication().Workbooks.Count;
+ if (nDocCount_New > nDocCount) {
+ doc = wps.EtApplication().ActiveWorkbook;
+ }
+ }
+ } else {
+ //如果当前没有打开文档,则另存为本地文件,再打开
+ if (l_strFileUrl.startWith("http")) { // 网络文档
+ DownloadFile(l_strFileUrl, function (path) {
+ if (path == "") {
+ alert("从服务端下载路径:" + l_strFileUrl + "\n" + "获取文件下载失败!");
+ return null;
+ }
+
+ doc = pDoOpenOADocProcess(params, path);
+ pOpenFile(doc, params, l_IsOnlineDoc);
+ });
+ return null;
+ } else { //本地文档
+ doc = pDoOpenOADocProcess(params, l_strFileUrl);
+ if (doc)
+ doc.SaveAs($FileName = wps.Env.GetTempPath() + "/" + doc.Name, undefined, undefined, undefined, undefined, undefined, undefined, undefined, false);
+ }
+ }
+ } else {
+ //fileURL 如果为空,则按新建OA本地文件处理
+ NewFile(params);
+ }
+
+ //如果打开pdf等其他非Office文档,则doc对象为空
+ if (!doc) {
+ return null;
+ }
+
+ pOpenFile(doc, params, l_IsOnlineDoc);
+
+ return doc
+}
+
+function pOpenFile(doc, params, isOnlineDoc) {
+ var l_IsOnlineDoc = isOnlineDoc
+ console.log(doc)
+ //Office文件打开后,设置该文件属性:从服务端来的OA文件
+ pSetOADocumentFlag(doc, params);
+ //设置当前文档为 本地磁盘落地模式
+ if (l_IsOnlineDoc == true) {
+ DoSetOADocLandMode(doc, EnumDocLandMode.DLM_OnlineDoc);
+ } else {
+ DoSetOADocLandMode(doc, EnumDocLandMode.DLM_LocalDoc);
+ }
+
+ l_NofityURL = GetParamsValue(params, "notifyUrl");
+ if (l_NofityURL) {
+ l_NofityURL = l_NofityURL.replace("{?}", "1"); //约定:参数为1则代码打开状态
+ NotifyToServer(l_NofityURL);
+ }
+ //重新设置工具条按钮的显示状态
+ pDoResetRibbonGroups();
+ // 触发切换窗口事件
+ OnWindowActivate();
+ return doc;
+}
+
+/**
+ * 文档打开服务器上的文件
+ * @param {*} fileUrl 文件url路径
+ */
+function OpenOnLineFile(OAParams) {
+ //OA参数如果为空的话退出
+ if (!OAParams) return;
+
+ //获取在线文档URL
+ var l_OAFileUrl = OAParams.fileName;
+ var l_doc;
+ if (l_OAFileUrl) {
+ //下载文档不落地(16版WPS的925后支持)
+ wps.PluginStorage.setItem("IsInCurrOADocOpen", true);
+ wps.EtApplication().Workbooks.OpenFromUrl(l_OAFileUrl, "OnOpenOnLineDocSuccess", "OnOpenOnLineDocDownFail");
+ wps.PluginStorage.setItem("IsInCurrOADocOpen", false);
+ l_doc = wps.EtApplication().ActiveWorkbook;
+ }
+
+ //Office文件打开后,设置该文件属性:从服务端来的OA文件
+ pOpenFile(l_doc, OAParams, true);
+ return l_doc;
+}
+
+
+/**
+ * 打开在线文档成功后触发事件
+ * @param {*} resp
+ */
+function OnOpenOnLineDocSuccess(resp) {
+
+}
+
+
+/**
+ * 作用:打开文档处理的各种过程,包含:打开带密码的文档,保护方式打开文档,修订方式打开文档等种种情况
+ * params Object OA Web端传来的请求JSON字符串,具体参数说明看下面数据
+ * TempLocalFile : 字符串 先把文档从OA系统下载并保存在Temp临时目录,这个参数指已经下载下来的本地文档地址
+ * ----------------------以下是OA参数的一些具体规范名称
+ * docId String 文档ID
+ * uploadPath String 保存文档接口
+ * fileName String 获取服务器文档接口(不传即为新建空文档)
+ * userName String 用于更改显示修改人的用户名
+ * buttonGroups string 自定义按钮组 (可不传,不传显示所有按钮)
+ * openType String 文档打开方式 ,不传正常打开
+ * protectType bool 文档保护类型,false或是未定义为不启用保护,其他为启用
+ * password String密码
+ */
+function pDoOpenOADocProcess(params, TempLocalFile) {
+ var l_ProtectType = false; //默认文档保护类型 0 为不启用保护
+ var l_ProtectPassword = ""; //默认文档密码为空
+
+ var l_strDocPassword = ""; //打开文档密码参数
+
+ for (var key = "" in params) {
+ switch (key.toUpperCase()) //
+ {
+ case "userName".toUpperCase(): //修改当前文档用户名
+ wps.EtApplication().UserName = params[key];
+ break;
+ case "openType".toUpperCase():
+ l_ProtectType = params[key].protectType; //获取OA传来的文档保护类型
+ l_ProtectPassword = params[key].password; //获取OA传来的保护模式下的文档密码
+ break;
+ case "buttonGroups".toUpperCase(): //按钮组合
+ break;
+ case "docPassword".toUpperCase(): //传入打开文件的密码
+ l_strDocPassword = params[key].docPassword;
+ break;
+ }
+
+ }
+
+ var l_Doc;
+ l_Doc = wps.EtApplication().Workbooks.Open(TempLocalFile, false, false, undefined, l_strDocPassword);
+
+ //打开文档后,根据保护类型设置文档保护
+ if (!!l_ProtectType) // 设置文档保护
+ SetOADocProtect(l_Doc, l_ProtectPassword);
+ return l_Doc;
+}
+
+/**
+ * protectType: '', 文档保护模式
+ * @param {*} ProtectPassword
+ * @param {*} doc
+ */
+function SetOADocProtect(doc, ProtectPassword) {
+ if (!doc) return; //校验文档是否存在
+
+ // 保护文档如果之前有被保护,再次保护会出问题,需要先解除保护
+ doc.Unprotect();
+ doc.Protect(ProtectPassword);
+ return;
+}
+
+
+/**
+ * 打开在线不落地文档出现失败时,给予错误提示
+ */
+function OnOpenOnLineDocDownFail() {
+ alert("打开在线不落地文档失败!请尝试重新打开。");
+ return;
+}
+
+/**
+ * 功能说明:判断是否已存在来自OA的已打开的文档
+ * @param {字符串} FileURL
+ */
+function pCheckIsExistOpenOADoc(FileURL) {
+ var l_DocCount = wps.EtApplication().Workbooks.Count;
+ if (l_DocCount <= 0) return false;
+
+ //轮询检查当前已打开的WPS文档中,是否存在OA相同的文件
+ if (l_DocCount >= 1) {
+ for (var l_index = 1; l_index <= l_DocCount; l_index++) {
+ var l_objDoc = wps.EtApplication().Workbooks.Item(l_index);
+
+ var l_strParam = wps.PluginStorage.getItem(l_objDoc.FullName);
+ if (l_strParam == null)
+ continue;
+ var l_objParam = JSON.parse(l_strParam)
+ if (l_objParam.fileName == FileURL) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
+
+/**
+ * 参数:
+ * doc : 当前OA文档的Document对象
+ * DocLandMode : 落地模式设置
+ */
+function DoSetOADocLandMode(doc, DocLandMode) {
+ if (!doc) return;
+ var l_Param = wps.PluginStorage.getItem(doc.FullName);
+ var l_objParam = JSON.parse(l_Param);
+ //增加属性,或设置
+ l_objParam.OADocLandMode = DocLandMode; //设置OA文档的落地标志
+
+ var l_p = JSON.stringify(l_objParam);
+ //将OA文档落地模式标志存入系统变量对象保存
+
+ wps.PluginStorage.setItem(doc.FullName, l_p);
+
+}
+
+//Office文件打开后,设置该文件属性:从服务端来的OA文件
+function pSetOADocumentFlag(doc, params) {
+ if (!doc) {
+ return;
+ }
+ var l_Param = params;
+ l_Param.isOA = EnumOAFlag.DocFromOA; //设置OA打开文档的标志
+ l_Param.SourcePath = doc.FullName; //保存OA的原始文件路径,用于保存时分析,是否进行了另存为操作
+
+ if (doc) {
+ var l_p = JSON.stringify(l_Param);
+
+ //将OA文档标志存入系统变量对象保存
+ wps.PluginStorage.setItem(doc.FullName, l_p);
+ }
+}
+
+/**
+ * 作用:设置Ribbon工具条的按钮显示状态
+ * @param {*} paramsGroups
+ */
+function pDoResetRibbonGroups(paramsGroups) {
+
+}
+
+/**
+ * 按照定时器的时间,自动执行所有文档的自动保存事件
+ */
+function OnDocSaveByAutoTimer() {
+ var l_Doc;
+
+ var l_Count = 0
+ var l_docCounts = wps.EtApplication().Workbooks.Count;
+ for (l_Count = 0; l_Count < l_docCounts; l_Count++) {
+ l_Doc = wps.EtApplication().Workbooks.Item(l_Count);
+ if (l_Doc) {
+ if (pCheckIfOADoc(l_Doc) == true) { // 是否为OA文件
+ if (pISOADocReadOnly(l_Doc) == false) { // 是否为只读文档
+ //执行自动上传到OA服务器端的操作
+ pAutoUploadToServer(l_Doc);
+ //保存该文档对应的访问过程记录信息
+ }
+ }
+ }
+ }
+}
+
+/**
+ * 实现一个定时器
+ */
+function OpenTimerRun(funcCallBack) {
+ var l_mCount = 0; //设置一个计时器,按每分钟执行一次; 10分钟后重复执行
+ var l_timeID = 0; //用于保存计时器ID值
+
+ // 对间隔时间做处理
+ var l_AutoSaveToServerTime = wps.PluginStorage.getItem("AutoSaveToServerTime");
+ if (l_AutoSaveToServerTime == 0) { // 设置为0则不启动定时器
+ l_timeID = wps.PluginStorage.getItem("TempTimerID");
+ clearInterval(l_timeID);
+ return;
+ } else if (l_AutoSaveToServerTime < 3) {
+ l_AutoSaveToServerTime = 3;
+ }
+
+ l_timeID = setInterval(function () {
+ l_mCount = l_mCount + 1;
+ if (l_mCount > l_AutoSaveToServerTime) { //l_AutoSaveToServerTime 值由系统配置时设定,见pInitParameters()函数
+ l_mCount = 0;
+ funcCallBack(); //每隔l_AutoSaveToServerTime 分钟(例如10分钟)执行一次回调函数
+ }
+ }, 60000); //60000 每隔1分钟,执行一次操作(1000*60)
+
+
+ wps.PluginStorage.setItem("TempTimerID", l_timeID); //保存计时器ID值
+}
\ No newline at end of file
diff --git a/oaassist/EtOAAssist/js/common/func_oastarter.js b/oaassist/EtOAAssist/js/common/func_oastarter.js
new file mode 100644
index 0000000..4ee7117
--- /dev/null
+++ b/oaassist/EtOAAssist/js/common/func_oastarter.js
@@ -0,0 +1,56 @@
+/**
+ * web页面调用WPS加载项的方法入口
+ * * info参数结构
+ * info:[
+ * {
+ * '方法名':'方法参数',需要执行的方法
+ * },
+ * ...
+ * ]
+ * @param {*} info
+ */
+function dispatcher(info) {
+ var funcs = info.funcs;
+ //NotifyToWeb();
+ //alert(JSON.stringify(funcs));
+ //执行web页面传递的方法
+ for (var index = 0; index < funcs.length; index++) {
+ var func = funcs[index];
+ for (var key in func) {
+ func[key].isOA=true
+ if (key === "OpenDoc") { // OpenDoc 属于普通的打开文档的操作方式,文档落地操作
+ OpenDoc(func[key]); //进入打开文档处理函数
+ } else if (key === "OnlineEditDoc") { //在线方式打开文档,属于文档不落地的方式打开
+ OnlineEditDoc(func[key]);
+ } else if (key === "NewDoc") {
+ OpenDoc(func[key]);
+ }
+ }
+ }
+ return {message:"ok", app:wps.Application.Name}
+}
+
+/**
+ *
+ * @param {*} params OA端传入的参数
+ */
+function OnlineEditDoc(OaParams) {
+ //如果
+ if (OaParams.fileName == "") {
+ NewFile(OaParams);
+ } else {
+ //OA传来下载文件的URL地址,调用openFile 方法打开
+ OpenOnLineFile(OaParams);
+ }
+}
+
+///打开来自OA端传递来的文档
+function OpenDoc(OaParams) {
+ //如果
+ if (OaParams.fileName == "") {
+ NewFile(OaParams);
+ } else {
+ //OA传来下载文件的URL地址,调用openFile 方法打开
+ OpenFile(OaParams);
+ }
+}
\ No newline at end of file
diff --git a/oaassist/EtOAAssist/js/common/func_tabcontrol.js b/oaassist/EtOAAssist/js/common/func_tabcontrol.js
new file mode 100644
index 0000000..e0fde6d
--- /dev/null
+++ b/oaassist/EtOAAssist/js/common/func_tabcontrol.js
@@ -0,0 +1,441 @@
+var EnumOAFlag = {
+ DocFromOA: 1,
+ DocFromNoOA: 0
+}
+
+//记录是否用户点击OA文件的保存按钮
+var EnumDocSaveFlag = {
+ OADocSave: 1,
+ NoneOADocSave: 0
+}
+
+//标识文档的落地模式 本地文档落地 0 ,不落地 1
+var EnumDocLandMode = {
+ DLM_LocalDoc: 0,
+ DLM_OnlineDoc: 1
+}
+
+//加载时会执行的方法
+function OnWPSWorkTabLoad(ribbonUI) {
+ wps.ribbonUI = ribbonUI;
+
+ OnJSWorkInit(); //初始化文档事件(全局参数,挂载监听事件)
+ activeTab(); // 激活OA助手菜单
+ OpenTimerRun(OnDocSaveByAutoTimer); //启动定时备份过程
+ return true;
+}
+
+//文档各类初始化工作(WPS Js环境)
+function OnJSWorkInit() {
+ pInitParameters(); //OA助手环境的所有配置控制的初始化过程
+ AddWorkbookEvent(); //挂接文档事件处理函数
+}
+
+
+//初始化全局参数
+function pInitParameters() {
+ wps.PluginStorage.setItem("OADocUserSave", EnumDocSaveFlag.NoneOADocSave); //初始化,没有用户点击保存按钮
+
+ var l_wpsUserName = wps.EtApplication().UserName;
+ wps.PluginStorage.setItem("WPSInitUserName", l_wpsUserName); //在OA助手加载前,先保存用户原有的WPS应用用户名称
+
+ wps.PluginStorage.setItem("OADocCanSaveAs", false); //默认OA文档不能另存为本地
+ wps.PluginStorage.setItem("AllowOADocReOpen", false); //设置是否允许来自OA的文件再次被打开
+ wps.PluginStorage.setItem("ShowOATabDocActive", false); //设置新打开文档是否默认显示OA助手菜单Tab //默认为false
+
+ wps.PluginStorage.setItem("DefaultUploadFieldName", "file"); //针对UploadFile方法设置上载字段名称
+
+ wps.PluginStorage.setItem("AutoSaveToServerTime", "10"); //自动保存回OA服务端的时间间隔。如果设置0,则关闭,最小设置3分钟
+ wps.PluginStorage.setItem("TempTimerID", "0"); //临时值,用于保存计时器ID的临时值
+
+ // 以下是一些临时状态参数,用于打开文档等的状态判断
+ wps.PluginStorage.setItem("IsInCurrOADocOpen", false); //用于执行来自OA端的新建或打开文档时的状态
+ wps.PluginStorage.setItem("IsInCurrOADocSaveAs", false); //用于执行来自OA端的文档另存为本地的状态
+}
+
+//挂载WPS的表格事件
+function AddWorkbookEvent() {
+ wps.ApiEvent.AddApiEventListener("WindowActivate", OnWindowActivate);
+ wps.ApiEvent.AddApiEventListener("WorkbookBeforeClose", OnWorkbookBeforeClose);
+ wps.ApiEvent.AddApiEventListener("WorkbookBeforeSave", OnWorkbookBeforeSave);
+ wps.ApiEvent.AddApiEventListener("WorkbookOpen", OnWorkbookOpen);
+ wps.ApiEvent.AddApiEventListener("NewWorkbook", OnWorkbookNew);
+ console.log("AddWorkbookEvent");
+}
+
+/**
+ * 根据传入Document对象,获取OA传入的参数的某个Key值的Value
+ * @param {*} Doc
+ * @param {*} Key
+ * 返回值:返回指定 Key的 Value
+ */
+function GetDocParamsValue(Doc, Key) {
+ if (!Doc) {
+ return "";
+ }
+
+ var l_Params = wps.PluginStorage.getItem(Doc.FullName);
+ if (!l_Params) {
+ return "";
+ }
+
+ var l_objParams = JSON.parse(l_Params);
+ if (typeof (l_objParams) == "undefined") {
+ return "";
+ }
+
+ var l_rtnValue = l_objParams[Key];
+ if (typeof (l_rtnValue) == "undefined" || l_rtnValue == null) {
+ return "";
+ }
+ return l_rtnValue;
+}
+
+/**
+ * 作用:根据OA传入参数,设置是否显示Ribbob按钮组
+ * 参数:CtrlID 是OnGetVisible 传入的Ribbob控件的ID值
+ */
+function pShowRibbonGroupByOADocParam(CtrlID) {
+ var l_Doc = wps.EtApplication().ActiveWorkbook;
+ if (!l_Doc) {
+ return false; //如果未装入文档,则设置OA助手按钮组不可见
+ }
+
+ //获取OA传入的按钮组参数组
+ var l_grpButtonParams = GetDocParamsValue(l_Doc, "buttonGroups"); //disableBtns
+ l_grpButtonParams = l_grpButtonParams + "," + GetDocParamsValue(l_Doc, "disableBtns");
+ // 要求OA传入控制自定义按钮显示的参数为字符串 中间用 , 分隔开
+ if (typeof (l_grpButtonParams) == "string") {
+ var l_arrayGroup = new Array();
+ l_arrayGroup = l_grpButtonParams.split(",");
+ //console.log(l_grpButtonParams);
+
+ // 判断当前按钮是否存在于数组
+ if (l_arrayGroup.indexOf(CtrlID) >= 0) {
+ return false;
+ }
+ }
+ // 添加OA菜单判断
+ if (CtrlID == "WPSWorkExtTab") {
+ var l_value = wps.PluginStorage.getItem("ShowOATabDocActive");
+ wps.PluginStorage.setItem("ShowOATabDocActive", false); //初始化临时状态变量
+ console.log("菜单:" + l_value);
+ return l_value;
+ }
+
+ //disableBtns
+
+ return true;
+}
+
+/**
+ * 调用文件上传到OA服务端时,
+ * @param {*} resp
+ * wdDoNotSaveChanges 0 *不保存待定的更改。
+ * wdPromptToSaveChanges -2 *提示用户保存待定更改。
+ * wdSaveChanges -1 *自动保存待定更改,而不提示用户。
+ */
+function OnUploadToServerSuccess(resp) {
+ var l_doc = wps.EtApplication().ActiveWorkbook;
+ if (wps.confirm("文件上传成功!继续编辑请确认,取消关闭文档。") == false) {
+ if (l_doc) {
+ console.log("OnUploadToServerSuccess: before Close");
+ l_doc.Close(-1); //保存文档后关闭
+ console.log("OnUploadToServerSuccess: after Close");
+ }
+ }
+
+ var l_NofityURL = GetDocParamsValue(l_doc, "notifyUrl");
+ if (l_NofityURL != "") {
+ l_NofityURL = l_NofityURL.replace("{?}", "2"); //约定:参数为2则文档被成功上传
+ NotifyToServer(l_NofityURL);
+ }
+}
+
+function OnUploadToServerFail(resp) {
+ alert("文件上传失败!");
+}
+
+//判断当前文档是否是OA文档
+function pCheckIfOADoc() {
+ var doc = wps.EtApplication().ActiveWorkbook;
+ if (!doc)
+ return false;
+ return CheckIfDocIsOADoc(doc);
+}
+
+//根据传入的doc对象,判断当前文档是否是OA文档
+function CheckIfDocIsOADoc(doc) {
+ if (!doc) {
+ return false;
+ }
+ var l_isOA = GetDocParamsValue(doc, "isOA");
+ if (l_isOA == "") {
+ return false
+ };
+ return l_isOA == EnumOAFlag.DocFromOA ? true : false;
+}
+
+//返回是否可以点击OA保存按钮的状态
+function OnSetSaveToOAEnable() {
+ return pCheckIfOADoc();
+}
+
+/**
+ * 作用:判断是否是不落地文档
+ * 参数:doc 文档对象
+ * 返回值: 布尔值
+ */
+function pIsOnlineOADoc(doc) {
+ var l_LandMode = GetDocParamsValue(doc, "OADocLandMode"); //获取文档落地模式
+ if (l_LandMode == "") { //用户本地打开的文档
+ return false;
+ }
+ return l_LandMode == EnumDocLandMode.DLM_OnlineDoc;
+}
+
+//保存到OA后台服务器
+function OnBtnSaveToServer() {
+ // console.log('SaveToServer');
+ var l_doc = wps.EtApplication().ActiveWorkbook;
+ if (!l_doc) {
+ alert("空文档不能保存!");
+ return;
+ }
+
+ //非OA文档,不能上传到OA
+ if (pCheckIfOADoc() == false) {
+ alert("非系统打开的文档,不能直接上传到系统!");
+ return;
+ }
+
+ //如果是OA打开的文档,并且设置了保护的文档,则不能再上传到OA服务器
+ if (pISOADocReadOnly(l_doc)) {
+ wps.alert("系统设置了保护的文档,不能再提交到系统后台。");
+ return;
+ }
+
+ /**
+ * 参数定义:OAAsist.UploadFile(name, path, url, field, "OnSuccess", "OnFail")
+ * 上传一个文件到远程服务器。
+ * name:为上传后的文件名称;
+ * path:是文件绝对路径;
+ * url:为上传地址;
+ * field:为请求中name的值;
+ * 最后两个参数为回调函数名称;
+ */
+ var l_uploadPath = GetDocParamsValue(l_doc, "uploadPath"); // 文件上载路径
+ if (l_uploadPath == "") {
+ wps.alert("系统未传入文件上载路径,不能执行上传操作!");
+ return;
+ }
+
+ if (!wps.confirm("先保存文档,并开始上传到系统后台,请确认?")) {
+ return;
+ }
+
+ var l_FieldName = GetDocParamsValue(l_doc, "uploadFieldName"); //上载到后台的字段名称
+ if (l_FieldName == "") {
+ l_FieldName = wps.PluginStorage.getItem("DefaultUploadFieldName"); // 默认为‘file’
+ }
+
+ var l_UploadName = GetDocParamsValue(l_doc, "uploadFileName"); //设置OA传入的文件名称参数
+ if (l_UploadName == "") {
+ l_UploadName = l_doc.Name; //默认文件名称就是当前文件编辑名称
+ }
+
+ var l_DocPath = l_doc.FullName; // 文件所在路径
+
+ if (pIsOnlineOADoc(l_doc) == false) {
+ //对于本地磁盘文件上传OA,先用Save方法保存后,再上传
+ //设置用户保存按钮标志,避免出现禁止OA文件保存的干扰信息
+ wps.PluginStorage.setItem("OADocUserSave", EnumDocSaveFlag.OADocSave);
+ l_doc.Save(); //执行一次保存方法
+ //设置用户保存按钮标志
+ wps.PluginStorage.setItem("OADocUserSave", EnumDocSaveFlag.NoneOADocSave);
+ //落地文档,调用UploadFile方法上传到OA后台
+ try {
+ //调用OA助手的上传方法
+ UploadFile(l_UploadName, l_DocPath, l_uploadPath, l_FieldName, OnUploadToServerSuccess, OnUploadToServerFail);
+ } catch (err) {
+ alert("上传文件失败!请检查系统上传参数及网络环境!");
+ }
+ } else {
+ // 不落地的文档,调用 Document 对象的不落地上传方法
+ wps.PluginStorage.setItem("OADocUserSave", EnumDocSaveFlag.OADocSave);
+ try {
+ //调用不落地上传方法
+ l_doc.SaveAsUrl(l_UploadName, l_uploadPath, l_FieldName, "OnUploadToServerSuccess", "OnUploadToServerFail");
+ } catch (err) {
+ alert("上传文件失败!请检查系统上传参数及网络环境,重新上传。");
+ }
+ wps.PluginStorage.setItem("OADocUserSave", EnumDocSaveFlag.NoneOADocSave);
+ }
+
+ //获取OA传入的 转其他格式上传属性
+ var l_suffix = GetDocParamsValue(l_doc, "suffix");
+ if (l_suffix == "") {
+ console.log("上传需转换的文件后缀名错误,无妨进行转换上传!");
+ return;
+ }
+
+ //判断是否同时上传PDF等格式到OA后台
+ var l_uploadWithAppendPath = GetDocParamsValue(l_doc, "uploadWithAppendPath"); //标识是否同时上传OFD、PDF等格式的文件
+ if (l_uploadWithAppendPath == "1") {
+ //调用转 pdf格式函数,强制关闭转换修订痕迹
+ pDoChangeToOtherDocFormat(l_doc, l_suffix, false, false); //
+ }
+ return;
+}
+
+/**
+ * 执行另存为本地文件操作
+ */
+function OnBtnSaveAsLocalFile() {
+
+ //初始化临时状态值
+ wps.PluginStorage.setItem("OADocUserSave", false);
+ wps.PluginStorage.setItem("IsInCurrOADocSaveAs", false);
+
+ //检测是否有文档正在处理
+ var l_doc = wps.EtApplication().ActiveWorkbook;
+ if (!l_doc) {
+ alert("WPS当前没有可操作文档!");
+ return;
+ }
+
+ // 设置WPS文档对话框 2 FileDialogType:=msoFileDialogSaveAs
+ var l_ksoFileDialog = wps.EtApplication().FileDialog(2);
+ l_ksoFileDialog.InitialFileName = l_doc.Name; //文档名称
+
+ if (l_ksoFileDialog.Show() == -1) { // -1 代表确认按钮
+ wps.PluginStorage.setItem("OADocUserSave", true); //设置保存为临时状态,在Save事件中避免OA禁止另存为对话框
+ l_ksoFileDialog.Execute(); //会触发保存文档的监听函数
+
+ pSetNoneOADocFlag(l_doc);
+ wps.ribbonUI.Invalidate(); //刷新Ribbon的状态
+ };
+}
+
+/**
+ * 获取对象中属性的值
+ * @param {*} params
+ * @param {*} Key
+ */
+function GetParamsValue(Params, Key) {
+ if (typeof (Params) == "undefined") {
+ return "";
+ }
+
+ var l_rtnValue = Params[Key];
+ return l_rtnValue;
+}
+
+
+function OnAction(control) {
+ var eleId;
+ if (typeof control == "object" && arguments.length == 1) { //针对Ribbon的按钮的
+ eleId = control.Id;
+ } else if (typeof control == "undefined" && arguments.length > 1) { //针对idMso的
+ eleId = arguments[1].Id;
+ } else if (typeof control == "boolean" && arguments.length > 1) { //针对checkbox的
+ eleId = arguments[1].Id;
+ } else if (typeof control == "number" && arguments.length > 1) { //针对combox的
+ eleId = arguments[2].Id;
+ }
+ switch (strId) {
+ case "btnSaveToServer":
+ OnBtnSaveToServer();
+ break;
+ case "btnSaveAsFile":
+ OnBtnSaveAsLocalFile();
+ break;
+ default:
+ ;
+ }
+ return true;
+}
+
+function OnGetEnabled(control) {
+ var eleId;
+ if (typeof control == "object" && arguments.length == 1) { //针对Ribbon的按钮的
+ eleId = control.Id;
+ } else if (typeof control == "undefined" && arguments.length > 1) { //针对idMso的
+ eleId = arguments[1].Id;
+ } else if (typeof control == "boolean" && arguments.length > 1) { //针对checkbox的
+ eleId = arguments[1].Id;
+ } else if (typeof control == "number" && arguments.length > 1) { //针对combox的
+ eleId = arguments[2].Id;
+ }
+ switch (eleId) {
+ case "btnSaveToServer": //保存到OA服务器的相关按钮。判断,如果非OA文件,禁止点击
+ return OnSetSaveToOAEnable();
+ case "btnSaveAsFile":
+ let doc=wps.EtApplication().ActiveWorkbook;
+ let l_Params=wps.PluginStorage.getItem(doc.FullName);
+ let OADocLandMode=JSON.parse(l_Params).OADocLandMode
+ return !OADocLandMode
+ default:
+ ;
+ }
+ return true;
+}
+
+function OnGetVisible(control) {
+ var eleId;
+ if (typeof control == "object" && arguments.length == 1) { //针对Ribbon的按钮的
+ eleId = control.Id;
+ } else if (typeof control == "undefined" && arguments.length > 1) { //针对idMso的
+ eleId = arguments[1].Id;
+ } else if (typeof control == "boolean" && arguments.length > 1) { //针对checkbox的
+ eleId = arguments[1].Id;
+ } else if (typeof control == "number" && arguments.length > 1) { //针对combox的
+ eleId = arguments[2].Id;
+ }
+ var l_value = false;
+ //按照 OA文档传递过来的属性进行判断
+ l_value = pShowRibbonGroupByOADocParam(eleId);
+ return l_value;
+}
+
+function GetImage(control) {
+ var eleId;
+ if (typeof control == "object" && arguments.length == 1) { //针对Ribbon的按钮的
+ eleId = control.Id;
+ } else if (typeof control == "undefined" && arguments.length > 1) { //针对idMso的
+ eleId = arguments[1].Id;
+ } else if (typeof control == "boolean" && arguments.length > 1) { //针对checkbox的
+ eleId = arguments[1].Id;
+ } else if (typeof control == "number" && arguments.length > 1) { //针对combox的
+ eleId = arguments[2].Id;
+ }
+ switch (eleId) {
+ case "btnSaveToServer": //保存到OA后台服务端
+ return "./icon/w_Save.png";
+ case "btnSaveAsFile": //另存为本地文件
+ return "./icon/w_SaveAs.png";
+ default:
+ ;
+ }
+ return "./icon/c_default.png";
+}
+
+function OnGetLabel(control) {
+ var eleId;
+ if (typeof control == "object" && arguments.length == 1) { //针对Ribbon的按钮的
+ eleId = control.Id;
+ } else if (typeof control == "undefined" && arguments.length > 1) { //针对idMso的
+ eleId = arguments[1].Id;
+ } else if (typeof control == "boolean" && arguments.length > 1) { //针对checkbox的
+ eleId = arguments[1].Id;
+ } else if (typeof control == "number" && arguments.length > 1) { //针对combox的
+ eleId = arguments[2].Id;
+ }
+ switch (eleId) {
+ case "btnSaveAsFile":
+ return "另存为本地";
+ default:
+ ;
+ }
+ return "";
+}
\ No newline at end of file
diff --git a/oaassist/EtOAAssist/js/main.js b/oaassist/EtOAAssist/js/main.js
new file mode 100644
index 0000000..81578c3
--- /dev/null
+++ b/oaassist/EtOAAssist/js/main.js
@@ -0,0 +1,9 @@
+if (typeof (window.wps) == "undefined") {
+ window.wps = window;
+}
+var time=new Date().getTime() //添加时间戳,防止js文件使用浏览器缓存
+document.write("");
+document.write("");
+document.write("");
+document.write("");
+document.write("");
\ No newline at end of file
diff --git a/oaassist/EtOAAssist/package.json b/oaassist/EtOAAssist/package.json
new file mode 100644
index 0000000..b945069
--- /dev/null
+++ b/oaassist/EtOAAssist/package.json
@@ -0,0 +1,12 @@
+{
+ "name": "EtOAAssist",
+ "addonType": "et",
+ "version": "1.0.0",
+ "description": "这个工程为WPS表格项目一个简单的OA场景集成的WPS加载项——OA助手,旨在帮助大家能够快速理解并熟悉WPS加载项机制以及和浏览器调用交互的流程。",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "author": "",
+ "license": "ISC"
+}
\ No newline at end of file
diff --git a/oaassist/EtOAAssist/ribbon.xml b/oaassist/EtOAAssist/ribbon.xml
new file mode 100644
index 0000000..2d8a051
--- /dev/null
+++ b/oaassist/EtOAAssist/ribbon.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/oaassist/README.md b/oaassist/README.md
new file mode 100644
index 0000000..d36ab9d
--- /dev/null
+++ b/oaassist/README.md
@@ -0,0 +1,121 @@
+## Welcome to WPS OAAssist Demo
+
+### 这个项目是什么?
+
+ 这个工程主要提供常见的OA助手的场景示例来演示网页端启动WPS客户端并和WPS加载项交互WPS API的功能,方便大家能够快速理解并熟悉WPS加载项机制以及和浏览器调用交互的流程。
+
+### 工程结构
+
+* demo.html 包含了本地是否安装了正确的wps安装包、是否启动了本地服务端等的环境检测。
+* server 包含了一些前端文件和演示场景的模板文件,为网页端场景代码, 此外有几个场景需要服务端的支持,用nodejs写了一个本地服务程序用于模拟服务端场景。
+* EtOAAssist WPS 表格组件的OA助手WPS加载项,提供简单的OA场景功能示例。(单独的网页项目)
+* WppOAAssist WPS 演示组件的OA助手WPS加载项,提供简单的OA场景功能示例。(单独的网页项目)
+* WpsOAAssist WPS 文字组件的OA助手WPS加载项,提供常见的OA场景功能示例。(单独的网页项目)
+### demo启动
+1. 安装WPS,WPS版本支持情况
+
+ WPS Win:企业版:11.8.2.8808;个人版:11.1.0.9566
+
+ Linux 企业版:11.8.2.9346 ; 个人版暂不支持
+
+ 他们之后的版本,含他们自己
+
+ 这些版本是稳定支持的,之前的2019版本也支持,不推荐用了,jsapi支持的不稳定。
+
+2. 安装node(仅demo需要)
+ [windows安装](https://www.cnblogs.com/liuqiyun/p/8133904.html)
+
+ [Linux安装](https://www.cnblogs.com/sirdong/p/11447739.html)
+
+ 使用node的作用是:
+
+ * 静态资源转发。/plugin/et指向EtOAAssist目录,/plugin/wps指向WpsOAAssist目录,/plugin/et指向WppOAAssist目录。以及file目录下文档的访问。
+
+ * 后端接口提供:提供了下载文件接口/Download/文件名 和 上传文件接口/Upload
+
+ 在实际项目中,不需要安装node,静态资源转发由tomcat、nginx或者其他中间件实现。后端接口由java或者php语言实现。
+
+3. 进入server目录下
+4. npm config set registry http://registry.npm.taobao.org //切换npm淘宝镜像源
+5. npm install //安装相应依赖
+6. node StartupServer //启动demo的服务
+
+
+### WPS重要地址
+
+* WPS配置文件oem.ini地址
+```
+ oem.ini目录地址:
+ windows:
+ 1. 安装路径\WPS Offlce\一串数字(版本号)\offlce6\cfgs\
+ 2. 鼠标右键点击左面的wps文字图标==>打开文件位置==>在同级目录中找到cfgs目录
+ linux:
+ 普通linux操作系统:
+ /opt/kingsoft/wps-office/office6/cfgs/
+ uos操作系统:
+ /opt/apps/cn.wps.wps-office-pro/files/kingsoft/wps-office/office6/cfgs/
+```
+
+
+* 加载项管理文件存放位置(jsaddons目录)
+```
+ jsaddons目录地址:
+ windows:
+ 我的电脑地址栏中输入:%appdata%\kingsoft\wps\jsaddons
+ linux:
+ 我的电脑地址栏中输入:~/.local/share/Kingsoft/wps/jsaddons
+
+```
+
+### 调试器开启和使用
+
+ 1. 配置oem.ini,在support栏下配置JsApiShowWebDebugger=true
+ 2. linux机器上需要使用quickstartoffice restart重启WPS
+ 普通linux操作系统:
+ 电脑终端执行quickstartoffice restart
+ uos操作系统:
+ 电脑终端执行 cd /opt/apps/cn.wps.wps-office-pro/files/bin
+ ./quickstartoffice restart
+ 3. WPS打开后,在有文档的情况下按alt+F12(index.html页面的调试器)
+ 4. ShowDialog和Taskpane页面的调试器,点击该弹窗或者任务窗格,按F12
+ 如果无法打开调试器,那么说明加载项加载失败了,排查加载项管理文件是否生成,加载项管理文件中的加载项地址是否正确
+
+
+
+### 项目集成
+1. 部署加载项
+
+ * 将WpsOAAssist,EtOAAssist,WppOAAssist这三个目录分别部署到服务器上
+
+ [部署到tomcat](https://jingyan.baidu.com/article/22a299b5c6cfb09e18376a62.html)
+ [部署到nginx](https://www.cnblogs.com/amazingjava/p/13411644.html)
+2. 配置加载项管理文件
+
+ 加载项有两种部署模式,publish模式和jsplugins.xml模式,**这两种模式是WPS去找到加载项管理文件的方式**,每个模式都有对应的管理文件,WPS启动时,会去jsaddons目录读取publish.xml和jsplugins.xml文件。
+
+
+ * 区别:
+
+ * 管理文件生成方式不一样
+
+ publish模式是通过在网页中调用本地服务的端口,在客户本地jsaddons目录中生成publish.xml文件,https://kdocs.cn/l/cpOfxONhn8Yg [金山文档] publish自动安装加载项.docx
+
+ jsplugins.xml模式是在oem.ini中配置好地址,在WPS启动时,会自动去服务端拉取地址指向的jsplugins.xml文件,放到客户本地的jsaddons目录中。在实际项目中,将jsplugins.xml文件地址告知我们,由我们将jsplugins打包进WPS安装包中,用户安装二次打包后的安装包即可使用
+
+ * 相同
+ * 都有离线和在线模式
+ 离线模式和在线模式是去根据加载项管理文件中的加载项地址,去拉取代码的方式,模式介绍请看文档
+
+ https://kdocs.cn/l/cBk8tsBIf
+ [金山文档] 加载项在线模式和离线模式.docx
+
+
+### 注意事项
+
+* 本工程只是演示demo
+* 我们建议您修改示例代码结合具体的应用场景部署到服务器上面,这样更能够体现OA助手集成的应用场景
+* 为了保护代码,建议代码上线前进行混淆
+* 使用该工程的时候,必须要安装WPS专业版,请咨询QQ:3253920855
+
+
+
diff --git a/oaassist/WppOAAssist/LICENSE b/oaassist/WppOAAssist/LICENSE
new file mode 100644
index 0000000..3417144
--- /dev/null
+++ b/oaassist/WppOAAssist/LICENSE
@@ -0,0 +1,25 @@
+
+Copyright @ 2012-2019, Kingsoft office,All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+3. Neither the name of the copyright holder nor the names of its
+contributors may be used to endorse or promote products derived from this
+software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/oaassist/WppOAAssist/README.md b/oaassist/WppOAAssist/README.md
new file mode 100644
index 0000000..e7fb37f
--- /dev/null
+++ b/oaassist/WppOAAssist/README.md
@@ -0,0 +1,19 @@
+## Welcome to WPP OAAssist Demo
+
+### 这个项目是什么?
+
+这个工程为WPS演示项目一个简单的OA场景集成的WPS加载项——OA助手,旨在帮助大家能够快速理解并熟悉WPS加载项机制以及和浏览器调用交互的流程。
+
+### 工程结构
+
+* icon 图标文件。
+* js WPS 加载项功能逻辑的js代码。
+* index.html 加载项的默认加载页面。
+* ribbon.xml 自定义选项卡配置。
+
+### 注意事项
+
+* 本工程只是演示demo
+* 我们建议您结合具体的应用场景修改示例代码,这样更能够体现OA助手集成的应用场景
+* 为了保护代码,建议对上线代码进行混淆
+* 使用该工程的时候,必须要安装WPS专业版,请咨询QQ:3253920855
diff --git a/oaassist/WppOAAssist/icon/w_Save.png b/oaassist/WppOAAssist/icon/w_Save.png
new file mode 100644
index 0000000..edcd53a
Binary files /dev/null and b/oaassist/WppOAAssist/icon/w_Save.png differ
diff --git a/oaassist/WppOAAssist/icon/w_SaveAs.png b/oaassist/WppOAAssist/icon/w_SaveAs.png
new file mode 100644
index 0000000..a5fe456
Binary files /dev/null and b/oaassist/WppOAAssist/icon/w_SaveAs.png differ
diff --git a/oaassist/WppOAAssist/index.html b/oaassist/WppOAAssist/index.html
new file mode 100644
index 0000000..887c288
--- /dev/null
+++ b/oaassist/WppOAAssist/index.html
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/oaassist/WppOAAssist/js/common/common.js b/oaassist/WppOAAssist/js/common/common.js
new file mode 100644
index 0000000..fd85227
--- /dev/null
+++ b/oaassist/WppOAAssist/js/common/common.js
@@ -0,0 +1,289 @@
+// -------------------------- 通用方法 ---------------------------
+//扩展js string endwith,startwith方法
+String.prototype.endWith = function (str) {
+ if (str == null || str == "" || this.length == 0 || str.length > this.length)
+ return false;
+ if (this.substring(this.length - str.length) == str)
+ return true;
+ else
+ return false;
+}
+
+String.prototype.startWith = function (str) {
+ if (str == null || str == "" || this.length == 0 || str.length > this.length)
+ return false;
+ if (this.substr(0, str.length) == str)
+ return true;
+ else
+ return false;
+}
+
+//UTF-16转UTF-8
+function utf16ToUtf8(s) {
+ if (!s) {
+ return;
+ }
+ var i, code, ret = [],
+ len = s.length;
+ for (i = 0; i < len; i++) {
+ code = s.charCodeAt(i);
+ if (code > 0x0 && code <= 0x7f) {
+ //单字节
+ //UTF-16 0000 - 007F
+ //UTF-8 0xxxxxxx
+ ret.push(s.charAt(i));
+ } else if (code >= 0x80 && code <= 0x7ff) {
+ //双字节
+ //UTF-16 0080 - 07FF
+ //UTF-8 110xxxxx 10xxxxxx
+ ret.push(
+ //110xxxxx
+ String.fromCharCode(0xc0 | ((code >> 6) & 0x1f)),
+ //10xxxxxx
+ String.fromCharCode(0x80 | (code & 0x3f))
+ );
+ } else if (code >= 0x800 && code <= 0xffff) {
+ //三字节
+ //UTF-16 0800 - FFFF
+ //UTF-8 1110xxxx 10xxxxxx 10xxxxxx
+ ret.push(
+ //1110xxxx
+ String.fromCharCode(0xe0 | ((code >> 12) & 0xf)),
+ //10xxxxxx
+ String.fromCharCode(0x80 | ((code >> 6) & 0x3f)),
+ //10xxxxxx
+ String.fromCharCode(0x80 | (code & 0x3f))
+ );
+ }
+ }
+ return ret.join('');
+}
+
+//扩展js string endwith,startwith方法
+String.prototype.endWith = function (str) {
+ if (str == null || str == "" || this.length == 0 || str.length > this.length)
+ return false;
+ if (this.substring(this.length - str.length) == str)
+ return true;
+ else
+ return false;
+}
+
+String.prototype.startWith = function (str) {
+ if (str == null || str == "" || this.length == 0 || str.length > this.length)
+ return false;
+ if (this.substr(0, str.length) == str)
+ return true;
+ else
+ return false;
+}
+
+//UTF-16转UTF-8
+function utf16ToUtf8(s) {
+ if (!s) {
+ return;
+ }
+ var i, code, ret = [],
+ len = s.length;
+ for (i = 0; i < len; i++) {
+ code = s.charCodeAt(i);
+ if (code > 0x0 && code <= 0x7f) {
+ //单字节
+ //UTF-16 0000 - 007F
+ //UTF-8 0xxxxxxx
+ ret.push(s.charAt(i));
+ } else if (code >= 0x80 && code <= 0x7ff) {
+ //双字节
+ //UTF-16 0080 - 07FF
+ //UTF-8 110xxxxx 10xxxxxx
+ ret.push(
+ //110xxxxx
+ String.fromCharCode(0xc0 | ((code >> 6) & 0x1f)),
+ //10xxxxxx
+ String.fromCharCode(0x80 | (code & 0x3f))
+ );
+ } else if (code >= 0x800 && code <= 0xffff) {
+ //三字节
+ //UTF-16 0800 - FFFF
+ //UTF-8 1110xxxx 10xxxxxx 10xxxxxx
+ ret.push(
+ //1110xxxx
+ String.fromCharCode(0xe0 | ((code >> 12) & 0xf)),
+ //10xxxxxx
+ String.fromCharCode(0x80 | ((code >> 6) & 0x3f)),
+ //10xxxxxx
+ String.fromCharCode(0x80 | (code & 0x3f))
+ );
+ }
+ }
+ return ret.join('');
+}
+
+//若要显示:当前日期加时间(如:200906121200)
+function currentTime() {
+ var now = new Date();
+
+ var year = now.getFullYear(); //年
+ var month = now.getMonth() + 1; //月
+ var day = now.getDate(); //日
+
+ var hh = now.getHours(); //时
+ var mm = now.getMinutes(); //分
+
+ var clock = year + "";
+
+ if (month < 10)
+ clock += "0";
+
+ clock += month + "";
+
+ if (day < 10)
+ clock += "0";
+
+ clock += day + "";
+
+ if (hh < 10)
+ clock += "0";
+
+ clock += hh + "";
+ if (mm < 10) clock += '0';
+ clock += mm;
+ return (clock);
+}
+
+/**
+ * 判断WPP中的文件个数是否为0,若为0则关闭WPP函数
+ * @param {*} name
+ */
+function closeWppIfNoDocument() {
+ var wppApp = wps.WppApplication();
+ var docs = wppApp.Presentations;
+ if (docs && docs.Count == 0) {
+ wppApp.Quit();
+ }
+}
+
+function activeTab() {
+ wps.ribbonUI.ActivateTab('WPSWorkExtTab');
+}
+
+function showOATab() {
+ wps.PluginStorage.setItem("ShowOATabDocActive", pCheckIfOADoc()); //根据文件是否为OA文件来显示OA菜单
+ wps.ribbonUI.Invalidate(); // 刷新Ribbon自定义按钮的状态
+}
+
+
+function pGetParamName(data, attr) {
+ var start = data.indexOf(attr);
+ data = data.substring(start + attr.length);
+ return data;
+}
+
+/**
+ * 从requst中获取文件名(确保请求中有filename这个参数)
+ * @param {*} request
+ * @param {*} url
+ */
+ function pGetFileName(request, url) {
+ var disposition = request.getResponseHeader("Content-Disposition");
+ var filename = "";
+ if (disposition) {
+ var matchs = pGetParamName(disposition, "filename=");
+ if (matchs) {
+ filename = decodeURIComponent(matchs);
+ } else {
+ filename = "petro" + Date.getTime();
+ }
+ } else {
+ filename = url.substring(url.lastIndexOf("/") + 1);
+ filename=filename.split("?")[0]
+ }
+ return filename;
+}
+function StringToUint8Array(string) {
+ var binLen, buffer, chars, i, _i;
+ binLen = string.length;
+ buffer = new ArrayBuffer(binLen);
+ chars = new Uint8Array(buffer);
+ for (var i = 0; i < binLen; ++i) {
+ chars[i] = String.prototype.charCodeAt.call(string, i);
+ }
+ return buffer;
+}
+
+function DownloadFile(url, callback) {
+ // 需要根据业务实现一套
+ var xhr = new XMLHttpRequest();
+ xhr.onreadystatechange = function () {
+ if (this.readyState == 4 && this.status == 200) {
+ var path = wps.Env.GetTempPath() + "/" + pGetFileName(xhr, url);
+ var reader = new FileReader();
+ reader.onload = function () {
+ wps.FileSystem.writeAsBinaryString(path, reader.result);
+ callback(path);
+ };
+ reader.readAsBinaryString(xhr.response);
+ }
+ }
+ xhr.open('GET', url);
+ xhr.responseType = 'blob';
+ xhr.send();
+}
+
+function UploadFile(strFileName, strPath, uploadPath, strFieldName, OnSuccess, OnFail) {
+ var xhr = new XMLHttpRequest();
+ xhr.open('POST', uploadPath);
+
+ function KFormData() {
+ this.fake = true;
+ this.boundary = "--------FormData" + Math.random();
+ this._fields = [];
+ }
+ KFormData.prototype.append = function (key, value) {
+ this._fields.push([key, value]);
+ }
+ KFormData.prototype.toString = function () {
+ var boundary = this.boundary;
+ var body = "";
+ this._fields.forEach(function (field) {
+ body += "--" + boundary + "\r\n";
+ if (field[1].name) {
+ var file = field[1];
+ body += "Content-Disposition: form-data; name=\"" + field[0] + "\"; filename=\"" + file.name + "\"\r\n";
+ body += "Content-Type: " + file.type + "\r\n\r\n";
+ body += file.getAsBinary() + "\r\n";
+ } else {
+ body += "Content-Disposition: form-data; name=\"" + field[0] + "\";\r\n\r\n";
+ body += field[1] + "\r\n";
+ }
+ });
+ body += "--" + boundary + "--";
+ return body;
+ }
+ var fileData = wps.FileSystem.readAsBinaryString(strPath);
+ var data = new KFormData();
+ data.append('file', {
+ name: strFileName,
+ type: "application/octet-stream",
+ getAsBinary: function () {
+ return fileData;
+ }
+ });
+ xhr.onreadystatechange = function () {
+ if (xhr.readyState == 4) {
+ if (xhr.status == 200)
+ OnSuccess(xhr.response)
+ else
+ OnFail(xhr.response);
+ }
+ };
+ xhr.setRequestHeader("Cache-Control", "no-cache");
+ xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
+ if (data.fake) {
+ xhr.setRequestHeader("Content-Type", "multipart/form-data; boundary=" + data.boundary);
+ var arr = StringToUint8Array(data.toString());
+ xhr.send(arr);
+ } else {
+ xhr.send(data);
+ }
+}
\ No newline at end of file
diff --git a/oaassist/WppOAAssist/js/common/func_docEvents.js b/oaassist/WppOAAssist/js/common/func_docEvents.js
new file mode 100644
index 0000000..f9f1f39
--- /dev/null
+++ b/oaassist/WppOAAssist/js/common/func_docEvents.js
@@ -0,0 +1,103 @@
+//切换窗口时触发的事件
+function OnWindowActivate() {
+ console.log("OnWindowActivate" + "=======================");
+
+ showOATab(); // 根据文件是否为OA文件来显示OA菜单再进行刷新按钮
+ setTimeout(activeTab, 2000); // 激活页面必须要页签显示出来,所以做1秒延迟
+ return;
+}
+
+function OnPresentationBeforeClose(doc) {
+ console.log('OnPresentationClose');
+
+ var l_fullName = doc.FullName;
+ var l_bIsOADoc = false;
+ l_bIsOADoc = CheckIfDocIsOADoc(doc); //判断是否OA文档要关闭
+ if (l_bIsOADoc == false) { // 非OA文档不做处理
+ return;
+ }
+
+ if (doc.Saved == false) { //如果OA文档关闭前,有未保存的数据
+ if (wps.confirm("系统文件有改动,是否提交后关闭?" + "\n" + "确认后请按上传按钮执行上传操作。取消则继续关闭文档。")) {
+ wps.ApiEvent.Cancel = true;
+ return;
+ }
+ }
+
+ wps.ApiEvent.RemoveApiEventListener("PresentationBeforeClose", OnPresentationBeforeClose);
+ doc.Close();
+ wps.ApiEvent.AddApiEventListener("PresentationBeforeClose", OnPresentationBeforeClose);
+ pSetNoneOADocFlag(l_fullName);
+ closeWppIfNoDocument(); // 判断文件个数是否为0,若为0则关闭组件
+ wps.FileSystem.Remove(l_fullName);
+}
+
+/**
+ * 作用:判断当前文档是否从OA来的文档,如果非OA文档(就是本地新建或打开的文档,则设置EnumOAFlag 标识)
+ * 作用:设置非OA文档的标识状态
+ * @param {*} doc
+ * 返回值:无
+ */
+function pSetNoneOADocFlag(fullName) {
+
+ var l_param = wps.PluginStorage.getItem(fullName); //定义JSON文档参数
+ var l_objParams = new Object();
+ if (l_param) {
+ l_objParams = JSON.parse(l_param);
+ }
+ l_objParams.isOA = EnumOAFlag.DocFromNoOA; // 新增非OA打开文档属性
+ wps.PluginStorage.setItem(fullName, JSON.stringify(l_objParams)); // 存入内存中
+}
+/**
+ * 权限点集合
+ */
+var ksoRightsInfo = {
+ ksoNoneRight: 0x0000,
+ ksoModifyRight: 0x0001,
+ ksoCopyRight: 0x0002,
+ ksoPrintRight: 0x0004,
+ ksoSaveRight: 0x0008,
+ ksoBackupRight: 0x0010,
+ ksoVbaRight: 0x0020,
+ ksoSaveAsRight: 0x0040,
+ ksoFullRight: -1
+}
+var gRightsInfo = ksoRightsInfo.ksoFullRight;
+/**
+ * 设置文档的权限
+ *
+ * @param {*} rightsInfo
+ * 所有权限: ksoRightsInfo.ksoFullRight
+ * 备份权限: ksoRightsInfo.ksoFullRight & ~ksoRightsInfo.ksoBackupRight
+ * 另存权限: ksoRightsInfo.ksoFullRight & ~ksoRightsInfo.ksoSaveAsRight
+ * 类似保护模式: ksoRightsInfo.ksoFullRight & ~ksoRightsInfo.ksoBackupRight & ~ksoRightsInfo.ksoSaveAsRight & ~ksoRightsInfo.ksoSaveRight & ~ksoRightsInfo.ksoPrintRight & ~ksoRightsInfo.ksoCopyRight
+ */
+function setDocumentRights(rightsInfo) {
+ gRightsInfo = rightsInfo;
+ var l_doc = wps.WppApplication().ActivePresentation;
+ if (l_doc) {
+ l_doc.InvalidateRightsInfo();
+ wps.ribbonUI.Invalidate();
+ }
+}
+/**
+ * 设置权限的事件实现
+ *
+ * @param {*} doc
+ */
+function OnDocumentRightsInfo(doc) {
+ var curRightsInfo = wps.ApiEvent.RightsInfo;
+ wps.ApiEvent.RightsInfo = gRightsInfo;
+
+}
+/**
+ * 针对权限的功能可用状态判断
+ *
+ * @returns
+ */
+function OnSetSaveAsRightsEnable() {
+ if (gRightsInfo & ksoRightsInfo.ksoSaveAsRight)
+ return true;
+ else
+ return false;
+}
\ No newline at end of file
diff --git a/oaassist/WppOAAssist/js/common/func_docProcess.js b/oaassist/WppOAAssist/js/common/func_docProcess.js
new file mode 100644
index 0000000..265b43b
--- /dev/null
+++ b/oaassist/WppOAAssist/js/common/func_docProcess.js
@@ -0,0 +1,312 @@
+/**
+ * 从OA调用传来的指令,打开本地新建文件
+ * @param {*} fileUrl 文件url路径
+ */
+function NewFile(params) {
+ //获取WPP Application 对象
+ var wppApp = wps.WppApplication();
+ var doc = wppApp.Presentations.Add(); //新增OA端文档
+ wps.PluginStorage.setItem("IsInCurrOADocOpen", false);
+
+ //检查系统临时文件目录是否能访问
+ if (wps.Env && wps.Env.GetTempPath) {
+ if (params.newFileName) {
+ //按OA传入的文件名称保存
+ doc.SaveAs($FileName = wps.Env.GetTempPath() + "/" + params.newFileName);
+ } else {
+ //OA传入空文件名称,则保存成系统时间文件
+ doc.SaveAs($FileName = wps.Env.GetTempPath() + "/OA_" + currentTime());
+ }
+ } else {
+ alert("文档保存临时目录出错!不能保存新建文档!请联系系统开发商。");
+ }
+
+ var l_NofityURL = GetParamsValue(params, "notifyUrl");
+ if (l_NofityURL) {
+ NotifyToServer(l_NofityURL.replace("{?}", "1"));
+ }
+
+ //Office文件打开后,设置该文件属性:从服务端来的OA文件
+ pSetOADocumentFlag(doc, params);
+ //设置当前文档为 本地磁盘落地模式
+ DoSetOADocLandMode(doc, EnumDocLandMode.DLM_LocalDoc);
+ //强制执行一次Activate事件
+ OnWindowActivate();
+
+ return doc; //返回新创建的Document对象
+}
+
+/**
+ * 打开服务器上的文件
+ * @param {*} fileUrl 文件url路径
+ */
+function OpenFile(params) {
+ var l_strFileUrl = params.fileName; //来自OA网页端的OA文件下载路径
+ var doc;
+ var l_IsOnlineDoc = false; //默认打开的是不落地文档
+ if (l_strFileUrl) {
+ //下载文档之前,判断是否已下载该文件
+ if (pCheckIsExistOpenOADoc(l_strFileUrl) == true) {
+ //如果找到相同OA地址文档,则给予提示
+ wps.WppApplication().Activate(); //把WPS对象置前
+ //根据OA助手对是否允许再次打开相同文件的判断处理
+ var l_AllowOADocReOpen = false;
+ l_AllowOADocReOpen = wps.PluginStorage.getItem("AllowOADocReOpen");
+ if (l_AllowOADocReOpen == false) {
+ alert("已打开相同的OA文件,请关闭之前的文件,再次打开。");
+ wps.WppApplication().Activate();
+ return null;
+ } else {
+ //处理重复打开相同OA 文件的方法
+ var nDocCount = wps.WppApplication().Presentations.Count;
+ pReOpenOADoc(l_strFileUrl);
+ //重复打开的文档采用不落地的方式打开
+ // 不落地方式打开文档判断落地比较多,V1版本先暂时关闭
+ l_IsOnlineDoc = true;
+ var nDocCount_New = wps.WppApplication().Presentations.Count;
+ if (nDocCount_New > nDocCount) {
+ doc = wps.WppApplication().ActivePresentation;
+ }
+ }
+ } else {
+ //如果当前没有打开文档,则另存为本地文件,再打开
+ if (l_strFileUrl.startWith("http")) { // 网络文档
+ DownloadFile(l_strFileUrl, function (path) {
+ if (path == "") {
+ alert("从服务端下载路径:" + l_strFileUrl + "\n" + "获取文件下载失败!");
+ return null;
+ }
+
+ doc = pDoOpenOADocProcess(params, path);
+ pOpenFile(doc, params, l_IsOnlineDoc);
+ });
+ return null;
+ } else { //本地文档
+ doc = pDoOpenOADocProcess(params, l_strFileUrl);
+ if (doc)
+ doc.SaveAs($FileName = wps.Env.GetTempPath() + "/" + doc.Name);
+ }
+
+ }
+ } else {
+ //fileURL 如果为空,则按新建OA本地文件处理
+ NewFile(params);
+ }
+
+ //如果打开pdf等其他非Office文档,则doc对象为空
+ if (!doc) {
+ return null;
+ }
+ pOpenFile(doc, params, l_IsOnlineDoc);
+
+}
+
+function pOpenFile(doc, params, isOnlineDoc){
+ var l_IsOnlineDoc = isOnlineDoc
+
+ //Office文件打开后,设置该文件属性:从服务端来的OA文件
+ pSetOADocumentFlag(doc, params);
+ //设置当前文档为 本地磁盘落地模式
+ if (l_IsOnlineDoc == true) {
+ DoSetOADocLandMode(doc, EnumDocLandMode.DLM_OnlineDoc);
+ } else {
+ DoSetOADocLandMode(doc, EnumDocLandMode.DLM_LocalDoc);
+ }
+
+ l_NofityURL = GetParamsValue(params, "notifyUrl");
+ if (l_NofityURL) {
+ l_NofityURL = l_NofityURL.replace("{?}", "1"); //约定:参数为1则代码打开状态
+ NotifyToServer(l_NofityURL);
+ }
+ //重新设置工具条按钮的显示状态
+ pDoResetRibbonGroups();
+ // 触发切换窗口事件
+ OnWindowActivate();
+ // 把WPS对象置前
+ wps.WppApplication().Activate();
+ return doc;
+}
+
+/**
+ * 不落地打开服务端的文档
+ * @param {*} fileUrl 文件url路径
+ */
+function OpenOnLineFile(OAParams) {
+ //OA参数如果为空的话退出
+ if (!OAParams) return;
+
+ //获取在线文档URL
+ var l_OAFileUrl = OAParams.fileName;
+ var l_doc;
+ if (l_OAFileUrl) {
+ //下载文档不落地
+ wps.WppApplication().Presentations.OpenFromUrl(l_OAFileUrl, "OnOpenOnLineDocSuccess", "OnOpenOnLineDocDownFail");
+ //设置文档的权限,模拟保护模式打开
+ setDocumentRights(ksoRightsInfo.ksoNoneRight)
+ l_doc = wps.WppApplication().ActivePresentation;
+ }
+
+ //执行文档打开后的方法
+ pOpenFile(l_doc, OAParams, true);
+ return l_doc;
+
+ // //Office文件打开后,设置该文件属性:从服务端来的OA文件
+ // pSetOADocumentFlag(l_doc, OAParams);
+ // //设置当前文档为 不落地打开模式
+ // DoSetOADocLandMode(l_doc, EnumDocLandMode.DLM_OnlineDoc);
+ // // 强制执行一次Activate事件
+ // OnWindowActivate();
+ // return l_doc;
+}
+
+/**
+ * 打开在线文档成功后触发事件
+ * @param {*} resp
+ */
+function OnOpenOnLineDocSuccess(resp) {
+
+}
+
+/**
+ * 作用:打开文档处理的各种过程,包含:打开带密码的文档,保护方式打开文档,修订方式打开文档等种种情况
+ * params Object OA Web端传来的请求JSON字符串,具体参数说明看下面数据
+ * TempLocalFile : 字符串 先把文档从OA系统下载并保存在Temp临时目录,这个参数指已经下载下来的本地文档地址
+ * ----------------------以下是OA参数的一些具体规范名称
+ * docId String 文档ID
+ * uploadPath String 保存文档接口
+ * fileName String 获取服务器文档接口(不传即为新建空文档)
+ * buttonGroups string 自定义按钮组 (可不传,不传显示所有按钮)
+ */
+function pDoOpenOADocProcess(params, TempLocalFile) {
+ for (var key = "" in params) {
+ switch (key.toUpperCase()) //
+ {
+ case "buttonGroups".toUpperCase(): //按钮组合
+ break;
+ }
+ }
+
+ //可设置ReadOnly?: Kso.KsoMsoTriState属性设置:-1是只读,其他值都是非只读
+ var l_Doc = wps.WppApplication().Presentations.Open(TempLocalFile);
+ return l_Doc;
+}
+
+/**
+ * 打开在线不落地文档出现失败时,给予错误提示
+ */
+function OnOpenOnLineDocDownFail() {
+ alert("打开在线不落地文档失败!请尝试重新打开。");
+ return;
+}
+
+/**
+ * 功能说明:判断是否已存在来自OA的已打开的文档
+ * @param {字符串} FileURL
+ */
+function pCheckIsExistOpenOADoc(FileURL) {
+ var l_DocCount = wps.WppApplication().Presentations.Count;
+ if (l_DocCount <= 0) return false;
+
+ //轮询检查当前已打开的文档中,是否存在OA相同的文件
+ if (l_DocCount >= 1) {
+ for (var l_index = 1; l_index <= l_DocCount; l_index++) {
+ var l_objDoc = wps.WppApplication().Presentations.Item(l_index);
+
+ var l_strParam = wps.PluginStorage.getItem(l_objDoc.FullName);
+ if (l_strParam == null)
+ continue;
+ var l_objParam = JSON.parse(l_strParam)
+ if (l_objParam.fileName == FileURL) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
+
+/**
+ * 参数:
+ * doc : 当前OA文档的Document对象
+ * DocLandMode : 落地模式设置
+ */
+function DoSetOADocLandMode(doc, DocLandMode) {
+ if (!doc) return;
+ var l_Param = wps.PluginStorage.getItem(doc.FullName);
+ var l_objParam = JSON.parse(l_Param);
+ //增加属性,或设置
+ l_objParam.OADocLandMode = DocLandMode; //设置OA文档的落地标志
+
+ var l_p = JSON.stringify(l_objParam);
+ //将OA文档落地模式标志存入系统变量对象保存
+ wps.PluginStorage.setItem(doc.FullName, l_p);
+}
+
+//Office文件打开后,设置该文件属性:从服务端来的OA文件
+function pSetOADocumentFlag(doc, params) {
+ if (!doc) {
+ return;
+ }
+ var l_Param = params;
+ l_Param.isOA = EnumOAFlag.DocFromOA; //设置OA打开文档的标志
+ l_Param.SourcePath = doc.FullName; //保存OA的原始文件路径,用于保存时分析,是否进行了另存为操作
+ if (doc) {
+ var l_p = JSON.stringify(l_Param);
+ //将OA文档标志存入系统变量对象保存
+ wps.PluginStorage.setItem(doc.FullName, l_p);
+ }
+}
+
+/**
+ * 作用:设置Ribbon工具条的按钮显示状态
+ * @param {*} paramsGroups
+ */
+function pDoResetRibbonGroups(paramsGroups) {
+
+}
+
+/**
+ * 按照定时器的时间,自动执行所有文档的自动保存事件
+ */
+function OnDocSaveByAutoTimer() {
+ var l_Doc;
+ var l_Count = 0
+ var l_docCounts = wps.WppApplication().Presentations.Count;
+ for (l_Count = 0; l_Count < l_docCounts; l_Count++) {
+ l_Doc = wps.WppApplication().Presentations.Item(l_Count);
+ if (l_Doc) {
+ if (pCheckIfOADoc(l_Doc) == true) { // 是否为OA文件
+ //执行自动上传到OA服务器端的操作
+ pAutoUploadToServer(l_Doc);
+ //保存该文档对应的访问过程记录信息
+ }
+ }
+ }
+}
+
+/**
+ * 实现一个定时器
+ */
+function OpenTimerRun(funcCallBack) {
+ var l_mCount = 0; //设置一个计时器,按每分钟执行一次; 10分钟后重复执行
+ var l_timeID = 0; //用于保存计时器ID值
+
+ // 对间隔时间做处理
+ var l_AutoSaveToServerTime = wps.PluginStorage.getItem("AutoSaveToServerTime");
+ if (l_AutoSaveToServerTime == 0) { // 设置为0则不启动定时器
+ l_timeID = wps.PluginStorage.getItem("TempTimerID");
+ clearInterval(l_timeID);
+ return;
+ } else if (l_AutoSaveToServerTime < 3) {
+ l_AutoSaveToServerTime = 3;
+ }
+
+ l_timeID = setInterval(function () {
+ l_mCount = l_mCount + 1;
+ if (l_mCount > l_AutoSaveToServerTime) { //l_AutoSaveToServerTime 值由系统配置时设定,见pInitParameters()函数
+ l_mCount = 0;
+ funcCallBack(); //每隔l_AutoSaveToServerTime 分钟(例如10分钟)执行一次回调函数
+ }
+ }, 60000); //60000 每隔1分钟,执行一次操作(1000*60)
+
+ wps.PluginStorage.setItem("TempTimerID", l_timeID); //保存计时器ID值
+}
\ No newline at end of file
diff --git a/oaassist/WppOAAssist/js/common/func_oastarter.js b/oaassist/WppOAAssist/js/common/func_oastarter.js
new file mode 100644
index 0000000..ea010a4
--- /dev/null
+++ b/oaassist/WppOAAssist/js/common/func_oastarter.js
@@ -0,0 +1,53 @@
+/**
+ * web页面调用WPS加载项的方法入口
+ * * info参数结构
+ * info:[
+ * {
+ * '方法名':'方法参数',需要执行的方法
+ * },
+ * ...
+ * ]
+ * @param {*} info
+ */
+function dispatcher(info) {
+ var funcs = info.funcs;
+
+ //执行web页面传递的方法
+ for (var index = 0; index < funcs.length; index++) {
+ var func = funcs[index];
+ for (var key in func) {
+ func[key].isOA=true
+ if (key === "OpenDoc") { // OpenDoc 属于普通的打开文档的操作方式,文档落地操作
+ OpenDoc(func[key]); //进入打开文档处理函数
+ } else if (key === "OnlineEditDoc") { //在线方式打开文档,属于文档不落地的方式打开
+ OnlineEditDoc(func[key]);
+ } else if (key === "NewDoc") {
+ OpenDoc(func[key]);
+ }
+ }
+ }
+ return {message:"ok", app:wps.Application.Name}
+}
+
+/**
+ *
+ * @param {*} params OA端传入的参数
+ */
+function OnlineEditDoc(OaParams) {
+ if (OaParams.fileName == "") {
+ NewFile(OaParams);
+ } else {
+ //OA传来下载文件的URL地址,调用不落地方法打开
+ OpenOnLineFile(OaParams);
+ }
+}
+
+///打开来自OA端传递来的文档
+function OpenDoc(OaParams) {
+ if (OaParams.fileName == "") {
+ NewFile(OaParams);
+ } else {
+ //OA传来下载文件的URL地址,调用openFile 方法打开
+ OpenFile(OaParams);
+ }
+}
\ No newline at end of file
diff --git a/oaassist/WppOAAssist/js/common/func_tabcontrol.js b/oaassist/WppOAAssist/js/common/func_tabcontrol.js
new file mode 100644
index 0000000..ae83be0
--- /dev/null
+++ b/oaassist/WppOAAssist/js/common/func_tabcontrol.js
@@ -0,0 +1,407 @@
+var EnumOAFlag = {
+ DocFromOA: 1,
+ DocFromNoOA: 0
+}
+
+//记录是否用户点击OA文件的保存按钮
+var EnumDocSaveFlag = {
+ OADocSave: 1,
+ NoneOADocSave: 0
+}
+
+//标识文档的落地模式 本地文档落地 0 ,不落地 1
+var EnumDocLandMode = {
+ DLM_LocalDoc: 0,
+ DLM_OnlineDoc: 1
+}
+
+//加载时会执行的方法
+function OnWPSWorkTabLoad(ribbonUI) {
+ wps.ribbonUI = ribbonUI;
+
+ OnJSWorkInit(); //初始化文档事件(全局参数,挂载监听事件)
+ activeTab(); // 激活OA助手菜单
+ OpenTimerRun(OnDocSaveByAutoTimer); //启动定时备份过程
+ return true;
+}
+
+//文档各类初始化工作(WPP Js环境)
+function OnJSWorkInit() {
+ pInitParameters(); //OA助手环境的所有配置控制的初始化过程
+ AddPresentationEvent(); //挂接文档事件处理函数
+}
+
+
+//初始化全局参数
+function pInitParameters() {
+ wps.PluginStorage.setItem("OADocUserSave", EnumDocSaveFlag.NoneOADocSave); //初始化,没有用户点击保存按钮
+ wps.PluginStorage.setItem("OADocCanSaveAs", false); //默认OA文档不能另存为本地
+ wps.PluginStorage.setItem("AllowOADocReOpen", false); //设置是否允许来自OA的文件再次被打开
+ wps.PluginStorage.setItem("ShowOATabDocActive", false); //设置新打开文档是否默认显示OA助手菜单Tab //默认为false
+
+ wps.PluginStorage.setItem("DefaultUploadFieldName", "file"); //针对UploadFile方法设置上载字段名称
+
+ wps.PluginStorage.setItem("AutoSaveToServerTime", "10"); //自动保存回OA服务端的时间间隔。如果设置0,则关闭,最小设置3分钟
+ wps.PluginStorage.setItem("TempTimerID", "0"); //临时值,用于保存计时器ID的临时值
+
+ // 以下是一些临时状态参数,用于打开文档等的状态判断
+ wps.PluginStorage.setItem("IsInCurrOADocOpen", false); //用于执行来自OA端的新建或打开文档时的状态
+ wps.PluginStorage.setItem("IsInCurrOADocSaveAs", false); //用于执行来自OA端的文档另存为本地的状态
+}
+
+//挂载WPS的演示事件
+function AddPresentationEvent() {
+ wps.ApiEvent.AddApiEventListener("WindowActivate", OnWindowActivate);
+ wps.ApiEvent.AddApiEventListener("PresentationBeforeClose", OnPresentationBeforeClose);
+ wps.ApiEvent.AddApiEventListener("DocumentRightsInfo", OnDocumentRightsInfo);
+
+ console.log("AddPresentationEvent");
+}
+
+/**
+ * 根据传入Document对象,获取OA传入的参数的某个Key值的Value
+ * @param {*} Doc
+ * @param {*} Key
+ * 返回值:返回指定 Key的 Value
+ */
+function GetDocParamsValue(Doc, Key) {
+ if (!Doc) {
+ return "";
+ }
+
+ var l_Params = wps.PluginStorage.getItem(Doc.FullName);
+ if (!l_Params) {
+ return "";
+ }
+
+ var l_objParams = JSON.parse(l_Params);
+ if (typeof (l_objParams) == "undefined") {
+ return "";
+ }
+
+ var l_rtnValue = l_objParams[Key];
+ if (typeof (l_rtnValue) == "undefined" || l_rtnValue == null) {
+ return "";
+ }
+ return l_rtnValue;
+}
+
+/**
+ * 作用:根据OA传入参数,设置是否显示Ribbob按钮组
+ * 参数:CtrlID 是OnGetVisible 传入的Ribbob控件的ID值
+ */
+function pShowRibbonGroupByOADocParam(CtrlID) {
+ var l_Doc = wps.WppApplication().ActivePresentation;
+ if (!l_Doc) {
+ return false; //如果未装入文档,则设置OA助手按钮组不可见
+ }
+
+ //获取OA传入的按钮组参数组
+ var l_grpButtonParams = GetDocParamsValue(l_Doc, "buttonGroups"); //disableBtns
+ l_grpButtonParams = l_grpButtonParams + "," + GetDocParamsValue(l_Doc, "disableBtns");
+
+
+ // 要求OA传入控制自定义按钮显示的参数为字符串 中间用 , 分隔开
+ if (typeof (l_grpButtonParams) == "string") {
+ var l_arrayGroup = new Array();
+ l_arrayGroup = l_grpButtonParams.split(",");
+ //console.log(l_grpButtonParams);
+
+ // 判断当前按钮是否存在于数组
+ if (l_arrayGroup.indexOf(CtrlID) >= 0) {
+ return false;
+ }
+ }
+ // 添加OA菜单判断
+ if (CtrlID == "WPSWorkExtTab") {
+ var l_value = wps.PluginStorage.getItem("ShowOATabDocActive");
+ wps.PluginStorage.setItem("ShowOATabDocActive", false); //初始化临时状态变量
+ console.log("菜单:" + l_value);
+ return l_value;
+ }
+
+ return true;
+}
+
+/**
+ * 调用文件上传到OA服务端时,
+ * @param {*} resp
+ */
+function OnUploadToServerSuccess(resp) {
+ var l_doc = wps.WppApplication().ActivePresentation;
+ if (wps.confirm("文件上传成功!继续编辑请确认,取消关闭文档。") == false) {
+ if (l_doc) {
+ console.log("OnUploadToServerSuccess: before Close");
+ l_doc.Close(); //保存文档后关闭
+ console.log("OnUploadToServerSuccess: after Close");
+ }
+ }
+
+ var l_NofityURL = GetDocParamsValue(l_doc, "notifyUrl");
+ if (l_NofityURL != "") {
+ l_NofityURL = l_NofityURL.replace("{?}", "2"); //约定:参数为2则文档被成功上传
+ NotifyToServer(l_NofityURL);
+ }
+}
+
+function OnUploadToServerFail(resp) {
+ alert("文件上传失败!");
+}
+
+//判断当前文档是否是OA文档
+function pCheckIfOADoc() {
+ var doc = wps.WppApplication().ActivePresentation;
+ console.log("先判断是否有doc对象")
+ if (!doc)
+ return false;
+ return CheckIfDocIsOADoc(doc);
+}
+
+//根据传入的doc对象,判断当前文档是否是OA文档
+function CheckIfDocIsOADoc(doc) {
+ if (!doc) {
+ return false;
+ }
+
+ var l_isOA = GetDocParamsValue(doc, "isOA");
+ if (l_isOA == "") {
+ return false
+ }
+
+ return l_isOA == EnumOAFlag.DocFromOA ? true : false;
+}
+
+//返回是否可以点击OA保存按钮的状态
+function OnSetSaveToOAEnable() {
+ return pCheckIfOADoc();
+}
+
+/**
+ * 作用:判断是否是不落地文档
+ * 参数:doc 文档对象
+ * 返回值: 布尔值
+ */
+function pIsOnlineOADoc(doc) {
+ var l_LandMode = GetDocParamsValue(doc, "OADocLandMode"); //获取文档落地模式
+ if (l_LandMode == "") { //用户本地打开的文档
+ return false;
+ }
+ return l_LandMode == EnumDocLandMode.DLM_OnlineDoc;
+}
+
+//保存到OA后台服务器
+function OnBtnSaveToServer() {
+ // console.log('SaveToServer');
+ var l_doc = wps.WppApplication().ActivePresentation;
+ if (!l_doc) {
+ alert("空文档不能保存!");
+ return;
+ }
+
+ //非OA文档,不能上传到OA
+ if (pCheckIfOADoc() == false) {
+ alert("非系统打开的文档,不能直接上传到系统!");
+ return;
+ }
+
+ /**
+ * 参数定义:OAAsist.UploadFile(name, path, url, field, "OnSuccess", "OnFail")
+ * 上传一个文件到远程服务器。
+ * name:为上传后的文件名称;
+ * path:是文件绝对路径;
+ * url:为上传地址;
+ * field:为请求中name的值;
+ * 最后两个参数为回调函数名称;
+ */
+ var l_uploadPath = GetDocParamsValue(l_doc, "uploadPath"); // 文件上载路径
+ if (l_uploadPath == "") {
+ wps.alert("系统未传入文件上载路径,不能执行上传操作!");
+ return;
+ }
+
+ if (!wps.confirm("先保存文档,并开始上传到系统后台,请确认?")) {
+ return;
+ }
+
+ var l_FieldName = GetDocParamsValue(l_doc, "uploadFieldName"); //上载到后台的字段名称
+ if (l_FieldName == "") {
+ l_FieldName = wps.PluginStorage.getItem("DefaultUploadFieldName"); // 默认为‘file’
+ }
+
+ var l_UploadName = GetDocParamsValue(l_doc, "uploadFileName"); //设置OA传入的文件名称参数
+ if (l_UploadName == "") {
+ l_UploadName = l_doc.Name; //默认文件名称就是当前文件编辑名称
+ }
+
+ var l_DocPath = l_doc.FullName; // 文件所在路径
+
+ if (pIsOnlineOADoc(l_doc) == false) {
+ //对于本地磁盘文件上传OA,先用Save方法保存后,再上传
+ //设置用户保存按钮标志,避免出现禁止OA文件保存的干扰信息
+ wps.PluginStorage.setItem("OADocUserSave", EnumDocSaveFlag.OADocSave);
+ l_doc.Save(); //执行一次保存方法
+ //设置用户保存按钮标志
+ wps.PluginStorage.setItem("OADocUserSave", EnumDocSaveFlag.NoneOADocSave);
+ //落地文档,调用UploadFile方法上传到OA后台
+ try {
+ //调用OA助手的上传方法
+ wps.OAAssist.UploadFile(l_UploadName, l_DocPath, l_uploadPath, l_FieldName, "OnUploadToServerSuccess", "OnUploadToServerFail");
+ } catch (err) {
+ alert("上传文件失败!请检查系统上传参数及网络环境!");
+ }
+ } else {
+ // 不落地的文档,调用 Document 对象的不落地上传方法
+ wps.PluginStorage.setItem("OADocUserSave", EnumDocSaveFlag.OADocSave);
+ try {
+ //调用不落地上传方法
+ l_doc.SaveAsUrl(l_UploadName, l_uploadPath, l_FieldName, "OnUploadToServerSuccess", "OnUploadToServerFail");
+ } catch (err) {
+ alert("上传文件失败!请检查系统上传参数及网络环境,重新上传。");
+ }
+ wps.PluginStorage.setItem("OADocUserSave", EnumDocSaveFlag.NoneOADocSave);
+ }
+
+ //获取OA传入的 转其他格式上传属性
+ var l_suffix = GetDocParamsValue(l_doc, "suffix");
+ if (l_suffix == "") {
+ console.log("上传需转换的文件后缀名错误,无妨进行转换上传!");
+ return;
+ }
+
+ //判断是否同时上传PDF等格式到OA后台
+ var l_uploadWithAppendPath = GetDocParamsValue(l_doc, "uploadWithAppendPath"); //标识是否同时上传OFD、PDF等格式的文件
+ if (l_uploadWithAppendPath == "1") {
+ //调用转 pdf格式函数,强制关闭转换修订痕迹
+ pDoChangeToOtherDocFormat(l_doc, l_suffix, false, false); //
+ }
+ return;
+}
+
+/**
+ * 执行另存为本地文件操作
+ */
+function OnBtnSaveAsLocalFile() {
+
+ //初始化临时状态值
+ wps.PluginStorage.setItem("OADocUserSave", false);
+ wps.PluginStorage.setItem("IsInCurrOADocSaveAs", false);
+
+ //检测是否有文档正在处理
+ var l_doc = wps.WppApplication().ActivePresentation;
+ if (!l_doc) {
+ alert("WPS当前没有可操作文档!");
+ return;
+ }
+
+ // 设置WPS文档对话框 2 FileDialogType:=msoFileDialogSaveAs
+ var l_ksoFileDialog = wps.WppApplication().FileDialog(2);
+ l_ksoFileDialog.InitialFileName = l_doc.Name; //文档名称
+
+ if (l_ksoFileDialog.Show() == -1) { // -1 代表确认按钮
+ wps.PluginStorage.setItem("OADocUserSave", true); //设置保存为临时状态,在Save事件中避免OA禁止另存为对话框
+ l_ksoFileDialog.Execute(); //会触发保存文档的监听函数
+
+ pSetNoneOADocFlag(l_doc.FullName);
+
+ wps.ribbonUI.Invalidate(); //刷新Ribbon的状态
+ };
+}
+
+/**
+ *
+ * @param {*} params
+ * @param {*} Key
+ */
+function GetParamsValue(Params, Key) {
+ if (typeof (Params) == "undefined") {
+ return "";
+ }
+
+ var l_rtnValue = Params[Key];
+ return l_rtnValue;
+}
+
+function OnAction(control) {
+ var strId = typeof (control) == "object" ? control.Id : control;
+ switch (strId) {
+ case "btnSaveToServer":
+ OnBtnSaveToServer();
+ break;
+ case "btnSaveAsFile":
+ OnBtnSaveAsLocalFile();
+ break;
+ default:
+ ;
+ }
+ return true;
+}
+/**
+ * 设置功能的可用性
+ *
+ * @param {*} control
+ * @returns
+ */
+function OnGetEnabled(control) {
+ var eleId;
+ if (typeof control == "object" && arguments.length == 1) { //针对Ribbon的按钮的
+ eleId = control.Id;
+ } else if (typeof control == "undefined" && arguments.length > 1) { //针对idMso的
+ eleId = arguments[1].Id;
+ console.log(eleId)
+ } else if (typeof control == "boolean" && arguments.length > 1) { //针对checkbox的
+ eleId = arguments[1].Id;
+ } else if (typeof control == "number" && arguments.length > 1) { //针对combox的
+ eleId = arguments[2].Id;
+ }
+ switch (eleId) {
+ case "btnSaveToServer": //保存到OA服务器的相关按钮。判断,如果非OA文件,禁止点击
+ case "btnChangeToPDF": //保存到PDF格式再上传
+ case "btnChangeToUOT": //保存到UOT格式再上传
+ case "btnChangeToOFD": //保存到OFD格式再上传
+ return OnSetSaveToOAEnable();
+ case "SaveAsPDF":
+ case "SaveAsOfd":
+ case "SaveAsPicture":
+ case "FileMenuSendMail":
+ case "FileSaveAsPicture":
+ case "FileSaveAsPdfOrXps":
+ case "VisualBasic":
+ case "MacroPlay":
+ return OnSetSaveAsRightsEnable();
+ default:
+ ;
+ }
+ return true;
+}
+
+function OnGetVisible(control) {
+ var eleId = typeof (control) == "object" ? control.Id : control;
+ var l_value = false;
+ //按照 OA文档传递过来的属性进行判断
+ l_value = pShowRibbonGroupByOADocParam(eleId);
+ return l_value;
+}
+
+function GetImage(control) {
+ var eleId = typeof (control) == "object" ? control.Id : control;
+ switch (eleId) {
+ case "btnSaveToServer": //保存到OA后台服务端
+ return "./icon/w_Save.png";
+ case "btnSaveAsFile": //另存为本地文件
+ return "./icon/w_SaveAs.png";
+ default:
+ ;
+ }
+ return "./icon/c_default.png";
+}
+
+function OnGetLabel(control) {
+ var eleId = typeof (control) == "object" ? control.Id : control;
+ switch (eleId) {
+ case "btnSaveAsFile":
+ return "另存为本地";
+ default:
+ ;
+ }
+ return "";
+}
\ No newline at end of file
diff --git a/oaassist/WppOAAssist/js/main.js b/oaassist/WppOAAssist/js/main.js
new file mode 100644
index 0000000..81578c3
--- /dev/null
+++ b/oaassist/WppOAAssist/js/main.js
@@ -0,0 +1,9 @@
+if (typeof (window.wps) == "undefined") {
+ window.wps = window;
+}
+var time=new Date().getTime() //添加时间戳,防止js文件使用浏览器缓存
+document.write("");
+document.write("");
+document.write("");
+document.write("");
+document.write("");
\ No newline at end of file
diff --git a/oaassist/WppOAAssist/package.json b/oaassist/WppOAAssist/package.json
new file mode 100644
index 0000000..8ee5a6f
--- /dev/null
+++ b/oaassist/WppOAAssist/package.json
@@ -0,0 +1,12 @@
+{
+ "name": "WppOAAssist",
+ "addonType": "wpp",
+ "version": "1.0.0",
+ "description": "这个工程为WPS演示项目一个简单的OA场景集成的WPS加载项——OA助手,旨在帮助大家能够快速理解并熟悉WPS加载项机制以及和浏览器调用交互的流程。",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "author": "",
+ "license": "ISC"
+}
\ No newline at end of file
diff --git a/oaassist/WppOAAssist/ribbon.xml b/oaassist/WppOAAssist/ribbon.xml
new file mode 100644
index 0000000..c03cfad
--- /dev/null
+++ b/oaassist/WppOAAssist/ribbon.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/oaassist/WpsOAAssist/LICENSE b/oaassist/WpsOAAssist/LICENSE
new file mode 100644
index 0000000..c57b0e8
--- /dev/null
+++ b/oaassist/WpsOAAssist/LICENSE
@@ -0,0 +1,326 @@
+
+Copyright @ 2012-2019, Kingsoft office,All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+3. Neither the name of the copyright holder nor the names of its
+contributors may be used to endorse or promote products derived from this
+software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+
+
+
+
+
+
+************************************************************************************
+QRCode.js
+
+The MIT License (MIT)
+---------------------
+Copyright (c) 2012 davidshimjs
+
+Permission is hereby granted, free of charge,
+to any person obtaining a copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction,
+including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+************************************************************************************
+Vue.js
+
+The MIT License (MIT)
+
+Copyright (c) 2013-present, Yuxi (Evan) You
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+************************************************************************************
+bootstrap
+The MIT License (MIT)
+
+Copyright (c) 2011-2019 Twitter, Inc.
+Copyright (c) 2011-2019 The Bootstrap Authors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+************************************************************************************
+html5-formdata
+MIT License
+
+Copyright (c) 2010 François de Metz
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+The MIT License (MIT)
+
+************************************************************************************
+iview
+
+Copyright (c) 2016-present TalkingData
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+MIT LICENSE
+
+Copyright (c) 2015-present Alipay.com, https://www.alipay.com/
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+The MIT License (MIT)
+
+Copyright (c) 2016 ElemeFE
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+The MIT License (MIT)
+
+Copyright (c) 2015 Koala
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+The MIT License (MIT)
+
+Copyright (c) 2016 vue-beauty
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+MIT License
+
+Copyright (c) 2016-present, Airyland
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+The MIT License (MIT)
+
+Copyright (c) 2016 Drifty (http://drifty.com/)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+The MIT License (MIT)
+
+Copyright (c) 2015 greyby
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+************************************************************************************
+jquery
+Copyright JS Foundation and other contributors, https://js.foundation/
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+************************************************************************************
+zTree
+The MIT License (MIT)
+
+copyright (c) <2011> < hunter.z >
+
+使用该许可证的软件被授予以下权限,免费,任何人可以得到这个软件及其相关文档的一个拷贝,并且经营该软件不受任何限制,包括无限制的使用、复制、修改、合并、出版、发行、发放从属证书、或者出售该软件的拷贝的权利。同时允许获得这些软件的用户享受这些权利,使其服从下面的条件:
+
+以上的版权通知和权限通知应该包含在所有该软件的拷贝中或者是其他该软件的真实部分中。
+
+该软件按本来的样子提供,没有任何形式的担保,不管是明确地或者暗含的,包含这些但是不受商业性质的担保的限制。适合一个特定的用途并且不受侵犯。作者和版权持有人在任何场合对使用该软件涉及的任何要求、损害或者其他责任都不应负责。不管它是正在起作用还是只是合同形式、民事侵权或是其他方式,如由它引起,在其作用范围内、与该软件有联系、该软件的使用或者有这个软件引起的其他行为。
\ No newline at end of file
diff --git a/oaassist/WpsOAAssist/QRCode.html b/oaassist/WpsOAAssist/QRCode.html
new file mode 100644
index 0000000..0cd1bc1
--- /dev/null
+++ b/oaassist/WpsOAAssist/QRCode.html
@@ -0,0 +1,82 @@
+
+
+
+
+ 二维码生成
+
+
+
+
+
+
+
+
+
+
2+66
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/oaassist/WpsOAAssist/README.md b/oaassist/WpsOAAssist/README.md
new file mode 100644
index 0000000..ea52303
--- /dev/null
+++ b/oaassist/WpsOAAssist/README.md
@@ -0,0 +1,27 @@
+## Welcome to WPS OAAssist Demo
+
+### 这个项目是什么?
+
+这个工程为WPS文字项目常见的OA场景集成下的WPS加载项——OA助手,项目使用了丰富的WPS API的功能,可以帮助大家能够快速理解并熟悉WPS加载项机制以及和浏览器调用交互的流程。
+
+### 工程结构
+
+* icon 图标文件。
+* js WPS 加载项功能逻辑的js代码。
+* otherslib vue,jQueryd等第三方库。
+* template 示例模板文件。
+* importTemplate.html 导入模板页面。
+* index.html 加载项的默认加载页面。
+* qrcode.html 插入二维码页面。
+* redhead.html 插入红头页面。
+* selectBookmark.html 插入标签页面。
+* selectSeal.html 插入签章页面。
+* setUserName.html 修改默认用户名页面。
+* ribbon.xml 自定义选项卡配置。
+
+### 注意事项
+
+* 本工程只是演示demo
+* 我们建议您结合具体的应用场景修改示例代码,这样更能够体现OA助手集成的应用场景
+* 为了保护代码,建议对上线代码进行混淆
+* 使用该工程的时候,必须要安装WPS专业版,请咨询QQ:3253920855
diff --git a/oaassist/WpsOAAssist/icon/3.svg b/oaassist/WpsOAAssist/icon/3.svg
new file mode 100644
index 0000000..f779740
--- /dev/null
+++ b/oaassist/WpsOAAssist/icon/3.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
diff --git a/oaassist/WpsOAAssist/icon/c_bookmark.png b/oaassist/WpsOAAssist/icon/c_bookmark.png
new file mode 100644
index 0000000..3a16822
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/c_bookmark.png differ
diff --git a/oaassist/WpsOAAssist/icon/c_default.png b/oaassist/WpsOAAssist/icon/c_default.png
new file mode 100644
index 0000000..419eb16
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/c_default.png differ
diff --git a/oaassist/WpsOAAssist/icon/c_printDoc.png b/oaassist/WpsOAAssist/icon/c_printDoc.png
new file mode 100644
index 0000000..6bcf18c
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/c_printDoc.png differ
diff --git a/oaassist/WpsOAAssist/icon/c_seal.png b/oaassist/WpsOAAssist/icon/c_seal.png
new file mode 100644
index 0000000..77e7461
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/c_seal.png differ
diff --git a/oaassist/WpsOAAssist/icon/newFromTemp.svg b/oaassist/WpsOAAssist/icon/newFromTemp.svg
new file mode 100644
index 0000000..f6c70b3
--- /dev/null
+++ b/oaassist/WpsOAAssist/icon/newFromTemp.svg
@@ -0,0 +1,22 @@
+
+
+
+ 从模版新建
+ Created with Sketch.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/oaassist/WpsOAAssist/icon/w_AcceptRev.png b/oaassist/WpsOAAssist/icon/w_AcceptRev.png
new file mode 100644
index 0000000..b059197
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/w_AcceptRev.png differ
diff --git a/oaassist/WpsOAAssist/icon/w_BackDoc.png b/oaassist/WpsOAAssist/icon/w_BackDoc.png
new file mode 100644
index 0000000..9726a88
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/w_BackDoc.png differ
diff --git a/oaassist/WpsOAAssist/icon/w_CloseRev.png b/oaassist/WpsOAAssist/icon/w_CloseRev.png
new file mode 100644
index 0000000..cc258e8
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/w_CloseRev.png differ
diff --git a/oaassist/WpsOAAssist/icon/w_CloseRev1 (2).png b/oaassist/WpsOAAssist/icon/w_CloseRev1 (2).png
new file mode 100644
index 0000000..5ae70ce
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/w_CloseRev1 (2).png differ
diff --git a/oaassist/WpsOAAssist/icon/w_CloseRev3.png b/oaassist/WpsOAAssist/icon/w_CloseRev3.png
new file mode 100644
index 0000000..9d02983
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/w_CloseRev3.png differ
diff --git a/oaassist/WpsOAAssist/icon/w_DeleteRev.png b/oaassist/WpsOAAssist/icon/w_DeleteRev.png
new file mode 100644
index 0000000..2ca61b5
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/w_DeleteRev.png differ
diff --git a/oaassist/WpsOAAssist/icon/w_DocClear.png b/oaassist/WpsOAAssist/icon/w_DocClear.png
new file mode 100644
index 0000000..a21d6ed
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/w_DocClear.png differ
diff --git a/oaassist/WpsOAAssist/icon/w_DocClound.png b/oaassist/WpsOAAssist/icon/w_DocClound.png
new file mode 100644
index 0000000..c322e15
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/w_DocClound.png differ
diff --git a/oaassist/WpsOAAssist/icon/w_DocOFD.png b/oaassist/WpsOAAssist/icon/w_DocOFD.png
new file mode 100644
index 0000000..965f52b
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/w_DocOFD.png differ
diff --git a/oaassist/WpsOAAssist/icon/w_DocQr.png b/oaassist/WpsOAAssist/icon/w_DocQr.png
new file mode 100644
index 0000000..d320a7c
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/w_DocQr.png differ
diff --git a/oaassist/WpsOAAssist/icon/w_DocQr1.png b/oaassist/WpsOAAssist/icon/w_DocQr1.png
new file mode 100644
index 0000000..0ed2ed5
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/w_DocQr1.png differ
diff --git a/oaassist/WpsOAAssist/icon/w_DocRevis.png b/oaassist/WpsOAAssist/icon/w_DocRevis.png
new file mode 100644
index 0000000..71b3fbe
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/w_DocRevis.png differ
diff --git a/oaassist/WpsOAAssist/icon/w_DocUOF.png b/oaassist/WpsOAAssist/icon/w_DocUOF.png
new file mode 100644
index 0000000..61ffe9b
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/w_DocUOF.png differ
diff --git a/oaassist/WpsOAAssist/icon/w_GovDoc.png b/oaassist/WpsOAAssist/icon/w_GovDoc.png
new file mode 100644
index 0000000..81fd96d
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/w_GovDoc.png differ
diff --git a/oaassist/WpsOAAssist/icon/w_ImportDoc.png b/oaassist/WpsOAAssist/icon/w_ImportDoc.png
new file mode 100644
index 0000000..5f05768
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/w_ImportDoc.png differ
diff --git a/oaassist/WpsOAAssist/icon/w_ImportDoc1.png b/oaassist/WpsOAAssist/icon/w_ImportDoc1.png
new file mode 100644
index 0000000..e2c270c
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/w_ImportDoc1.png differ
diff --git a/oaassist/WpsOAAssist/icon/w_InsDate.png b/oaassist/WpsOAAssist/icon/w_InsDate.png
new file mode 100644
index 0000000..4ce7254
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/w_InsDate.png differ
diff --git a/oaassist/WpsOAAssist/icon/w_InsPicture.png b/oaassist/WpsOAAssist/icon/w_InsPicture.png
new file mode 100644
index 0000000..7471c4a
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/w_InsPicture.png differ
diff --git a/oaassist/WpsOAAssist/icon/w_InsPictures.png b/oaassist/WpsOAAssist/icon/w_InsPictures.png
new file mode 100644
index 0000000..9c031d9
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/w_InsPictures.png differ
diff --git a/oaassist/WpsOAAssist/icon/w_OpenRev.png b/oaassist/WpsOAAssist/icon/w_OpenRev.png
new file mode 100644
index 0000000..375db8d
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/w_OpenRev.png differ
diff --git a/oaassist/WpsOAAssist/icon/w_OpenRev2.png b/oaassist/WpsOAAssist/icon/w_OpenRev2.png
new file mode 100644
index 0000000..5aa6245
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/w_OpenRev2.png differ
diff --git a/oaassist/WpsOAAssist/icon/w_PDF.png b/oaassist/WpsOAAssist/icon/w_PDF.png
new file mode 100644
index 0000000..7b8ea14
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/w_PDF.png differ
diff --git a/oaassist/WpsOAAssist/icon/w_PageGear.png b/oaassist/WpsOAAssist/icon/w_PageGear.png
new file mode 100644
index 0000000..c8cf08d
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/w_PageGear.png differ
diff --git a/oaassist/WpsOAAssist/icon/w_RejectRev.png b/oaassist/WpsOAAssist/icon/w_RejectRev.png
new file mode 100644
index 0000000..81a92a6
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/w_RejectRev.png differ
diff --git a/oaassist/WpsOAAssist/icon/w_Save.png b/oaassist/WpsOAAssist/icon/w_Save.png
new file mode 100644
index 0000000..edcd53a
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/w_Save.png differ
diff --git a/oaassist/WpsOAAssist/icon/w_SaveAs.png b/oaassist/WpsOAAssist/icon/w_SaveAs.png
new file mode 100644
index 0000000..a5fe456
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/w_SaveAs.png differ
diff --git a/oaassist/WpsOAAssist/icon/w_Scanner16.png b/oaassist/WpsOAAssist/icon/w_Scanner16.png
new file mode 100644
index 0000000..e3b1bec
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/w_Scanner16.png differ
diff --git a/oaassist/WpsOAAssist/icon/w_WPSCloud.png b/oaassist/WpsOAAssist/icon/w_WPSCloud.png
new file mode 100644
index 0000000..b60e5a4
Binary files /dev/null and b/oaassist/WpsOAAssist/icon/w_WPSCloud.png differ
diff --git a/oaassist/WpsOAAssist/importTemplate.html b/oaassist/WpsOAAssist/importTemplate.html
new file mode 100644
index 0000000..0a67570
--- /dev/null
+++ b/oaassist/WpsOAAssist/importTemplate.html
@@ -0,0 +1,173 @@
+
+
+
+
+ 导入模板
+
+
+
+
+
+
+
+
+
+
+
+ 文件名:
+
+ 请选择模板
+ {{item.tempName}}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/oaassist/WpsOAAssist/index.html b/oaassist/WpsOAAssist/index.html
new file mode 100644
index 0000000..887c288
--- /dev/null
+++ b/oaassist/WpsOAAssist/index.html
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/oaassist/WpsOAAssist/js/common/common.js b/oaassist/WpsOAAssist/js/common/common.js
new file mode 100644
index 0000000..3c02027
--- /dev/null
+++ b/oaassist/WpsOAAssist/js/common/common.js
@@ -0,0 +1,535 @@
+// -------------------------- 通用常量 ---------------------------
+
+//OA门户网站用接口,配置默认服务器接口
+var OA_DOOR = {
+ templateDataUrl: undefined, //正文模板列表接口
+ templateBaseURL: undefined, //指定正文模板基础接口
+ redHeadsPath: undefined, //默认红头模板列表获取路径
+ getRedHeadPath: undefined, //默认获取红头文件路径
+ bookmarkPath: undefined, //书签列表接口
+ redHeadsPath: undefined, //默认红头模板列表获取路径
+}
+
+// -------------------------- 通用方法 ---------------------------
+//去除字符串左边空格
+String.prototype.ltrim = function () {
+ return this.replace(/(^\s*)/g, "");
+}
+
+//去除字符串右边空格
+String.prototype.rtrim = function () {
+ return this.replace(/(\s*$)/g, "");
+}
+
+//扩展js string endwith,startwith方法
+String.prototype.endWith = function (str) {
+ if (str == null || str == "" || this.length == 0 || str.length > this.length)
+ return false;
+ if (this.substring(this.length - str.length) == str)
+ return true;
+ else
+ return false;
+}
+
+String.prototype.startWith = function (str) {
+ if (str == null || str == "" || this.length == 0 || str.length > this.length)
+ return false;
+ if (this.substr(0, str.length) == str)
+ return true;
+ else
+ return false;
+}
+
+//UTF-16转UTF-8
+function utf16ToUtf8(s) {
+ if (!s) {
+ return;
+ }
+ var i, code, ret = [],
+ len = s.length;
+ for (i = 0; i < len; i++) {
+ code = s.charCodeAt(i);
+ if (code > 0x0 && code <= 0x7f) {
+ //单字节
+ //UTF-16 0000 - 007F
+ //UTF-8 0xxxxxxx
+ ret.push(s.charAt(i));
+ } else if (code >= 0x80 && code <= 0x7ff) {
+ //双字节
+ //UTF-16 0080 - 07FF
+ //UTF-8 110xxxxx 10xxxxxx
+ ret.push(
+ //110xxxxx
+ String.fromCharCode(0xc0 | ((code >> 6) & 0x1f)),
+ //10xxxxxx
+ String.fromCharCode(0x80 | (code & 0x3f))
+ );
+ } else if (code >= 0x800 && code <= 0xffff) {
+ //三字节
+ //UTF-16 0800 - FFFF
+ //UTF-8 1110xxxx 10xxxxxx 10xxxxxx
+ ret.push(
+ //1110xxxx
+ String.fromCharCode(0xe0 | ((code >> 12) & 0xf)),
+ //10xxxxxx
+ String.fromCharCode(0x80 | ((code >> 6) & 0x3f)),
+ //10xxxxxx
+ String.fromCharCode(0x80 | (code & 0x3f))
+ );
+ }
+ }
+
+ return ret.join('');
+
+}
+var Base64 = {
+ _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
+ encode: function(e) {
+ var t = "";
+ var n, r, i, s, o, u, a;
+ var f = 0;
+ e = Base64._utf8_encode(e);
+ while (f < e.length) {
+ n = e.charCodeAt(f++);
+ r = e.charCodeAt(f++);
+ i = e.charCodeAt(f++);
+ s = n >> 2;
+ o = (n & 3) << 4 | r >> 4;
+ u = (r & 15) << 2 | i >> 6;
+ a = i & 63;
+ if (isNaN(r)) {
+ u = a = 64
+ } else if (isNaN(i)) {
+ a = 64
+ }
+ t = t + this._keyStr.charAt(s) + this._keyStr.charAt(o) + this._keyStr.charAt(u) + this._keyStr.charAt(a)
+ }
+ return t
+ },
+ decode: function(e) {
+ var t = "";
+ var n, r, i;
+ var s, o, u, a;
+ var f = 0;
+ e = e.replace(/[^A-Za-z0-9+/=]/g, "");
+ while (f < e.length) {
+ s = this._keyStr.indexOf(e.charAt(f++));
+ o = this._keyStr.indexOf(e.charAt(f++));
+ u = this._keyStr.indexOf(e.charAt(f++));
+ a = this._keyStr.indexOf(e.charAt(f++));
+ n = s << 2 | o >> 4;
+ r = (o & 15) << 4 | u >> 2;
+ i = (u & 3) << 6 | a;
+ t = t + String.fromCharCode(n);
+ if (u != 64) {
+ t = t + String.fromCharCode(r)
+ }
+ if (a != 64) {
+ t = t + String.fromCharCode(i)
+ }
+ }
+ t = Base64._utf8_decode(t);
+ return t
+ },
+ _utf8_encode: function(e) {
+ e = e.replace(/rn/g, "n");
+ var t = "";
+ for (var n = 0; n < e.length; n++) {
+ var r = e.charCodeAt(n);
+ if (r < 128) {
+ t += String.fromCharCode(r)
+ } else if (r > 127 && r < 2048) {
+ t += String.fromCharCode(r >> 6 | 192);
+ t += String.fromCharCode(r & 63 | 128)
+ } else {
+ t += String.fromCharCode(r >> 12 | 224);
+ t += String.fromCharCode(r >> 6 & 63 | 128);
+ t += String.fromCharCode(r & 63 | 128)
+ }
+ }
+ return t
+ },
+ _utf8_decode: function(e) {
+ var t = "";
+ var n = 0;
+ var r = c1 = c2 = 0;
+ while (n < e.length) {
+ r = e.charCodeAt(n);
+ if (r < 128) {
+ t += String.fromCharCode(r);
+ n++
+ } else if (r > 191 && r < 224) {
+ c2 = e.charCodeAt(n + 1);
+ t += String.fromCharCode((r & 31) << 6 | c2 & 63);
+ n += 2
+ } else {
+ c2 = e.charCodeAt(n + 1);
+ c3 = e.charCodeAt(n + 2);
+ t += String.fromCharCode((r & 15) << 12 | (c2 & 63) << 6 | c3 & 63);
+ n += 3
+ }
+ }
+ return t
+ }
+}
+//UTF-8转UTF-16
+function utf8ToUtf16(s) {
+ if (!s) {
+ return;
+ }
+
+ var i, codes, bytes, ret = [],
+ len = s.length;
+ for (i = 0; i < len; i++) {
+ codes = [];
+ codes.push(s.charCodeAt(i));
+ if (((codes[0] >> 7) & 0xff) == 0x0) {
+ //单字节 0xxxxxxx
+ ret.push(s.charAt(i));
+ } else if (((codes[0] >> 5) & 0xff) == 0x6) {
+ //双字节 110xxxxx 10xxxxxx
+ codes.push(s.charCodeAt(++i));
+ bytes = [];
+ bytes.push(codes[0] & 0x1f);
+ bytes.push(codes[1] & 0x3f);
+ ret.push(String.fromCharCode((bytes[0] << 6) | bytes[1]));
+ } else if (((codes[0] >> 4) & 0xff) == 0xe) {
+ //三字节 1110xxxx 10xxxxxx 10xxxxxx
+ codes.push(s.charCodeAt(++i));
+ codes.push(s.charCodeAt(++i));
+ bytes = [];
+ bytes.push((codes[0] << 4) | ((codes[1] >> 2) & 0xf));
+ bytes.push(((codes[1] & 0x3) << 6) | (codes[2] & 0x3f));
+ ret.push(String.fromCharCode((bytes[0] << 8) | bytes[1]));
+ }
+ }
+ return ret.join('');
+
+}
+
+function currentTime() {
+ var now = new Date();
+
+ var year = now.getFullYear(); //年
+ var month = now.getMonth() + 1; //月
+ var day = now.getDate(); //日
+
+ var hh = now.getHours(); //时
+ var mm = now.getMinutes(); //分
+ var ss = now.getSeconds();
+ var clock = year + "";
+
+ if (month < 10)
+ clock += "0";
+
+ clock += month + "";
+
+ if (day < 10)
+ clock += "0";
+
+ clock += day + "";
+
+ if (hh < 10)
+ clock += "0";
+
+ clock += hh + "";
+ if (mm < 10) clock += '0';
+ clock += mm;
+ if (ss < 10) clock += '0';
+ clock += ss;
+ return (clock);
+}
+
+/**
+ * 获取文件路径
+ * @param {*} html 文件全称
+ */
+function getHtmlURL(html) {
+ //弹出辅助窗格框
+ var GetUrlPath = ()=> {
+ var e = document.location.toString();
+ return -1 != (e = decodeURI(e)).indexOf("/") && (e = e.substring(0, e.lastIndexOf("/"))), e
+ }
+
+ var url = GetUrlPath();
+
+ if (url.length != 0) {
+ url = url.concat("/" + html);
+ } else {
+ url = url.concat("./" + html);
+ }
+ return url;
+}
+
+/**
+ * wps内弹出web页面
+ * @param {*} html 文件名
+ * @param {*} title 窗口标题
+ * @param {*} hight 窗口高
+ * @param {*} width 窗口宽
+ */
+function OnShowDialog(html, title, height, width, bModal) {
+ var l_ActiveDoc = wps.WpsApplication().ActiveDocument;
+ if (!l_ActiveDoc) {
+ alert("WPS当前没有可操作文档!")
+ return;
+ }
+ if (typeof bModal == "undefined" || bModal == null) {
+ bModal = true;
+ }
+ width *= window.devicePixelRatio;
+ height *= window.devicePixelRatio;
+ var url = getHtmlURL(html);
+ wps.ShowDialog(url, title, height, width, bModal);
+}
+
+/**
+ * 解析返回response的参数
+ * @param {*} resp
+ * @return {*} body
+ */
+function handleResultBody(resp) {
+ var result = "";
+ if (resp.Body) {
+ // 解析返回response的参数
+ }
+ return result;
+}
+
+
+/**
+ * 判断WPS中的文件个数是否为0,若为0则关闭WPS函数
+ * @param {*} name
+ */
+function closeWpsIfNoDocument() {
+ var wpsApp = wps.WpsApplication();
+ var docs = wpsApp.Documents;
+ if (!docs || docs.Count == 0) {
+ wps.ApiEvent.Cancel = true;
+ //根据业务可以选择是否退出进程 wpsApp.Quit();
+ }
+}
+
+function activeTab() {
+ //启动WPS程序后,默认显示的工具栏选项卡为ribbon.xml中某一tab
+ if (wps.ribbonUI)
+ wps.ribbonUI.ActivateTab('WPSWorkExtTab');
+}
+
+function showOATab() {
+ wps.PluginStorage.setItem("ShowOATabDocActive", pCheckIfOADoc()); //根据文件是否为OA文件来显示OA菜单
+ wps.ribbonUI.Invalidate(); // 刷新Ribbon自定义按钮的状态
+}
+
+function getDemoTemplatePath() {
+ var url = document.location.toString();
+ url = decodeURI(url);
+ if (url.indexOf("/") != -1) {
+ url = url.substring(0, url.lastIndexOf("/"));
+ }
+ if (url.length !== 0)
+ url = url.concat("/template/红头文件.docx");
+
+ if (url.startsWith("file:///"))
+ url = url.substr("file:///".length);
+ return url;
+}
+
+function getDemoSealPath() {
+ var url = document.location.toString();
+ url = decodeURI(url);
+ if (url.indexOf("/") != -1) {
+ url = url.substring(0, url.lastIndexOf("/"));
+ }
+ if (url.length !== 0)
+ url = url.concat("/template/OA模板:公章.png");
+
+ if (url.startsWith("file:///"))
+ url = url.substr("file:///".length);
+ return url;
+}
+
+function pGetParamName(data, attr) {
+ var start = data.indexOf(attr);
+ data = data.substring(start + attr.length);
+ return data;
+}
+/**
+ * 从requst中获取文件名(确保请求中有filename这个参数)
+ * @param {*} request
+ * @param {*} url
+ */
+ function pGetFileName(request, url) {
+ var disposition = request.getResponseHeader("Content-Disposition");
+ var filename = "";
+ if (disposition) {
+ var matchs = pGetParamName(disposition, "filename=");
+ if (matchs) {
+ filename = decodeURIComponent(matchs);
+ } else {
+ filename = "petro" + Date.getTime();
+ }
+ } else {
+ filename = url.substring(url.lastIndexOf("/") + 1);
+ filename=filename.split("?")[0]
+ }
+ return filename;
+}
+
+function StringToUint8Array(string) {
+ var binLen, buffer, chars, i, _i;
+ binLen = string.length;
+ buffer = new ArrayBuffer(binLen);
+ chars = new Uint8Array(buffer);
+ for (var i = 0; i < binLen; ++i) {
+ chars[i] = String.prototype.charCodeAt.call(string, i);
+ }
+ return buffer;
+}
+/**
+ * WPS下载文件到本地打开(业务系统可根据实际情况进行修改)
+ * @param {*} url 文件流的下载路径
+ * @param {*} callback 下载后的回调
+ */
+function DownloadFile(url, callback) {
+ var xhr = new XMLHttpRequest();
+ xhr.onreadystatechange = function () {
+ if (this.readyState == 4 && this.status == 200) {
+ //需要业务系统的服务端在传递文件流时,确保请求中的参数有filename
+ var fileName = pGetFileName(xhr, url)
+ //落地打开模式下,WPS会将文件下载到本地的临时目录,在关闭后会进行清理
+ var path = wps.Env.GetTempPath() + "/" + fileName
+ var reader = new FileReader();
+ reader.onload = function () {
+ wps.FileSystem.writeAsBinaryString(path, reader.result);
+ callback(path);
+ };
+ reader.readAsBinaryString(xhr.response);
+ }
+ }
+ xhr.open('GET', url);
+ xhr.responseType = 'blob';
+ xhr.send();
+}
+/**
+ * WPS上传文件到服务端(业务系统可根据实际情况进行修改,为了兼容中文,服务端约定用UTF-8编码格式)
+ * @param {*} strFileName 上传到服务端的文件名称(包含文件后缀)
+ * @param {*} strPath 上传文件的文件路径(文件在操作系统的绝对路径)
+ * @param {*} uploadPath 上传文件的服务端地址
+ * @param {*} strFieldName 业务调用方自定义的一些内容可通过此字段传递,默认赋值'file'
+ * @param {*} OnSuccess 上传成功后的回调
+ * @param {*} OnFail 上传失败后的回调
+ */
+function UploadFile(strFileName, strPath, uploadPath, strFieldName, OnSuccess, OnFail) {
+ var xhr = new XMLHttpRequest();
+ xhr.open('POST', uploadPath);
+
+ var fileData = wps.FileSystem.readAsBinaryString(strPath);
+ var data = new FakeFormData();
+ if (strFieldName == "" || typeof strFieldName == "undefined"){//如果业务方没定义,默认设置为'file'
+ strFieldName = 'file';
+ }
+ data.append(strFieldName, {
+ name: utf16ToUtf8(strFileName), //主要是考虑中文名的情况,服务端约定用utf-8来解码。
+ type: "application/octet-stream",
+ getAsBinary: function () {
+ return fileData;
+ }
+ });
+ xhr.onreadystatechange = function () {
+ if (xhr.readyState == 4) {
+ if (xhr.status == 200)
+ OnSuccess(xhr.response)
+ else
+ OnFail(xhr.response);
+ }
+ };
+ xhr.setRequestHeader("Cache-Control", "no-cache");
+ xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
+ if (data.fake) {
+ xhr.setRequestHeader("Content-Type", "multipart/form-data; boundary=" + data.boundary);
+ var arr = StringToUint8Array(data.toString());
+ xhr.send(arr);
+ } else {
+ xhr.send(data);
+ }
+}
+
+/**
+ * 打开WPS后通知到业务系统,可根据需求扩展
+ * @param {*} p_Url 业务方接受请求的地址
+ */
+function NotifyToServer(p_Url) {
+ $.ajax({
+ url: p_Url, // URL + '/wps/wpsCanOpen',
+ async: true,
+ method: "post",
+ dataType: 'json'
+ });
+}
+
+/**
+ * 更新编辑状态
+ * @param {*} p_Url 要传入OA端,通知业务系统,当前文档所处的编辑状态的URL地址路径
+ * @param {*} p_OpenUrl 当前文档从业务系统打开时的入口URL,这个URL包含业务系统开发者需要传入的ID等参数
+ * @param {*} docId 文档id
+ * @param {*} state 0-正在编辑中 1-文件保存 2-文件关闭 状态可根据需要进行自定义扩展
+ */
+function UpdateEditState(p_Url, p_OpenUrl, docId, state) {
+ var formData = {
+ "openUrl": p_OpenUrl,
+ "docId": docId,
+ "state": state
+ };
+ $.ajax({
+ url: p_Url, //URL + '/document/stateMonitor',
+ async: false,
+ data: formData,
+ method: "post",
+ dataType: 'json',
+ success: function (response) {
+ if (response == "success") {
+ console.log(response);
+ }
+ },
+ error: function (response) {
+ console.log(response);
+ }
+ });
+}
+
+/**
+ * 作用:判断文档关闭后,如果系统已经没有打开的文档了,则设置回初始用户名
+ */
+function pSetWPSAppUserName() {
+ //文档全部关闭的情况下,把WPS初始启动的用户名设置回去
+ if (wps.WpsApplication().Documents.Count == 1) {
+ var l_strUserName = wps.PluginStorage.getItem(constStrEnum.WPSInitUserName);
+ wps.WpsApplication().UserName = l_strUserName;
+ }
+}
+
+/**
+ * 设置文档参数的属性值
+ * @param {*} Doc
+ * @param {*} Key
+ * @param {*} Value
+ */
+function SetDocParamsValue(Doc, Key, Value) {
+ if (!Doc || !Key) {
+ return;
+ }
+
+ var l_Params = wps.PluginStorage.getItem(Doc.DocID);
+ if (!l_Params) {
+ return;
+ }
+
+ var l_objParams = JSON.parse(l_Params);
+ if (!(typeof(l_objParams) == "undefined")) {
+ l_objParams[Key] = Value;
+ }
+
+ //把属性值整体再写回原来的文档ID中
+ wps.PluginStorage.setItem(Doc.DocID, JSON.stringify(l_objParams));
+}
diff --git a/oaassist/WpsOAAssist/js/common/enum.js b/oaassist/WpsOAAssist/js/common/enum.js
new file mode 100644
index 0000000..77b5849
--- /dev/null
+++ b/oaassist/WpsOAAssist/js/common/enum.js
@@ -0,0 +1,115 @@
+/**
+ * WPS常用的API枚举值,具体参与API文档
+ */
+var WPS_Enum = {
+ wdDoNotSaveChanges: 0,
+ wdFormatPDF: 17,
+ wdFormatOpenDocumentText: 23,
+ wdFieldFormTextInput: 70,
+ wdAlertsNone: 0,
+ wdDialogFilePageSetup: 178,
+ wdDialogFilePrint: 88,
+ wdRelativeHorizontalPositionPage: 1,
+ wdGoToPage: 1,
+ wdPropertyPages: 14,
+ wdRDIComments: 1,
+ wdDialogInsertDateTime: 165,
+ msoCTPDockPositionLeft: 0,
+ msoCTPDockPositionRight: 2,
+ /**
+ * 将形状嵌入到文字中。
+ */
+ wdWrapInline: 7,
+ /**
+ * 将形状放在文字前面。 请参阅 wdWrapFront。
+ */
+ wdWrapNone: 3,
+ /**
+ * 使文字环绕形状。 行在形状的另一侧延续。
+ */
+ wdWrapSquare: 0,
+ /**
+ * 使文字环绕形状。
+ */
+ wdWrapThrough: 2,
+ /**
+ * 使文字紧密地环绕形状。
+ */
+ wdWrapTight: 1,
+ /**
+ * 将文字放在形状的上方和下方。
+ */
+ wdWrapTopBottom: 4,
+ /**
+ * 将形状放在文字后面。
+ */
+ wdWrapBehind: 5,
+ /**
+ * 将形状放在文字前面。
+ */
+ wdWrapFront: 6
+}
+
+/**
+ * WPS加载项自定义的枚举值
+ */
+var constStrEnum = {
+ AllowOADocReOpen: "AllowOADocReOpen",
+ AutoSaveToServerTime: "AutoSaveToServerTime",
+ bkInsertFile: "bkInsertFile",
+ buttonGroups: "buttonGroups",
+ CanSaveAs: "CanSaveAs",
+ copyUrl: "copyUrl",
+ DefaultUploadFieldName: "DefaultUploadFieldName",
+ disableBtns: "disableBtns",
+ insertFileUrl: "insertFileUrl",
+ IsInCurrOADocOpen: "IsInCurrOADocOpen",
+ IsInCurrOADocSaveAs: "IsInCurrOADocSaveAs",
+ isOA: "isOA",
+ notifyUrl: "notifyUrl",
+ OADocCanSaveAs: "OADocCanSaveAs",
+ OADocLandMode: "OADocLandMode",
+ OADocUserSave: "OADocUserSave",
+ openType: "openType",
+ picPath: "picPath",
+ picHeight: "picHeight",
+ picWidth: "picWidth",
+ redFileElement: "redFileElement",
+ revisionCtrl: "revisionCtrl",
+ ShowOATabDocActive: "ShowOATabDocActive",
+ SourcePath: "SourcePath",
+ /**
+ * 保存文档到业务系统服务端时,另存一份其他格式到服务端,其他格式支持:.pdf .ofd .uot .uof
+ */
+ suffix: "suffix",
+ templateDataUrl: "templateDataUrl",
+ TempTimerID: "TempTimerID",
+ /**
+ * 文档上传到业务系统的保存地址:服务端接收文件流的地址
+ */
+ uploadPath: "uploadPath",
+ /**
+ * 文档上传到服务端后的名称
+ */
+ uploadFieldName: "uploadFieldName",
+ /**
+ * 文档上传时的名称,默认取当前活动文档的名称
+ */
+ uploadFileName: "uploadFileName",
+ uploadAppendPath: "uploadAppendPath",
+ /**
+ * 标志位: 1 在保存到业务系统时再保存一份suffix格式的文档, 需要和suffix参数配合使用
+ */
+ uploadWithAppendPath: "uploadWithAppendPath",
+ userName: "userName",
+ WPSInitUserName: "WPSInitUserName",
+ taskpaneid: "taskpaneid",
+ /**
+ * 是否弹出上传前确认和成功后的确认信息:true|弹出,false|不弹出
+ */
+ Save2OAShowConfirm: "Save2OAShowConfirm",
+ /**
+ * 修订状态标志位
+ */
+ RevisionEnableFlag: "RevisionEnableFlag"
+}
\ No newline at end of file
diff --git a/oaassist/WpsOAAssist/js/common/func_docEvents.js b/oaassist/WpsOAAssist/js/common/func_docEvents.js
new file mode 100644
index 0000000..f63b9cb
--- /dev/null
+++ b/oaassist/WpsOAAssist/js/common/func_docEvents.js
@@ -0,0 +1,232 @@
+// 打印前监听事件
+function OnDocumentBeforePrint(doc) {
+ return;
+}
+
+//切换窗口时触发的事件
+function OnWindowActivate() {
+ var l_doc = wps.WpsApplication().ActiveDocument;
+ SetCurrDocEnvProp(l_doc); // 设置当前文档对应的用户名
+ showOATab(); // 根据文件是否为OA文件来显示OA菜单再进行刷新按钮
+ setTimeout(activeTab, 2000); // 激活页面必须要页签显示出来,所以做1秒延迟
+ return;
+}
+
+/**
+ * 作用:判断OA文档是否被另存为了
+ */
+function CheckIfOADocSaveAs(doc) {
+ if (!doc) {
+ return;
+ }
+ // 获取OA文档的原始保存路径
+ var l_Path = GetDocParamsValue(doc, constStrEnum.SourcePath);
+ // 原路径和当前文件的路径对比
+ return l_Path == doc.FullName;
+}
+
+
+// 当文件保存前触发的事件
+function OnDocumentBeforeSave(doc) {
+ //设置变量,判断是否当前用户按了自定义的OA文件保存按钮
+ if(wps.WpsApplication().ActiveDocument&&doc.DocID==wps.WpsApplication().ActiveDocument.DocID){
+ var l_IsOADocButtonSave = false;
+ l_IsOADocButtonSave = wps.PluginStorage.getItem(constStrEnum.OADocUserSave);
+
+ //根据传入参数判断当前文档是否能另存为,默认不能另存为
+ if (pCheckCurrOADocCanSaveAs(doc) == false) { //先根据OA助手的默认设置判断是否允许OA文档另存为操作
+ //0.如果配置文件:OA文档不允许另存为,则再判断
+ //1.先判断是否是在线文档且是通过WPS自身按钮或快捷键保存,则取消弹出另存到本地的弹出框
+ if (pIsOnlineOADoc(doc) == true && l_IsOADocButtonSave == false) {
+ alert("来自OA的不落地文档,禁止另存为本地文档!");
+ //如果是OA文档,则禁止另存为
+ wps.ApiEvent.Cancel = true;
+ }
+ //2.如果是落地打开的OA文档并且通过WPS自身按钮或者快捷键保存,则执行保存到本地临时目录,取消弹出对话框
+ if (pIsOnlineOADoc(doc) == false && l_IsOADocButtonSave == false){
+ //用户手动另存为操作时,在这里被屏蔽掉
+ doc.Save();
+ //如果是OA文档,则禁止另存为
+ wps.ApiEvent.Cancel = true;
+ }
+ }
+ //保存文档后,也要刷新一下Ribbon按钮的状态
+ showOATab();
+ }else{
+ wps.ApiEvent.Cancel=true;
+ }
+ return;
+}
+
+
+//文档保存前关闭事件
+/**
+ * 作用:
+ * @param {*} doc
+ */
+function OnDocumentBeforeClose(doc) {
+ console.log('OnDocumentBeforeClose');
+ var l_fullName = doc.FullName;
+ var l_bIsOADoc = false;
+ l_bIsOADoc = CheckIfDocIsOADoc(doc); //判断是否OA文档要关闭
+ if (l_bIsOADoc == false) { // 非OA文档不做处理
+ return;
+ }
+ //判断是否只读的文档,或受保护的文档,对于只读的文档,不给予保存提示
+ if (pISOADocReadOnly(doc) == false) {
+ if (doc.Saved == false) { //如果OA文档关闭前,有未保存的数据
+ if (wps.confirm("系统文件有改动,是否提交后关闭?" + "\n" + "确认后请按上传按钮执行上传操作。取消则继续关闭文档。")) {
+ wps.ApiEvent.Cancel = true;
+ return;
+ }
+ }
+ }
+ // 有未保存的数据,确认无需保存直接关闭
+ doc.Close(wps.Enum&&wps.Enum.wdDoNotSaveChanges||0); // 不保存待定的更改。枚举值兼容性写法
+ closeWpsIfNoDocument(); // 判断WPS中的文件个数是否为0,若为0则关闭WPS函数
+ wps.FileSystem.Remove(l_fullName);
+}
+
+
+//文档保存后关闭事件
+function OnDocumentAfterClose(doc) {
+ console.log("OnDocumentAfterClose");
+ var l_NofityURL = GetDocParamsValue(doc, constStrEnum.notifyUrl);
+ if (l_NofityURL) {
+ l_NofityURL = l_NofityURL.replace("{?}", "3"); //约定:参数为3则文档关闭
+ console.log("" + l_NofityURL);
+ NotifyToServer(l_NofityURL);
+ }
+
+ pRemoveDocParam(doc); // 关闭文档时,移除PluginStorage对象的参数
+ pSetWPSAppUserName(); // 判断文档关闭后,如果系统已经没有打开的文档了,则设置回初始用户名
+}
+
+//文档打开事件
+function OnDocumentOpen(doc) {
+ //设置当前新增文档是否来自OA的文档
+ // if (wps.PluginStorage.getItem(constStrEnum.IsInCurrOADocOpen) == false) {
+ // //如果是用户自己在WPS环境打开文档,则设置非OA文档标识
+ // console.log(wps.PluginStorage.getItem(wps.WpsApplication().ActiveDocument.DocID))
+ // pSetNoneOADocFlag(doc);
+ // console.log(wps.PluginStorage.getItem(wps.WpsApplication().ActiveDocument.DocID))
+ // }
+ OnWindowActivate();
+ ChangeOATabOnDocOpen(); //打开文档后,默认打开Tab页
+ setTimeout(activeTab,2000); // 激活OA助手菜单
+}
+
+//新建文档事件
+function OnDocumentNew(doc) {
+ //设置当前新增文档是否来自OA的文档
+ // if (wps.PluginStorage.getItem(constStrEnum.IsInCurrOADocOpen) == false) {
+ // //如果是用户自己在WPS环境打开文档,则设置非OA文档标识
+ // pSetNoneOADocFlag(doc);
+ // }
+ ChangeOATabOnDocOpen(); // 打开OA助手Tab菜单页
+ wps.ribbonUI.Invalidate(); // 刷新Ribbon按钮的状态
+}
+
+/**
+ * 作用:判断当前文档是否是只读文档
+ * 返回值:布尔
+ */
+function pISOADocReadOnly(doc) {
+ if (!doc) {
+ return false;
+ }
+ var l_openType = GetDocParamsValue(doc, constStrEnum.openType); // 获取OA传入的参数 openType
+ if (l_openType == "") {
+ return false;
+ }
+ try {
+ if (l_openType.protectType != -1) { // -1 为未保护
+ return true;
+ }
+ } catch (err) {
+ return false;
+ }
+}
+
+
+/**
+ * 作用:根据当前活动文档的情况判断,当前文档适用的系统参数,例如:当前文档对应的用户名称等
+ */
+function SetCurrDocEnvProp(doc) {
+ if (!doc) return;
+ var l_bIsOADoc = false;
+ l_bIsOADoc = pCheckIfOADoc(doc);
+
+ //如果是OA文件,则按OA传来的用户名设置WPS OA助手WPS用户名设置按钮冲突
+ if (l_bIsOADoc == true) {
+ var l_userName = GetDocParamsValue(doc, constStrEnum.userName);
+ if (l_userName != "") {
+ wps.WpsApplication().UserName = l_userName;
+ return;
+ }
+ }
+ //如果是非OA文件或者参数的值是空值,则按WPS安装默认用户名设置
+ wps.WpsApplication().UserName = wps.PluginStorage.getItem(constStrEnum.WPSInitUserName);
+}
+
+
+
+/*
+ 入口参数:doc
+ 功能说明:判断当前文档是否能另存为本地文件
+ 返回值:布尔值true or false
+*/
+function pCheckCurrOADocCanSaveAs(doc) {
+ //如果是非OA文档,则允许另存为
+ if (CheckIfDocIsOADoc(doc) == false) return true;
+
+ //对于来自OA系统的文档,则获取该文档对应的属性参数
+ var l_CanSaveAs = GetDocParamsValue(doc, constStrEnum.CanSaveAs);
+
+ //判断OA传入的参数
+ if (typeof (l_CanSaveAs) == "boolean") {
+ return l_CanSaveAs;
+ }
+ return false;
+}
+
+/**
+ * 作用:文档关闭后,删除对应的PluginStorage内的参数信息
+ * 返回值:没有返回值
+ * @param {*} doc
+ */
+function pRemoveDocParam(doc) {
+ if (!doc) return;
+ wps.PluginStorage.removeItem(doc.DocID);
+ return;
+}
+
+/**
+ * 作用:判断当前文档是否从OA来的文档,如果非OA文档(就是本地新建或打开的文档,则设置EnumOAFlag 标识)
+ * 作用:设置非OA文档的标识状态
+ * @param {*} doc
+ * 返回值:无
+ */
+function pSetNoneOADocFlag(doc) {
+ if (!doc) return;
+ var l_param = wps.PluginStorage.getItem(doc.DocID); //定义JSON文档参数
+ var l_objParams = new Object();
+ if (l_param) {
+ l_objParams = JSON.parse(l_param);
+ }
+ l_objParams.isOA = EnumOAFlag.DocFromNoOA; // 新增非OA打开文档属性
+ wps.PluginStorage.setItem(doc.DocID, JSON.stringify(l_objParams)); // 存入内存中
+}
+
+/**
+ * 作用:根据设置判断打开文件是否默认激活OA助手工具Tab菜单
+ * 返回值:无
+ */
+function ChangeOATabOnDocOpen() {
+ var l_ShowOATab = true; //默认打开
+ l_ShowOATab = wps.PluginStorage.getItem(constStrEnum.ShowOATabDocActive);
+ if (l_ShowOATab == true) {
+ setTimeout(activeTab,500);
+ // wps.ribbonUI.ActivateTab("WPSWorkExtTab"); //新建文档时,自动切换到OA助手状态
+ }
+}
\ No newline at end of file
diff --git a/oaassist/WpsOAAssist/js/common/func_docProcess.js b/oaassist/WpsOAAssist/js/common/func_docProcess.js
new file mode 100644
index 0000000..0e48574
--- /dev/null
+++ b/oaassist/WpsOAAssist/js/common/func_docProcess.js
@@ -0,0 +1,904 @@
+/**
+ * 从OA调用传来的指令,打开本地新建文件
+ * @param {*} fileUrl 文件url路径
+ */
+function NewFile(params) {
+ //获取WPS Application 对象
+ var wpsApp = wps.WpsApplication();
+ wps.PluginStorage.setItem(constStrEnum.IsInCurrOADocOpen, true); //设置OA打开文档的临时状态
+ //判断一下isOfficialDocument是否通过公文写作打开
+ var doc;
+ if (params.isOfficialDocument) {
+ wps.Application.GetApplicationEx().NewOfficialDocument(); //新增使用公文写作打开的公文
+ doc = wpsApp.ActiveDocument;
+ } else {
+ doc = wpsApp.Documents.Add(); //新增OA端文档
+ }
+ wps.PluginStorage.setItem(constStrEnum.IsInCurrOADocOpen, false);
+
+ //检查系统临时文件目录是否能访问
+ if (wps.Env && wps.Env.GetTempPath) {
+ if (params.newFileName) {
+ //按OA传入的文件名称保存
+ doc.SaveAs2($FileName = wps.Env.GetTempPath() + "/" + params.newFileName, undefined, undefined, undefined, false);
+ } else {
+ //OA传入空文件名称,则保存成系统时间文件
+ if (params.isOfficialDocument) {
+ doc.SaveAs2($FileName = wps.Env.GetTempPath() + "/OA_" + currentTime(), 0, undefined, undefined, false);
+ } else {
+ doc.SaveAs2($FileName = wps.Env.GetTempPath() + "/OA_" + currentTime(), undefined, undefined, undefined, false);
+ }
+ }
+ } else {
+ alert("文档保存临时目录出错!不能保存新建文档!请联系系统开发商。");
+ }
+
+ var l_NofityURL = GetParamsValue(params, constStrEnum.notifyUrl);
+ if (l_NofityURL) {
+ NotifyToServer(l_NofityURL.replace("{?}", "1"));
+ }
+
+ //Office文件打开后,设置该文件属性:从服务端来的OA文件
+ pSetOADocumentFlag(doc, params);
+ //设置当前文档为 本地磁盘落地模式
+ DoSetOADocLandMode(doc, EnumDocLandMode.DLM_LocalDoc);
+ //强制执行一次Activate事件
+ OnWindowActivate();
+ wps.WpsApplication().WindowState=1;
+ wps.WpsApplication().Activate(); //把WPS对象置前
+
+ return doc; //返回新创建的Document对象
+}
+
+/**
+ * 打开服务器上的文件
+ * @param {*} fileUrl 文件url路径
+ */
+function OpenFile(params) {
+ var l_strFileUrl = params.fileName; //来自OA网页端的OA文件下载路径
+ var doc;
+ var l_IsOnlineDoc = false; //默认打开的是不落地文档
+ if (l_strFileUrl) {
+ //下载文档之前,判断是否已下载该文件
+ if (pCheckIsExistOpenOADoc(l_strFileUrl) == true) {
+ //如果找到相同OA地址文档,则给予提示
+ wps.WpsApplication().WindowState=1;
+ wps.WpsApplication().Activate(); //把WPS对象置前
+ //根据OA助手对是否允许再次打开相同文件的判断处理
+ var l_AllowOADocReOpen = false;
+ l_AllowOADocReOpen = wps.PluginStorage.getItem(constStrEnum.AllowOADocReOpen);
+ if (l_AllowOADocReOpen == false) {
+ alert("已打开相同的OA文件,请关闭之前的文件,再次打开。");
+ wps.WpsApplication().Activate();
+ return null;
+ } else {
+ //处理重复打开相同OA 文件的方法
+ var nDocCount = wps.WpsApplication().Documents.Count;
+ pReOpenOADoc(l_strFileUrl);
+ //重复打开的文档采用不落地的方式打开
+ // 不落地方式打开文档判断落地比较多,V1版本先暂时关闭
+ l_IsOnlineDoc = true;
+ var nDocCount_New = wps.WpsApplication().Documents.Count;
+ if (nDocCount_New > nDocCount) {
+ doc = wps.WpsApplication().ActiveDocument;
+ }
+ }
+ } else {
+ //如果当前没有打开文档,则另存为本地文件,再打开
+ if (l_strFileUrl.startWith("http")) { // 网络文档
+ DownloadFile(l_strFileUrl, function(path) {
+ if (path == "") {
+ alert("从服务端下载路径:" + l_strFileUrl + "\n" + "获取文件下载失败!");
+ return null;
+ }
+
+ doc = pDoOpenOADocProcess(params, path);
+ pOpenFile(doc, params, l_IsOnlineDoc);
+ });
+ return;
+ } else { //本地文档
+ doc = pDoOpenOADocProcess(params, l_strFileUrl);
+ if (doc)
+ doc.SaveAs2($FileName = wps.Env.GetTempPath() + "/" + doc.Name, undefined, undefined, undefined, false);
+ }
+ }
+ } else {
+ //fileURL 如果为空,则按新建OA本地文件处理
+ NewFile(params);
+ }
+ //如果打开pdf等其他非Office文档,则doc对象为空
+ if (!doc) {
+ return null;
+ }
+
+ pOpenFile(doc, params, l_IsOnlineDoc);
+}
+
+/**
+ * 作用:文档打开后执行的动作集合
+ * @param {*} doc 文档对象
+ * @param {*} params 前端传递的参数集合
+ * @param {*} isOnlineDoc 在线打开/落地打开
+ */
+function pOpenFile(doc, params, isOnlineDoc) {
+ var l_IsOnlineDoc = isOnlineDoc
+ //Office文件打开后,设置该文件属性:从服务端来的OA文件
+ pSetOADocumentFlag(doc, params)
+ //设置当前文档为 本地磁盘落地模式
+ if (l_IsOnlineDoc == true) {
+ DoSetOADocLandMode(doc, EnumDocLandMode.DLM_OnlineDoc);
+ } else {
+ DoSetOADocLandMode(doc, EnumDocLandMode.DLM_LocalDoc);
+ }
+
+ if (GetParamsValue(params, constStrEnum.templateDataUrl)) {
+ GetServerTemplateData(doc, params[constStrEnum.templateDataUrl]);
+ }
+
+ if (GetParamsValue(params, constStrEnum.insertFileUrl)) {
+ InsertRedHeadDoc(doc);
+ }
+
+ var l_NofityURL = GetParamsValue(params, constStrEnum.notifyUrl);
+ if (l_NofityURL) {
+ l_NofityURL = l_NofityURL.replace("{?}", "1"); //约定:参数为1则代码打开状态
+ NotifyToServer(l_NofityURL);
+ }
+ //重新设置工具条按钮的显示状态
+ pDoResetRibbonGroups();
+ // 触发切换窗口事件
+ OnWindowActivate();
+ // 把WPS对象置前
+ wps.WpsApplication().WindowState=1;
+ wps.WpsApplication().Activate();
+ return doc;
+}
+
+
+
+/**
+ * 套用模板插入文字/图片/文档
+ * * params参数结构
+ * params:{
+ * 'docId': docId, //文档ID
+ * 'templateURL':'',获取模板接口
+ * 'fileName':'',获取文档接口
+ * 'uploadPath':'',文档保存上传接口
+ * }
+ * 这个功能要求服务端传来的模板JSON数据字符串,支持三种类型定义:
+ * text 类型:直接插入对应的书签位置
+ * link 类型: 把对应的URL的文件插入到指定的书签位置
+ * pic 类型: 把对应的URL的图片文件插入到指定的书签位置
+ * @param {*} params
+ */
+function GetServerTemplateData(template, pTemplateDataUrl) {
+ //获取文档内容
+ $.ajax({
+ url: pTemplateDataUrl,
+ async: false,
+ method: "get",
+ dataType: 'json',
+ success: function(res) {
+ var data = res;
+ let Bookmarks = template.Bookmarks;
+ data.forEach(function(it) {
+
+ var bookmark = Bookmarks.Item(it.name);
+ let bookStart = bookmark.Range.Start;
+ let bookEnd = bookmark.Range.End;
+ let start = template.Range().End
+ //方案1,直接替换,手动添加书签
+ // if (bookmark) {
+ // if (!it.type || it.type === "text") {
+ // bookmark.Range.Text = it.text;
+ // } else if (it.type === "link") {
+ // bookmark.Range.InsertFile(it.text);
+ // } else if (it.type === "pic") {
+ // bookmark.Range.InlineShapes.AddPicture(it.text);
+ // }
+ // }
+ // let end = template.Range().End
+ // let range=bookmark.Range;
+ // if (!Bookmarks.Exists(bookmark.Name))
+ // Bookmarks.Add(bookmark.Name, range.SetRange(bookStart, bookEnd + (end - start)))
+
+ //方案2,不完全替换
+ if(bookmark){
+ if (!it.type || it.type === "text") {
+ bookmark.Range.InsertBefore(it.text);
+ } else if (it.type === "link") {
+ bookmark.Range.InsertFile(it.text);
+ } else if (it.type === "pic") {
+ bookmark.Range.InlineShapes.AddPicture(it.text);
+ }
+ }
+ var selection=wps.WpsApplication().ActiveWindow.Selection;
+ if (bookmark.Range.Text) {
+ selection.Start = bookmark.Range.End - (bookEnd - bookStart);
+ selection.End = bookmark.Range.End;
+ selection.Cut();
+ } else {
+ selection.Start = bookmark.Range.End;
+ selection.End = bookmark.Range.End+it.text.length;
+ ActiveDocument.Bookmarks.Add(bookmark.Name, selection.Range);
+ }
+ })
+ }
+ });
+}
+
+/**
+ * 打开服务端的文档(不落地)
+ * @param {*} fileUrl 文件url路径
+ */
+function OpenOnLineFile(OAParams) {
+ //OA参数如果为空的话退出
+ if (!OAParams) return;
+
+ //获取在线文档URL
+ var l_OAFileUrl = OAParams.fileName;
+ var l_doc;
+ if (l_OAFileUrl) {
+ //下载文档不落地(16版WPS的925后支持)
+ wps.WpsApplication().Documents.OpenFromUrl(l_OAFileUrl, "OnOpenOnLineDocSuccess", "OnOpenOnLineDocDownFail");
+ l_doc = wps.WpsApplication().ActiveDocument;
+ }
+ //执行文档打开后的方法
+ pOpenFile(l_doc, OAParams, true);
+ return l_doc;
+}
+
+
+/**
+ * 打开在线文档成功后触发事件
+ * @param {*} resp
+ */
+function OnOpenOnLineDocSuccess(resp) {
+
+}
+
+
+/**
+ * 打开在线不落地文档出现失败时,给予错误提示
+ */
+function OnOpenOnLineDocDownFail(res) {
+ var err={}
+ try{
+ res=JSON.parse(res)
+ err.Body=Base64.decode(res.Body)
+ err.Headers=Base64.decode(JSON.stringify(res.Headers))
+ console.log(err)
+ }catch(err){
+
+ }
+ alert("打开在线不落地文档失败!请尝试重新打开。");
+ return;
+}
+
+/**
+ * 参数:
+ * doc : 当前OA文档的Document对象
+ * DocLandMode : 落地模式设置
+ */
+function DoSetOADocLandMode(doc, DocLandMode) {
+ if (!doc) return;
+ var l_Param = wps.PluginStorage.getItem(doc.DocID);
+ var l_objParam = JSON.parse(l_Param);
+ //增加属性,或设置
+ l_objParam.OADocLandMode = DocLandMode; //设置OA文档的落地标志
+
+ var l_p = JSON.stringify(l_objParam);
+ //将OA文档落地模式标志存入系统变量对象保存
+
+ wps.PluginStorage.setItem(doc.DocID, l_p);
+
+}
+
+
+/**
+ * 作用:设置Ribbon工具条的按钮显示状态
+ * @param {*} paramsGroups
+ */
+function pDoResetRibbonGroups(paramsGroups) {
+
+}
+
+/**
+ * 作用:打开文档处理的各种过程,包含:打开带密码的文档,保护方式打开文档,修订方式打开文档等种种情况
+ * params Object OA Web端传来的请求JSON字符串,具体参数说明看下面数据
+ * TempLocalFile : 字符串 先把文档从OA系统下载并保存在Temp临时目录,这个参数指已经下载下来的本地文档地址
+ * ----------------------以下是OA参数的一些具体规范名称
+ * docId String 文档ID
+ * uploadPath String 保存文档接口
+ * fileName String 获取服务器文档接口(不传即为新建空文档)
+ * suffix String ".pdf|.uot",可传多个,用“|”分割,保存时会按照所传的值转成对应的格式文档并上传
+ * userName String 用于更改显示修改人的用户名
+ * strBookmarkDataPath string 书签列表 (可不传,可以在OA助手config.js中配置)
+ * templatePath string 模板列表 (可不传,可以在OA助手config.js中配置)
+ * buttonGroups string 自定义按钮组 (可不传,不传显示所有按钮)
+ * revisionCtrl String 痕迹控制 ,不传正常打开
+ * bOpenRevision String true(打开)false(关闭)修订
+ * bShowRevision String true(显示)/false(关闭)痕迹
+ * openType String 文档打开方式 ,不传正常打开
+ * protectType String 文档保护类型,-1:不启用保护模式,0:只允许对现有内容进行修订,1:只允许添加批注,2:只允许修改窗体域,3:只读
+ * password String密码
+ */
+function pDoOpenOADocProcess(params, TempLocalFile) {
+ var l_ProtectType = -1; //默认文档保护类型 -1 为不启用保护
+ var l_ProtectPassword = ""; //默认文档密码为空
+
+ var l_strDocPassword = ""; //打开文档密码参数
+ var l_bOpenRevision = false; //初始化关闭修订模式
+ var l_bShowRevision = false; //初始化不显示修订气泡样式
+
+ for (var key = "" in params) {
+ switch (key.toUpperCase()) //
+ {
+ case "userName".toUpperCase(): //修改当前文档用户名
+ wps.WpsApplication().UserName = params[key];
+ break;
+ case "openType".toUpperCase():
+ l_ProtectType = params[key].protectType; //获取OA传来的文档保护类型
+ l_ProtectPassword = params[key].password; //获取OA传来的保护模式下的文档密码
+ break;
+ case "revisionCtrl".toUpperCase(): //限制修订状态
+ l_bOpenRevision = params[key].bOpenRevision;
+ l_bShowRevision = params[key].bShowRevision;
+ break;
+ case "buttonGroups".toUpperCase(): //按钮组合
+ break;
+ case "docPassword".toUpperCase(): //传入打开文件的密码
+ l_strDocPassword = params[key].docPassword;
+ break;
+ }
+
+ }
+
+ var l_Doc;
+ // Open方法的参数说明如下
+ //Function Open(FileName, [ConfirmConversions], [ReadOnly], [AddToRecentFiles],
+ // [PasswordDocument], [PasswordTemplate], [Revert], [WritePasswordDocument],
+ // [WritePasswordTemplate], [Format], [Encoding], [Visible],
+ // [OpenAndRepair], [DocumentDirection], [NoEncodingDialog], [XMLTransform]) As Document
+ l_Doc = wps.WpsApplication().Documents.Open(TempLocalFile, false, false, false, l_strDocPassword);
+
+ //设置文档修订状态
+ DoOADocOpenRevision(l_Doc, l_bOpenRevision, l_bShowRevision);
+
+ //打开文档后,根据保护类型设置文档保护
+ if (l_ProtectType > -1) // -1 :不设置文档保护
+ SetOADocProtect(l_Doc, l_ProtectType, l_ProtectPassword);
+ return l_Doc;
+}
+
+
+/**
+ * protectType: '', 文档保护模式( -1:不启用保护模式,
+ * 0:只允许对现有内容进行修订,
+ * 1:只允许添加批注,
+ * 2:只允许修改窗体域,
+ * 3:只读)
+ * @param {*} protectType
+ * @param {*} doc
+ */
+function SetOADocProtect(doc, protectType, ProtectPassword) {
+ if (!doc) return; //校验文档是否存在
+ if ([0, 1, 2, 3].indexOf(protectType) !== -1) {
+ // 保护文档如果之前有被保护,再次保护会出问题,需要先解除保护
+ doc.Unprotect();
+ // ** 方法参数
+ // ** Protect(Type As WdProtectionType, [NoReset], [Password], [UseIRM], [EnforceStyleLock])
+ doc.Protect(protectType, false, ProtectPassword, false);
+ }
+ return;
+}
+
+
+
+
+/**
+ * 打开/关闭修订
+ * @param {*} doc :传入文档对象
+ * @param {*} bOpenRevision : 布尔值,是否允许打开修订模式,true:打开/false:关闭
+ * @param {*} bOpenRevision : 布尔值,是否显示修订痕迹状态
+ * 返回值:无
+ */
+function DoOADocOpenRevision(doc, bOpenRevision, bShowRevision) {
+ if (!doc) return;
+
+ doc.TrackRevisions = bOpenRevision; //如果标记对指定文档的修改,则该属性值为True
+ var l_v = doc.ActiveWindow.View;
+ l_v.ShowRevisionsAndComments = bShowRevision; //如果为True,则 WPS 显示使用“修订”功能对文档所作的修订和批注
+ l_v.RevisionsBalloonShowConnectingLines = bShowRevision; //如果为 True,则 WPS 显示从文本到修订和批注气球之间的连接线
+ wps.WpsApplication().CommandBars.ExecuteMso("KsoEx_RevisionCommentModify_Disable"); //去掉修改痕迹信息框中的接受修订和拒绝修订勾叉,使其不可用
+
+
+ if (bShowRevision) {
+ doc.ActiveWindow.ActivePane.View.RevisionsMode = 2; //2为不支持气泡显示。
+ }
+
+ //如果关闭修订,关闭显示痕迹并将按钮至灰
+ wps.ribbonUI.InvalidateControl("btnOpenRevision");
+ wps.ribbonUI.InvalidateControl("btnShowRevision");
+
+ return;
+}
+
+
+
+/**
+ * 描述:如何处理再次打开相同的OA文件
+ * 返回值:打开的Document对象
+ */
+function pReOpenOADoc(OADocURL) {
+ if (wps.confirm("当前环境已打开该文件,是否重新再打开一份?")) {
+ //如果用户选择再次打开,则用在线方式打开
+ wps.WpsApplication().Documents.OpenFromUrl(OADocURL, "", "");
+ }
+}
+
+/**
+ * 功能说明:判断是否已存在来自OA的已打开的文档
+ * @param {字符串} FileURL
+ */
+function pCheckIsExistOpenOADoc(FileURL) {
+ var l_DocCount = wps.WpsApplication().Documents.Count;
+ if (l_DocCount <= 0) return false;
+
+ //轮询检查当前已打开的WPS文档中,是否存在OA相同的文件
+ if (l_DocCount >= 1) {
+ for (var l_index = 1; l_index <= l_DocCount; l_index++) {
+ var l_objDoc = wps.WpsApplication().Documents.Item(l_index);
+
+ var l_strParam = wps.PluginStorage.getItem(l_objDoc.DocID);
+ if (l_strParam == null)
+ continue;
+ var l_objParam = JSON.parse(l_strParam)
+ if (l_objParam.fileName == FileURL) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
+
+//Office文件打开后,设置该文件属性:从服务端来的OA文件
+function pSetOADocumentFlag(doc, params) {
+ if (!doc) {
+ return; //
+ }
+
+ var l_Param = params;
+ l_Param.isOA = EnumOAFlag.DocFromOA; //设置OA打开文档的标志
+
+ l_Param.SourcePath = doc.FullName; //保存OA的原始文件路径,用于保存时分析,是否进行了另存为操作
+ //console.log(l_Param.SourcePath);
+
+ if (doc) {
+ var l_p = JSON.stringify(l_Param);
+ //将OA文档标志存入系统变量对象保存
+ wps.PluginStorage.setItem(doc.DocID, l_p);
+ }
+}
+
+/**
+ * 作用:
+ * @param {*} suffix :文档后缀明:.pdf 或 .uot 或 .uof
+ * @param {*} doc
+ * @param {*} uploadPath
+ * @param {} FieldName : 上传到服务器端的字段名称,可由OA传入的参数设置
+ *
+ * 返回值:是否执行了上传操作,布尔值
+ */
+function handleFileAndUpload(suffix, doc, uploadPath, FieldName) {
+ var l_strChangeFileName = ""; // 转换格式后的文件名称
+ var l_strPath = ""; // 转换格式后的文件路径
+ var l_FieldName = FieldName;
+
+ if (!doc) {
+ return false;
+ }
+ if (!l_FieldName) {
+ l_FieldName = "file"; //默认情况下,设置为 file 字段名称
+ }
+
+ var l_DocSourcePath = doc.FullName; //保留当前文档明,在SaveAs使用后再保存回原来的文件明
+
+ //Sub ExportAsFixedFormat(OutputFileName As String, ExportFormat As WdExportFormat,
+ // [OpenAfterExport As Boolean = False],
+ // [OptimizeFor As WdExportOptimizeFor = wdExportOptimizeForPrint],
+ // [Range As WdExportRange = wdExportAllDocument], [From As Long = 1],
+ // [To As Long = 1], [Item As WdExportItem = wdExportDocumentContent],
+ // [IncludeDocProps As Boolean = False], [KeepIRM As Boolean = True],
+ // [CreateBookmarks As WdExportCreateBookmarks = wdExportCreateNoBookmarks],
+ // [DocStructureTags As Boolean = True], [BitmapMissingFonts As Boolean = True],
+ // [UseISO19005_1 As Boolean = False], [FixedFormatExtClassPtr])
+
+ // Const wdExportFormatPDF = 17 (&H11)
+ // Const wdExportFormatXPS = 18 (&H12)
+ //
+
+ //根据传入的 后缀文件名称进行不同的转换文档操作
+ switch (suffix.toLocaleLowerCase()) {
+ case '.pdf':
+ l_strPath = pGetValidDocTempPath(doc) + ".pdf"; //获取有效输出路径
+ wps.FileSystem.Remove(l_strPath); //先删除之前可能存在的临时文件
+ doc.ExportAsFixedFormat(l_strPath, wps.Enum&&wps.Enum.wdFormatPDF||17, true); //文档另存为PDF格式
+ l_strChangeFileName = doc.Name.split(".")[0] + ".pdf";
+ UploadFile(l_strChangeFileName, l_strPath, uploadPath, l_FieldName, OnChangeSuffixUploadSuccess, OnChangeSuffixUploadFail);
+ break;
+ case '.uof':
+ l_strPath = pGetValidDocTempPath(doc) + suffix;
+ wps.FileSystem.Remove(l_strPath); //先删除之前可能存在的临时文件
+ doc.ExportAsFixedFormat(l_strPath, wps.Enum&&wps.Enum.wdFormatOpenDocumentText||23, true); //转换文件格式
+ doc.SaveAs2(l_strPath);
+ l_strChangeFileName = doc.Name.split(".")[0] + suffix;
+ UploadFile(l_strChangeFileName, l_strPath, uploadPath, l_FieldName, OnChangeSuffixUploadSuccess, OnChangeSuffixUploadFail);
+ doc.SaveAs2(l_DocSourcePath); //保存回原来的文档内容
+ break;
+ case '.uot':
+ l_strPath = pGetValidDocTempPath(doc) + suffix;
+ wps.FileSystem.Remove(l_strPath); //先删除之前可能存在的临时文件
+ doc.ExportAsFixedFormat(l_strPath, wps.Enum&&wps.Enum.wdFormatOpenDocumentText||23, true);
+ doc.SaveAs2(l_strPath);
+ l_strChangeFileName = doc.Name.split(".")[0] + suffix;
+ UploadFile(l_strChangeFileName, l_strPath, uploadPath, l_FieldName, OnChangeSuffixUploadSuccess, OnChangeSuffixUploadFail);
+ doc.SaveAs2(l_DocSourcePath); //保存回原来的文档内容
+ break;
+ case '.ofd':
+ l_strPath = pGetValidDocTempPath(doc) + suffix;
+ wps.FileSystem.Remove(l_strPath); //先删除之前可能存在的临时文件
+ doc.ExportAsFixedFormat(l_strPath, wps.Enum&&wps.Enum.wdFormatOpenDocumentText||23, true);
+ doc.SaveAs2(l_strPath,102);
+ l_strChangeFileName = doc.Name.split(".")[0] + suffix;
+ UploadFile(l_strChangeFileName, l_strPath, uploadPath, l_FieldName, OnChangeSuffixUploadSuccess, OnChangeSuffixUploadFail);
+ doc.SaveAs2(l_DocSourcePath); //保存回原来的文档内容
+ break;
+ default:
+ l_strPath = pGetValidDocTempPath(doc) + suffix;
+ wps.FileSystem.Remove(l_strPath); //先删除之前可能存在的临时文件
+ doc.SaveAs2(l_strPath);
+ l_strChangeFileName = doc.Name.split(".")[0] + suffix;
+ UploadFile(l_strChangeFileName, l_strPath, uploadPath, l_FieldName, OnChangeSuffixUploadSuccess, OnChangeSuffixUploadFail);
+ doc.SaveAs2(l_DocSourcePath); //保存回原来的文档内容
+ break;
+ }
+
+ wps.FileSystem.Remove(l_strPath); //上载完成后,删除临时文件
+ return true;
+}
+
+/**
+ * 作用:获取一个有效的临时文档路径,用于保存转换格式后的文档
+ * @param {*} doc
+ */
+function pGetValidDocTempPath(doc) {
+ if (!doc) {
+ return;
+ }
+ if (doc.Path == "") { //对于不落地文档,文档路径为空
+ return wps.Env.GetTempPath()+"/"+doc.Name.split(".")[0];
+ } else {
+ return doc.FullName.split(".")[0]
+ }
+}
+
+/**
+ * 作用:转格式保存上传成功后,触发这个事件的回调
+ * @param {} response
+ */
+function OnChangeSuffixUploadSuccess(response) {
+ l_result = handleResultBody(response);
+ alert("文件转格式保存成功!");
+}
+
+/**
+ * 作用:转格式保存失败,触发失败事件回调
+ * @param {*} response
+ */
+function OnChangeSuffixUploadFail(response) {
+ var l_result = "";
+ l_result = handleResultBody(response);
+ alert("保存失败" + "\n" + +"系统返回数据:" + +JSON.stringify(l_result));
+}
+
+/**
+ * 解析返回response的参数
+ * @param {*} resp
+ * @return {*} body
+ */
+function handleResultBody(resp) {
+ var l_result = "";
+ if (resp.Body) {
+ //解析返回response的参数
+ }
+ return l_result;
+}
+
+/**
+ * 把OA文件的当前编辑内容,自动提交到OA后台
+ */
+function pAutoUploadToServer(p_Doc) {
+ if (!p_Doc) {
+ return;
+ }
+
+ /**
+ * 参数定义:OAAsist.UploadFile(name, path, url, field, "OnSuccess", "OnFail")
+ * 上传一个文件到远程服务器。
+ * name:为上传后的文件名称;
+ * path:是文件绝对路径;
+ * url:为上传地址;
+ * field:为请求中name的值;
+ * 最后两个参数为回调函数名称;
+ */
+
+ var l_uploadPath = GetDocParamsValue(p_Doc, constStrEnum.uploadPath); // 文件上载路径
+ if (l_uploadPath == "") {
+ //wps.alert("系统未传入文件上载路径,不能执行上传操作!");
+ return;
+ }
+
+ var l_FieldName = GetDocParamsValue(p_Doc, constStrEnum.uploadFieldName); //上载到后台的字段名称
+ if (l_FieldName == "") {
+ l_FieldName = wps.PluginStorage.getItem(constStrEnum.DefaultUploadFieldName); // 默认为‘file’
+ }
+
+ var l_UploadName = GetDocParamsValue(p_Doc, constStrEnum.uploadFileName); //设置OA传入的文件名称参数
+ if (l_UploadName == "") {
+ l_UploadName = p_Doc.Name; //默认文件名称就是当前文件编辑名称
+ }
+
+ var l_DocPath = p_Doc.FullName; // 文件所在路径
+
+ if (pIsOnlineOADoc(p_Doc) == false) {
+ console.log("落地文档自动保存");
+ //对于本地磁盘文件上传OA,先用Save方法保存后,在上传
+ //设置用户保存按钮标志,避免出现禁止OA文件保存的干扰信息
+ wps.PluginStorage.setItem(constStrEnum.OADocUserSave, EnumDocSaveFlag.OADocSave);
+ p_Doc.Save(); //执行一次保存方法
+ //设置用户保存按钮标志
+ wps.PluginStorage.setItem(constStrEnum.OADocUserSave, EnumDocSaveFlag.NoneOADocSave);
+ //落地文档,调用UploadFile方法上传到OA后台
+ try {
+ //调用OA助手的上传方法
+ UploadFile(l_UploadName, l_DocPath, l_uploadPath, l_FieldName, OnAutoUploadSuccess, OnAutoUploadFail);
+ } catch (err) {
+ alert("上传文件失败!请检查系统上传参数及网络环境!");
+ }
+ } else {
+ console.log("不落地文档自动保存");
+ // 不落地的文档,调用 Document 对象的不落地上传方法
+ wps.PluginStorage.setItem(constStrEnum.OADocUserSave, EnumDocSaveFlag.OADocSave);
+ try {
+ //调用不落地上传方法
+ p_Doc.SaveAsUrl(l_UploadName, l_uploadPath, l_FieldName, "OnAutoUploadSuccess", "OnAutoUploadFail");
+ } catch (err) {}
+ wps.PluginStorage.setItem(constStrEnum.OADocUserSave, EnumDocSaveFlag.NoneOADocSave);
+ }
+
+}
+
+/**
+ * 作用:自动上传到OA后台成功后出发事件
+ */
+function OnAutoUploadSuccess(resp) {
+ return;
+}
+
+/**
+ * 作用:自动上传到OA后台成功后出发事件
+ */
+function OnAutoUploadFail(resp) {
+ return;
+}
+
+/**
+ * 按照定时器的时间,自动执行所有文档的自动保存事件
+ */
+function OnDocSaveByAutoTimer() {
+ var l_Doc;
+
+ var l_Count = 0
+ var l_docCounts = wps.WpsApplication().Documents.Count;
+ for (l_Count = 0; l_Count < l_docCounts; l_Count++) {
+ l_Doc = wps.WpsApplication().Documents.Item(l_Count);
+ if (l_Doc) {
+ if (pCheckIfOADoc(l_Doc) == true) { // 是否为OA文件
+ if (pISOADocReadOnly(l_Doc) == false) { // 是否为只读文档
+ //执行自动上传到OA服务器端的操作
+ pAutoUploadToServer(l_Doc);
+ //保存该文档对应的访问过程记录信息
+ }
+ }
+ }
+ }
+}
+
+/**
+ * 实现一个定时器
+ */
+function OpenTimerRun(funcCallBack) {
+ var l_mCount = 0; //设置一个计时器,按每分钟执行一次; 10分钟后重复执行
+ var l_timeID = 0; //用于保存计时器ID值
+
+ // 对间隔时间做处理
+ var l_AutoSaveToServerTime = wps.PluginStorage.getItem(constStrEnum.AutoSaveToServerTime);
+ if (l_AutoSaveToServerTime == 0) { // 设置为0则不启动定时器
+ l_timeID = wps.PluginStorage.getItem(constStrEnum.TempTimerID);
+ clearInterval(l_timeID);
+ return;
+ } else if (l_AutoSaveToServerTime < 3) {
+ l_AutoSaveToServerTime = 3;
+ }
+
+ l_timeID = setInterval(function() {
+ l_mCount = l_mCount + 1;
+ if (l_mCount > l_AutoSaveToServerTime) { //l_AutoSaveToServerTime 值由系统配置时设定,见pInitParameters()函数
+ l_mCount = 0;
+ funcCallBack(); //每隔l_AutoSaveToServerTime 分钟(例如10分钟)执行一次回调函数
+ }
+ }, 60000); //60000 每隔1分钟,执行一次操作(1000*60)
+
+ wps.PluginStorage.setItem(constStrEnum.TempTimerID, l_timeID); //保存计时器ID值
+}
+
+/**
+ * 从OA-web端点击套红头
+ * params : 需要存在以下参数
+ * 'insertFileUrl':'',获取红头模板接口
+ * 'bkInsertFile':'' ,正文书签
+ */
+function InsertRedHead(params) {
+ var wpsApp = wps.WpsApplication();
+ var activeDoc = wpsApp.ActiveDocument;
+ if (!activeDoc) {
+ alert('文档不存在,请先新建一个文档!');
+ return;
+ }
+
+ var bookmark = GetParamsValue(params, constStrEnum.bkInsertFile);
+ var strFile = GetParamsValue(params, constStrEnum.insertFileUrl);
+ if (strFile == "") {
+ alert("未获取到传入的红头模板URL路径,不能正常套红");
+ return;
+ }
+
+ if (bookmark == "") {
+ alert("获取到传入的正文书签,不能正常套红");
+ return;
+ }
+ pInsertRInedHead(activeDoc, strFile, bookmark);
+}
+
+/**
+ * 套红头
+ * doc :套红头的文档
+ * strFile :获取红头模板接口
+ * bookmark :,正文书签
+ */
+function pInsertRInedHead(doc, strFile, bookmark) {
+ var bookMarks = doc.Bookmarks;
+ if (bookMarks.Item("quanwen")) { // 当前文档存在"quanwen"书签时候表示已经套过红头
+ alert("当前文档已套过红头,请勿重复操作!");
+ return;
+ }
+
+ var wpsApp = wps.WpsApplication();
+ var activeDoc = wpsApp.ActiveDocument;
+ var selection = wpsApp.ActiveWindow.Selection;
+ // 准备以非批注的模式插入红头文件(剪切/粘贴等操作会留有痕迹,故先关闭修订)
+ activeDoc.TrackRevisions = false;
+ selection.WholeStory(); //选取全文
+ bookMarks.Add("quanwen", selection.Range)
+ selection.Cut();
+ selection.InsertFile(strFile);
+ if (bookMarks.Exists(bookmark)) {
+ var bookmark1 = bookMarks.Item(bookmark);
+ bookmark1.Range.Select(); //获取指定书签位置
+ var s = activeDoc.ActiveWindow.Selection;
+ s.Paste();
+ } else {
+ alert("套红头失败,您选择的红头模板没有对应书签:" + bookmark);
+ }
+
+ // 轮询插入书签
+ var elements = GetDocParamsValue(doc, constStrEnum.redFileElement);
+ if (elements != "") {
+ for (var key in elements) {
+ console.log(key + "----" + elements[key])
+ if (bookMarks.Exists(key)) {
+ // 直接插入
+ var eleBookmark = bookMarks.Item(key);
+ eleBookmark.Range.Text = elements[key];
+ }
+ }
+ }
+
+ // 恢复修订模式(根据传入参数决定)
+ var l_revisionCtrl = GetDocParamsValue(activeDoc, constStrEnum.revisionCtrl);
+ activeDoc.TrackRevisions = l_revisionCtrl == "" ? false : l_revisionCtrl.bOpenRevision;
+ //取消WPS关闭时的提示信息
+ wps.WpsApplication().DisplayAlerts = wps.Enum&&wps.Enum.wdAlertsNone||0;
+}
+/**
+ * 从OA-web端点击套红头
+ * doc : 需要存在以下属性
+ * 'insertFileUrl':'',获取红头模板接口
+ * 'bkInsertFile':'' ,正文书签
+ */
+function InsertRedHeadDoc(doc) { //插入红头
+ if (!doc) {
+ alert('文档不存在!');
+ return;
+ }
+
+ var bookmark = GetDocParamsValue(doc, constStrEnum.bkInsertFile);
+ var strFile = GetDocParamsValue(doc, constStrEnum.insertFileUrl);
+ if (strFile == "") {
+ alert("未获取到系统传入的红头模板URL路径,不能正常套红");
+ return;
+ }
+ if (bookmark == "") {
+ alert("套红头失败,您选择的红头模板没有正文书签!");
+ return;
+ }
+
+ pInsertRInedHead(doc, strFile, bookmark)
+}
+
+/**
+ * 打开本地文档,并插入文档
+ */
+function OpenLocalFile() {
+ var l_FileName = "";
+
+ //msoFileDialogFilePicker = 3
+ var l_FileDialog = wps.WpsApplication().FileDialog(3);
+ if (l_FileDialog.Show()) {
+ l_FileName = l_FileDialog.SelectedItems;
+ if (l_FileName.Count > 0) {
+ wps.WpsApplication().Selection.InsertFile(l_FileName.Item(1));
+ }
+ }
+}
+
+
+
+/**
+ * 作用:OA的正文备份按钮操作功能,把OA文件备份一份到指定的OA后台copyUrl路径中
+ */
+function OnUploadOABackupClicked() {
+ var doc = wps.WpsApplication().ActiveDocument;
+ if (!doc) {
+ alert("当前没有打开任何文档");
+ return;
+ }
+ var l_copyUrl = GetDocParamsValue(doc, constStrEnum.copyUrl);
+ var l_uploadFieldName = GetDocParamsValue(doc, constStrEnum.uploadFieldName);
+
+ if (!l_copyUrl) {
+ alert("系统未传入备份URL路径,不能执行备份!");
+ return;
+ }
+
+ if (!l_uploadFieldName) {
+ l_uploadFieldName = "file";
+ }
+ // 默认保存为新文档,走上传文档的接口
+ UploadFile(doc.Name, doc.FullName, l_copyUrl, l_uploadFieldName, OnBackupSuccess, OnBackupFail);
+}
+
+/**
+ * 备份成功后的回调
+ */
+function OnBackupSuccess() {
+ wps.alert("备份上传成功");
+}
+
+/**
+ * 备份失败后的回调
+ */
+function OnBackupFail() {
+ wps.alert("备份失败");
+}
\ No newline at end of file
diff --git a/oaassist/WpsOAAssist/js/common/func_oastarter.js b/oaassist/WpsOAAssist/js/common/func_oastarter.js
new file mode 100644
index 0000000..1d7e2ab
--- /dev/null
+++ b/oaassist/WpsOAAssist/js/common/func_oastarter.js
@@ -0,0 +1,146 @@
+/**
+ * 在这个js中,集中处理来自OA的传入参数
+ *
+ */
+
+/**
+ * web页面调用WPS的方法入口
+ * * info参数结构
+ * info:[
+ * {
+ * '方法名':'方法参数',需要执行的方法
+ * },
+ * ...
+ * ]
+ * @param {*} info
+ */
+let testFuncs=null;
+function dispatcher(info) {
+ var funcs = info.funcs;
+ wps.WpsApplication().Options.UseLocalUserInfo=true//修订时,不使用登录名
+ //解析参数
+ /**
+ * 分两种情况解析:
+ * 1、业务系统依赖客户端返回:做同步处理,直接在for循环中返回
+ */
+ for (var index = 0; index < funcs.length; index++) {
+ var func = funcs[index];
+ for (var key in func) {
+ if (key === "GetDocStatus") {
+ return GetDocStatus(func[key])
+ } else if (key === "ExitWPS") {
+ ExitWPS(func[key])
+ }
+ }
+ }
+ /**
+ * 2、业务系统不依赖客户端返回:
+ * 做异步处理,先返回接收状态,再在setTimeout中做打开文档的一系列业务逻辑
+ */
+ setTimeout(function(){
+ for (var index = 0; index < funcs.length; index++) {
+ testFuncs=funcs;
+ var func = funcs[index];
+ for (var key in func) {
+ func[key].isOA=true;
+ if (key === "OpenDoc") { // OpenDoc 属于普通的打开文档的操作方式,文档落地操作
+ OpenDoc(func[key]); //进入打开文档处理函数
+ } else if (key === "OnlineEditDoc") { //在线方式打开文档,属于文档不落地的方式打开
+ OnlineEditDoc(func[key]);
+ } else if (key === "NewDoc") {
+ OpenDoc(func[key]);
+ } else if (key === "UseTemplate") {
+ OpenDoc(func[key]);
+ } else if (key === "InsertRedHead") {
+ InsertRedHead(func[key]);
+ } else if (key === "taskPaneBookMark"){
+ taskPaneBookMark(func[key])
+ } else if (key === "NewOfficialDocument"){
+ return OpenDoc(func[key])
+ }
+ }
+ }
+ },100)
+ return {message:"ok", app:wps.WpsApplication().Name}
+}
+
+
+/**
+ * 获取活动文档的状态
+ */
+function GetDocStatus() {
+ let l_doc = wps.WpsApplication().ActiveDocument
+ if (l_doc && pCheckIfOADoc()) {//此方法还可根据需要进行扩展
+ return{
+ message: "GetDocStatus",
+ docstatus:{
+ words: l_doc.Words.Count,
+ saved: l_doc.Saved,
+ pages: l_doc.ActiveWindow.Panes.Item(1).Pages.Count
+ }
+ }
+ }
+}
+
+/**
+ * 关闭WPS活动文档并退出WPS进程
+ */
+function ExitWPS() {
+ //为了接下来的用户确认操作,先将WPS界面激活显示在最前
+ wps.WpsApplication().Activate();
+ let l_doc = wps.WpsApplication().ActiveDocument
+ if (l_doc && pCheckIfOADoc()) {//此方法还可根据需要进行扩展
+ l_doc.Close();
+ }
+ if(wps.confirm("要关闭WPS软件,请确认文档都已保存。\n点击确定后关闭WPS,点击取消继续编辑。")){
+ wps.WpsApplication().Quit();
+ }
+}
+
+/**
+ *
+ * @param {*} params OA端传入的参数
+ */
+function OnlineEditDoc(OaParams) {
+ if (OaParams.fileName == "") {
+ NewFile(OaParams);
+ } else {
+ //OA传来下载文件的URL地址,调用openFile 方法打开
+ OpenOnLineFile(OaParams);
+ }
+}
+
+///打开来自OA端传递来的文档
+function OpenDoc(OaParams) {
+ if (OaParams.fileName == "") {
+ NewFile(OaParams);
+ } else {
+ //OA传来下载文件的URL地址,调用openFile 方法打开
+ OpenFile(OaParams);
+ }
+}
+
+function taskPaneBookMark(OaParams){
+ let filePath = OaParams.fileName
+ if (filePath == "")
+ return
+ OpenFile(OaParams);
+
+ //创建taskpane,只创建一次
+ let id = wps.PluginStorage.getItem(constStrEnum.taskpaneid)
+ if (id){
+ let tp = wps.GetTaskPane(id)
+ tp.Width = 300
+ tp.Visible = true
+ }
+ else{
+ let url = getHtmlURL("taskpane.html");
+ let tp = wps.CreateTaskPane(url, "书签操作")
+ if (tp){
+ tp.DockPosition = WPS_Enum.msoCTPDockPositionRight //这里可以设置taskapne是在左边还是右边
+ tp.Width = 300
+ tp.Visible = true
+ wps.PluginStorage.setItem(constStrEnum.taskpaneid, tp.ID)
+ }
+ }
+}
\ No newline at end of file
diff --git a/oaassist/WpsOAAssist/js/common/func_tabcontrol.js b/oaassist/WpsOAAssist/js/common/func_tabcontrol.js
new file mode 100644
index 0000000..0bd21d6
--- /dev/null
+++ b/oaassist/WpsOAAssist/js/common/func_tabcontrol.js
@@ -0,0 +1,1431 @@
+var EnumOAFlag = {
+ DocFromOA: 1,
+ DocFromNoOA: 0
+}
+
+//记录是否用户点击OA文件的保存按钮
+var EnumDocSaveFlag = {
+ OADocSave: 1,
+ NoneOADocSave: 0
+}
+
+//标识文档的落地模式 本地文档落地 0 ,不落地 1
+var EnumDocLandMode = {
+ DLM_LocalDoc: 0,
+ DLM_OnlineDoc: 1
+}
+
+//加载时会执行的方法
+function OnWPSWorkTabLoad(ribbonUI) {
+ wps.ribbonUI = ribbonUI;
+ if (typeof(wps.Enum) == "undefined") { // 如果没有内置枚举值
+ wps.Enum = WPS_Enum;
+ }
+ OnJSWorkInit(); //初始化文档事件(全局参数,挂载监听事件)
+ // setTimeout(activeTab,2000); // 激活OA助手菜单
+ OpenTimerRun(OnDocSaveByAutoTimer); //启动定时备份过程
+ return true;
+}
+
+//文档各类初始化工作(WPS Js环境)
+function OnJSWorkInit() {
+ pInitParameters(); //OA助手环境的所有配置控制的初始化过程
+ AddDocumentEvent(); //挂接文档事件处理函数
+}
+
+//初始化全局参数
+function pInitParameters() {
+ wps.PluginStorage.setItem(constStrEnum.OADocUserSave, EnumDocSaveFlag.NoneOADocSave); //初始化,没有用户点击保存按钮
+
+ var l_wpsUserName = wps.WpsApplication().UserName;
+ wps.PluginStorage.setItem(constStrEnum.WPSInitUserName, l_wpsUserName); //在OA助手加载前,先保存用户原有的WPS应用用户名称
+
+ wps.PluginStorage.setItem(constStrEnum.OADocCanSaveAs, false); //默认OA文档不能另存为本地
+ wps.PluginStorage.setItem(constStrEnum.AllowOADocReOpen, false); //设置是否允许来自OA的文件再次被打开
+ wps.PluginStorage.setItem(constStrEnum.ShowOATabDocActive, false); //设置新打开文档是否默认显示OA助手菜单Tab 默认为false
+
+ wps.PluginStorage.setItem(constStrEnum.DefaultUploadFieldName, "file"); //针对UploadFile方法设置上载字段名称
+
+ wps.PluginStorage.setItem(constStrEnum.AutoSaveToServerTime, "10"); //自动保存回OA服务端的时间间隔。如果设置0,则关闭,最小设置3分钟
+ wps.PluginStorage.setItem(constStrEnum.TempTimerID, "0"); //临时值,用于保存计时器ID的临时值
+
+ // 以下是一些临时状态参数,用于打开文档等的状态判断
+ wps.PluginStorage.setItem(constStrEnum.IsInCurrOADocOpen, false); //用于执行来自OA端的新建或打开文档时的状态
+ wps.PluginStorage.setItem(constStrEnum.IsInCurrOADocSaveAs, false); //用于执行来自OA端的文档另存为本地的状态
+ wps.PluginStorage.setItem(constStrEnum.RevisionEnableFlag, false) //按钮的标记控制
+ wps.PluginStorage.setItem(constStrEnum.Save2OAShowConfirm, true); //弹出上传成功后的提示信息
+}
+
+//挂载WPS的文档事件
+function AddDocumentEvent() {
+ wps.ApiEvent.AddApiEventListener("WindowActivate", OnWindowActivate);
+ wps.ApiEvent.AddApiEventListener("DocumentBeforeSave", OnDocumentBeforeSave);
+ wps.ApiEvent.AddApiEventListener("DocumentBeforeClose", OnDocumentBeforeClose);
+ wps.ApiEvent.AddApiEventListener("DocumentAfterClose", OnDocumentAfterClose);
+ wps.ApiEvent.AddApiEventListener("DocumentBeforePrint", OnDocumentBeforePrint);
+ wps.ApiEvent.AddApiEventListener("DocumentOpen", OnDocumentOpen);
+ wps.ApiEvent.AddApiEventListener("DocumentNew", OnDocumentNew);
+ // wps.ApiEvent.AddApiEventListener("NewDocument", OnDocumentNew);
+ console.log("AddDocumentEvent");
+}
+
+/**
+ * 打开插入书签页面
+ */
+function OnInsertBookmarkToDoc() {
+ if (!wps.WpsApplication().ActiveDocument) {
+ return;
+ }
+ OnShowDialog("selectBookmark.html", "自定义书签", 700, 440, false);
+}
+
+/**
+ * 作用:打开当前文档的页面设置对话框
+ */
+function OnPageSetupClicked() {
+ var wpsApp = wps.WpsApplication();
+ var doc = wpsApp.ActiveDocument;
+ if (!doc) {
+ return;
+ }
+ wpsApp.Dialogs.Item(wps.Enum&&wps.Enum.wdDialogFilePageSetup||178).Show();
+}
+
+/**
+ * 作用:打开当前文档的打印设置对话框
+ */
+function OnPrintDocBtnClicked() {
+ var wpsApp = wps.WpsApplication();
+ var doc = wpsApp.ActiveDocument;
+ if (!doc) {
+ return;
+ }
+ wpsApp.Dialogs.Item(wps.Enum&&wps.Enum.wdDialogFilePrint||88).Show();
+}
+
+
+/**
+ * 作用:接受所有修订内容
+ *
+ */
+function OnAcceptAllRevisions() {
+ //获取当前文档对象
+ var l_Doc = wps.WpsApplication().ActiveDocument;
+ if (!l_Doc) {
+ return;
+ }
+ if (l_Doc.Revisions.Count >= 1) {
+ if (!wps.confirm("目前有" + l_Doc.Revisions.Count + "个修订信息,是否全部接受?")) {
+ return;
+ }
+ l_Doc.AcceptAllRevisions();
+ }
+}
+
+
+/**
+ * 作用:拒绝当前文档的所有修订内容
+ */
+function OnRejectAllRevisions() {
+ var l_Doc = wps.WpsApplication().ActiveDocument;
+ if (!l_Doc) {
+ return;
+ }
+ if (l_Doc.Revisions.Count >= 1) {
+ l_Doc.RejectAllRevisions();
+ }
+}
+
+
+/**
+ * 作用:把当前文档修订模式关闭
+ */
+function OnCloseRevisions() {
+ //获取当前文档对象
+ var l_Doc = wps.WpsApplication().ActiveDocument;
+ OnRevisionsSwitch(l_Doc, false);
+}
+
+
+/**
+ * 作用:把当前文档修订模式打开
+ */
+function OnOpenRevisions() {
+ //获取当前文档对象
+ var l_Doc = wps.WpsApplication().ActiveDocument;
+ OnRevisionsSwitch(l_Doc, true);
+}
+
+function OnRevisionsSwitch(doc, openRevisions) {
+ if (!doc) {
+ return;
+ }
+ var l_activeWindow = doc.ActiveWindow;
+ if (l_activeWindow) {
+ var v = l_activeWindow.View;
+ if (v) {
+ //WPS 显示使用“修订”功能对文档所作的修订和批注
+ v.ShowRevisionsAndComments = openRevisions;
+ //WPS 显示从文本到修订和批注气球之间的连接线
+ v.RevisionsBalloonShowConnectingLines = openRevisions;
+ }
+ if (openRevisions == true) {
+ //去掉修改痕迹信息框中的接受修订和拒绝修订勾叉,使其不可用
+ wps.WpsApplication().CommandBars.ExecuteMso("KsoEx_RevisionCommentModify_Disable");
+ }
+
+ //RevisionsMode:
+ //wdBalloonRevisions 0 在左边距或右边距的气球中显示修订。
+ //wdInLineRevisions 1 在正文中显示修订,使用删除线表示删除,使用下划线表示插入。
+ // 这是 Word 早期版本的默认设置。
+ //wdMixedRevisions 2 不支持。
+ doc.TrackRevisions = openRevisions; // 开关修订
+ l_activeWindow.ActivePane.View.RevisionsMode = 2; //2为不支持气球显示。
+
+ }
+}
+
+/**
+ * 作用:打开扫描仪
+ */
+function OnOpenScanBtnClicked() {
+ var doc = wps.WpsApplication().ActiveDocument;
+ if (!doc) {
+ return;
+ }
+ //打开扫描仪
+ try {
+ wps.WpsApplication().WordBasic.InsertImagerScan(); //打开扫描仪
+ } catch (err) {
+ alert("打开扫描仪的过程遇到问题。");
+ }
+}
+
+/**
+ * 作用:在文档的当前光标处插入从前端传递来的图片
+ * OA参数中 picPath 是需要插入的图片路径
+ * 图片插入的默认版式是在浮于文档上方
+ */
+function DoInsertPicToDoc() {
+ console.log("DoInsertPicToDoc...");
+
+ var l_doc; //文档对象
+ l_doc = wps.WpsApplication().ActiveDocument;
+ if (!l_doc) {
+ return;
+ }
+
+ //获取当前文档对象对应的OA参数
+ var l_picPath = GetDocParamsValue(l_doc, constStrEnum.picPath); // 获取OA参数传入的图片路径
+ if (l_picPath == "") {
+ // alert("未获取到系统传入的图片URL路径,不能正常插入图片");
+ // return;
+ //如果没有传,则默认写一个图片地址
+ l_picPath="http://127.0.0.1:3888/file/OA模板公章.png"
+ }
+
+ var l_picHeight = GetDocParamsValue(l_doc, constStrEnum.picHeight); //图片高
+ var l_picWidth = GetDocParamsValue(l_doc, constStrEnum.picWidth); //图片宽
+
+ if (l_picHeight == "") { //设定图片高度
+ l_picHeight = 39.117798; //13.8mm=39.117798磅
+ }
+ if (l_picWidth == "") { //设定图片宽度
+ l_picWidth = 72; //49.7mm=140.880768磅
+ }
+
+ var l_shape = l_doc.Shapes.AddPicture(l_picPath, false, true);
+ l_shape.Select();
+ // l_shape.WrapFormat.Type = wps.Enum&&wps.Enum.wdWrapBehind||5; //图片的默认版式为浮于文字上方,可通过此设置图片环绕模式
+}
+/**
+ * 作用:模拟插入签章图片
+ * @param {*} doc 文档对象
+ * @param {*} picPath 图片路径
+ * @param {*} picWidth 图片宽度
+ * @param {*} picHeight 图片高度
+ */
+function OnInsertPicToDoc(doc, picPath, picWidth, picHeight,callBack) {
+ // alert("图片路径:"+picPath);
+ if (!doc) {
+ return;
+ }
+ if (typeof picPath == "undefined" || picPath == null || picPath == "") {
+ alert("未获取到系统传入的图片URL路径,不能正常插入印章");
+ return;
+ }
+ if (!picWidth) { //设定图片宽度
+ picWidth = 95; //49.7mm=140.880768磅
+ }
+ if (!picHeight) { //设定图片高度
+ picHeight = 40; //13.8mm=39.117798磅
+ }
+
+ var selection = doc.ActiveWindow.Selection; // 活动窗口选定范围或插入点
+ var pagecount = doc.BuiltInDocumentProperties.Item(wps.Enum&&wps.Enum.wdPropertyPages||14); //获取文档页数
+ selection.GoTo(wps.Enum&&wps.Enum.wdGoToPage||1, wps.Enum&&wps.Enum.wdGoToPage||1, pagecount.Value); //将光标指向文档最后一页
+ DownloadFile(picPath,function(url){
+ selection.ParagraphFormat.LineSpacing = 12 //防止文档设置了固定行距
+ var picture = selection.InlineShapes.AddPicture(url, true, true); //插入图片
+ wps.FileSystem.Remove(url) //删除本地的图片
+ picture.LockAspectRatio = 0; //在调整形状大小时可分别改变其高度和宽度
+ picture.Height = picHeight; //设定图片高度
+ picture.Width = picWidth; //设定图片宽度
+ picture.LockAspectRatio = 0;
+ picture.Select(); //当前图片为焦点
+
+ //定义印章图片对象
+ var seal_shape = picture.ConvertToShape(); //类型转换:嵌入型图片->粘贴版型图片
+
+ seal_shape.RelativeHorizontalPosition = wps.Enum&&wps.Enum.wdRelativeHorizontalPositionPage||1;
+ seal_shape.RelativeVerticalPosition = wps.Enum&&wps.Enum.wdRelativeVerticalPositionPage||1;
+ seal_shape.Left = 315; //设置指定形状或形状范围的垂直位置(以磅为单位)。
+ seal_shape.Top = 630; //指定形状或形状范围的水平位置(以磅为单位)。
+ callBack&&callBack()
+ })
+
+}
+
+
+
+/**
+ * 作用: 把当前文档保存为其他格式的文档并上传
+ * @param {*} p_FileSuffix 输出的目标格式后缀名,支持:.pdf .uof .uot .ofd
+ * @param {*} pShowPrompt 是否弹出用户确认框
+ */
+function OnDoChangeToOtherDocFormat(p_FileSuffix, pShowPrompt) {
+ var l_suffix = p_FileSuffix; // params.suffix;
+ if (!l_suffix) {
+ return;
+ }
+ //获取当前执行格式转换操作的文档
+ var l_doc = wps.WpsApplication().ActiveDocument;
+ if (!l_doc) {
+ return;
+ }
+ console.log(pShowPrompt)
+ if (typeof(pShowPrompt) == "undefined") {
+ pShowPrompt = true; //默认设置为弹出用户确认框
+ }
+ //默认设置为以当前文件的显示模式输出,即当前为修订则输出带有修订痕迹的
+ pDoChangeToOtherDocFormat(l_doc, l_suffix, pShowPrompt, true);
+}
+/**
+ * 作用:获取文档的Path或者临时文件路径
+ * @param {*} doc
+ */
+ function getDocSavePath(doc) {
+ if (!doc) {
+ return;
+ }
+ if (doc.Path == "") { //对于不落地文档,文档路径为空
+ return wps.Env.GetTempPath();
+ } else {
+ return doc.Path
+ }
+}
+/**
+ * 作用:把当前文档输出为另外的格式保存
+ * @param {*} p_Doc 文档对象
+ * @param {*} p_Suffix 另存为的目标文件格式
+ * @param {*} pShowPrompt 是否弹出用户确认框
+ * @param {*} p_ShowRevision :是否强制关闭修订,如果是False,则强制关闭痕迹显示。如果为true则不做控制输出。
+ */
+function pDoChangeToOtherDocFormat(p_Doc, p_Suffix, pShowPrompt, p_ShowRevision) {
+ if (!p_Doc) {
+ return;
+ }
+
+ var l_suffix = p_Suffix;
+ //获取该文档对应OA参数的上载路径
+ var l_uploadPath = GetDocParamsValue(p_Doc, constStrEnum.uploadAppendPath);
+ if (l_uploadPath == "" || l_uploadPath == null) {
+ l_uploadPath = GetDocParamsValue(p_Doc, constStrEnum.uploadPath);
+ }
+ var l_FieldName = GetDocParamsValue(p_Doc, constStrEnum.uploadFieldName);
+ if (l_FieldName == "") {
+ l_FieldName = wps.PluginStorage.getItem(constStrEnum.DefaultUploadFieldName); //默认是'file'
+ }
+
+ if (l_uploadPath == "" && pShowPrompt == true) {
+ alert("系统未传入有效上载文件路径!不能继续转换操作。"); //如果OA未传入上载路径,则给予提示
+ return;
+ }
+
+ if (pShowPrompt == true) {
+ if (!wps.confirm("当前文档将另存一份" + l_suffix + " 格式的副本,并上传到系统后台,请确认 ?")) {
+ return;
+ }
+ }
+
+ // 先把文档输出保存为指定的文件格式,再上传到后台
+ wps.PluginStorage.setItem(constStrEnum.OADocUserSave, true); //设置一个临时变量,用于在BeforeSave事件中判断
+ if (p_ShowRevision == false) { // 强制关闭痕迹显示
+ var l_SourceName = p_Doc.Name;
+ var l_NewName="";
+ var docPath=getDocSavePath(p_Doc);
+ if(docPath.indexOf("\\")>0){
+ l_NewName = docPath + "\\B_" + p_Doc.Name;
+ }else{
+ l_NewName = docPath + "/B_" + p_Doc.Name;
+ }
+ if(docPath.indexOf("\\")>0){
+ l_SourceName = docPath + "\\" + l_SourceName;
+ }else{
+ l_SourceName = docPath + "/" + l_SourceName;
+ }
+
+ p_Doc.SaveAs2($FileName = l_NewName, $AddToRecentFiles = false);
+ p_Doc.SaveAs2($FileName = l_SourceName, $AddToRecentFiles = false);
+ //以下以隐藏模式打开另一个文档
+ var l_textEncoding = wps.WpsApplication().Options.DefaultTextEncoding; //默认 936
+ var l_Doc = wps.WpsApplication().Documents.Open(l_NewName, false, false, false, "", "", false, "", "", 0, l_textEncoding, false);
+
+ l_Doc.TrackRevisions = false; //关闭修订模式
+ l_Doc.ShowRevisions = false; //隐含属性,隐藏修订模式
+ l_Doc.AcceptAllRevisions();
+ l_Doc.Save();
+ handleFileAndUpload(l_suffix, l_Doc, l_uploadPath, l_FieldName);
+ l_Doc.Close();
+ wps.FileSystem.Remove(l_NewName); //删除临时文档
+ } else {
+ handleFileAndUpload(l_suffix, p_Doc, l_uploadPath, l_FieldName);
+ }
+
+ wps.PluginStorage.setItem(constStrEnum.OADocUserSave, false);
+
+ return;
+}
+
+/**
+ * 把文档转换成UOT在上传
+ */
+function OnDoChangeToUOF() {}
+
+/**
+ * 打开WPS云文档的入口
+ */
+function pDoOpenWPSCloundDoc() {
+ wps.TabPages.Add("https://www.kdocs.cn");
+}
+
+/**
+ * 执行另存为本地文件操作
+ */
+function OnBtnSaveAsLocalFile() {
+
+ //初始化临时状态值
+ wps.PluginStorage.setItem(constStrEnum.OADocUserSave, false);
+ wps.PluginStorage.setItem(constStrEnum.IsInCurrOADocSaveAs, false);
+
+ //检测是否有文档正在处理
+ var l_doc = wps.WpsApplication().ActiveDocument;
+ if (!l_doc) {
+ alert("WPS当前没有可操作文档!");
+ return;
+ }
+
+ // 设置WPS文档对话框 2 FileDialogType:=msoFileDialogSaveAs
+ var l_ksoFileDialog = wps.WpsApplication().FileDialog(2);
+ l_ksoFileDialog.InitialFileName = l_doc.Name; //文档名称
+
+ if (l_ksoFileDialog.Show() == -1) { // -1 代表确认按钮
+ //alert("确认");
+ wps.PluginStorage.setItem(constStrEnum.OADocUserSave, true); //设置保存为临时状态,在Save事件中避免OA禁止另存为对话框
+ l_ksoFileDialog.Execute(); //会触发保存文档的监听函数
+
+ pSetNoneOADocFlag(l_doc);
+
+ wps.ribbonUI.Invalidate(); //刷新Ribbon的状态
+
+ };
+}
+
+//
+/**
+ * 作用:执行清稿按钮操作
+ * 业务功能:清除所有修订痕迹和批注
+ */
+function OnBtnClearRevDoc() {
+ var doc = wps.WpsApplication().ActiveDocument;
+ if (!doc) {
+ alert("尚未打开文档,请先打开文档再进行清稿操作!");
+ }
+
+ //执行清稿操作前,给用户提示
+ if (!wps.confirm("清稿操作将接受所有的修订内容,关闭修订显示。请确认执行清稿操作?")) {
+ return;
+ }
+
+ //接受所有修订
+ if (doc.Revisions.Count >= 1) {
+ doc.AcceptAllRevisions();
+ }
+ //去除所有批注
+ if (doc.Comments.Count >= 1) {
+ doc.RemoveDocumentInformation(wps.Enum&&wps.Enum.wdRDIComments||1);
+ }
+
+ //删除所有ink墨迹对象
+ pDeleteAllInkObj(doc);
+
+ doc.TrackRevisions = false; //关闭修订模式
+ wps.ribbonUI.InvalidateControl("btnOpenRevision");
+
+ return;
+}
+
+/**
+ * 作用:删除当前文档的所有墨迹对象
+ * @param {*} p_Doc
+ */
+function pDeleteAllInkObj(p_Doc) {
+ var l_Count = 0;
+ var l_IsInkObjExist = true;
+ while (l_IsInkObjExist == true && l_Count < 20) {
+ l_IsInkObjExist = pDeleteInkObj(p_Doc);
+ l_Count++;
+ }
+ return;
+}
+
+/**
+ * 删除墨迹对象
+ */
+function pDeleteInkObj(p_Doc) {
+ var l_IsInkObjExist = false;
+ if (p_Doc) {
+ for (var l_Index = 1; l_Index <= p_Doc.Shapes.Count; l_Index++) {
+ var l_Item = p_Doc.Shapes.Item(l_Index);
+ if (l_Item.Type == 23) {
+ l_Item.Delete();
+ //只要有一次找到Ink类型,就标识一下
+ if (l_IsInkObjExist == false) {
+ l_IsInkObjExist = true;
+ }
+ }
+ }
+ }
+ return l_IsInkObjExist;
+}
+
+
+/**
+ *
+ */
+function pSaveAnotherDoc(p_Doc) {
+ if (!p_Doc) {
+ return;
+ }
+ var l_SourceDocName = p_Doc.Name;
+ var l_NewName = "BK_" + l_SourceDocName;
+ p_Doc.SaveAs2(l_NewName);
+ wps.WpsApplication().Documents.Open();
+}
+
+
+//保存到OA后台服务器
+function OnBtnSaveToServer() {
+ // console.log('SaveToServer');
+ var l_doc = wps.WpsApplication().ActiveDocument;
+ if (!l_doc) {
+ alert("空文档不能保存!");
+ return;
+ }
+
+ //非OA文档,不能上传到OA
+ if (pCheckIfOADoc() == false) {
+ alert("非系统打开的文档,不能直接上传到系统!");
+ return;
+ }
+
+ //如果是OA打开的文档,并且设置了保护的文档,则不能再上传到OA服务器
+ if (pISOADocReadOnly(l_doc)) {
+ wps.alert("系统设置了保护的文档,不能再提交到系统后台。");
+ return;
+ }
+
+ /**
+ * 参数定义:OAAsist.UploadFile(name, path, url, field, "OnSuccess", "OnFail")
+ * 上传一个文件到远程服务器。
+ * name:为上传后的文件名称;
+ * path:是文件绝对路径;
+ * url:为上传地址;
+ * field:为请求中name的值;
+ * 最后两个参数为回调函数名称;
+ */
+ var l_uploadPath = GetDocParamsValue(l_doc, constStrEnum.uploadPath); // 文件上载路径
+ if (l_uploadPath == "") {
+ wps.alert("系统未传入文件上载路径,不能执行上传操作!");
+ return;
+ }
+
+ var l_showConfirm = wps.PluginStorage.getItem(constStrEnum.Save2OAShowConfirm)
+ if (l_showConfirm) {
+ if (!wps.confirm("先保存文档,并开始上传到系统后台,请确认?")) {
+ return;
+ }
+ }
+
+ var l_FieldName = GetDocParamsValue(l_doc, constStrEnum.uploadFieldName); //上载到后台的业务方自定义的字段名称
+ if (l_FieldName == "") {
+ l_FieldName = wps.PluginStorage.getItem(constStrEnum.DefaultUploadFieldName); // 默认为‘file’
+ }
+
+ var l_UploadName = GetDocParamsValue(l_doc, constStrEnum.uploadFileName); //设置OA传入的文件名称参数
+ if (l_UploadName == "") {
+ l_UploadName = l_doc.Name; //默认文件名称就是当前文件编辑名称
+ }
+
+ var l_DocPath = l_doc.FullName; // 文件所在路径
+
+ if (pIsOnlineOADoc(l_doc) == false) {
+ //对于本地磁盘文件上传OA,先用Save方法保存后,再上传
+ //设置用户保存按钮标志,避免出现禁止OA文件保存的干扰信息
+ wps.PluginStorage.setItem(constStrEnum.OADocUserSave, EnumDocSaveFlag.OADocSave);
+ if (l_doc.Path == "") { //对于不落地文档,文档路径为空
+ l_doc.SaveAs2(wps.Env.GetTempPath() + "/" + l_doc.Name, undefined, undefined, undefined, false);
+ } else {
+ l_doc.Save();
+ }
+ //执行一次保存方法
+ //设置用户保存按钮标志
+ wps.PluginStorage.setItem(constStrEnum.OADocUserSave, EnumDocSaveFlag.NoneOADocSave);
+ //落地文档,调用UploadFile方法上传到OA后台
+ l_DocPath = l_doc.FullName;
+ try {
+ //调用OA助手的上传方法
+ UploadFile(l_UploadName, l_DocPath, l_uploadPath, l_FieldName, OnUploadToServerSuccess, OnUploadToServerFail);
+ } catch (err) {
+ alert("上传文件失败!请检查系统上传参数及网络环境!");
+ }
+ } else {
+ // 不落地的文档,调用 Document 对象的不落地上传方法
+ wps.PluginStorage.setItem(constStrEnum.OADocUserSave, EnumDocSaveFlag.OADocSave);
+ try {
+ //调用不落地上传方法
+ l_doc.SaveAsUrl(l_UploadName, l_uploadPath, l_FieldName, "OnUploadToServerSuccess", "OnUploadToServerFail");
+ } catch (err) {
+ alert("上传文件失败!请检查系统上传参数及网络环境,重新上传。");
+ }
+ wps.PluginStorage.setItem(constStrEnum.OADocUserSave, EnumDocSaveFlag.NoneOADocSave);
+ }
+
+ //获取OA传入的 转其他格式上传属性
+ var l_suffix = GetDocParamsValue(l_doc, constStrEnum.suffix);
+ if (l_suffix == "") {
+ console.log("上传需转换的文件后缀名错误,无法进行转换上传!");
+ return;
+ }
+
+ //判断是否同时上传PDF等格式到OA后台
+ var l_uploadWithAppendPath = GetDocParamsValue(l_doc, constStrEnum.uploadWithAppendPath); //标识是否同时上传suffix格式的文档
+ if (l_uploadWithAppendPath == "1") {
+ //调用转pdf格式函数,强制关闭转换修订痕迹,不弹出用户确认的对话框
+ pDoChangeToOtherDocFormat(l_doc, l_suffix, false, false);
+ }
+ return;
+}
+
+
+/**
+ * 作用:套红头
+ * 所有与OA系统相关的业务功能,都放在oabuss 子目录下
+ */
+function OnInsertRedHeaderClick() {
+ var l_Doc = wps.WpsApplication().ActiveDocument;
+ if (!l_Doc) {
+ return;
+ }
+ var l_insertFileUrl = GetDocParamsValue(l_Doc, constStrEnum.insertFileUrl); //插入文件的位置
+ var l_BkFile = GetDocParamsValue(l_Doc, constStrEnum.bkInsertFile);
+ if (l_BkFile == "" || l_insertFileUrl == "") {
+ var height = 250;
+ var width = 400;
+ OnShowDialog("redhead.html", "OA助手", width, height);
+ return;
+ }
+ InsertRedHeadDoc(l_Doc);
+}
+
+
+/**
+ * 插入时间
+ * params参数结构
+ * params:{
+ *
+ * }
+ */
+function OnInsertDateClicked() {
+ var l_Doc = wps.WpsApplication().ActiveDocument;
+ if (l_Doc) {
+ //打开插入日期对话框
+ wps.WpsApplication().Dialogs.Item(wps.Enum&&wps.Enum.wdDialogInsertDateTime||165).Show();
+ }
+}
+
+
+/**
+ * 调用文件上传到OA服务端时,
+ * @param {*} resp
+ */
+function OnUploadToServerSuccess(resp) {
+ console.log("成功上传服务端后的回调:" + resp)
+ console.log(resp)
+ var l_doc = wps.WpsApplication().ActiveDocument;
+ var l_showConfirm = wps.PluginStorage.getItem(constStrEnum.Save2OAShowConfirm);
+ if (l_showConfirm) {
+ if (wps.confirm("文件上传成功!继续编辑请确认,取消关闭文档。") == false) {
+ if (l_doc) {
+ console.log("OnUploadToServerSuccess: before Close");
+ l_doc.Close(-1); //保存文档后关闭
+ console.log("OnUploadToServerSuccess: after Close");
+ }
+ }
+ }
+
+ var l_NofityURL = GetDocParamsValue(l_doc, constStrEnum.notifyUrl);
+ if (l_NofityURL != "") {
+ l_NofityURL = l_NofityURL.replace("{?}", "2"); //约定:参数为2则文档被成功上传
+ NotifyToServer(l_NofityURL);
+ }
+}
+
+function OnUploadToServerFail(resp) {
+ alert("文件上传失败!");
+}
+
+function OnbtnTabClick() {
+ alert("OnbtnTabClick");
+}
+
+
+
+//判断当前文档是否是OA文档
+function pCheckIfOADoc() {
+ var doc = wps.WpsApplication().ActiveDocument;
+ if (!doc)
+ return false;
+ return CheckIfDocIsOADoc(doc);
+}
+
+//根据传入的doc对象,判断当前文档是否是OA文档
+function CheckIfDocIsOADoc(doc) {
+ if (!doc) {
+ return false;
+ }
+
+ var l_isOA = GetDocParamsValue(doc, constStrEnum.isOA);
+ if (l_isOA == "") {
+ return false
+ };
+
+ return l_isOA == EnumOAFlag.DocFromOA ? true : false;
+}
+
+//获取文件来源标识
+function pGetDocSourceLabel() {
+ return pCheckIfOADoc() ? "OA文件" : "非OA文件";
+}
+
+
+
+/**
+ * 作用:设置用户名称标签
+ */
+function pSetUserNameLabelControl() {
+ var l_doc = wps.WpsApplication().ActiveDocument;
+ if (!l_doc) return "";
+
+ var l_strUserName = "";
+ if (pCheckIfOADoc() == true) { // OA文档,获取OA用户名
+ var userName = GetDocParamsValue(l_doc, constStrEnum.userName);
+ l_strUserName = userName == "" ? "未设置" : userName;
+ } else {
+ //非OA传来的文档,则按WPS安装后设置的用户名显示
+ l_strUserName = "" + wps.PluginStorage.getItem(constStrEnum.WPSInitUserName);
+ }
+
+ return l_strUserName;
+}
+
+
+/**
+ * 作用:判断是否是不落地文档
+ * 参数:doc 文档对象
+ * 返回值: 布尔值
+ */
+function pIsOnlineOADoc(doc) {
+ var l_LandMode = GetDocParamsValue(doc, constStrEnum.OADocLandMode); //获取文档落地模式
+ if (l_LandMode == "") { //用户本地打开的文档
+ return false;
+ }
+ return l_LandMode == EnumDocLandMode.DLM_OnlineDoc;
+}
+/**
+ * 作用:返回OA文档落地模式标签
+ */
+function pGetOADocLabel() {
+ var l_Doc = wps.WpsApplication().ActiveDocument;
+ if (!l_Doc) {
+ return "";
+ }
+
+ var l_strLabel = ""; //初始化
+
+ if (pIsOnlineOADoc(l_Doc) == true) { // 判断是否为不落地文档
+ l_strLabel = "文档状态:不落地";
+ } else {
+ l_strLabel = l_Doc.Path != "" ? "文档状态:落地" : "文档状态:未保存";
+ }
+
+ //判断OA文档是否是受保护
+ if (pISOADocReadOnly(l_Doc) == true) {
+ l_strLabel = l_strLabel + "(保护)";
+ }
+ return l_strLabel;
+}
+
+//返回是否可以点击OA保存按钮的状态
+function OnSetSaveToOAEnable() {
+ return pCheckIfOADoc();
+}
+
+
+/**
+ * 作用:根据OA传入参数,设置是否显示Ribbob按钮组
+ * 参数:CtrlID 是OnGetVisible 传入的Ribbob控件的ID值
+ */
+function pShowRibbonGroupByOADocParam(CtrlID) {
+ var l_Doc = wps.WpsApplication().ActiveDocument;
+ if (!l_Doc) {
+ return false; //如果未装入文档,则设置OA助手按钮组不可见
+ }
+
+ //获取OA传入的按钮组参数组
+ var l_grpButtonParams = GetDocParamsValue(l_Doc, constStrEnum.buttonGroups); //disableBtns
+ l_grpButtonParams = l_grpButtonParams + "," + GetDocParamsValue(l_Doc, constStrEnum.disableBtns);
+
+
+ // 要求OA传入控制自定义按钮显示的参数为字符串 中间用 , 分隔开
+ if (typeof(l_grpButtonParams) == "string") {
+ var l_arrayGroup = new Array();
+ l_arrayGroup = l_grpButtonParams.split(",");
+ //console.log(l_grpButtonParams);
+
+ // 判断当前按钮是否存在于数组
+ if (l_arrayGroup.indexOf(CtrlID) >= 0) {
+ return false;
+ }
+ }
+ // 添加OA菜单判断
+ if (CtrlID == "WPSWorkExtTab") {
+ if(wps.WpsApplication().ActiveDocument){
+ let l_value=GetDocParamsValue(wps.WpsApplication().ActiveDocument,"isOA");
+ return l_value?true:false;
+ }
+ var l_value = wps.PluginStorage.getItem(constStrEnum.ShowOATabDocActive);
+ wps.PluginStorage.setItem(constStrEnum.ShowOATabDocActive, false); //初始化临时状态变量
+ console.log("菜单:" + l_value);
+ return l_value;
+ }
+ return true;
+}
+
+/**
+ * 根据传入Document对象,获取OA传入的参数的某个Key值的Value
+ * @param {*} Doc
+ * @param {*} Key
+ * 返回值:返回指定 Key的 Value
+ */
+function GetDocParamsValue(Doc, Key) {
+ if (!Doc) {
+ return "";
+ }
+
+ var l_Params = wps.PluginStorage.getItem(Doc.DocID);
+ if (!l_Params) {
+ return "";
+ }
+
+ var l_objParams = JSON.parse(l_Params);
+ if (typeof(l_objParams) == "undefined") {
+ return "";
+ }
+
+ var l_rtnValue = l_objParams[Key];
+ if (typeof(l_rtnValue) == "undefined" || l_rtnValue == null) {
+ return "";
+ }
+ return l_rtnValue;
+}
+
+/**
+ * 获取对象中指定属性的值
+ * @param {*} params
+ * @param {*} Key
+ */
+function GetParamsValue(Params, Key) {
+ if (typeof(Params) == "undefined") {
+ return "";
+ }
+
+ var l_rtnValue = Params[Key];
+ return l_rtnValue;
+}
+
+
+
+/**
+ * 作用:插入二维码图片
+ */
+function OnInsertQRCode() {
+ OnShowDialog("QRCode.html", "插入二维码", 400, 400);
+}
+
+
+/**
+ * 打开本地文档并插入到当前文档中指定位置(导入文档)
+ */
+function OnOpenLocalFile() {
+ OpenLocalFile();
+}
+/**
+ * 插入水印
+ */
+function DoInsertWaterToDoc(){
+ var app, shapeRange;
+ try {
+ // app = wpsFrame.Application;
+ var app=wps.WpsApplication();
+ var doc = app.ActiveDocument;
+ var selection = doc.ActiveWindow.Selection;
+ var pageCount = app.ActiveWindow.ActivePane.Pages.Count;
+ for(var i=1;i<=pageCount;i++){
+ selection.GoTo(1, 1, i);
+ app.ActiveWindow.ActivePane.View.SeekView=9;
+ app.ActiveDocument.Sections.Item(1).Headers.Item(1).Shapes.AddTextEffect(0, "公司绝密", "华文新魏", 36, false, false, 0, 0).Select();
+ shapeRange = app.Selection.ShapeRange;
+ shapeRange.TextEffect.NormalizedHeight = false;
+ shapeRange.Line.Visible = false;
+ shapeRange.Fill.Visible = true;
+ shapeRange.Fill.Solid();
+ shapeRange.Fill.ForeColor.RGB = 12632256; /* WdColor枚举 wdColorGray25 代表颜色值 */
+ shapeRange.Fill.Transparency = 0.5; /* 填充透明度,值为0.0~1.0 */
+ shapeRange.LockAspectRatio = true;
+ shapeRange.Height = 4.58 * 28.346;
+ shapeRange.Width = 28.07 * 28.346;
+ shapeRange.Rotation = 315; /* 图形按照Z轴旋转度数,正值为顺时针旋转,负值为逆时针旋转 */
+ shapeRange.WrapFormat.AllowOverlap = true;
+ shapeRange.WrapFormat.Side = 3; /* WdWrapSideType枚举 wdWrapLargest 形状距离页边距最远的一侧 */
+ shapeRange.WrapFormat.Type = 3;
+ shapeRange.RelativeHorizontalPosition = 0;
+ shapeRange.RelativeVerticalPosition = 0;
+ shapeRange.Left = '-999995';
+ shapeRange.Top = '-999995';
+
+ } /* WdShapePosition枚举 wdShapeCenter 形状的位置在中央 */
+ selection.GoTo(1, 1, 1);
+ app.ActiveWindow.ActivePane.View.SeekView=0;
+ } catch (error) {
+ alert(error.message);
+ }
+}
+
+/**
+ * 插入电子印章的功能
+ */
+function OnInsertSeal() {
+ OnShowDialog("selectSeal.html", "印章", 730, 500);
+}
+
+/**
+ * 导入模板到文档中
+ */
+function OnImportTemplate() {
+ OnShowDialog("importTemplate.html", "导入模板", 560, 400);
+}
+
+
+//自定义菜单按钮的点击执行事件
+function OnAction(control) {
+ var eleId;
+ if (typeof control == "object" && arguments.length == 1) { //针对Ribbon的按钮的
+ eleId = control.Id;
+ } else if (typeof control == "undefined" && arguments.length > 1) { //针对idMso的
+ eleId = arguments[1].Id;
+ console.log(eleId)
+ } else if (typeof control == "boolean" && arguments.length > 1) { //针对checkbox的
+ eleId = arguments[1].Id;
+ } else if (typeof control == "number" && arguments.length > 1) { //针对combox的
+ eleId = arguments[2].Id;
+ }
+ switch (eleId) {
+ case "btnOpenWPSYUN": //打开WPS云文档入口
+ pDoOpenWPSCloundDoc();
+ break;
+ case "btnOpenLocalWPSYUN": //打开本地文档并插入到文档中
+ OnOpenLocalFile();
+ break;
+ case "WPSWorkExtTab":
+ OnbtnTabClick();
+ break;
+ case "btnSaveToServer": //保存到OA服务器
+ wps.PluginStorage.setItem(constStrEnum.Save2OAShowConfirm, true)
+ OnBtnSaveToServer();
+ break;
+ case "btnSaveAsFile": //另存为本地文件
+ OnBtnSaveAsLocalFile();
+ break;
+ case "btnChangeToPDF": //转PDF文档并上传
+ OnDoChangeToOtherDocFormat(".pdf");
+ break;
+ case "btnChangeToUOT": //转UOF文档并上传
+ OnDoChangeToOtherDocFormat(".uof");
+ break;
+ case "btnChangeToOFD": //转OFD文档并上传
+ OnDoChangeToOtherDocFormat(".ofd");
+ break;
+ //------------------------------------
+ case "btnInsertRedHeader": //插入红头
+ OnInsertRedHeaderClick(); //套红头功能
+ break;
+ case "btnUploadOABackup": //文件备份
+ OnUploadOABackupClicked();
+ break;
+ case "btnInsertSeal": //插入印章
+ OnInsertSeal();
+ break;
+ //------------------------------------
+ //修订按钮组
+ case "btnClearRevDoc": //执行 清稿 按钮
+ OnBtnClearRevDoc();
+ break;
+ case "btnOpenRevision": //打开修订
+ {
+ let bFlag = wps.PluginStorage.getItem(constStrEnum.RevisionEnableFlag)
+ wps.PluginStorage.setItem(constStrEnum.RevisionEnableFlag, !bFlag)
+ //通知wps刷新以下几个按钮的状态
+ wps.ribbonUI.InvalidateControl("btnOpenRevision")
+ wps.ribbonUI.InvalidateControl("btnCloseRevision")
+ OnOpenRevisions(); //
+ break;
+ }
+ case "btnCloseRevision": //关闭修订
+ {
+ let bFlag = wps.PluginStorage.getItem(constStrEnum.RevisionEnableFlag)
+ wps.PluginStorage.setItem(constStrEnum.RevisionEnableFlag, !bFlag)
+ //通知wps刷新以下几个按钮的状态
+ wps.ribbonUI.InvalidateControl("btnOpenRevision")
+ wps.ribbonUI.InvalidateControl("btnCloseRevision")
+ OnCloseRevisions();
+ break;
+ }
+ case "btnShowRevision":
+ break;
+ case "btnAcceptAllRevisions": //接受所有修订功能
+ OnAcceptAllRevisions();
+ break;
+ case "btnRejectAllRevisions": //拒绝修订
+ OnRejectAllRevisions();
+ break;
+ //------------------------------------
+ case "btnInsertPic": //插入图片
+ DoInsertPicToDoc();
+ break;
+ case "btnInsertWater":
+ DoInsertWaterToDoc()
+ case "btnInsertDate": //插入日期
+ OnInsertDateClicked();
+ break;
+ case "btnOpenScan": //打开扫描仪
+ OnOpenScanBtnClicked();
+ break;
+ case "btnPageSetup": //打开页面设置
+ OnPageSetupClicked();
+ break;
+ case "btnQRCode": //插入二维码
+ OnInsertQRCode(); //
+ break;
+ case "btnPrintDOC": // 打开打印设置
+ OnPrintDocBtnClicked();
+ break;
+ case "lblDocSourceValue": //OA公文提示
+ OnOADocInfo();
+ break;
+ case "btnUserName": //点击用户
+ OnUserNameSetClick();
+ break;
+ case "btnInsertBookmark": //插入书签
+ OnInsertBookmarkToDoc();
+ break;
+ case "btnImportTemplate": //导入模板
+ OnImportTemplate();
+ break;
+ case "FileSaveAsMenu": //通过idMso进行「另存为」功能的自定义
+ case "FileSaveAs":
+ {
+ if (pCheckIfOADoc()) { //文档来源是业务系统的,做自定义
+ alert("这是OA文档,将Ctrl+S动作做了重定义,可以调用OA的保存文件流到业务系统的接口。")
+ OnBtnSaveToServer();
+ } else { //本地的文档,期望不做自定义,通过转调idMso的方法实现
+ wps.WpsApplication().CommandBars.ExecuteMso("FileSaveAsWordDocx");
+ //此处一定不能去调用与重写idMso相同的ID,否则就是个无线递归了,即在这个场景下不可调用FileSaveAs和FileSaveAsMenu这两个方法
+ }
+ break;
+ }
+ case "FileSave": //通过idMso进行「保存」功能的自定义
+ {
+ if (pCheckIfOADoc()) { //文档来源是业务系统的,做自定义
+ alert("这是OA文档,将Ctrl+S动作做了重定义,可以调用OA的保存文件流到业务系统的接口。")
+ OnBtnSaveToServer();
+ } else { //本地的文档,期望不做自定义,通过转调idMso的方法实现
+ // wps.WpsApplication().CommandBars.ExecuteMso("FileSave");
+ wps.WpsApplication().CommandBars.ExecuteMso("SaveAll");
+ //此处一定不能去调用与重写idMso相同的ID,否则就是个无线递归了,即在这个场景下不可调用FileSaveAs和FileSaveAsMenu这两个方法
+ }
+ break;
+ }
+ case "FileNew":
+ case "FileNewMenu":
+ case "WindowNew":
+ case "FileNewBlankDocument":
+ {
+ if (pCheckIfOADoc()) { //文档来源是业务系统的,做自定义
+ alert("这是OA文档,将Ctrl+N动作做了禁用")
+ }
+ }
+ break
+ case "ShowAlert_ContextMenuText":
+ {
+ let selectText = wps.WpsApplication().Selection.Text;
+ alert("您选择的内容是:\n" + selectText);
+ break;
+ }
+ case "btnSendMessage1":
+ {
+ /**
+ * 内部封装了主动响应前端发送的请求的方法
+ */
+ //参数自定义,这里只是负责传递参数,在WpsInvoke.RegWebNotify方法的回调函数中去做接收,自行解析参数
+ let params={
+ type:'executeFunc1',
+ message:"当前时间为:" + currentTime()
+ }
+ /**
+ * WebNotify:
+ * 参数1:发送给业务系统的消息
+ * 参数2:是否将消息加入队列,是否防止丢失消息,都需要设置为true
+ */
+ wps.OAAssist.WebNotify(JSON.stringify(params),true); //如果想传一个对象,则使用JSON.stringify方法转成对象字符串。
+ break;
+ }
+ case "btnSendMessage2":
+ {
+ /**
+ * 内部封装了主动响应前端发送的请求的方法
+ */
+ let msgInfo =
+ {
+ id: 1,
+ name: 'kingsoft',
+ since: "1988"
+ }
+ //参数自定义,这里只是负责传递参数,在WpsInvoke.RegWebNotify方法的回调函数中去做接收,自行解析参数
+
+ let params={
+ type:'executeFunc2',
+ message:"当前时间为:" + currentTime(),
+ msgInfoStr: JSON.stringify(msgInfo)
+ }
+ /**
+ * WebNotify:
+ * 参数1:发送给业务系统的消息
+ * 参数2:是否将消息加入队列,是否防止丢失消息,都需要设置为true
+ */
+ wps.OAAssist.WebNotify(JSON.stringify(params),true); //如果想传一个对象,则使用JSON.stringify方法转成对象字符串。
+ break;
+ }
+ case "btnAddWebShape":
+ {
+ let l_doc = wps.WpsApplication().ActiveDocument;
+ l_doc.Shapes.AddWebShape("https://www.wps.cn");
+ break;
+ }
+ default:
+ break;
+ }
+ return true;
+}
+
+/**
+ * 作用:重新设置当前用户名称
+ */
+function OnUserNameSetClick() {
+ var l_UserPageUrl = "setUserName.html"
+ OnShowDialog(l_UserPageUrl, "OA助手用户名称设置", 500, 300);
+}
+/**
+ * 作用:展示当前文档,被OA助手打开后的,操作记录及相关附加信息
+ */
+function OnOADocInfo() {
+ return;
+}
+
+/**
+ * 作用:自定义菜单按钮的图标
+ */
+function GetImage(control) {
+ var eleId;
+ if (typeof control == "object" && arguments.length == 1) { //针对Ribbon的按钮的
+ eleId = control.Id;
+ } else if (typeof control == "undefined" && arguments.length > 1) { //针对idMso的
+ eleId = arguments[1].Id;
+ } else if (typeof control == "boolean" && arguments.length > 1) { //针对checkbox的
+ eleId = arguments[1].Id;
+ } else if (typeof control == "number" && arguments.length > 1) { //针对combox的
+ eleId = arguments[2].Id;
+ }
+ switch (eleId) {
+ case "btnOpenWPSYUN":
+ return "./icon/w_WPSCloud.png"; //打开WPS云文档
+ case "btnOpenLocalWPSYUN": //导入文件
+ return "./icon/w_ImportDoc.png"
+ case "btnSaveToServer": //保存到OA后台服务端
+ return "./icon/w_Save.png";
+ case "btnSaveAsFile": //另存为本地文件
+ return "./icon/w_SaveAs.png";
+ case "btnChangeToPDF": //输出为PDF格式
+ return "./icon/w_PDF.png";
+ case "btnChangeToUOT": //
+ return "./icon/w_DocUOF.png";
+ case "btnChangeToOFD": //转OFD上传
+ return "./icon/w_DocOFD.png"; //
+ case "btnInsertRedHeader": //套红头
+ return "./icon/w_GovDoc.png";
+ case "btnInsertSeal": //印章
+ return "./icon/c_seal.png";
+ case "btnClearRevDoc": //清稿
+ return "./icon/w_DocClear.png"
+ case "btnUploadOABackup": //备份正文
+ return "./icon/w_BackDoc.png";
+ case "btnOpenRevision": //打开 修订
+ case "btnShowRevision": //
+ return "./icon/w_OpenRev.png";
+ case "btnCloseRevision": //关闭修订
+ return "./icon/w_CloseRev.png";
+ case "btnAcceptAllRevisions": // 接受修订
+ return "./icon/w_AcceptRev.png";
+ case "btnRejectAllRevisions": // 拒绝修订
+ return "./icon/w_RejectRev.png";
+ case "btnSaveAsFile":
+ return "";
+ case "btnInsertWater":
+ case "btnInsertPic": //插入图片
+ return "./icon/w_InsPictures.png";
+ case "btnOpenScan": //打开扫描仪
+ return "./icon/w_Scanner16.png"; //
+ case "btnPageSetup": //打开页面设置
+ return "./icon/w_PageGear.png";
+ case "btnInsertDate": //插入日期
+ return "./icon/w_InsDate.png";
+ case "btnQRCode": //二维码
+ return "./icon/w_DocQr.png";
+ case "btnPrintDOC": // 打印设置
+ return "./icon/c_printDoc.png";
+ case "btnInsertBookmark":
+ return "./icon/c_bookmark.png";
+ case "btnImportTemplate":
+ return "./icon/w_ImportDoc.png";
+ case "btnSendMessage1":
+ return "./icon/3.svg"
+ case "btnSendMessage2":
+ return "./icon/3.svg"
+ default:
+ ;
+ }
+ return "./icon/c_default.png";
+}
+
+function pGetOpenRevisionButtonLabel() {
+ return "打开修订";
+}
+
+function pGetShowRevisionButtonLabel() {
+ return "显示修订";
+}
+
+
+//xml文件中自定义按钮的文字处理函数
+function OnGetLabel(control) {
+ var eleId;
+ if (typeof control == "object" && arguments.length == 1) { //针对Ribbon的按钮的
+ eleId = control.Id;
+ } else if (typeof control == "undefined" && arguments.length > 1) { //针对idMso的
+ eleId = arguments[1].Id;
+ } else if (typeof control == "boolean" && arguments.length > 1) { //针对checkbox的
+ eleId = arguments[1].Id;
+ } else if (typeof control == "number" && arguments.length > 1) { //针对combox的
+ eleId = arguments[2].Id;
+ }
+ switch (eleId) {
+ case "btnOpenWPSYUN": //打开WPS云文档
+ return "WPS云文档";
+ case "btnOpenLocalWPSYUN": //打开本地云文档目录
+ return "导入文档";
+ case "btnSaveAsFile":
+ return "另存为本地";
+ case "btnChangeToPDF": //转PDF并上传
+ return "转PDF上传";
+ case "btnChangeToUOT": //转UOF并上传
+ return "转UOF上传";
+ case "btnChangeToOFD": //转OFD格式并上传
+ return "转OFD上传";
+ case "lblDocSourceValue": //文件来源标签:
+ return pGetDocSourceLabel();
+ case "lblUserName": //用户名:lableControl 控件
+ return "编辑人:"; //pSetUserNameLabelControl();
+ case "btnUserName":
+ return pSetUserNameLabelControl();
+ //======================================================
+ case "btnInsertRedHeader": //套红头
+ return "套红头";
+ case "btnInsertSeal": //插入印章
+ return "印章";
+ case "btnUploadOABackup": //文件备份
+ return "文件备份";
+ //======================================================
+ case "btnOpenRevision": //打开修订按钮
+ return pGetOpenRevisionButtonLabel();
+ case "btnShowRevision": //显示修订按钮
+ return pGetShowRevisionButtonLabel();
+ case "btnCloseRevision": //关闭修订按钮
+ return "关闭修订";
+ case "btnClearRevDoc": //显示 清稿
+ return "清稿";
+ case "btnAcceptAllRevisions": //显示 接受修订
+ return "接受修订";
+ case "btnRejectAllRevisions": //显示 拒绝修订
+ return "拒绝修订";
+ case "lblDocLandMode": //显示 文档落地方式 :不落地还是本地,包括是否受保护
+ return pGetOADocLabel();
+ //---------------------------------------------
+ case "btnInsertPic": //插入图片
+ return "插图片";
+ case "btnInsertDate": //插入日期
+ return "插日期";
+ case "btnOpenScan": //打开扫描仪
+ return "扫描仪";
+ case "btnInsertWater":
+ return "插入水印"
+ case "btnPageSetup": //打开页面设置
+ return "页面设置";
+ case "btnPrintDOC": //打开页面设置
+ return "打印设置";
+ case "btnInsertBookmark":
+ return "导入书签";
+ case "btnImportTemplate":
+ return "导入模板";
+ default:
+ ;
+ }
+ return "";
+}
+
+/**
+ * 作用:处理Ribbon按钮的是否可显示
+ * @param {*} control :Ribbon 的按钮控件
+ */
+function OnGetVisible(control) {
+ var eleId;
+ if (typeof control == "object" && arguments.length == 1) { //针对Ribbon的按钮的
+ eleId = control.Id;
+ } else if (typeof control == "undefined" && arguments.length > 1) { //针对idMso的
+ eleId = arguments[1].Id;
+ } else if (typeof control == "boolean" && arguments.length > 1) { //针对checkbox的
+ eleId = arguments[1].Id;
+ } else if (typeof control == "number" && arguments.length > 1) { //针对combox的
+ eleId = arguments[2].Id;
+ }
+ var l_value = false;
+
+ //关闭一些测试中的功能
+ switch (eleId) {
+ case "lblDocLandMode": //文档落地标签
+ return true;
+ case "btnOpenScan":
+ return false;
+ case "btnAddWebShape":
+ {
+ if (wps.WpsApplication().Build.toString().indexOf("11.1") != -1){
+ return true;
+ }
+ return false;
+ }
+ break;
+ default:
+
+ }
+
+ //按照 OA文档传递过来的属性进行判断
+ l_value = pShowRibbonGroupByOADocParam(eleId);
+ return l_value;
+}
+
+/**
+ * 作用:处理Ribbon按钮的是否可用
+ * @param {*} control :Ribbon 的按钮控件
+ */
+function OnGetEnabled(control) {
+ var eleId;
+ if (typeof control == "object" && arguments.length == 1) { //针对Ribbon的按钮的
+ eleId = control.Id;
+ } else if (typeof control == "undefined" && arguments.length > 1) { //针对idMso的
+ eleId = arguments[1].Id;
+ } else if (typeof control == "boolean" && arguments.length > 1) { //针对checkbox的
+ eleId = arguments[1].Id;
+ } else if (typeof control == "number" && arguments.length > 1) { //针对combox的
+ eleId = arguments[2].Id;
+ }
+ switch (eleId) {
+ case "btnSaveToServer": //保存到OA服务器的相关按钮。判断,如果非OA文件,禁止点击
+ case "btnChangeToPDF": //保存到PDF格式再上传
+ case "btnChangeToUOT": //保存到UOT格式再上传
+ case "btnChangeToOFD": //保存到OFD格式再上传
+ case "SaveAll": //保存所有文档
+ //以下四个idMso的控制是关于文档新建的
+ case "FileNew":
+ case "FileNewMenu":
+ case "WindowNew":
+ case "FileNewBlankDocument":
+ return OnSetSaveToOAEnable();
+ case "btnCloseRevision":
+ {
+ let bFlag = wps.PluginStorage.getItem(constStrEnum.RevisionEnableFlag)
+ return bFlag
+ }
+ case "btnOpenRevision":
+ {
+ let bFlag = wps.PluginStorage.getItem(constStrEnum.RevisionEnableFlag)
+ return !bFlag
+ }
+ case "PictureInsert":
+ return false;
+ case "TabInsert"://WPS自身tab:插入
+ case "TabDeveloper": //WPS自身tab:开发工具
+ // case "TabPageLayoutWord": //WPS自身tab:页面布局
+ // case "TabReferences": //WPS自身tab:引用
+ // case "TabReviewWord": //WPS自身tab:审阅
+ // case "TabView": //WPS自身tab:视图
+ {
+ if(pCheckIfOADoc()){
+ return false;//如果是OA打开的文档,把这个几个tab不可用/隐藏
+ }else{
+ return true;
+ }
+ }
+ default:
+ ;
+ }
+ return true;
+}
\ No newline at end of file
diff --git a/oaassist/WpsOAAssist/js/common/time.js b/oaassist/WpsOAAssist/js/common/time.js
new file mode 100644
index 0000000..5981248
--- /dev/null
+++ b/oaassist/WpsOAAssist/js/common/time.js
@@ -0,0 +1,157 @@
+var MAX_DATE = 2958465 // about year 9999
+var MAX_DATE_1904 = 2957003
+
+// Half a second, expressed in days
+var HALF_SECOND = (1.0 / 172800.0)
+
+// Half a millisecond
+var HALF_MILLISECOND = (1.0 / 2000.0)
+
+// 从 0000/1/1 到 1900/1/1 的时间序数值
+var SERIAL_BASE_NUM = 693959
+
+// 从 0000/1/1 到 1904/1/1 的时间序数值
+var SERIAL_BASE_NUM_1904 = 695421
+
+// 指示是否假定 1900 年为润年(兼容 Excel)
+var YEAR1900_ISLEAP = 0
+
+// One-based array of days in year at month start
+var _afxMonthDays =
+ [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365];
+var b1904 = false;
+var bDisable1900Year = false;
+
+function toTime(dtSrc, b1904) {
+ var tmDest = {};
+ var nDays = 0; // Number of days since Dec. 30, 1899
+ var nDaysAbsolute = 0; // Number of days since 1/1/0
+ var nSecsInDay = 0; // Time in seconds since midnight
+ var nMinutesInDay = 0; // Minutes in day
+
+ var n400Years = 0; // Number of 400 year increments since 1/1/0
+ var n400Century = 0; // Century within 400 year block (0,1,2 or 3)
+ var n4Years = 0; // Number of 4 year increments since 1/1/0
+ var n4Day = 0; // Day within 4 year block
+ // (0 is 1/1/yr1, 1460 is 12/31/yr4)
+ var n4Yr = 0; // Year within 4 year block (0,1,2 or 3)
+ var bLeap4 = true; // true if 4 year block includes leap year
+ var bIs1900Year = false; // true if this year is 1900
+
+ var dblDate = dtSrc; // tempory serial date
+
+ // Round to the second
+ if (0 == 0)
+ dblDate += ((dtSrc > 0.0) ? HALF_SECOND : -HALF_SECOND);
+
+ // If a valid date, then this conversion should not overflow
+ nDays = Math.floor(dblDate);
+
+ nDaysAbsolute = Math.floor(dblDate) + (b1904 ? SERIAL_BASE_NUM_1904 : SERIAL_BASE_NUM); // Add days from 1/1/0 to 12/30/1899
+
+ dblDate = Math.abs(dblDate);
+ var dblSecsInDay = (dblDate - Math.floor(dblDate)) * 86400.0;
+
+ nSecsInDay = Math.floor(dblSecsInDay);
+
+ // modified by tsingbo:
+ // Calculate the day of week (sun=0, mon=1...)
+ // -1 because 1/1/0 is Sat.
+ tmDest.tm_wday = Math.floor((nDaysAbsolute - 1) % 7);
+
+ if (!bDisable1900Year && !b1904 &&
+ nDaysAbsolute >= SERIAL_BASE_NUM &&
+ nDaysAbsolute < SERIAL_BASE_NUM + 367) {
+ bIs1900Year = true;
+ n4Day = nDaysAbsolute - SERIAL_BASE_NUM;
+ bLeap4 = true;
+ n400Years = 4;
+ n400Century = 3;
+ n4Yr = 0;
+ }
+ else {
+ // Leap years every 4 yrs except centuries not multiples of 400.
+ n400Years = Math.floor(nDaysAbsolute / 146097);
+
+ // Set nDaysAbsolute to day within 400-year block
+ nDaysAbsolute %= 146097;
+
+ // -1 because first century has extra day
+ n400Century = Math.floor((nDaysAbsolute - 1) / 36524);
+
+ // Non-leap century
+ if (n400Century != 0) {
+ // Set nDaysAbsolute to day within century
+ nDaysAbsolute = (nDaysAbsolute - 1) % 36524;
+
+ // +1 because 1st 4 year increment has 1460 days
+ n4Years = Math.floor((nDaysAbsolute + 1) / 1461);
+
+ if (n4Years != 0)
+ n4Day = Math.floor((nDaysAbsolute + 1) % 1461);
+ else {
+ bLeap4 = false;
+ n4Day = Math.floornDaysAbsolute;
+ }
+ }
+ else {
+ // Leap century - not special case!
+ n4Years = Math.floor(nDaysAbsolute / 1461);
+ n4Day = Math.floor(nDaysAbsolute % 1461);
+ }
+
+ if (bLeap4) {
+ // -1 because first year has 366 days
+ n4Yr = (n4Day - 1) / 365;
+
+ if (n4Yr != 0)
+ n4Day = (n4Day - 1) % 365;
+ }
+ else {
+ n4Yr = n4Day / 365;
+ n4Day %= 365;
+ }
+ }
+
+ // n4Day is now 0-based day of year. Save 1-based day of year, year number
+ tmDest.tm_yday = Math.floor(n4Day) + 1;
+ tmDest.tm_year = Math.floor(n400Years * 400 + n400Century * 100 + n4Years * 4 + n4Yr);
+
+ // Handle leap year: before, on, and after Feb. 29.
+ if (n4Yr == 0 && bLeap4) {
+ // Leap Year
+ if ((!bIs1900Year && n4Day == 59) ||
+ (bIs1900Year && n4Day == 60)) {
+ /* Feb. 29 */
+ tmDest.tm_mon = 2;
+ tmDest.tm_mday = 29;
+ }
+ else {
+ // Pretend it's not a leap year for month/day comp.
+ if (n4Day >= 60)
+ --n4Day;
+ }
+ } else {
+ // Make n4DaY a 1-based day of non-leap year and compute
+ // month/day for everything but Feb. 29.
+ if (!bIs1900Year)
+ ++n4Day;
+
+ // Month number always >= n/32, so save some loop time */
+ for (tmDest.tm_mon = (n4Day >> 5) + 1;
+ n4Day > _afxMonthDays[tmDest.tm_mon]; tmDest.tm_mon++);
+
+ tmDest.tm_mday = Math.floor(n4Day - _afxMonthDays[tmDest.tm_mon - 1]);
+ }
+
+ if (nSecsInDay == 0)
+ tmDest.tm_hour = tmDest.tm_min = tmDest.tm_sec = 0;
+ else {
+ tmDest.tm_sec = Math.floor(nSecsInDay % 60);
+ nMinutesInDay = nSecsInDay / 60;
+ tmDest.tm_min = Math.floor(nMinutesInDay % 60);
+ tmDest.tm_hour = Math.floor(nMinutesInDay / 60);
+ }
+
+ return new Date(tmDest.tm_year, tmDest.tm_mon + 1, tmDest.tm_mday, tmDest.tm_mday, tmDest.tm_min, tmDest.tm_sec);
+}
diff --git a/oaassist/WpsOAAssist/js/main.js b/oaassist/WpsOAAssist/js/main.js
new file mode 100644
index 0000000..a079b09
--- /dev/null
+++ b/oaassist/WpsOAAssist/js/main.js
@@ -0,0 +1,12 @@
+//=======================依赖的第三方库=======================
+var time=new Date().getTime()
+document.write("");
+document.write("");
+//======================wps api常用枚举值=====================
+document.write("");
+//=======================业务代码============================
+document.write("");
+document.write("");
+document.write("");
+document.write("");
+document.write("");
\ No newline at end of file
diff --git a/oaassist/WpsOAAssist/otherslib/lib/formdata.js b/oaassist/WpsOAAssist/otherslib/lib/formdata.js
new file mode 100644
index 0000000..1a3e9b5
--- /dev/null
+++ b/oaassist/WpsOAAssist/otherslib/lib/formdata.js
@@ -0,0 +1,37 @@
+/**
+ * Emulate FormData for some browsers
+ * MIT License
+ * (c) 2010 François de Metz
+ */
+(function(w) {
+ if (w.FakeFormData)
+ return;
+ function FormData() {
+ this.fake = true;
+ this.boundary = "--------FormData" + Math.random();
+ this._fields = [];
+ }
+ FormData.prototype.append = function(key, value) {
+ this._fields.push([key, value]);
+ }
+ FormData.prototype.toString = function() {
+ var boundary = this.boundary;
+ var body = "";
+ this._fields.forEach(function(field) {
+ body += "--" + boundary + "\r\n";
+ // file upload
+ if (field[1].name) {
+ var file = field[1];
+ body += "Content-Disposition: form-data; name=\""+ field[0] +"\"; filename=\""+ file.name +"\"\r\n";
+ body += "Content-Type: "+ file.type +"\r\n\r\n";
+ body += file.getAsBinary() + "\r\n";
+ } else {
+ body += "Content-Disposition: form-data; name=\""+ field[0] +"\";\r\n\r\n";
+ body += field[1] + "\r\n";
+ }
+ });
+ body += "--" + boundary +"--";
+ return body;
+ }
+ w.FakeFormData = FormData;
+})(window);
\ No newline at end of file
diff --git a/oaassist/WpsOAAssist/otherslib/lib/jquery.min.js b/oaassist/WpsOAAssist/otherslib/lib/jquery.min.js
new file mode 100644
index 0000000..f4c12ca
--- /dev/null
+++ b/oaassist/WpsOAAssist/otherslib/lib/jquery.min.js
@@ -0,0 +1,6 @@
+/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
+//@ sourceMappingURL=jquery-1.10.2.min.map
+*/
+(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="
",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML=" ",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML=" ","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML=" ",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML=" a ",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t
+}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""," "],legend:[1,""," "],area:[1,""," "],param:[1,""," "],thead:[1,""],tr:[2,""],col:[2,""],td:[3,""],_default:x.support.htmlSerialize?[0,"",""]:[1,"X","
"]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle);
+u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write(""),t.close(),n=un(e,t),Pt.detach()),Gt[e]=n),n}function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,n){x.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(x.css(e,"display"))?x.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x.support.opacity||(x.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=x.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===x.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,n){return n?x.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,n){x.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?x(e).position()[n]+"px":r):t}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!x.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||x.css(e,"display"))},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(x.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Ct.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),x.param=function(e,n){var r,i=[],o=function(e,t){t=x.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}x.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var mn,yn,vn=x.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Cn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Nn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=x.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=o.href}catch(Ln){yn=a.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(T)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(l){var u;return o[l]=!0,x.each(e[l]||[],function(e,l){var c=l(n,r,i);return"string"!=typeof c||a||o[c]?a?!(u=c):t:(n.dataTypes.unshift(c),s(c),!1)}),u}return s(n.dataTypes[0])||!o["*"]&&s("*")}function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,l=e.indexOf(" ");return l>=0&&(i=e.slice(l,e.length),e=e.slice(0,l)),x.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&x.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?x("").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks("once memory"),m=p.statusCode||{},y={},v={},b=0,w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||"*").toLowerCase().match(T)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(mn[3]||("http:"===mn[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&C.setRequestHeader("If-None-Match",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w="abort";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger("ajaxSend",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort("timeout")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||"",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader("Last-Modified"),T&&(x.lastModified[o]=T),T=C.getResponseHeader("etag"),T&&(x.etag[o]=T)),204===e||"HEAD"===p.type?N="nocontent":304===e?N="notmodified":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+"",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger("ajaxComplete",[C,p]),--x.active||x.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,n){return x.get(e,t,n,"script")}}),x.each(["get","post"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+" "+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(p){return{state:"parsererror",error:a?p:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),x.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=a.head||x("head")[0]||a.documentElement;return{send:function(t,i){n=a.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Fn.pop()||x.expando+"_"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return l||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||x.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&"withCredentials"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),"string"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+w+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),a=(x.cssNumber[e]||"px"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,"fxshow");n.queue||(s=x._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(x.support.inlineBlockNeedsLayout&&"inline"!==ln(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?"hidden"in d&&(f=d.hidden):d=x._data(e,"fxshow",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);(i||x._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=x._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,"position");"static"===r&&(e.style.position="relative");var i=x(e),o=i.offset(),a=x.css(e,"top"),s=x.css(e,"left"),l=("absolute"===r||"fixed"===r)&&x.inArray("auto",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),"using"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===x.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(n=e.offset()),n.top+=x.css(e[0],"borderTopWidth",!0),n.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-x.css(r,"marginTop",!0),left:t.left-n.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:"height",Width:"width"},function(e,n){x.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}))})(window);
diff --git a/oaassist/WpsOAAssist/otherslib/lib/qrcode.min.js b/oaassist/WpsOAAssist/otherslib/lib/qrcode.min.js
new file mode 100644
index 0000000..993e88f
--- /dev/null
+++ b/oaassist/WpsOAAssist/otherslib/lib/qrcode.min.js
@@ -0,0 +1 @@
+var QRCode;!function(){function a(a){this.mode=c.MODE_8BIT_BYTE,this.data=a,this.parsedData=[];for(var b=[],d=0,e=this.data.length;e>d;d++){var f=this.data.charCodeAt(d);f>65536?(b[0]=240|(1835008&f)>>>18,b[1]=128|(258048&f)>>>12,b[2]=128|(4032&f)>>>6,b[3]=128|63&f):f>2048?(b[0]=224|(61440&f)>>>12,b[1]=128|(4032&f)>>>6,b[2]=128|63&f):f>128?(b[0]=192|(1984&f)>>>6,b[1]=128|63&f):b[0]=f,this.parsedData=this.parsedData.concat(b)}this.parsedData.length!=this.data.length&&(this.parsedData.unshift(191),this.parsedData.unshift(187),this.parsedData.unshift(239))}function b(a,b){this.typeNumber=a,this.errorCorrectLevel=b,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function i(a,b){if(void 0==a.length)throw new Error(a.length+"/"+b);for(var c=0;c
=f;f++){var h=0;switch(b){case d.L:h=l[f][0];break;case d.M:h=l[f][1];break;case d.Q:h=l[f][2];break;case d.H:h=l[f][3]}if(h>=e)break;c++}if(c>l.length)throw new Error("Too long data");return c}function s(a){var b=encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return b.length+(b.length!=a?3:0)}a.prototype={getLength:function(){return this.parsedData.length},write:function(a){for(var b=0,c=this.parsedData.length;c>b;b++)a.put(this.parsedData[b],8)}},b.prototype={addData:function(b){var c=new a(b);this.dataList.push(c),this.dataCache=null},isDark:function(a,b){if(0>a||this.moduleCount<=a||0>b||this.moduleCount<=b)throw new Error(a+","+b);return this.modules[a][b]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var d=0;d=7&&this.setupTypeNumber(a),null==this.dataCache&&(this.dataCache=b.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,b){for(var c=-1;7>=c;c++)if(!(-1>=a+c||this.moduleCount<=a+c))for(var d=-1;7>=d;d++)-1>=b+d||this.moduleCount<=b+d||(this.modules[a+c][b+d]=c>=0&&6>=c&&(0==d||6==d)||d>=0&&6>=d&&(0==c||6==c)||c>=2&&4>=c&&d>=2&&4>=d?!0:!1)},getBestMaskPattern:function(){for(var a=0,b=0,c=0;8>c;c++){this.makeImpl(!0,c);var d=f.getLostPoint(this);(0==c||a>d)&&(a=d,b=c)}return b},createMovieClip:function(a,b,c){var d=a.createEmptyMovieClip(b,c),e=1;this.make();for(var f=0;f=g;g++)for(var h=-2;2>=h;h++)this.modules[d+g][e+h]=-2==g||2==g||-2==h||2==h||0==g&&0==h?!0:!1}},setupTypeNumber:function(a){for(var b=f.getBCHTypeNumber(this.typeNumber),c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[Math.floor(c/3)][c%3+this.moduleCount-8-3]=d}for(var c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[c%3+this.moduleCount-8-3][Math.floor(c/3)]=d}},setupTypeInfo:function(a,b){for(var c=this.errorCorrectLevel<<3|b,d=f.getBCHTypeInfo(c),e=0;15>e;e++){var g=!a&&1==(1&d>>e);6>e?this.modules[e][8]=g:8>e?this.modules[e+1][8]=g:this.modules[this.moduleCount-15+e][8]=g}for(var e=0;15>e;e++){var g=!a&&1==(1&d>>e);8>e?this.modules[8][this.moduleCount-e-1]=g:9>e?this.modules[8][15-e-1+1]=g:this.modules[8][15-e-1]=g}this.modules[this.moduleCount-8][8]=!a},mapData:function(a,b){for(var c=-1,d=this.moduleCount-1,e=7,g=0,h=this.moduleCount-1;h>0;h-=2)for(6==h&&h--;;){for(var i=0;2>i;i++)if(null==this.modules[d][h-i]){var j=!1;g>>e));var k=f.getMask(b,d,h-i);k&&(j=!j),this.modules[d][h-i]=j,e--,-1==e&&(g++,e=7)}if(d+=c,0>d||this.moduleCount<=d){d-=c,c=-c;break}}}},b.PAD0=236,b.PAD1=17,b.createData=function(a,c,d){for(var e=j.getRSBlocks(a,c),g=new k,h=0;h8*l)throw new Error("code length overflow. ("+g.getLengthInBits()+">"+8*l+")");for(g.getLengthInBits()+4<=8*l&&g.put(0,4);0!=g.getLengthInBits()%8;)g.putBit(!1);for(;;){if(g.getLengthInBits()>=8*l)break;if(g.put(b.PAD0,8),g.getLengthInBits()>=8*l)break;g.put(b.PAD1,8)}return b.createBytes(g,e)},b.createBytes=function(a,b){for(var c=0,d=0,e=0,g=new Array(b.length),h=new Array(b.length),j=0;j=0?p.get(q):0}}for(var r=0,m=0;mm;m++)for(var j=0;jm;m++)for(var j=0;j=0;)b^=f.G15<=0;)b^=f.G18<>>=1;return b},getPatternPosition:function(a){return f.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,b,c){switch(a){case e.PATTERN000:return 0==(b+c)%2;case e.PATTERN001:return 0==b%2;case e.PATTERN010:return 0==c%3;case e.PATTERN011:return 0==(b+c)%3;case e.PATTERN100:return 0==(Math.floor(b/2)+Math.floor(c/3))%2;case e.PATTERN101:return 0==b*c%2+b*c%3;case e.PATTERN110:return 0==(b*c%2+b*c%3)%2;case e.PATTERN111:return 0==(b*c%3+(b+c)%2)%2;default:throw new Error("bad maskPattern:"+a)}},getErrorCorrectPolynomial:function(a){for(var b=new i([1],0),c=0;a>c;c++)b=b.multiply(new i([1,g.gexp(c)],0));return b},getLengthInBits:function(a,b){if(b>=1&&10>b)switch(a){case c.MODE_NUMBER:return 10;case c.MODE_ALPHA_NUM:return 9;case c.MODE_8BIT_BYTE:return 8;case c.MODE_KANJI:return 8;default:throw new Error("mode:"+a)}else if(27>b)switch(a){case c.MODE_NUMBER:return 12;case c.MODE_ALPHA_NUM:return 11;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 10;default:throw new Error("mode:"+a)}else{if(!(41>b))throw new Error("type:"+b);switch(a){case c.MODE_NUMBER:return 14;case c.MODE_ALPHA_NUM:return 13;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 12;default:throw new Error("mode:"+a)}}},getLostPoint:function(a){for(var b=a.getModuleCount(),c=0,d=0;b>d;d++)for(var e=0;b>e;e++){for(var f=0,g=a.isDark(d,e),h=-1;1>=h;h++)if(!(0>d+h||d+h>=b))for(var i=-1;1>=i;i++)0>e+i||e+i>=b||(0!=h||0!=i)&&g==a.isDark(d+h,e+i)&&f++;f>5&&(c+=3+f-5)}for(var d=0;b-1>d;d++)for(var e=0;b-1>e;e++){var j=0;a.isDark(d,e)&&j++,a.isDark(d+1,e)&&j++,a.isDark(d,e+1)&&j++,a.isDark(d+1,e+1)&&j++,(0==j||4==j)&&(c+=3)}for(var d=0;b>d;d++)for(var e=0;b-6>e;e++)a.isDark(d,e)&&!a.isDark(d,e+1)&&a.isDark(d,e+2)&&a.isDark(d,e+3)&&a.isDark(d,e+4)&&!a.isDark(d,e+5)&&a.isDark(d,e+6)&&(c+=40);for(var e=0;b>e;e++)for(var d=0;b-6>d;d++)a.isDark(d,e)&&!a.isDark(d+1,e)&&a.isDark(d+2,e)&&a.isDark(d+3,e)&&a.isDark(d+4,e)&&!a.isDark(d+5,e)&&a.isDark(d+6,e)&&(c+=40);for(var k=0,e=0;b>e;e++)for(var d=0;b>d;d++)a.isDark(d,e)&&k++;var l=Math.abs(100*k/b/b-50)/5;return c+=10*l}},g={glog:function(a){if(1>a)throw new Error("glog("+a+")");return g.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;a>=256;)a-=255;return g.EXP_TABLE[a]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},h=0;8>h;h++)g.EXP_TABLE[h]=1<h;h++)g.EXP_TABLE[h]=g.EXP_TABLE[h-4]^g.EXP_TABLE[h-5]^g.EXP_TABLE[h-6]^g.EXP_TABLE[h-8];for(var h=0;255>h;h++)g.LOG_TABLE[g.EXP_TABLE[h]]=h;i.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var b=new Array(this.getLength()+a.getLength()-1),c=0;cf;f++)for(var g=c[3*f+0],h=c[3*f+1],i=c[3*f+2],k=0;g>k;k++)e.push(new j(h,i));return e},j.getRsBlockTable=function(a,b){switch(b){case d.L:return j.RS_BLOCK_TABLE[4*(a-1)+0];case d.M:return j.RS_BLOCK_TABLE[4*(a-1)+1];case d.Q:return j.RS_BLOCK_TABLE[4*(a-1)+2];case d.H:return j.RS_BLOCK_TABLE[4*(a-1)+3];default:return void 0}},k.prototype={get:function(a){var b=Math.floor(a/8);return 1==(1&this.buffer[b]>>>7-a%8)},put:function(a,b){for(var c=0;b>c;c++)this.putBit(1==(1&a>>>b-c-1))},getLengthInBits:function(){return this.length},putBit:function(a){var b=Math.floor(this.length/8);this.buffer.length<=b&&this.buffer.push(0),a&&(this.buffer[b]|=128>>>this.length%8),this.length++}};var l=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],o=function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){function g(a,b){var c=document.createElementNS("http://www.w3.org/2000/svg",a);for(var d in b)b.hasOwnProperty(d)&&c.setAttribute(d,b[d]);return c}var b=this._htOption,c=this._el,d=a.getModuleCount();Math.floor(b.width/d),Math.floor(b.height/d),this.clear();var h=g("svg",{viewBox:"0 0 "+String(d)+" "+String(d),width:"100%",height:"100%",fill:b.colorLight});h.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),c.appendChild(h),h.appendChild(g("rect",{fill:b.colorDark,width:"1",height:"1",id:"template"}));for(var i=0;d>i;i++)for(var j=0;d>j;j++)if(a.isDark(i,j)){var k=g("use",{x:String(i),y:String(j)});k.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),h.appendChild(k)}},a.prototype.clear=function(){for(;this._el.hasChildNodes();)this._el.removeChild(this._el.lastChild)},a}(),p="svg"===document.documentElement.tagName.toLowerCase(),q=p?o:m()?function(){function a(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}function d(a,b){var c=this;if(c._fFail=b,c._fSuccess=a,null===c._bSupportDataURI){var d=document.createElement("img"),e=function(){c._bSupportDataURI=!1,c._fFail&&_fFail.call(c)},f=function(){c._bSupportDataURI=!0,c._fSuccess&&c._fSuccess.call(c)};return d.onabort=e,d.onerror=e,d.onload=f,d.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",void 0}c._bSupportDataURI===!0&&c._fSuccess?c._fSuccess.call(c):c._bSupportDataURI===!1&&c._fFail&&c._fFail.call(c)}if(this._android&&this._android<=2.1){var b=1/window.devicePixelRatio,c=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(a,d,e,f,g,h,i,j){if("nodeName"in a&&/img/i.test(a.nodeName))for(var l=arguments.length-1;l>=1;l--)arguments[l]=arguments[l]*b;else"undefined"==typeof j&&(arguments[1]*=b,arguments[2]*=b,arguments[3]*=b,arguments[4]*=b);c.apply(this,arguments)}}var e=function(a,b){this._bIsPainted=!1,this._android=n(),this._htOption=b,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=b.width,this._elCanvas.height=b.height,a.appendChild(this._elCanvas),this._el=a,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return e.prototype.draw=function(a){var b=this._elImage,c=this._oContext,d=this._htOption,e=a.getModuleCount(),f=d.width/e,g=d.height/e,h=Math.round(f),i=Math.round(g);b.style.display="none",this.clear();for(var j=0;e>j;j++)for(var k=0;e>k;k++){var l=a.isDark(j,k),m=k*f,n=j*g;c.strokeStyle=l?d.colorDark:d.colorLight,c.lineWidth=1,c.fillStyle=l?d.colorDark:d.colorLight,c.fillRect(m,n,f,g),c.strokeRect(Math.floor(m)+.5,Math.floor(n)+.5,h,i),c.strokeRect(Math.ceil(m)-.5,Math.ceil(n)-.5,h,i)}this._bIsPainted=!0},e.prototype.makeImage=function(){this._bIsPainted&&d.call(this,a)},e.prototype.isPainted=function(){return this._bIsPainted},e.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},e.prototype.round=function(a){return a?Math.floor(1e3*a)/1e3:a},e}():function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){for(var b=this._htOption,c=this._el,d=a.getModuleCount(),e=Math.floor(b.width/d),f=Math.floor(b.height/d),g=[''],h=0;d>h;h++){g.push("");for(var i=0;d>i;i++)g.push(' ');g.push(" ")}g.push("
"),c.innerHTML=g.join("");var j=c.childNodes[0],k=(b.width-j.offsetWidth)/2,l=(b.height-j.offsetHeight)/2;k>0&&l>0&&(j.style.margin=l+"px "+k+"px")},a.prototype.clear=function(){this._el.innerHTML=""},a}();QRCode=function(a,b){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:d.H},"string"==typeof b&&(b={text:b}),b)for(var c in b)this._htOption[c]=b[c];"string"==typeof a&&(a=document.getElementById(a)),this._android=n(),this._el=a,this._oQRCode=null,this._oDrawing=new q(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)},QRCode.prototype.makeCode=function(a){this._oQRCode=new b(r(a,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(a),this._oQRCode.make(),this._el.title=a,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=d}();
\ No newline at end of file
diff --git a/oaassist/WpsOAAssist/otherslib/lib/vue.min.js b/oaassist/WpsOAAssist/otherslib/lib/vue.min.js
new file mode 100644
index 0000000..83606fd
--- /dev/null
+++ b/oaassist/WpsOAAssist/otherslib/lib/vue.min.js
@@ -0,0 +1,6 @@
+/*!
+ * Vue.js v2.5.13
+ * (c) 2014-2017 Evan You
+ * Released under the MIT License.
+ */
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.Vue=e()}(this,function(){"use strict";function t(t){return void 0===t||null===t}function e(t){return void 0!==t&&null!==t}function n(t){return!0===t}function r(t){return"string"==typeof t||"number"==typeof t||"symbol"==typeof t||"boolean"==typeof t}function i(t){return null!==t&&"object"==typeof t}function o(t){return"[object Object]"===Nn.call(t)}function a(t){var e=parseFloat(String(t));return e>=0&&Math.floor(e)===e&&isFinite(t)}function s(t){return null==t?"":"object"==typeof t?JSON.stringify(t,null,2):String(t)}function c(t){var e=parseFloat(t);return isNaN(e)?t:e}function u(t,e){for(var n=Object.create(null),r=t.split(","),i=0;i-1)return t.splice(n,1)}}function f(t,e){return Mn.call(t,e)}function p(t){var e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}function d(t,e){function n(n){var r=arguments.length;return r?r>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n}function v(t,e){e=e||0;for(var n=t.length-e,r=new Array(n);n--;)r[n]=t[n+e];return r}function h(t,e){for(var n in e)t[n]=e[n];return t}function m(t){for(var e={},n=0;n0&&(tt((s=et(s,(o||"")+"_"+a))[0])&&tt(u)&&(l[c]=x(u.text+s[0].text),s.shift()),l.push.apply(l,s)):r(s)?tt(u)?l[c]=x(u.text+s):""!==s&&l.push(x(s)):tt(s)&&tt(u)?l[c]=x(u.text+s.text):(n(i._isVList)&&e(s.tag)&&t(s.key)&&e(o)&&(s.key="__vlist"+o+"_"+a+"__"),l.push(s)));return l}function nt(t,e){return(t.__esModule||fr&&"Module"===t[Symbol.toStringTag])&&(t=t.default),i(t)?e.extend(t):t}function rt(t){return t.isComment&&t.asyncFactory}function it(t){if(Array.isArray(t))for(var n=0;n=0||n.indexOf(t[i])<0)&&r.push(t[i]);return r}return t}}(n[o],r[o],i[o]));return e}(t);r&&h(t.extendOptions,r),(e=t.options=F(n,t.extendOptions)).name&&(e.components[e.name]=t)}}return e}function Rt(t){this._init(t)}function Ht(t){t.cid=0;var e=1;t.extend=function(t){t=t||{};var n=this,r=n.cid,i=t._Ctor||(t._Ctor={});if(i[r])return i[r];var o=t.name||n.options.name,a=function(t){this._init(t)};return a.prototype=Object.create(n.prototype),a.prototype.constructor=a,a.cid=e++,a.options=F(n.options,t),a.super=n,a.options.props&&function(t){var e=t.options.props;for(var n in e)mt(t.prototype,"_props",n)}(a),a.options.computed&&function(t){var e=t.options.computed;for(var n in e)gt(t.prototype,n,e[n])}(a),a.extend=n.extend,a.mixin=n.mixin,a.use=n.use,zn.forEach(function(t){a[t]=n[t]}),o&&(a.options.components[o]=a),a.superOptions=n.options,a.extendOptions=t,a.sealedOptions=h({},a.options),i[r]=a,a}}function Bt(t){return t&&(t.Ctor.options.name||t.tag)}function Ut(t,e){return Array.isArray(t)?t.indexOf(e)>-1:"string"==typeof t?t.split(",").indexOf(e)>-1:!!function(t){return"[object RegExp]"===Nn.call(t)}(t)&&t.test(e)}function Vt(t,e){var n=t.cache,r=t.keys,i=t._vnode;for(var o in n){var a=n[o];if(a){var s=Bt(a.componentOptions);s&&!e(s)&&zt(n,o,r,i)}}}function zt(t,e,n,r){var i=t[e];!i||r&&i.tag===r.tag||i.componentInstance.$destroy(),t[e]=null,l(n,e)}function Kt(t){for(var n=t.data,r=t,i=t;e(i.componentInstance);)(i=i.componentInstance._vnode)&&i.data&&(n=Jt(i.data,n));for(;e(r=r.parent);)r&&r.data&&(n=Jt(n,r.data));return function(t,n){if(e(t)||e(n))return qt(t,Wt(n));return""}(n.staticClass,n.class)}function Jt(t,n){return{staticClass:qt(t.staticClass,n.staticClass),class:e(t.class)?[t.class,n.class]:n.class}}function qt(t,e){return t?e?t+" "+e:t:e||""}function Wt(t){return Array.isArray(t)?function(t){for(var n,r="",i=0,o=t.length;i=0&&" "===(m=t.charAt(h));h--);m&&Ii.test(m)||(l=!0)}}else void 0===o?(v=i+1,o=t.slice(0,i).trim()):e();if(void 0===o?o=t.slice(0,i).trim():0!==v&&e(),a)for(i=0;i-1?{exp:t.slice(0,ii),key:'"'+t.slice(ii+1)+'"'}:{exp:t,key:null};ni=t,ii=oi=ai=0;for(;!_e();)be(ri=ge())?$e(ri):91===ri&&function(t){var e=1;oi=ii;for(;!_e();)if(t=ge(),be(t))$e(t);else if(91===t&&e++,93===t&&e--,0===e){ai=ii;break}}(ri);return{exp:t.slice(0,oi),key:t.slice(oi+1,ai)}}(t);return null===n.key?t+"="+e:"$set("+n.exp+", "+n.key+", "+e+")"}function ge(){return ni.charCodeAt(++ii)}function _e(){return ii>=ei}function be(t){return 34===t||39===t}function $e(t){for(var e=t;!_e()&&(t=ge())!==e;);}function Ce(t,e,n,r,i){e=function(t){return t._withTask||(t._withTask=function(){Er=!0;var e=t.apply(null,arguments);return Er=!1,e})}(e),n&&(e=function(t,e,n){var r=si;return function i(){null!==t.apply(null,arguments)&&we(e,i,n,r)}}(e,t,r)),si.addEventListener(t,e,or?{capture:r,passive:i}:r)}function we(t,e,n,r){(r||si).removeEventListener(t,e._withTask||e,n)}function xe(n,r){if(!t(n.data.on)||!t(r.data.on)){var i=r.data.on||{},o=n.data.on||{};si=r.elm,function(t){if(e(t[Li])){var n=Qn?"change":"input";t[n]=[].concat(t[Li],t[n]||[]),delete t[Li]}e(t[Mi])&&(t.change=[].concat(t[Mi],t.change||[]),delete t[Mi])}(i),X(i,o,Ce,we,r.context),si=void 0}}function ke(n,r){if(!t(n.data.domProps)||!t(r.data.domProps)){var i,o,a=r.elm,s=n.data.domProps||{},u=r.data.domProps||{};e(u.__ob__)&&(u=r.data.domProps=h({},u));for(i in s)t(u[i])&&(a[i]="");for(i in u){if(o=u[i],"textContent"===i||"innerHTML"===i){if(r.children&&(r.children.length=0),o===s[i])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===i){a._value=o;var l=t(o)?"":String(o);(function(t,n){return!t.composing&&("OPTION"===t.tagName||function(t,e){var n=!0;try{n=document.activeElement!==t}catch(t){}return n&&t.value!==e}(t,n)||function(t,n){var r=t.value,i=t._vModifiers;if(e(i)){if(i.lazy)return!1;if(i.number)return c(r)!==c(n);if(i.trim)return r.trim()!==n.trim()}return r!==n}(t,n))})(a,l)&&(a.value=l)}else a[i]=o}}}function Ae(t){var e=Oe(t.style);return t.staticStyle?h(t.staticStyle,e):e}function Oe(t){return Array.isArray(t)?m(t):"string"==typeof t?Fi(t):t}function Se(n,r){var i=r.data,o=n.data;if(!(t(i.staticStyle)&&t(i.style)&&t(o.staticStyle)&&t(o.style))){var a,s,c=r.elm,u=o.staticStyle,l=o.normalizedStyle||o.style||{},f=u||l,p=Oe(r.data.style)||{};r.data.normalizedStyle=e(p.__ob__)?h({},p):p;var d=function(t,e){var n,r={};if(e)for(var i=t;i.componentInstance;)(i=i.componentInstance._vnode)&&i.data&&(n=Ae(i.data))&&h(r,n);(n=Ae(t.data))&&h(r,n);for(var o=t;o=o.parent;)o.data&&(n=Ae(o.data))&&h(r,n);return r}(r,!0);for(s in f)t(d[s])&&Bi(c,s,"");for(s in d)(a=d[s])!==f[s]&&Bi(c,s,null==a?"":a)}}function Te(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(/\s+/).forEach(function(e){return t.classList.add(e)}):t.classList.add(e);else{var n=" "+(t.getAttribute("class")||"")+" ";n.indexOf(" "+e+" ")<0&&t.setAttribute("class",(n+e).trim())}}function Ee(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(/\s+/).forEach(function(e){return t.classList.remove(e)}):t.classList.remove(e),t.classList.length||t.removeAttribute("class");else{for(var n=" "+(t.getAttribute("class")||"")+" ",r=" "+e+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?t.setAttribute("class",n):t.removeAttribute("class")}}function je(t){if(t){if("object"==typeof t){var e={};return!1!==t.css&&h(e,Ki(t.name||"v")),h(e,t),e}return"string"==typeof t?Ki(t):void 0}}function Ne(t){Qi(function(){Qi(t)})}function Ie(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n.indexOf(e)<0&&(n.push(e),Te(t,e))}function Le(t,e){t._transitionClasses&&l(t._transitionClasses,e),Ee(t,e)}function Me(t,e,n){var r=De(t,e),i=r.type,o=r.timeout,a=r.propCount;if(!i)return n();var s=i===qi?Zi:Yi,c=0,u=function(){t.removeEventListener(s,l),n()},l=function(e){e.target===t&&++c>=a&&u()};setTimeout(function(){c0&&(n=qi,l=a,f=o.length):e===Wi?u>0&&(n=Wi,l=u,f=c.length):f=(n=(l=Math.max(a,u))>0?a>u?qi:Wi:null)?n===qi?o.length:c.length:0;return{type:n,timeout:l,propCount:f,hasTransform:n===qi&&to.test(r[Gi+"Property"])}}function Pe(t,e){for(;t.length1}function Ve(t,e){!0!==e.data.show&&Re(e)}function ze(t,e,n){Ke(t,e,n),(Qn||er)&&setTimeout(function(){Ke(t,e,n)},0)}function Ke(t,e,n){var r=e.value,i=t.multiple;if(!i||Array.isArray(r)){for(var o,a,s=0,c=t.options.length;s-1,a.selected!==o&&(a.selected=o);else if(g(qe(a),r))return void(t.selectedIndex!==s&&(t.selectedIndex=s));i||(t.selectedIndex=-1)}}function Je(t,e){return e.every(function(e){return!g(e,t)})}function qe(t){return"_value"in t?t._value:t.value}function We(t){t.target.composing=!0}function Ge(t){t.target.composing&&(t.target.composing=!1,Ze(t.target,"input"))}function Ze(t,e){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0),t.dispatchEvent(n)}function Xe(t){return!t.componentInstance||t.data&&t.data.transition?t:Xe(t.componentInstance._vnode)}function Ye(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abstract?Ye(it(e.children)):t}function Qe(t){var e={},n=t.$options;for(var r in n.propsData)e[r]=t[r];var i=n._parentListeners;for(var o in i)e[Pn(o)]=i[o];return e}function tn(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{props:e.componentOptions.propsData})}function en(t){t.elm._moveCb&&t.elm._moveCb(),t.elm._enterCb&&t.elm._enterCb()}function nn(t){t.data.newPos=t.elm.getBoundingClientRect()}function rn(t){var e=t.data.pos,n=t.data.newPos,r=e.left-n.left,i=e.top-n.top;if(r||i){t.data.moved=!0;var o=t.elm.style;o.transform=o.WebkitTransform="translate("+r+"px,"+i+"px)",o.transitionDuration="0s"}}function on(t,e){var n=e?zo:Vo;return t.replace(n,function(t){return Uo[t]})}function an(t,e,n){return{type:1,tag:t,attrsList:e,attrsMap:function(t){for(var e={},n=0,r=t.length;n=0&&a[i].lowerCasedTag!==s;i--);else i=0;if(i>=0){for(var c=a.length-1;c>=i;c--)e.end&&e.end(a[c].tag,n,r);a.length=i,o=i&&a[i-1].tag}else"br"===s?e.start&&e.start(t,[],!0,n,r):"p"===s&&(e.start&&e.start(t,[],!1,n,r),e.end&&e.end(t,n,r))}for(var i,o,a=[],s=e.expectHTML,c=e.isUnaryTag||Bn,u=e.canBeLeftOpenTag||Bn,l=0;t;){if(i=t,o&&Ho(o)){var f=0,p=o.toLowerCase(),d=Bo[p]||(Bo[p]=new RegExp("([\\s\\S]*?)("+p+"[^>]*>)","i")),v=t.replace(d,function(t,n,r){return f=r.length,Ho(p)||"noscript"===p||(n=n.replace(//g,"$1").replace(//g,"$1")),Jo(p,n)&&(n=n.slice(1)),e.chars&&e.chars(n),""});l+=t.length-v.length,t=v,r(p,l-f,l)}else{var h=t.indexOf("<");if(0===h){if(Ao.test(t)){var m=t.indexOf("--\x3e");if(m>=0){e.shouldKeepComment&&e.comment(t.substring(4,m)),n(m+3);continue}}if(Oo.test(t)){var y=t.indexOf("]>");if(y>=0){n(y+2);continue}}var g=t.match(ko);if(g){n(g[0].length);continue}var _=t.match(xo);if(_){var b=l;n(_[0].length),r(_[1],b,l);continue}var $=function(){var e=t.match(Co);if(e){var r={tagName:e[1],attrs:[],start:l};n(e[0].length);for(var i,o;!(i=t.match(wo))&&(o=t.match(_o));)n(o[0].length),r.attrs.push(o);if(i)return r.unarySlash=i[1],n(i[0].length),r.end=l,r}}();if($){!function(t){var n=t.tagName,i=t.unarySlash;s&&("p"===o&&go(n)&&r(o),u(n)&&o===n&&r(n));for(var l=c(n)||!!i,f=t.attrs.length,p=new Array(f),d=0;d=0){for(w=t.slice(h);!(xo.test(w)||Co.test(w)||Ao.test(w)||Oo.test(w)||(x=w.indexOf("<",1))<0);)h+=x,w=t.slice(h);C=t.substring(0,h),n(h)}h<0&&(C=t,t=""),e.chars&&C&&e.chars(C)}if(t===i){e.chars&&e.chars(t);break}}r()}(t,{warn:To,expectHTML:e.expectHTML,isUnaryTag:e.isUnaryTag,canBeLeftOpenTag:e.canBeLeftOpenTag,shouldDecodeNewlines:e.shouldDecodeNewlines,shouldDecodeNewlinesForHref:e.shouldDecodeNewlinesForHref,shouldKeepComment:e.comments,start:function(t,a,u){var l=i&&i.ns||Do(t);Qn&&"svg"===l&&(a=function(t){for(var e=[],n=0;nc&&(s.push(o=t.slice(c,i)),a.push(JSON.stringify(o)));var u=ae(r[1].trim());a.push("_s("+u+")"),s.push({"@binding":u}),c=i+r[0].length}return c ':'
',Ro.innerHTML.indexOf("
")>0}var jn=Object.freeze({}),Nn=Object.prototype.toString,In=u("slot,component",!0),Ln=u("key,ref,slot,slot-scope,is"),Mn=Object.prototype.hasOwnProperty,Dn=/-(\w)/g,Pn=p(function(t){return t.replace(Dn,function(t,e){return e?e.toUpperCase():""})}),Fn=p(function(t){return t.charAt(0).toUpperCase()+t.slice(1)}),Rn=/\B([A-Z])/g,Hn=p(function(t){return t.replace(Rn,"-$1").toLowerCase()}),Bn=function(t,e,n){return!1},Un=function(t){return t},Vn="data-server-rendered",zn=["component","directive","filter"],Kn=["beforeCreate","created","beforeMount","mounted","beforeUpdate","updated","beforeDestroy","destroyed","activated","deactivated","errorCaptured"],Jn={optionMergeStrategies:Object.create(null),silent:!1,productionTip:!1,devtools:!1,performance:!1,errorHandler:null,warnHandler:null,ignoredElements:[],keyCodes:Object.create(null),isReservedTag:Bn,isReservedAttr:Bn,isUnknownElement:Bn,getTagNamespace:y,parsePlatformTagName:Un,mustUseProp:Bn,_lifecycleHooks:Kn},qn=/[^\w.$]/,Wn="__proto__"in{},Gn="undefined"!=typeof window,Zn="undefined"!=typeof WXEnvironment&&!!WXEnvironment.platform,Xn=Zn&&WXEnvironment.platform.toLowerCase(),Yn=Gn&&window.navigator.userAgent.toLowerCase(),Qn=Yn&&/msie|trident/.test(Yn),tr=Yn&&Yn.indexOf("msie 9.0")>0,er=Yn&&Yn.indexOf("edge/")>0,nr=Yn&&Yn.indexOf("android")>0||"android"===Xn,rr=Yn&&/iphone|ipad|ipod|ios/.test(Yn)||"ios"===Xn,ir=(Yn&&/chrome\/\d+/.test(Yn),{}.watch),or=!1;if(Gn)try{var ar={};Object.defineProperty(ar,"passive",{get:function(){or=!0}}),window.addEventListener("test-passive",null,ar)}catch(t){}var sr,cr,ur=function(){return void 0===sr&&(sr=!Gn&&"undefined"!=typeof global&&"server"===global.process.env.VUE_ENV),sr},lr=Gn&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__,fr="undefined"!=typeof Symbol&&w(Symbol)&&"undefined"!=typeof Reflect&&w(Reflect.ownKeys);cr="undefined"!=typeof Set&&w(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var pr=y,dr=0,vr=function(){this.id=dr++,this.subs=[]};vr.prototype.addSub=function(t){this.subs.push(t)},vr.prototype.removeSub=function(t){l(this.subs,t)},vr.prototype.depend=function(){vr.target&&vr.target.addDep(this)},vr.prototype.notify=function(){for(var t=this.subs.slice(),e=0,n=t.length;eVr&&Fr[n].id>t.id;)n--;Fr.splice(n+1,0,t)}else Fr.push(t);Br||(Br=!0,q(ht))}}(this)},Kr.prototype.run=function(){if(this.active){var t=this.get();if(t!==this.value||i(t)||this.deep){var e=this.value;if(this.value=t,this.user)try{this.cb.call(this.vm,t,e)}catch(t){V(t,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,t,e)}}},Kr.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},Kr.prototype.depend=function(){for(var t=this.deps.length;t--;)this.deps[t].depend()},Kr.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||l(this.vm._watchers,this);for(var t=this.deps.length;t--;)this.deps[t].removeSub(this);this.active=!1}};var Jr={enumerable:!0,configurable:!0,get:y,set:y},qr={lazy:!0};Nt(It.prototype);var Wr={init:function(t,n,r,i){if(!t.componentInstance||t.componentInstance._isDestroyed){(t.componentInstance=function(t,n,r,i){var o={_isComponent:!0,parent:n,_parentVnode:t,_parentElm:r||null,_refElm:i||null},a=t.data.inlineTemplate;return e(a)&&(o.render=a.render,o.staticRenderFns=a.staticRenderFns),new t.componentOptions.Ctor(o)}(t,Pr,r,i)).$mount(n?t.elm:void 0,n)}else if(t.data.keepAlive){var o=t;Wr.prepatch(o,o)}},prepatch:function(t,e){var n=e.componentOptions;!function(t,e,n,r,i){var o=!!(i||t.$options._renderChildren||r.data.scopedSlots||t.$scopedSlots!==jn);if(t.$options._parentVnode=r,t.$vnode=r,t._vnode&&(t._vnode.parent=r),t.$options._renderChildren=i,t.$attrs=r.data&&r.data.attrs||jn,t.$listeners=n||jn,e&&t.$options.props){Cr.shouldConvert=!1;for(var a=t._props,s=t.$options._propKeys||[],c=0;c1?v(n):n;for(var r=v(arguments,1),i=0,o=n.length;iparseInt(this.max)&&zt(a,s[0],s,this._vnode)),e.data.keepAlive=!0}return e||t&&t[0]}}};!function(t){var e={};e.get=function(){return Jn},Object.defineProperty(t,"config",e),t.util={warn:pr,extend:h,mergeOptions:F,defineReactive:E},t.set=j,t.delete=N,t.nextTick=q,t.options=Object.create(null),zn.forEach(function(e){t.options[e+"s"]=Object.create(null)}),t.options._base=t,h(t.options.components,ti),function(t){t.use=function(t){var e=this._installedPlugins||(this._installedPlugins=[]);if(e.indexOf(t)>-1)return this;var n=v(arguments,1);return n.unshift(this),"function"==typeof t.install?t.install.apply(t,n):"function"==typeof t&&t.apply(null,n),e.push(t),this}}(t),function(t){t.mixin=function(t){return this.options=F(this.options,t),this}}(t),Ht(t),function(t){zn.forEach(function(e){t[e]=function(t,n){return n?("component"===e&&o(n)&&(n.name=n.name||t,n=this.options._base.extend(n)),"directive"===e&&"function"==typeof n&&(n={bind:n,update:n}),this.options[e+"s"][t]=n,n):this.options[e+"s"][t]}})}(t)}(Rt),Object.defineProperty(Rt.prototype,"$isServer",{get:ur}),Object.defineProperty(Rt.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Rt.version="2.5.13";var ei,ni,ri,ii,oi,ai,si,ci,ui=u("style,class"),li=u("input,textarea,option,select,progress"),fi=function(t,e,n){return"value"===n&&li(t)&&"button"!==e||"selected"===n&&"option"===t||"checked"===n&&"input"===t||"muted"===n&&"video"===t},pi=u("contenteditable,draggable,spellcheck"),di=u("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,translate,truespeed,typemustmatch,visible"),vi="http://www.w3.org/1999/xlink",hi=function(t){return":"===t.charAt(5)&&"xlink"===t.slice(0,5)},mi=function(t){return hi(t)?t.slice(6,t.length):""},yi=function(t){return null==t||!1===t},gi={svg:"http://www.w3.org/2000/svg",math:"http://www.w3.org/1998/Math/MathML"},_i=u("html,body,base,head,link,meta,style,title,address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,menuitem,summary,content,element,shadow,template,blockquote,iframe,tfoot"),bi=u("svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view",!0),$i=function(t){return _i(t)||bi(t)},Ci=Object.create(null),wi=u("text,number,password,search,email,tel,url"),xi=Object.freeze({createElement:function(t,e){var n=document.createElement(t);return"select"!==t?n:(e.data&&e.data.attrs&&void 0!==e.data.attrs.multiple&&n.setAttribute("multiple","multiple"),n)},createElementNS:function(t,e){return document.createElementNS(gi[t],e)},createTextNode:function(t){return document.createTextNode(t)},createComment:function(t){return document.createComment(t)},insertBefore:function(t,e,n){t.insertBefore(e,n)},removeChild:function(t,e){t.removeChild(e)},appendChild:function(t,e){t.appendChild(e)},parentNode:function(t){return t.parentNode},nextSibling:function(t){return t.nextSibling},tagName:function(t){return t.tagName},setTextContent:function(t,e){t.textContent=e},setAttribute:function(t,e,n){t.setAttribute(e,n)}}),ki={create:function(t,e){Xt(e)},update:function(t,e){t.data.ref!==e.data.ref&&(Xt(t,!0),Xt(e))},destroy:function(t){Xt(t,!0)}},Ai=new mr("",{},[]),Oi=["create","activate","update","remove","destroy"],Si={create:te,update:te,destroy:function(t){te(t,Ai)}},Ti=Object.create(null),Ei=[ki,Si],ji={create:re,update:re},Ni={create:oe,update:oe},Ii=/[\w).+\-_$\]]/,Li="__r",Mi="__c",Di={create:xe,update:xe},Pi={create:ke,update:ke},Fi=p(function(t){var e={},n=/:(.+)/;return t.split(/;(?![^(]*\))/g).forEach(function(t){if(t){var r=t.split(n);r.length>1&&(e[r[0].trim()]=r[1].trim())}}),e}),Ri=/^--/,Hi=/\s*!important$/,Bi=function(t,e,n){if(Ri.test(e))t.style.setProperty(e,n);else if(Hi.test(n))t.style.setProperty(e,n.replace(Hi,""),"important");else{var r=Vi(e);if(Array.isArray(n))for(var i=0,o=n.length;id?v(n,t(i[g+1])?null:i[g+1].elm,i,p,g,o):p>g&&m(0,r,f,d)}function _(r,i,o,a){if(r!==i){var s=i.elm=r.elm;if(n(r.isAsyncPlaceholder))e(i.asyncFactory.resolved)?$(r.elm,i,o):i.isAsyncPlaceholder=!0;else if(n(i.isStatic)&&n(r.isStatic)&&i.key===r.key&&(n(i.isCloned)||n(i.isOnce)))i.componentInstance=r.componentInstance;else{var c,u=i.data;e(u)&&e(c=u.hook)&&e(c=c.prepatch)&&c(r,i);var l=r.children,p=i.children;if(e(u)&&f(i)){for(c=0;c-1?Ci[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:Ci[t]=/HTMLUnknownElement/.test(e.toString())},h(Rt.options.directives,ro),h(Rt.options.components,so),Rt.prototype.__patch__=Gn?eo:y,Rt.prototype.$mount=function(t,e){return t=t&&Gn?Zt(t):void 0,function(t,e,n){t.$el=e,t.$options.render||(t.$options.render=gr),vt(t,"beforeMount");var r;return r=function(){t._update(t._render(),n)},new Kr(t,r,y,null,!0),n=!1,null==t.$vnode&&(t._isMounted=!0,vt(t,"mounted")),t}(this,t,e)},Rt.nextTick(function(){Jn.devtools&&lr&&lr.emit("init",Rt)},0);var co,uo=/\{\{((?:.|\n)+?)\}\}/g,lo=/[-.*+?^${}()|[\]\/\\]/g,fo=p(function(t){var e=t[0].replace(lo,"\\$&"),n=t[1].replace(lo,"\\$&");return new RegExp(e+"((?:.|\\n)+?)"+n,"g")}),po={staticKeys:["staticClass"],transformNode:function(t,e){e.warn;var n=he(t,"class");n&&(t.staticClass=JSON.stringify(n));var r=ve(t,"class",!1);r&&(t.classBinding=r)},genData:function(t){var e="";return t.staticClass&&(e+="staticClass:"+t.staticClass+","),t.classBinding&&(e+="class:"+t.classBinding+","),e}},vo={staticKeys:["staticStyle"],transformNode:function(t,e){e.warn;var n=he(t,"style");n&&(t.staticStyle=JSON.stringify(Fi(n)));var r=ve(t,"style",!1);r&&(t.styleBinding=r)},genData:function(t){var e="";return t.staticStyle&&(e+="staticStyle:"+t.staticStyle+","),t.styleBinding&&(e+="style:("+t.styleBinding+"),"),e}},ho=function(t){return co=co||document.createElement("div"),co.innerHTML=t,co.textContent},mo=u("area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr"),yo=u("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source"),go=u("address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track"),_o=/^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,bo="[a-zA-Z_][\\w\\-\\.]*",$o="((?:"+bo+"\\:)?"+bo+")",Co=new RegExp("^<"+$o),wo=/^\s*(\/?)>/,xo=new RegExp("^<\\/"+$o+"[^>]*>"),ko=/^]+>/i,Ao=/^
+
+
+
+ 套红头
+
+
+
+
+
\ No newline at end of file
diff --git a/oaassist/WpsOAAssist/ribbon.xml b/oaassist/WpsOAAssist/ribbon.xml
new file mode 100644
index 0000000..82aeab7
--- /dev/null
+++ b/oaassist/WpsOAAssist/ribbon.xml
@@ -0,0 +1,148 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/oaassist/WpsOAAssist/selectBookmark.html b/oaassist/WpsOAAssist/selectBookmark.html
new file mode 100644
index 0000000..69b41e7
--- /dev/null
+++ b/oaassist/WpsOAAssist/selectBookmark.html
@@ -0,0 +1,195 @@
+
+
+
+
+ 自定义书签
+
+
+
+
+
+
+
+
+
+
+
+ 书签名称:
+
+ 请选择书签
+ {{item.bookmarkname}}
+
+
+
+
+
请先从上方的下拉列表中选择指定书签后,再进行添加或删除操作!
+
+
+
+ 添加
+
+
+ 删除
+
+
+ 取消
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/oaassist/WpsOAAssist/selectSeal.html b/oaassist/WpsOAAssist/selectSeal.html
new file mode 100644
index 0000000..f9ed5a5
--- /dev/null
+++ b/oaassist/WpsOAAssist/selectSeal.html
@@ -0,0 +1,205 @@
+
+
+
+
+
+ 印章页面
+
+
+
+
+
+
+
+
+
+ 印章名称:
+
+ 请选择印章
+ {{item.MarkName}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/oaassist/WpsOAAssist/setUserName.html b/oaassist/WpsOAAssist/setUserName.html
new file mode 100644
index 0000000..e4f661c
--- /dev/null
+++ b/oaassist/WpsOAAssist/setUserName.html
@@ -0,0 +1,34 @@
+
+
+
+
+ OA助手WPS用户名设置
+
+
+
+
+
+
+ 请在下面输入WPS Office的用户名称:
+
+
+
+
+
\ No newline at end of file
diff --git a/oaassist/WpsOAAssist/taskpane.html b/oaassist/WpsOAAssist/taskpane.html
new file mode 100644
index 0000000..d7fe891
--- /dev/null
+++ b/oaassist/WpsOAAssist/taskpane.html
@@ -0,0 +1,143 @@
+
+
+
+
+
+ 操作书签
+
+
+
+
+
+ 这是一个网页,按f12可以打开调试器
+ 书签列表如下:
+
+
+
+
+
选择的书签是:
+
+
替换的内容是:
+
+
+
+ 书签内容替换
+
+
+ 本地文件替换已选择书签
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/oaassist/WpsOAAssist/template/OA模板公章.png b/oaassist/WpsOAAssist/template/OA模板公章.png
new file mode 100644
index 0000000..8a9db82
Binary files /dev/null and b/oaassist/WpsOAAssist/template/OA模板公章.png differ
diff --git a/oaassist/WpsOAAssist/template/模板.docx b/oaassist/WpsOAAssist/template/模板.docx
new file mode 100644
index 0000000..1325dc2
Binary files /dev/null and b/oaassist/WpsOAAssist/template/模板.docx differ
diff --git a/oaassist/WpsOAAssist/template/红头文件.docx b/oaassist/WpsOAAssist/template/红头文件.docx
new file mode 100644
index 0000000..d3a44ae
Binary files /dev/null and b/oaassist/WpsOAAssist/template/红头文件.docx differ
diff --git a/oaassist/server/.gitignore b/oaassist/server/.gitignore
new file mode 100644
index 0000000..b51d008
--- /dev/null
+++ b/oaassist/server/.gitignore
@@ -0,0 +1,4 @@
+node_modules
+package-lock.json
+uploaded
+plugins
\ No newline at end of file
diff --git a/oaassist/server/StartupServer.js b/oaassist/server/StartupServer.js
new file mode 100644
index 0000000..dbe7812
--- /dev/null
+++ b/oaassist/server/StartupServer.js
@@ -0,0 +1,310 @@
+/**
+ * 这是为了便于Demo能在开发者的本地快速运行起来,采用Nodejs模拟服务端,开发者可根据此文件的注释,自行在业务系统中实现对应的功能
+ */
+const express = require('express');
+const fs = require('fs');
+const path = require('path');
+var urlencode = require('urlencode');
+const formidable = require('formidable')
+var ini = require('ini')
+var regedit = require('regedit')
+const os = require('os');
+const app = express()
+var cp = require('child_process');
+var mode=-1;
+const querystring=require("querystring")
+//----开发者将WPS加载项集成到业务系统中时,需要实现的功能 Start--------
+/**
+ * 支持jsplugins.xml中,在线模式下,WPS加载项的请求地址
+ * 开发者可在业务系统部署时,将WPS加载项合并部署到服务端,提供jsplugins.xml中对应的请求地址即可
+ */
+app.all('*', function (req, res, next) {
+ res.header('Access-Control-Allow-Origin', '*');
+ console.log(getNow()+req.originalUrl)
+ // res.setHeader('Content-Type','text/plain;charset=gbk');
+ //Access-Control-Allow-Headers ,可根据浏览器的F12查看,把对应的粘贴在这里就行
+ // res.header('Access-Control-Allow-Headers', 'Content-Type');
+ // res.header('Access-Control-Allow-Methods', '*');
+ // res.header('Content-Type', 'text/html;charset=utf-8');
+ next();
+});
+app.use(express.static(path.join(__dirname, "wwwroot"))); //wwwroot代表http服务器根目录
+app.use('/plugin/et', express.static(path.join(__dirname, "../EtOAAssist")));
+app.use('/plugin/wps', express.static(path.join(__dirname, "../WpsOAAssist")));
+app.use('/plugin/wpp', express.static(path.join(__dirname, "../WppOAAssist")));
+
+/**
+ * 文件下载
+ * 开发者可将此方法更换为自己业务系统的文件下载方法, 请求中必须的参数为: filename
+ * 如果业务系统有特殊的要求, 此方法可与各加载项中的 js / common / common.js: DownloadFile 方法对应着修改
+ */
+app.use("/Download/:fileName", function (request, response) {
+ var fileName = request.params.fileName;
+ var filePath = path.join(__dirname, './wwwroot/file');
+ filePath = path.join(filePath, fileName);
+ var stats = fs.statSync(filePath);
+ if (stats.isFile()) {
+ let name = urlencode(fileName, "utf-8");
+ response.set({
+ 'Content-Type': 'application/octet-stream',
+ //'Content-Disposition': "attachment; filename* = UTF-8''" + name,
+ 'Content-Disposition': "attachment; filename=" + name,
+ 'Content-Length': stats.size
+ });
+ fs.createReadStream(filePath).pipe(response);
+ console.log(getNow() + "下载文件接被调用,文件路径:" + filePath)
+ } else {
+ response.writeHead(200, "Failed", {
+ "Content-Type": "text/html; charset=utf-8"
+ });
+ response.end("文件不存在");
+ }
+});
+/**
+ * 文件上传
+ * 开发者可将此方法更换为自己业务系统的接受文件上传的方法
+ * 如果业务系统有特殊的要求, 此方法可与加载项中的 js / common / common.js: UploadFile 方法对应着修改
+ */
+app.post("/Upload", function (request, response) {
+ const form = new formidable.IncomingForm();
+ var uploadDir = path.join(__dirname, './wwwroot/uploaded/');
+ form.encoding = 'utf-8';
+ form.uploadDir = uploadDir;
+ console.log(getNow() + "上传文件夹地址是:" + uploadDir);
+ //判断上传文件夹地址是否存在,如果不存在就创建
+ if (!fs.existsSync(form.uploadDir)) {
+ fs.mkdirSync(form.uploadDir);
+ }
+ form.parse(request, function (error, fields, files) {
+ for (let key in files) {
+ let file = files[key]
+ // 过滤空文件
+ if (file.size == 0 && file.name == '') continue
+
+ var fileName = file.name
+ if (!fileName)
+ fileName = request.headers.filename
+ let oldPath = file.path
+ let newPath = uploadDir + fileName
+
+ fs.rename(oldPath, newPath, function (error) {
+ console.log(getNow() + "上传文件成功,路径:" + newPath)
+ })
+ }
+ response.writeHead(200, {
+ "Content-Type": "text/html;charset=utf-8"
+ })
+ response.end("测试");
+ })
+});
+
+/**
+ * 模拟填充到文件的服务端数据( 加载本地的模拟json数据并提供请求)
+ * 开发者可将此方法更换为自己业务系统的数据接口
+ * json数据格式及解析, 可与各加载项中的 js / common / func_docProcess.js: GetServerTemplateData 方法对应着修改
+ */
+app.get('/getTemplateData', function (request, response) {
+ var file = path.join(__dirname, './wwwroot/file/templateData.json');
+ //读取json文件
+ fs.readFile(file, 'utf-8', function (err, data) {
+ if (err) {
+ response.send('文件读取失败');
+ } else {
+ response.send(data);
+ }
+ });
+});
+//----开发者将WPS加载项集成到业务系统中时,需要实现的功能 End--------
+
+
+//获取file目录下文件列表
+app.use("/FileList", function (request, response) {
+ var filePath = path.join(__dirname, './wwwroot/file');
+ fs.readdir(filePath, function (err, results) {
+ if (err) {
+ response.writeHead(200, "OK", { "Content-Type": "text/html; charset=utf-8" });
+ response.end("没有找到file文件夹");
+ return;
+ }
+ if (results.length > 0) {
+ var files = [];
+ results.forEach(function (file) {
+ if (fs.statSync(path.join(filePath, file)).isFile()) {
+ files.push(file);
+ }
+ })
+ response.writeHead(200, "OK", { "Content-Type": "text/html; charset=utf-8" });
+ response.end(files.toString());
+ } else {
+ response.writeHead(200, "OK", { "Content-Type": "text/html; charset=utf-8" });
+ response.end("当前目录下没有文件");
+ }
+ });
+});
+
+//wps安装包是否正确的检测
+app.use("/WpsSetup", (request, response) => {
+ response.writeHead(200, "OK", { "Content-Type": "text/html; charset=utf-8" })
+ response.end("成功");
+});
+
+//wps加载项配置是否正确的检测
+app.use("/OAAssistDeploy", (request, response) => {
+ response.writeHead(200, "OK", { "Content-Type": "text/html; charset=utf-8" })
+ response.end("成功");
+});
+//检测WPS客户端环境
+app.use("/WpsSetupTest", function (request, response) {
+ configOem(request.query.pluginsMode,function (res) {
+ response.writeHead(200, res.status, {
+ "Content-Type": "text/html;charset=utf-8"
+ });
+ response.write(' ');
+ response.write(" 当前检测时间为: " + getNow() + " ");
+ response.end(res.msg);
+ });
+});
+//定义node服务端口
+var server = app.listen(3888, function () {
+ console.log(getNow() + "启动本地web服务(http://127.0.0.1:3888)成功!");
+ let url="http://127.0.0.1:3888/index.html";
+ let exec=cp.exec;
+ try{
+ switch (process.platform) {
+ //mac系统使用 一下命令打开url在浏览器
+ case "darwin":
+ exec(`open ${url}`);
+ break;
+ //win系统使用 一下命令打开url在浏览器
+ case "win32":
+ exec(`start ${url}`);
+ break;
+ //linux系统使用 一下命令打开url在浏览器
+ case "linux":
+ exec(`xdg-open ${url}`)
+ break;
+ // 默认linux系统
+ default:
+ exec(`xdg-open ${url}`)
+ break;
+ }
+ }catch(e){
+ }
+});
+//启动node服务
+server.on('error', (e) => {
+ if (e.code === 'EADDRINUSE') {
+ console.log('地址正被使用,重试中...');
+ setTimeout(() => {
+ server.close();
+ server.listen(3888);
+ }, 2000);
+ }
+});
+//获取当前时间
+function getNow() {
+ let nowDate = new Date()
+ let year = nowDate.getFullYear()
+ let month = nowDate.getMonth() + 1
+ let day = nowDate.getDate()
+ let hour = nowDate.getHours()
+ let minute = nowDate.getMinutes()
+ let second = nowDate.getSeconds()
+ return year + '年' + month + '月' + day + '日 ' + hour + ':' + minute + ':' + second + " "
+}
+//配置WPS客户端的WPS加载项的配置
+//此功能开发者无需实现和考虑,在生产环境中,WPS客户端的配置文件可通过
+//独立打包或开发者编写批处理命令实现修改,业务系统无法实现修改WPS客户端配置文件
+function configOemFileInner(oemPath,pluginsMode, callback) {
+ var config = ini.parse(fs.readFileSync(oemPath, 'utf-8'))
+ var sup = config.support || config.Support;
+ var ser = config.server || config.Server;
+ var needUpdate = false;
+ if (!sup || !sup.JsApiPlugin || !sup.JsApiShowWebDebugger)
+ needUpdate = true;
+ if (!ser || !ser.JSPluginsServer || ser.JSPluginsServer != "http://127.0.0.1:3888/jsplugins.xml")
+ needUpdate = true;
+ if (!sup) {
+ sup = {}
+ config.Support = sup
+ }
+ if (!ser) {
+ ser = {}
+ config.Server = ser
+ }
+ if(pluginsMode!=0){
+ sup.JsApiPlugin = false
+ sup.JsApiShowWebDebugger = true
+ ser.JSPluginsServer = ""
+ }else{
+ sup.JsApiPlugin = true
+ sup.JsApiShowWebDebugger = true
+ ser.JSPluginsServer = "http://127.0.0.1:3888/jsplugins.xml"
+ }
+
+ if (pluginsMode!=mode) {
+ fs.writeFileSync(oemPath, ini.stringify(config))
+ if (os.platform() != 'win32')
+ cp.exec("quickstartoffice restart");
+ }
+ callback({ status: 0, msg: "wps安装正常," + oemPath + "文件设置正常。" })
+}
+//检测WPS客户端的安装情况
+function configOem(pluginsMode,callback) {
+ let oemPath;
+ try {
+ if (os.platform() == 'win32') {
+ cp.exec("REG QUERY HKEY_CLASSES_ROOT\\KWPS.Document.12\\shell\\open\\command /ve", function (error, stdout, stderr) {
+ try {
+ var val = stdout.split(" ")[3].split('"')[1];
+ if (typeof (val) == "undefined" || val == null) {
+ return callback({
+ status: 1,
+ msg: "WPS未安装。"
+ })
+ }
+ fs.exists(val, function (exists) {
+ if(!exists){
+ return callback({
+ status: 1,
+ msg: "WSP安装异常,请确认有没有正确的安装WPS2019。"
+ })
+ }
+ oemPath = path.dirname(val) + '\\cfgs\\oem.ini';
+ configOemFileInner(oemPath,pluginsMode, callback);
+ });
+ } catch (e) {
+ oemResult = "配置" + oemPath + "失败,请尝试以管理员重新运行!!";
+ console.log(oemResult)
+ console.log(e)
+ return callback({ status: 1, msg: oemResult })
+ }
+ });
+ } else {
+ oemPath = "/opt/kingsoft/wps-office/office6/cfgs/oem.ini";
+ if (!fs.existsSync(oemPath))
+ oemPath = "/opt/apps/cn.wps.wps-office-pro/files/kingsoft/wps-office/office6/cfgs/oem.ini";
+ configOemFileInner(oemPath,pluginsMode, callback);
+ }
+ } catch (e) {
+ oemResult = "配置" + oemPath + "失败,请尝试以管理员重新运行!!";
+ console.log(oemResult)
+ console.log(e)
+ return callback({ status: 1, msg: oemResult })
+ }
+}
+//获取服务端IP地址
+function getServerIPAdress() {
+ var interfaces = require('os').networkInterfaces();
+ for (var devName in interfaces) {
+ var iface = interfaces[devName];
+ for (var i = 0; i < iface.length; i++) {
+ var alias = iface[i];
+ if (alias.family === 'IPv4' && alias.address !== '127.0.0.1' && !alias.internal) {
+ return alias.address;
+ }
+ }
+ }
+}
+
+//----模拟服务端的特有功能,开发者无需关心 End--------
\ No newline at end of file
diff --git a/oaassist/server/package.json b/oaassist/server/package.json
new file mode 100644
index 0000000..3c37c8c
--- /dev/null
+++ b/oaassist/server/package.json
@@ -0,0 +1,23 @@
+{
+ "name": "oaassist_demo",
+ "version": "1.0.0",
+ "description": "server",
+ "main": "StartupServer.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "keywords": [
+ "oaassist",
+ "server",
+ "demo"
+ ],
+ "author": "aizelin",
+ "license": "ISC",
+ "dependencies": {
+ "express": "^4.17.1",
+ "formidable": "^1.2.1",
+ "ini": "^1.3.5",
+ "regedit": "^3.0.3",
+ "urlencode": "^1.1.0"
+ }
+}
diff --git a/oaassist/server/wwwroot/.gitignore b/oaassist/server/wwwroot/.gitignore
new file mode 100644
index 0000000..ba4c15b
--- /dev/null
+++ b/oaassist/server/wwwroot/.gitignore
@@ -0,0 +1,2 @@
+uploaded
+plugins
\ No newline at end of file
diff --git a/oaassist/server/wwwroot/LICENSE b/oaassist/server/wwwroot/LICENSE
new file mode 100644
index 0000000..3417144
--- /dev/null
+++ b/oaassist/server/wwwroot/LICENSE
@@ -0,0 +1,25 @@
+
+Copyright @ 2012-2019, Kingsoft office,All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+3. Neither the name of the copyright holder nor the names of its
+contributors may be used to endorse or promote products derived from this
+software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/oaassist/server/wwwroot/README.md b/oaassist/server/wwwroot/README.md
new file mode 100644
index 0000000..20a76f1
--- /dev/null
+++ b/oaassist/server/wwwroot/README.md
@@ -0,0 +1,17 @@
+## Welcome to OAAssist WebDemo
+
+### 这个项目是什么?
+
+这个工程为OA助手演示web端页面,旨在帮助大家能够快速理解并熟悉WPS加载项机制以及和浏览器调用交互的流程。
+
+### 工程结构
+
+* index.html web端页面入口
+* resource web页面相关资源
+
+### 注意事项
+
+* 本工程只是演示demo
+* 我们建议您结合具体的应用场景修改示例代码,这样更能够体现OA助手集成的应用场景
+* 为了保护代码,建议代码上线前进行混淆
+* 使用该工程的时候,必须要安装WPS专业版,请咨询QQ:3253920855
diff --git a/oaassist/server/wwwroot/demo.html b/oaassist/server/wwwroot/demo.html
new file mode 100644
index 0000000..a152635
--- /dev/null
+++ b/oaassist/server/wwwroot/demo.html
@@ -0,0 +1,208 @@
+
+
+
+
+
+
+
+ OA助手演示Demo
+
+ 开始境检测:
+
+
+
+
+ →
+ 点击开始体验
+
+
+ 重新开始环境检测
+
+
\ No newline at end of file
diff --git a/oaassist/server/wwwroot/file/HelloServlet.java b/oaassist/server/wwwroot/file/HelloServlet.java
new file mode 100644
index 0000000..7723b65
--- /dev/null
+++ b/oaassist/server/wwwroot/file/HelloServlet.java
@@ -0,0 +1,140 @@
+package com.kso.test;
+
+import java.io.ByteArrayOutputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.FileItemFactory;
+import org.apache.commons.fileupload.FileUploadException;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.apache.commons.fileupload.servlet.ServletFileUpload;
+
+@WebServlet({ "/HelloServlet" })
+public class HelloServlet extends HttpServlet {
+ private static final long serialVersionUID = 1L;
+ private static String s_fileName = "";
+
+ ByteArrayOutputStream output;
+
+ /**
+ * 下载文件
+ *
+ * @param request
+ * @param response
+ * @throws ServletException
+ * @throws IOException
+ */
+ protected void doGet(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException {
+ String filename = request.getParameter("name");
+ if (filename == null || filename.isEmpty()) {
+ out.print("please set file name ");
+ } else {
+ // 假设文件都在服务的根目录下
+ String realFileName = request.getServletContext().getRealPath("/") + filename;
+ System.out.println(realFileName);
+ // 实例化一个向客户端输出文件流
+ OutputStream outputStream = response.getOutputStream();
+ // 输出文件用的字节数组,每次向输出流发送600个字节
+ byte b[] = new byte[600];
+ // 要向客户端输出的文件
+ File fileload = new File(realFileName);
+ System.out.println(filename);
+ String utf8filename = URLEncoder.encode(filename, "UTF-8");
+ System.out.println(utf8filename);
+ response.setHeader("Content-disposition", "attachment; filename=" + utf8filename);
+ // 通知客户端:文件的MIME类型
+ response.setContentType("application/msword");
+ // 通知客户端:文件的长度
+ long fileLength = fileload.length();
+ String length = String.valueOf(fileLength);
+ response.setHeader("Content-length", length);
+ // 读取文件,并发送给客户端下载
+ FileInputStream inputStream = new FileInputStream(fileload);
+ int n = 0;
+ while ((n = inputStream.read(b)) != -1) {
+ outputStream.write(b, 0, n);
+ }
+ inputStream.close();
+ outputStream.close();
+ }
+ }
+
+ /**
+ * 上传文件
+ *
+ * @param request
+ * @param response
+ * @throws ServletException
+ * @throws IOException
+ */
+ protected void doPost(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException {
+ request.setCharacterEncoding("utf-8");
+ response.setContentType("text/html;charset=utf-8");
+ System.out.println("添加任务");
+ HttpSession session = request.getSession();
+ Cookie[] cookies = request.getCookies();
+ String value = "";
+
+ try {
+ DiskFileItemFactory factory = new DiskFileItemFactory();
+ ServletFileUpload upload = new ServletFileUpload((FileItemFactory) factory);
+ upload.setHeaderEncoding("UTF-8");
+
+ List items = upload.parseRequest(request);
+ boolean isOk = false;
+ Map param = new HashMap<>();
+ for (Object object : items) {
+ FileItem fileItem = (FileItem) object;
+ if (fileItem.isFormField()) {
+ System.out.println(fileItem.getFieldName() + ":" + fileItem.getString("utf-8") + ", size:"
+ + fileItem.getSize());
+ param.put(fileItem.getFieldName(), fileItem.getString("utf-8"));
+ continue;
+ }
+ String fieldName = fileItem.getFieldName();
+ // 必须要有文件名,需要客户端传参时注意
+ String fileName = fileItem.getName();
+ if (fileName.equals("blob"))
+ if (param.containsKey("filename")) {
+ fileName = param.get("filename").toString();
+ } else if (param.containsKey("fileName")) {
+ fileName = param.get("fileName").toString();
+ }
+ String filePath = request.getSession().getServletContext().getRealPath("/") + fileName;
+ System.out.println(fieldName + ":" + filePath);
+
+ FileOutputStream fileOut = new FileOutputStream(filePath);
+ InputStream in = fileItem.getInputStream();
+ byte[] buffer = new byte[1024];
+ int len = 0;
+ while ((len = in.read(buffer)) > 0) {
+ fileOut.write(buffer, 0, len);
+ }
+ in.close();
+ fileOut.close();
+ response.setHeader("Content-disposition", "attachment; filename*=UTF-8''" + fileName);
+ response.getWriter().write(fileName.concat("上传成功"));
+
+ return;
+ }
+ } catch (FileUploadException e) {
+
+ e.printStackTrace();
+ }
+
+ response.sendError(404, "no ssison");
+ }
+}
\ No newline at end of file
diff --git a/oaassist/server/wwwroot/file/OA模板公章.png b/oaassist/server/wwwroot/file/OA模板公章.png
new file mode 100644
index 0000000..8a9db82
Binary files /dev/null and b/oaassist/server/wwwroot/file/OA模板公章.png differ
diff --git a/oaassist/server/wwwroot/file/templateData.json b/oaassist/server/wwwroot/file/templateData.json
new file mode 100644
index 0000000..7e183aa
--- /dev/null
+++ b/oaassist/server/wwwroot/file/templateData.json
@@ -0,0 +1,22 @@
+[
+ {
+ "name": "Title",
+ "text": "填充模板测试,这是填充到书签名称为Title",
+ "type": "text"
+ },
+ {
+ "name": "Content",
+ "text": "正文内容模拟填充,这是填充到书签名称为Content",
+ "type": "text"
+ },
+ {
+ "name": "Number",
+ "text": "2020-3-13,这是填充到书签名称为Number",
+ "type": "text"
+ },
+ {
+ "name": "Other",
+ "text": "其他内容,这是填充到书签名称为Other",
+ "type": "text"
+ }
+]
\ No newline at end of file
diff --git a/oaassist/server/wwwroot/file/公文样章.wps b/oaassist/server/wwwroot/file/公文样章.wps
new file mode 100644
index 0000000..9d41989
Binary files /dev/null and b/oaassist/server/wwwroot/file/公文样章.wps differ
diff --git a/oaassist/server/wwwroot/file/样章.docx b/oaassist/server/wwwroot/file/样章.docx
new file mode 100644
index 0000000..2f0ef9a
Binary files /dev/null and b/oaassist/server/wwwroot/file/样章.docx differ
diff --git a/oaassist/server/wwwroot/file/样章.pptx b/oaassist/server/wwwroot/file/样章.pptx
new file mode 100644
index 0000000..9fdb8c7
Binary files /dev/null and b/oaassist/server/wwwroot/file/样章.pptx differ
diff --git a/oaassist/server/wwwroot/file/样章.xlsx b/oaassist/server/wwwroot/file/样章.xlsx
new file mode 100644
index 0000000..0f5da1d
Binary files /dev/null and b/oaassist/server/wwwroot/file/样章.xlsx differ
diff --git a/oaassist/server/wwwroot/file/样章2.docx b/oaassist/server/wwwroot/file/样章2.docx
new file mode 100644
index 0000000..1325dc2
Binary files /dev/null and b/oaassist/server/wwwroot/file/样章2.docx differ
diff --git a/oaassist/server/wwwroot/file/红头文件.docx b/oaassist/server/wwwroot/file/红头文件.docx
new file mode 100644
index 0000000..d3a44ae
Binary files /dev/null and b/oaassist/server/wwwroot/file/红头文件.docx differ
diff --git a/oaassist/server/wwwroot/index.html b/oaassist/server/wwwroot/index.html
new file mode 100644
index 0000000..6b0a73d
--- /dev/null
+++ b/oaassist/server/wwwroot/index.html
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ WPS OA助手示例
+
+
+
+
+
WPS OA助手应用场景示例
+
+ WPS加载项发来的消息内容:
+
+
+
+
+
+ 文字
+ 表格
+ 演示
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/oaassist/server/wwwroot/jsplugins.xml b/oaassist/server/wwwroot/jsplugins.xml
new file mode 100644
index 0000000..efaa4fc
--- /dev/null
+++ b/oaassist/server/wwwroot/jsplugins.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/oaassist/server/wwwroot/resource/WPS.png b/oaassist/server/wwwroot/resource/WPS.png
new file mode 100644
index 0000000..1565103
Binary files /dev/null and b/oaassist/server/wwwroot/resource/WPS.png differ
diff --git a/oaassist/server/wwwroot/resource/css/demo.css b/oaassist/server/wwwroot/resource/css/demo.css
new file mode 100644
index 0000000..e7f334d
--- /dev/null
+++ b/oaassist/server/wwwroot/resource/css/demo.css
@@ -0,0 +1,71 @@
+.indexTitle {
+ text-align: center;
+}
+
+.indexBody {
+ display: flex;
+ flex-direction: column;
+ height: 100vh;
+}
+
+.indexFrame {
+ flex: auto;
+ height: 100vh;
+}
+
+.itembody {
+ margin-left: 8px;
+}
+
+.appDiv {
+ display: flex;
+ flex-direction: column;
+}
+
+.appSelect {
+ width: 180px;
+ height: 30px;
+ overflow: hidden;
+}
+
+.appSelect select {
+ padding-left: 10px;
+ width: 180px;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ background: transparent;
+}
+
+button {
+ width: 180px;
+ color: #ffffff;
+}
+
+.demoBody {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+}
+
+.btnContainer {
+ display: flex;
+ flex-direction: column;
+}
+
+.divdemofunction {
+ flex: auto;
+ display: flex;
+ flex-direction: row;
+}
+
+.divFunction {
+ flex: 1;
+}
+
+.divDemo{
+ text-align: center;
+}
+
+#demoBtn {
+ height: 50px;
+}
\ No newline at end of file
diff --git a/oaassist/server/wwwroot/resource/et.html b/oaassist/server/wwwroot/resource/et.html
new file mode 100644
index 0000000..1a4251b
--- /dev/null
+++ b/oaassist/server/wwwroot/resource/et.html
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+ title
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 新建文档
+ 打开文档
+ 打开在线文档
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/oaassist/server/wwwroot/resource/highlight/highlight.pack.js b/oaassist/server/wwwroot/resource/highlight/highlight.pack.js
new file mode 100644
index 0000000..7d70be0
--- /dev/null
+++ b/oaassist/server/wwwroot/resource/highlight/highlight.pack.js
@@ -0,0 +1,3319 @@
+var hljs = new function () {
+ function m(p) {
+ return p.replace(/&/gm, "&").replace(/"
+ }
+ while (y.length || w.length) {
+ var v = u().splice(0, 1)[0];
+ z += m(x.substr(q, v.offset - q));
+ q = v.offset;
+ if (v.event == "start") {
+ z += t(v.node);
+ s.push(v.node)
+ } else {
+ if (v.event == "stop") {
+ var p, r = s.length;
+ do {
+ r--;
+ p = s[r];
+ z += ("" + p.nodeName.toLowerCase() + ">")
+ } while (p != v.node);
+ s.splice(r, 1);
+ while (r < s.length) {
+ z += t(s[r]);
+ r++
+ }
+ }
+ }
+ }
+ return z + m(x.substr(q))
+ }
+
+ function g(r) {
+ function p(t, s) {
+ var exp = null
+ try{exp = RegExp(t, "m" + (r.cI ? "i" : "") + (s ? "g" : ""));}catch(err){}
+ return exp ? exp : RegExp("abc")
+ }
+
+ function q(z, x) {
+ if (z.compiled) {
+ return
+ }
+ z.compiled = true;
+ var u = [];
+ if (z.k) {
+ var s = {};
+
+ function A(E, D) {
+ var B = D.split(" ");
+ for (var t = 0; t < B.length; t++) {
+ var C = B[t].split("|");
+ s[C[0]] = [E, C[1] ? Number(C[1]) : 1];
+ u.push(C[0])
+ }
+ }
+ z.lR = p(z.l || hljs.IR, true);
+ if (typeof z.k == "string") {
+ A("keyword", z.k)
+ } else {
+ for (var y in z.k) {
+ if (!z.k.hasOwnProperty(y)) {
+ continue
+ }
+ A(y, z.k[y])
+ }
+ }
+ z.k = s
+ }
+ if (x) {
+ if (z.bWK) {
+ z.b = "\\b(" + u.join("|") + ")\\s"
+ }
+ z.bR = p(z.b ? z.b : "\\B|\\b");
+ if (!z.e && !z.eW) {
+ z.e = "\\B|\\b"
+ }
+ if (z.e) {
+ z.eR = p(z.e)
+ }
+ z.tE = z.e || "";
+ if (z.eW && x.tE) {
+ z.tE += (z.e ? "|" : "") + x.tE
+ }
+ }
+ if (z.i) {
+ z.iR = p(z.i)
+ }
+ if (z.r === undefined) {
+ z.r = 1
+ }
+ if (!z.c) {
+ z.c = []
+ }
+ for (var w = 0; w < z.c.length; w++) {
+ if (z.c[w] == "self") {
+ z.c[w] = z
+ }
+ q(z.c[w], z)
+ }
+ if (z.starts) {
+ q(z.starts, x)
+ }
+ var v = [];
+ for (var w = 0; w < z.c.length; w++) {
+ v.push(z.c[w].b)
+ }
+ if (z.tE) {
+ v.push(z.tE)
+ }
+ if (z.i) {
+ v.push(z.i)
+ }
+ z.t = v.length ? p(v.join("|"), true) : null
+ }
+ q(r)
+ }
+
+ function e(D, E) {
+ function s(r, N) {
+ for (var M = 0; M < N.c.length; M++) {
+ var L = N.c[M].bR.exec(r);
+ if (L && L.index == 0) {
+ return N.c[M]
+ }
+ }
+ }
+
+ function v(L, r) {
+ if (p[L].e && p[L].eR.test(r)) {
+ return 1
+ }
+ if (p[L].eW) {
+ var M = v(L - 1, r);
+ return M ? M + 1 : 0
+ }
+ return 0
+ }
+
+ function w(r, L) {
+ return L.i && L.iR.test(r)
+ }
+
+ function q(L, r) {
+ var M = p[p.length - 1];
+ if (M.t) {
+ M.t.lastIndex = r;
+ return M.t.exec(L)
+ }
+ }
+
+ function A(N, r) {
+ var L = F.cI ? r[0].toLowerCase() : r[0];
+ var M = N.k[L];
+ if (M && M instanceof Array) {
+ return M
+ }
+ return false
+ }
+
+ function G(L, P) {
+ L = m(L);
+ if (!P.k) {
+ return L
+ }
+ var r = "";
+ var O = 0;
+ P.lR.lastIndex = 0;
+ var M = P.lR.exec(L);
+ while (M) {
+ r += L.substr(O, M.index - O);
+ var N = A(P, M);
+ if (N) {
+ y += N[1];
+ r += '' + M[0] + " "
+ } else {
+ r += M[0]
+ }
+ O = P.lR.lastIndex;
+ M = P.lR.exec(L)
+ }
+ return r + L.substr(O)
+ }
+
+ function B(L, M) {
+ var r;
+ if (M.sL == "") {
+ r = h(L)
+ } else {
+ r = e(M.sL, L)
+ }
+ if (M.r > 0) {
+ y += r.keyword_count;
+ C += r.r
+ }
+ return '' + r.value + " "
+ }
+
+ function K(r, L) {
+ if (L.sL && f[L.sL] || L.sL == "") {
+ return B(r, L)
+ } else {
+ return G(r, L)
+ }
+ }
+
+ function J(M, r) {
+ var L = M.cN ? '' : "";
+ if (M.rB) {
+ z += L;
+ M.buffer = ""
+ } else {
+ if (M.eB) {
+ z += m(r) + L;
+ M.buffer = ""
+ } else {
+ z += L;
+ M.buffer = r
+ }
+ }
+ p.push(M);
+ C += M.r
+ }
+
+ function H(N, M) {
+ var Q = p[p.length - 1];
+ if (M === undefined) {
+ z += K(Q.buffer + N, Q);
+ return
+ }
+ var P = s(M, Q);
+ if (P) {
+ z += K(Q.buffer + N, Q);
+ J(P, M);
+ return P.rB
+ }
+ var L = v(p.length - 1, M);
+ if (L) {
+ var O = Q.cN ? " " : "";
+ if (Q.rE) {
+ z += K(Q.buffer + N, Q) + O
+ } else {
+ if (Q.eE) {
+ z += K(Q.buffer + N, Q) + O + m(M)
+ } else {
+ z += K(Q.buffer + N + M, Q) + O
+ }
+ }
+ while (L > 1) {
+ O = p[p.length - 2].cN ? "" : "";
+ z += O;
+ L--;
+ p.length--
+ }
+ var r = p[p.length - 1];
+ p.length--;
+ p[p.length - 1].buffer = "";
+ if (r.starts) {
+ J(r.starts, "")
+ }
+ return Q.rE
+ }
+ if (w(M, Q)) {
+ throw "Illegal"
+ }
+ }
+ var F = f[D];
+ g(F);
+ var p = [F];
+ F.buffer = "";
+ var C = 0;
+ var y = 0;
+ var z = "";
+ try {
+ var x, u = 0;
+ while (true) {
+ x = q(E, u);
+ if (!x) {
+ break
+ }
+ var t = H(E.substr(u, x.index - u), x[0]);
+ u = x.index + (t ? 0 : x[0].length)
+ }
+ H(E.substr(u), undefined);
+ return {
+ r: C,
+ keyword_count: y,
+ value: z,
+ language: D
+ }
+ } catch (I) {
+ if (I == "Illegal") {
+ return {
+ r: 0,
+ keyword_count: 0,
+ value: m(E)
+ }
+ } else {
+ throw I
+ }
+ }
+ }
+
+ function h(t) {
+ var p = {
+ keyword_count: 0,
+ r: 0,
+ value: m(t)
+ };
+ var r = p;
+ for (var q in f) {
+ if (!f.hasOwnProperty(q)) {
+ continue
+ }
+ var s = e(q, t);
+ s.language = q;
+ if (s.keyword_count + s.r > r.keyword_count + r.r) {
+ r = s
+ }
+ if (s.keyword_count + s.r > p.keyword_count + p.r) {
+ r = p;
+ p = s
+ }
+ }
+ if (r.language) {
+ p.second_best = r
+ }
+ return p
+ }
+
+ function j(r, q, p) {
+ if (q) {
+ r = r.replace(/^((<[^>]+>|\t)+)/gm, function (t, w, v, u) {
+ return w.replace(/\t/g, q)
+ })
+ }
+ if (p) {
+ r = r.replace(/\n/g, " ")
+ }
+ return r
+ }
+
+ function n(t, w, r) {
+ var x = i(t, r);
+ var v = a(t);
+ var y, s;
+ if (v == "no-highlight") {
+ return
+ }
+ if (v) {
+ y = e(v, x)
+ } else {
+ y = h(x);
+ v = y.language
+ }
+ var q = d(t);
+ if (q.length) {
+ s = document.createElement("pre");
+ s.innerHTML = y.value;
+ y.value = k(q, d(s), x)
+ }
+ y.value = j(y.value, w, r);
+ var u = t.className;
+ if (!u.match("(\\s|^)(language-)?" + v + "(\\s|$)")) {
+ u = u ? (u + " " + v) : v
+ }
+ if (b && t.tagName == "CODE" && t.parentNode.tagName == "PRE") {
+ s = t.parentNode;
+ var p = document.createElement("div");
+ p.innerHTML = "" + y.value + "
";
+ t = p.firstChild.firstChild;
+ p.firstChild.cN = s.cN;
+ s.parentNode.replaceChild(p.firstChild, s)
+ } else {
+ t.innerHTML = y.value
+ }
+ t.className = u;
+ t.result = {
+ language: v,
+ kw: y.keyword_count,
+ re: y.r
+ };
+ if (y.second_best) {
+ t.second_best = {
+ language: y.second_best.language,
+ kw: y.second_best.keyword_count,
+ re: y.second_best.r
+ }
+ }
+ }
+
+ function o() {
+ if (o.called) {
+ return
+ }
+ o.called = true;
+ var r = document.getElementsByTagName("pre");
+ for (var p = 0; p < r.length; p++) {
+ var q = c(r[p]);
+ if (q) {
+ n(q, hljs.tabReplace)
+ }
+ }
+ }
+
+ function l() {
+ if (window.addEventListener) {
+ window.addEventListener("DOMContentLoaded", o, false);
+ window.addEventListener("load", o, false)
+ } else {
+ if (window.attachEvent) {
+ window.attachEvent("onload", o)
+ } else {
+ window.onload = o
+ }
+ }
+ }
+ var f = {};
+ this.LANGUAGES = f;
+ this.highlight = e;
+ this.highlightAuto = h;
+ this.fixMarkup = j;
+ this.highlightBlock = n;
+ this.initHighlighting = o;
+ this.initHighlightingOnLoad = l;
+ this.IR = "[a-zA-Z][a-zA-Z0-9_]*";
+ this.UIR = "[a-zA-Z_][a-zA-Z0-9_]*";
+ this.NR = "\\b\\d+(\\.\\d+)?";
+ this.CNR = "(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";
+ this.BNR = "\\b(0b[01]+)";
+ this.RSR = "!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|\\.|-|-=|/|/=|:|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";
+ this.BE = {
+ b: "\\\\[\\s\\S]",
+ r: 0
+ };
+ this.ASM = {
+ cN: "string",
+ b: "'",
+ e: "'",
+ i: "\\n",
+ c: [this.BE],
+ r: 0
+ };
+ this.QSM = {
+ cN: "string",
+ b: '"',
+ e: '"',
+ i: "\\n",
+ c: [this.BE],
+ r: 0
+ };
+ this.CLCM = {
+ cN: "comment",
+ b: "//",
+ e: "$"
+ };
+ this.CBLCLM = {
+ cN: "comment",
+ b: "/\\*",
+ e: "\\*/"
+ };
+ this.HCM = {
+ cN: "comment",
+ b: "#",
+ e: "$"
+ };
+ this.NM = {
+ cN: "number",
+ b: this.NR,
+ r: 0
+ };
+ this.CNM = {
+ cN: "number",
+ b: this.CNR,
+ r: 0
+ };
+ this.BNM = {
+ cN: "number",
+ b: this.BNR,
+ r: 0
+ };
+ this.inherit = function (r, s) {
+ var p = {};
+ for (var q in r) {
+ p[q] = r[q]
+ }
+ if (s) {
+ for (var q in s) {
+ p[q] = s[q]
+ }
+ }
+ return p
+ }
+}();
+hljs.LANGUAGES["1c"] = function (b) {
+ var f = "[a-zA-Zа-яА-Я][a-zA-Z0-9_а-яА-Я]*";
+ var c = "возврат дата для если и или иначе иначеесли исключение конецесли конецпопытки конецпроцедуры конецфункции конеццикла константа не перейти перем перечисление по пока попытка прервать продолжить процедура строка тогда фс функция цикл число экспорт";
+ var e = "ansitooem oemtoansi ввестивидсубконто ввестидату ввестизначение ввестиперечисление ввестипериод ввестиплансчетов ввестистроку ввестичисло вопрос восстановитьзначение врег выбранныйплансчетов вызватьисключение датагод датамесяц датачисло добавитьмесяц завершитьработусистемы заголовоксистемы записьжурналарегистрации запуститьприложение зафиксироватьтранзакцию значениевстроку значениевстрокувнутр значениевфайл значениеизстроки значениеизстрокивнутр значениеизфайла имякомпьютера имяпользователя каталогвременныхфайлов каталогиб каталогпользователя каталогпрограммы кодсимв командасистемы конгода конецпериодаби конецрассчитанногопериодаби конецстандартногоинтервала конквартала конмесяца коннедели лев лог лог10 макс максимальноеколичествосубконто мин монопольныйрежим названиеинтерфейса названиенабораправ назначитьвид назначитьсчет найти найтипомеченныенаудаление найтиссылки началопериодаби началостандартногоинтервала начатьтранзакцию начгода начквартала начмесяца начнедели номерднягода номерднянедели номернеделигода нрег обработкаожидания окр описаниеошибки основнойжурналрасчетов основнойплансчетов основнойязык открытьформу открытьформумодально отменитьтранзакцию очиститьокносообщений периодстр полноеимяпользователя получитьвремята получитьдатута получитьдокументта получитьзначенияотбора получитьпозициюта получитьпустоезначение получитьта прав праводоступа предупреждение префиксавтонумерации пустаястрока пустоезначение рабочаядаттьпустоезначение рабочаядата разделительстраниц разделительстрок разм разобратьпозициюдокумента рассчитатьрегистрына рассчитатьрегистрыпо сигнал симв символтабуляции создатьобъект сокрл сокрлп сокрп сообщить состояние сохранитьзначение сред статусвозврата стрдлина стрзаменить стрколичествострок стрполучитьстроку стрчисловхождений сформироватьпозициюдокумента счетпокоду текущаядата текущеевремя типзначения типзначениястр удалитьобъекты установитьтана установитьтапо фиксшаблон формат цел шаблон";
+ var a = {
+ cN: "dquote",
+ b: '""'
+ };
+ var d = {
+ cN: "string",
+ b: '"',
+ e: '"|$',
+ c: [a],
+ r: 0
+ };
+ var g = {
+ cN: "string",
+ b: "\\|",
+ e: '"|$',
+ c: [a]
+ };
+ return {
+ cI: true,
+ l: f,
+ k: {
+ keyword: c,
+ built_in: e
+ },
+ c: [b.CLCM, b.NM, d, g, {
+ cN: "function",
+ b: "(процедура|функция)",
+ e: "$",
+ l: f,
+ k: "процедура функция",
+ c: [{
+ cN: "title",
+ b: f
+ }, {
+ cN: "tail",
+ eW: true,
+ c: [{
+ cN: "params",
+ b: "\\(",
+ e: "\\)",
+ l: f,
+ k: "знач",
+ c: [d, g]
+ }, {
+ cN: "export",
+ b: "экспорт",
+ eW: true,
+ l: f,
+ k: "экспорт",
+ c: [b.CLCM]
+ }]
+ }, b.CLCM]
+ }, {
+ cN: "preprocessor",
+ b: "#",
+ e: "$"
+ }, {
+ cN: "date",
+ b: "'\\d{2}\\.\\d{2}\\.(\\d{2}|\\d{4})'"
+ }]
+ }
+}(hljs);
+hljs.LANGUAGES.actionscript = function (a) {
+ var d = "[a-zA-Z_$][a-zA-Z0-9_$]*";
+ var c = "([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)";
+ var e = {
+ cN: "rest_arg",
+ b: "[.]{3}",
+ e: d,
+ r: 10
+ };
+ var b = {
+ cN: "title",
+ b: d
+ };
+ return {
+ k: {
+ keyword: "as break case catch class const continue default delete do dynamic each else extends final finally for function get if implements import in include instanceof interface internal is namespace native new override package private protected public return set static super switch this throw try typeof use var void while with",
+ literal: "true false null undefined"
+ },
+ c: [a.ASM, a.QSM, a.CLCM, a.CBLCLM, a.CNM, {
+ cN: "package",
+ bWK: true,
+ e: "{",
+ k: "package",
+ c: [b]
+ }, {
+ cN: "class",
+ bWK: true,
+ e: "{",
+ k: "class interface",
+ c: [{
+ bWK: true,
+ k: "extends implements"
+ }, b]
+ }, {
+ cN: "preprocessor",
+ bWK: true,
+ e: ";",
+ k: "import include"
+ }, {
+ cN: "function",
+ bWK: true,
+ e: "[{;]",
+ k: "function",
+ i: "\\S",
+ c: [b, {
+ cN: "params",
+ b: "\\(",
+ e: "\\)",
+ c: [a.ASM, a.QSM, a.CLCM, a.CBLCLM, e]
+ }, {
+ cN: "type",
+ b: ":",
+ e: c,
+ r: 10
+ }]
+ }]
+ }
+}(hljs);
+hljs.LANGUAGES.apache = function (a) {
+ var b = {
+ cN: "number",
+ b: "[\\$%]\\d+"
+ };
+ return {
+ cI: true,
+ k: {
+ keyword: "acceptfilter acceptmutex acceptpathinfo accessfilename action addalt addaltbyencoding addaltbytype addcharset adddefaultcharset adddescription addencoding addhandler addicon addiconbyencoding addiconbytype addinputfilter addlanguage addmoduleinfo addoutputfilter addoutputfilterbytype addtype alias aliasmatch allow allowconnect allowencodedslashes allowoverride anonymous anonymous_logemail anonymous_mustgiveemail anonymous_nouserid anonymous_verifyemail authbasicauthoritative authbasicprovider authdbduserpwquery authdbduserrealmquery authdbmgroupfile authdbmtype authdbmuserfile authdefaultauthoritative authdigestalgorithm authdigestdomain authdigestnccheck authdigestnonceformat authdigestnoncelifetime authdigestprovider authdigestqop authdigestshmemsize authgroupfile authldapbinddn authldapbindpassword authldapcharsetconfig authldapcomparednonserver authldapdereferencealiases authldapgroupattribute authldapgroupattributeisdn authldapremoteuserattribute authldapremoteuserisdn authldapurl authname authnprovideralias authtype authuserfile authzdbmauthoritative authzdbmtype authzdefaultauthoritative authzgroupfileauthoritative authzldapauthoritative authzownerauthoritative authzuserauthoritative balancermember browsermatch browsermatchnocase bufferedlogs cachedefaultexpire cachedirlength cachedirlevels cachedisable cacheenable cachefile cacheignorecachecontrol cacheignoreheaders cacheignorenolastmod cacheignorequerystring cachelastmodifiedfactor cachemaxexpire cachemaxfilesize cacheminfilesize cachenegotiateddocs cacheroot cachestorenostore cachestoreprivate cgimapextension charsetdefault charsetoptions charsetsourceenc checkcaseonly checkspelling chrootdir contentdigest cookiedomain cookieexpires cookielog cookiename cookiestyle cookietracking coredumpdirectory customlog dav davdepthinfinity davgenericlockdb davlockdb davmintimeout dbdexptime dbdkeep dbdmax dbdmin dbdparams dbdpersist dbdpreparesql dbdriver defaulticon defaultlanguage defaulttype deflatebuffersize deflatecompressionlevel deflatefilternote deflatememlevel deflatewindowsize deny directoryindex directorymatch directoryslash documentroot dumpioinput dumpiologlevel dumpiooutput enableexceptionhook enablemmap enablesendfile errordocument errorlog example expiresactive expiresbytype expiresdefault extendedstatus extfilterdefine extfilteroptions fileetag filterchain filterdeclare filterprotocol filterprovider filtertrace forcelanguagepriority forcetype forensiclog gracefulshutdowntimeout group header headername hostnamelookups identitycheck identitychecktimeout imapbase imapdefault imapmenu include indexheadinsert indexignore indexoptions indexorderdefault indexstylesheet isapiappendlogtoerrors isapiappendlogtoquery isapicachefile isapifakeasync isapilognotsupported isapireadaheadbuffer keepalive keepalivetimeout languagepriority ldapcacheentries ldapcachettl ldapconnectiontimeout ldapopcacheentries ldapopcachettl ldapsharedcachefile ldapsharedcachesize ldaptrustedclientcert ldaptrustedglobalcert ldaptrustedmode ldapverifyservercert limitinternalrecursion limitrequestbody limitrequestfields limitrequestfieldsize limitrequestline limitxmlrequestbody listen listenbacklog loadfile loadmodule lockfile logformat loglevel maxclients maxkeepaliverequests maxmemfree maxrequestsperchild maxrequestsperthread maxspareservers maxsparethreads maxthreads mcachemaxobjectcount mcachemaxobjectsize mcachemaxstreamingbuffer mcacheminobjectsize mcacheremovalalgorithm mcachesize metadir metafiles metasuffix mimemagicfile minspareservers minsparethreads mmapfile mod_gzip_on mod_gzip_add_header_count mod_gzip_keep_workfiles mod_gzip_dechunk mod_gzip_min_http mod_gzip_minimum_file_size mod_gzip_maximum_file_size mod_gzip_maximum_inmem_size mod_gzip_temp_dir mod_gzip_item_include mod_gzip_item_exclude mod_gzip_command_version mod_gzip_can_negotiate mod_gzip_handle_methods mod_gzip_static_suffix mod_gzip_send_vary mod_gzip_update_static modmimeusepathinfo multiviewsmatch namevirtualhost noproxy nwssltrustedcerts nwsslupgradeable options order passenv pidfile protocolecho proxybadheader proxyblock proxydomain proxyerroroverride proxyftpdircharset proxyiobuffersize proxymaxforwards proxypass proxypassinterpolateenv proxypassmatch proxypassreverse proxypassreversecookiedomain proxypassreversecookiepath proxypreservehost proxyreceivebuffersize proxyremote proxyremotematch proxyrequests proxyset proxystatus proxytimeout proxyvia readmename receivebuffersize redirect redirectmatch redirectpermanent redirecttemp removecharset removeencoding removehandler removeinputfilter removelanguage removeoutputfilter removetype requestheader require rewritebase rewritecond rewriteengine rewritelock rewritelog rewriteloglevel rewritemap rewriteoptions rewriterule rlimitcpu rlimitmem rlimitnproc satisfy scoreboardfile script scriptalias scriptaliasmatch scriptinterpretersource scriptlog scriptlogbuffer scriptloglength scriptsock securelisten seerequesttail sendbuffersize serveradmin serveralias serverlimit servername serverpath serverroot serversignature servertokens setenv setenvif setenvifnocase sethandler setinputfilter setoutputfilter ssienableaccess ssiendtag ssierrormsg ssistarttag ssitimeformat ssiundefinedecho sslcacertificatefile sslcacertificatepath sslcadnrequestfile sslcadnrequestpath sslcarevocationfile sslcarevocationpath sslcertificatechainfile sslcertificatefile sslcertificatekeyfile sslciphersuite sslcryptodevice sslengine sslhonorciperorder sslmutex ssloptions sslpassphrasedialog sslprotocol sslproxycacertificatefile sslproxycacertificatepath sslproxycarevocationfile sslproxycarevocationpath sslproxyciphersuite sslproxyengine sslproxymachinecertificatefile sslproxymachinecertificatepath sslproxyprotocol sslproxyverify sslproxyverifydepth sslrandomseed sslrequire sslrequiressl sslsessioncache sslsessioncachetimeout sslusername sslverifyclient sslverifydepth startservers startthreads substitute suexecusergroup threadlimit threadsperchild threadstacksize timeout traceenable transferlog typesconfig unsetenv usecanonicalname usecanonicalphysicalport user userdir virtualdocumentroot virtualdocumentrootip virtualscriptalias virtualscriptaliasip win32disableacceptex xbithack",
+ literal: "on off"
+ },
+ c: [a.HCM, {
+ cN: "sqbracket",
+ b: "\\s\\[",
+ e: "\\]$"
+ }, {
+ cN: "cbracket",
+ b: "[\\$%]\\{",
+ e: "\\}",
+ c: ["self", b]
+ }, b, {
+ cN: "tag",
+ b: "?",
+ e: ">"
+ }, a.QSM]
+ }
+}(hljs);
+hljs.LANGUAGES.avrasm = function (a) {
+ return {
+ cI: true,
+ k: {
+ keyword: "adc add adiw and andi asr bclr bld brbc brbs brcc brcs break breq brge brhc brhs brid brie brlo brlt brmi brne brpl brsh brtc brts brvc brvs bset bst call cbi cbr clc clh cli cln clr cls clt clv clz com cp cpc cpi cpse dec eicall eijmp elpm eor fmul fmuls fmulsu icall ijmp in inc jmp ld ldd ldi lds lpm lsl lsr mov movw mul muls mulsu neg nop or ori out pop push rcall ret reti rjmp rol ror sbc sbr sbrc sbrs sec seh sbi sbci sbic sbis sbiw sei sen ser ses set sev sez sleep spm st std sts sub subi swap tst wdr",
+ built_in: "r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 r27 r28 r29 r30 r31 x|0 xh xl y|0 yh yl z|0 zh zl ucsr1c udr1 ucsr1a ucsr1b ubrr1l ubrr1h ucsr0c ubrr0h tccr3c tccr3a tccr3b tcnt3h tcnt3l ocr3ah ocr3al ocr3bh ocr3bl ocr3ch ocr3cl icr3h icr3l etimsk etifr tccr1c ocr1ch ocr1cl twcr twdr twar twsr twbr osccal xmcra xmcrb eicra spmcsr spmcr portg ddrg ping portf ddrf sreg sph spl xdiv rampz eicrb eimsk gimsk gicr eifr gifr timsk tifr mcucr mcucsr tccr0 tcnt0 ocr0 assr tccr1a tccr1b tcnt1h tcnt1l ocr1ah ocr1al ocr1bh ocr1bl icr1h icr1l tccr2 tcnt2 ocr2 ocdr wdtcr sfior eearh eearl eedr eecr porta ddra pina portb ddrb pinb portc ddrc pinc portd ddrd pind spdr spsr spcr udr0 ucsr0a ucsr0b ubrr0l acsr admux adcsr adch adcl porte ddre pine pinf"
+ },
+ c: [a.CBLCLM, {
+ cN: "comment",
+ b: ";",
+ e: "$"
+ }, a.CNM, a.BNM, {
+ cN: "number",
+ b: "\\b(\\$[a-zA-Z0-9]+|0o[0-7]+)"
+ }, a.QSM, {
+ cN: "string",
+ b: "'",
+ e: "[^\\\\]'",
+ i: "[^\\\\][^']"
+ }, {
+ cN: "label",
+ b: "^[A-Za-z0-9_.$]+:"
+ }, {
+ cN: "preprocessor",
+ b: "#",
+ e: "$"
+ }, {
+ cN: "preprocessor",
+ b: "\\.[a-zA-Z]+"
+ }, {
+ cN: "localvars",
+ b: "@[0-9]+"
+ }]
+ }
+}(hljs);
+hljs.LANGUAGES.axapta = function (a) {
+ return {
+ k: "false int abstract private char interface boolean static null if for true while long throw finally protected extends final implements return void enum else break new catch byte super class case short default double public try this switch continue reverse firstfast firstonly forupdate nofetch sum avg minof maxof count order group by asc desc index hint like dispaly edit client server ttsbegin ttscommit str real date container anytype common div mod",
+ c: [a.CLCM, a.CBLCLM, a.ASM, a.QSM, a.CNM, {
+ cN: "preprocessor",
+ b: "#",
+ e: "$"
+ }, {
+ cN: "class",
+ bWK: true,
+ e: "{",
+ i: ":",
+ k: "class interface",
+ c: [{
+ cN: "inheritance",
+ bWK: true,
+ k: "extends implements",
+ r: 10
+ }, {
+ cN: "title",
+ b: a.UIR
+ }]
+ }]
+ }
+}(hljs);
+hljs.LANGUAGES.bash = function (a) {
+ var f = "true false";
+ var c = {
+ cN: "variable",
+ b: "\\$[a-zA-Z0-9_]+\\b"
+ };
+ var b = {
+ cN: "variable",
+ b: "\\${([^}]|\\\\})+}"
+ };
+ var g = {
+ cN: "string",
+ b: '"',
+ e: '"',
+ i: "\\n",
+ c: [a.BE, c, b],
+ r: 0
+ };
+ var d = {
+ cN: "string",
+ b: "'",
+ e: "'",
+ c: [{
+ b: "''"
+ }],
+ r: 0
+ };
+ var e = {
+ cN: "test_condition",
+ b: "",
+ e: "",
+ c: [g, d, c, b],
+ k: {
+ literal: f
+ },
+ r: 0
+ };
+ return {
+ k: {
+ keyword: "if then else fi for break continue while in do done echo exit return set declare",
+ literal: f
+ },
+ c: [{
+ cN: "shebang",
+ b: "(#!\\/bin\\/bash)|(#!\\/bin\\/sh)",
+ r: 10
+ }, c, b, a.HCM, g, d, a.inherit(e, {
+ b: "\\[ ",
+ e: " \\]",
+ r: 0
+ }), a.inherit(e, {
+ b: "\\[\\[ ",
+ e: " \\]\\]"
+ })]
+ }
+}(hljs);
+hljs.LANGUAGES.clojure = function (l) {
+ var e = {
+ built_in: "def cond apply if-not if-let if not not= = < < > <= <= >= == + / * - rem quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last drop-while while intern condp case reduced cycle split-at split-with repeat replicate iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter monitor-exit defmacro defn defn- macroexpand macroexpand-1 for doseq dosync dotimes and or when when-not when-let comp juxt partial sequence memoize constantly complement identity assert peek pop doto proxy defstruct first rest cons defprotocol cast coll deftype defrecord last butlast sigs reify second ffirst fnext nfirst nnext defmulti defmethod meta with-meta ns in-ns create-ns import intern refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! assoc! dissoc! pop! disj! import use class type num float double short byte boolean bigint biginteger bigdec print-method print-dup throw-if throw printf format load compile get-in update-in pr pr-on newline flush read slurp read-line subvec with-open memfn time ns assert re-find re-groups rand-int rand mod locking assert-valid-fdecl alias namespace resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! new next conj set! memfn to-array future future-call into-array aset gen-class reduce merge map filter find empty hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize"
+ };
+ var f = "[a-zA-Z_0-9\\!\\.\\?\\-\\+\\*\\/\\<\\=\\>\\&\\#\\$';]+";
+ var a = "[\\s:\\(\\{]+\\d+(\\.\\d+)?";
+ var d = {
+ cN: "number",
+ b: a,
+ r: 0
+ };
+ var j = {
+ cN: "string",
+ b: '"',
+ e: '"',
+ c: [l.BE],
+ r: 0
+ };
+ var o = {
+ cN: "comment",
+ b: ";",
+ e: "$",
+ r: 0
+ };
+ var n = {
+ cN: "collection",
+ b: "[\\[\\{]",
+ e: "[\\]\\}]"
+ };
+ var c = {
+ cN: "comment",
+ b: "\\^" + f
+ };
+ var b = {
+ cN: "comment",
+ b: "\\^\\{",
+ e: "\\}"
+ };
+ var h = {
+ cN: "attribute",
+ b: "[:]" + f
+ };
+ var m = {
+ cN: "list",
+ b: "\\(",
+ e: "\\)",
+ r: 0
+ };
+ var g = {
+ eW: true,
+ eE: true,
+ k: {
+ literal: "true false nil"
+ },
+ r: 0
+ };
+ var i = {
+ k: e,
+ l: f,
+ cN: "title",
+ b: f,
+ starts: g
+ };
+ m.c = [{
+ cN: "comment",
+ b: "comment"
+ }, i];
+ g.c = [m, j, c, b, o, h, n, d];
+ n.c = [m, j, c, o, h, n, d];
+ return {
+ cI: true,
+ i: "\\S",
+ c: [o, m]
+ }
+}(hljs);
+hljs.LANGUAGES.cmake = function (a) {
+ return {
+ cI: true,
+ k: "add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_subdirectory add_test aux_source_directory break build_command cmake_minimum_required cmake_policy configure_file create_test_sourcelist define_property else elseif enable_language enable_testing endforeach endfunction endif endmacro endwhile execute_process export find_file find_library find_package find_path find_program fltk_wrap_ui foreach function get_cmake_property get_directory_property get_filename_component get_property get_source_file_property get_target_property get_test_property if include include_directories include_external_msproject include_regular_expression install link_directories load_cache load_command macro mark_as_advanced message option output_required_files project qt_wrap_cpp qt_wrap_ui remove_definitions return separate_arguments set set_directory_properties set_property set_source_files_properties set_target_properties set_tests_properties site_name source_group string target_link_libraries try_compile try_run unset variable_watch while build_name exec_program export_library_dependencies install_files install_programs install_targets link_libraries make_directory remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file",
+ c: [{
+ cN: "envvar",
+ b: "\\${",
+ e: "}"
+ }, a.HCM, a.QSM, a.NM]
+ }
+}(hljs);
+hljs.LANGUAGES.coffeescript = function (g) {
+ var f = {
+ keyword: "in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger class extends superthen unless until loop of by when and or is isnt not",
+ literal: "true false null undefined yes no on off ",
+ reserved: "case default function var void with const let enum export import native __hasProp __extends __slice __bind __indexOf"
+ };
+ var a = "[A-Za-z$_][0-9A-Za-z$_]*";
+ var j = {
+ cN: "subst",
+ b: "#\\{",
+ e: "}",
+ k: f,
+ c: [g.CNM, g.BNM]
+ };
+ var c = {
+ cN: "string",
+ b: '"',
+ e: '"',
+ r: 0,
+ c: [g.BE, j]
+ };
+ var m = {
+ cN: "string",
+ b: '"""',
+ e: '"""',
+ c: [g.BE, j]
+ };
+ var h = {
+ cN: "comment",
+ b: "###",
+ e: "###"
+ };
+ var i = {
+ cN: "regexp",
+ b: "///",
+ e: "///",
+ c: [g.HCM]
+ };
+ var d = {
+ cN: "regexp",
+ b: "//[gim]*"
+ };
+ var b = {
+ cN: "regexp",
+ b: "/\\S(\\\\.|[^\\n])*/[gim]*"
+ };
+ var l = {
+ cN: "function",
+ b: a + "\\s*=\\s*(\\(.+\\))?\\s*[-=]>",
+ rB: true,
+ c: [{
+ cN: "title",
+ b: a
+ }, {
+ cN: "params",
+ b: "\\(",
+ e: "\\)"
+ }]
+ };
+ var e = {
+ b: "`",
+ e: "`",
+ eB: true,
+ eE: true,
+ sL: "javascript"
+ };
+ return {
+ k: f,
+ c: [g.CNM, g.BNM, g.ASM, m, c, h, g.HCM, i, d, b, e, l]
+ }
+}(hljs);
+hljs.LANGUAGES.cpp = function (a) {
+ var b = {
+ keyword: "false int float while private char catch export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long throw volatile static protected bool template mutable if public friend do return goto auto void enum else break new extern using true class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue wchar_t inline delete alignof char16_t char32_t constexpr decltype noexcept nullptr static_assert thread_local restrict _Bool complex",
+ built_in: "std string cin cout cerr clog stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr"
+ };
+ return {
+ k: b,
+ i: "",
+ c: [a.CLCM, a.CBLCLM, a.QSM, {
+ cN: "string",
+ b: "'\\\\?.",
+ e: "'",
+ i: "."
+ }, {
+ cN: "number",
+ b: "\\b(\\d+(\\.\\d*)?|\\.\\d+)(u|U|l|L|ul|UL|f|F)"
+ }, a.CNM, {
+ cN: "preprocessor",
+ b: "#",
+ e: "$"
+ }, {
+ cN: "stl_container",
+ b: "\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",
+ e: ">",
+ k: b,
+ r: 10,
+ c: ["self"]
+ }]
+ }
+}(hljs);
+hljs.LANGUAGES.cs = function (a) {
+ return {
+ k: "abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long namespace new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while ascending descending from get group into join let orderby partial select set value var where yield",
+ c: [{
+ cN: "comment",
+ b: "///",
+ e: "$",
+ rB: true,
+ c: [{
+ cN: "xmlDocTag",
+ b: "///|"
+ }, {
+ cN: "xmlDocTag",
+ b: "?",
+ e: ">"
+ }]
+ }, a.CLCM, a.CBLCLM, {
+ cN: "preprocessor",
+ b: "#",
+ e: "$",
+ k: "if else elif endif define undef warning error line region endregion pragma checksum"
+ }, {
+ cN: "string",
+ b: '@"',
+ e: '"',
+ c: [{
+ b: '""'
+ }]
+ }, a.ASM, a.QSM, a.CNM]
+ }
+}(hljs);
+hljs.LANGUAGES.css = function (a) {
+ var b = {
+ cN: "function",
+ b: a.IR + "\\(",
+ e: "\\)",
+ c: [a.NM, a.ASM, a.QSM]
+ };
+ return {
+ cI: true,
+ i: "[=/|']",
+ c: [a.CBLCLM, {
+ cN: "id",
+ b: "\\#[A-Za-z0-9_-]+"
+ }, {
+ cN: "class",
+ b: "\\.[A-Za-z0-9_-]+",
+ r: 0
+ }, {
+ cN: "attr_selector",
+ b: "\\[",
+ e: "\\]",
+ i: "$"
+ }, {
+ cN: "pseudo",
+ b: ":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"
+ }, {
+ cN: "at_rule",
+ b: "@(font-face|page)",
+ l: "[a-z-]+",
+ k: "font-face page"
+ }, {
+ cN: "at_rule",
+ b: "@",
+ e: "[{;]",
+ eE: true,
+ k: "import page media charset",
+ c: [b, a.ASM, a.QSM, a.NM]
+ }, {
+ cN: "tag",
+ b: a.IR,
+ r: 0
+ }, {
+ cN: "rules",
+ b: "{",
+ e: "}",
+ i: "[^\\s]",
+ r: 0,
+ c: [a.CBLCLM, {
+ cN: "rule",
+ b: "[^\\s]",
+ rB: true,
+ e: ";",
+ eW: true,
+ c: [{
+ cN: "attribute",
+ b: "[A-Z\\_\\.\\-]+",
+ e: ":",
+ eE: true,
+ i: "[^\\s]",
+ starts: {
+ cN: "value",
+ eW: true,
+ eE: true,
+ c: [b, a.NM, a.QSM, a.ASM, a.CBLCLM, {
+ cN: "hexcolor",
+ b: "\\#[0-9A-F]+"
+ }, {
+ cN: "important",
+ b: "!important"
+ }]
+ }
+ }]
+ }]
+ }]
+ }
+}(hljs);
+hljs.LANGUAGES.d = function (x) {
+ var b = {
+ keyword: "abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",
+ built_in: "bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",
+ literal: "false null true"
+ };
+ var c = "(0|[1-9][\\d_]*)",
+ q = "(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)",
+ h = "0[bB][01_]+",
+ v = "([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)",
+ y = "0[xX]" + v,
+ p = "([eE][+-]?" + q + ")",
+ o = "(" + q + "(\\.\\d*|" + p + ")|\\d+\\." + q + q + "|\\." + c + p + "?)",
+ k = "(0[xX](" + v + "\\." + v + "|\\.?" + v + ")[pP][+-]?" + q + ")",
+ l = "(" + c + "|" + h + "|" + y + ")",
+ n = "(" + k + "|" + o + ")";
+ var z = "\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};";
+ var m = {
+ cN: "number",
+ b: "\\b" + l + "(L|u|U|Lu|LU|uL|UL)?",
+ r: 0
+ };
+ var j = {
+ cN: "number",
+ b: "\\b(" + n + "([fF]|L|i|[fF]i|Li)?|" + l + "(i|[fF]i|Li))",
+ r: 0
+ };
+ var s = {
+ cN: "string",
+ b: "'(" + z + "|.)",
+ e: "'",
+ i: "."
+ };
+ var r = {
+ b: z,
+ r: 0
+ };
+ var w = {
+ cN: "string",
+ b: '"',
+ c: [r],
+ e: '"[cwd]?',
+ r: 0
+ };
+ var f = {
+ cN: "string",
+ b: '[rq]"',
+ e: '"[cwd]?',
+ r: 5
+ };
+ var u = {
+ cN: "string",
+ b: "`",
+ e: "`[cwd]?"
+ };
+ var i = {
+ cN: "string",
+ b: 'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',
+ r: 10
+ };
+ var t = {
+ cN: "string",
+ b: 'q"\\{',
+ e: '\\}"'
+ };
+ var e = {
+ cN: "shebang",
+ b: "^#!",
+ e: "$",
+ r: 5
+ };
+ var g = {
+ cN: "preprocessor",
+ b: "#(line)",
+ e: "$",
+ r: 5
+ };
+ var d = {
+ cN: "keyword",
+ b: "@[a-zA-Z_][a-zA-Z_\\d]*"
+ };
+ var a = {
+ cN: "comment",
+ b: "\\/\\+",
+ c: ["self"],
+ e: "\\+\\/",
+ r: 10
+ };
+ return {
+ l: x.UIR,
+ k: b,
+ c: [x.CLCM, x.CBLCLM, a, i, w, f, u, t, j, m, s, e, g, d]
+ }
+}(hljs);
+hljs.LANGUAGES.delphi = function (b) {
+ var f = "and safecall cdecl then string exports library not pascal set virtual file in array label packed end. index while const raise for to implementation with except overload destructor downto finally program exit unit inherited override if type until function do begin repeat goto nil far initialization object else var uses external resourcestring interface end finalization class asm mod case on shr shl of register xorwrite threadvar try record near stored constructor stdcall inline div out or procedure";
+ var e = "safecall stdcall pascal stored const implementation finalization except to finally program inherited override then exports string read not mod shr try div shl set library message packed index for near overload label downto exit public goto interface asm on of constructor or private array unit raise destructor var type until function else external with case default record while protected property procedure published and cdecl do threadvar file in if end virtual write far out begin repeat nil initialization object uses resourcestring class register xorwrite inline static";
+ var a = {
+ cN: "comment",
+ b: "{",
+ e: "}",
+ r: 0
+ };
+ var g = {
+ cN: "comment",
+ b: "\\(\\*",
+ e: "\\*\\)",
+ r: 10
+ };
+ var c = {
+ cN: "string",
+ b: "'",
+ e: "'",
+ c: [{
+ b: "''"
+ }],
+ r: 0
+ };
+ var d = {
+ cN: "string",
+ b: "(#\\d+)+"
+ };
+ var h = {
+ cN: "function",
+ bWK: true,
+ e: "[:;]",
+ k: "function constructor|10 destructor|10 procedure|10",
+ c: [{
+ cN: "title",
+ b: b.IR
+ }, {
+ cN: "params",
+ b: "\\(",
+ e: "\\)",
+ k: f,
+ c: [c, d]
+ }, a, g]
+ };
+ return {
+ cI: true,
+ k: f,
+ i: '("|\\$[G-Zg-z]|\\/\\*|)',
+ c: [a, g, b.CLCM, c, d, b.NM, h, {
+ cN: "class",
+ b: "=\\bclass\\b",
+ e: "end;",
+ k: e,
+ c: [c, d, a, g, b.CLCM, h]
+ }]
+ }
+}(hljs);
+hljs.LANGUAGES.diff = function (a) {
+ return {
+ cI: true,
+ c: [{
+ cN: "chunk",
+ b: "^\\@\\@ +\\-\\d+,\\d+ +\\+\\d+,\\d+ +\\@\\@$",
+ r: 10
+ }, {
+ cN: "chunk",
+ b: "^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$",
+ r: 10
+ }, {
+ cN: "chunk",
+ b: "^\\-\\-\\- +\\d+,\\d+ +\\-\\-\\-\\-$",
+ r: 10
+ }, {
+ cN: "header",
+ b: "Index: ",
+ e: "$"
+ }, {
+ cN: "header",
+ b: "=====",
+ e: "=====$"
+ }, {
+ cN: "header",
+ b: "^\\-\\-\\-",
+ e: "$"
+ }, {
+ cN: "header",
+ b: "^\\*{3} ",
+ e: "$"
+ }, {
+ cN: "header",
+ b: "^\\+\\+\\+",
+ e: "$"
+ }, {
+ cN: "header",
+ b: "\\*{5}",
+ e: "\\*{5}$"
+ }, {
+ cN: "addition",
+ b: "^\\+",
+ e: "$"
+ }, {
+ cN: "deletion",
+ b: "^\\-",
+ e: "$"
+ }, {
+ cN: "change",
+ b: "^\\!",
+ e: "$"
+ }]
+ }
+}(hljs);
+hljs.LANGUAGES.xml = function (a) {
+ var c = "[A-Za-z0-9\\._:-]+";
+ var b = {
+ eW: true,
+ c: [{
+ cN: "attribute",
+ b: c,
+ r: 0
+ }, {
+ b: '="',
+ rB: true,
+ e: '"',
+ c: [{
+ cN: "value",
+ b: '"',
+ eW: true
+ }]
+ }, {
+ b: "='",
+ rB: true,
+ e: "'",
+ c: [{
+ cN: "value",
+ b: "'",
+ eW: true
+ }]
+ }, {
+ b: "=",
+ c: [{
+ cN: "value",
+ b: "[^\\s/>]+"
+ }]
+ }]
+ };
+ return {
+ cI: true,
+ c: [{
+ cN: "pi",
+ b: "<\\?",
+ e: "\\?>",
+ r: 10
+ }, {
+ cN: "doctype",
+ b: "",
+ r: 10,
+ c: [{
+ b: "\\[",
+ e: "\\]"
+ }]
+ }, {
+ cN: "comment",
+ b: "",
+ r: 10
+ }, {
+ cN: "cdata",
+ b: "<\\!\\[CDATA\\[",
+ e: "\\]\\]>",
+ r: 10
+ }, {
+ cN: "tag",
+ b: "",
+ rE: true,
+ sL: "css"
+ }
+ }, {
+ cN: "tag",
+ b: "
+
+
+
+
+
+
+
+
+
+
+
+ 新建文档
+ 打开文档
+ 不落地打开文档(模拟保护模式打开)
+
+
+
+
+
+
+