/* 主要服务于word,excel,ppt,visio等文档的打开。 存在问题 1、保存的时候不弹出系统默认框 2、彻底分离各个模板 3、键盘处理 那些是快捷键 需要写流程图 */ Namespace.register("U.D.Office"); //#region word创建,打开。 /** * Word打开 之前通过第二个参数是guid进来的全部都要改 * * @param {object} 登录用户信息 * @param {object} 文档信息数组,如果为空,则创建空文档。 * @return {object} 返回当前窗体 */ U.D.Office.Word = function (userinfo, fileinfo, cb) { //数据结构转换 //弹出word窗体 //创建顶部工具栏 //创建顶部菜单 //创建word编辑区域,包括创建邀请协作人员,创建编辑历史,创建生成链接.创建热门模板。加载当前word文档的内容。创建光标,监控键盘输入等。 // var _UDOD, _UDAD, _UTF, _UDTD, _UAE, //设置变量 _UDID = (fileinfo && (fileinfo.UserDirectoryID) || fileinfo) || Guid.newGuid(); //判断是否存在文件 //数据结构转换 //暂时解决方案,以后会数据结构统一,包括文件夹,文件,好友等数据结构。这个有个权衡:要考虑网络传输数据大小的问题及开发速度的问题。 //由于获取首页获取出来的数据结构和在网盘获取出来的数据结构不匹配,所以这里把他传化成网盘的结构, if (fileinfo && fileinfo.UserFilesID) { //通过这个方式重新把首页数据转化成云盘的格式 fileinfo = new U.Dk.M.Entity(fileinfo.UserFilesID, fileinfo.UserFilesSize, fileinfo.UserDirectoryID, fileinfo.UserFilesName, fileinfo.UserFilesName, fileinfo.UserFilesExtendName, fileinfo.UserFilesServerName, fileinfo.UserFilesModifyTime, fileinfo.UseFilesServerThumbnailName, 0, fileinfo.UserFilesModifyTime, fileinfo.UserDirectoryEncrypt, 1, "", fileinfo.UserDirectoryEncrypt, fileinfo.UsOffice, fileinfo.UserId, "", "", ""); } U.D.SY.ET["UL"].AD = [] //弹出word窗体,如果word已经弹出了,则直接置顶? if (!(_UDOD = $("#UD_Word" + _UDID)[0]) || $("#UD_Word" + _UDID)[0].id == "UD_Word" + _UDID) { //生成office //Word内容区域,由iframe构成。 _UDOD = $("#UD_Word").clone(true); //克隆word编辑器 包含头部菜单和功能及word编辑区域 // _UDOD.bind({'click':U.D.Office.QCDJ}) _UDOD[0].id = ""; //清除id //创建窗体 设置属性 _UAE = U.UI.Form({ //窗体放大缩小 resize: U.M.apply(null, [ [U.Word.Tools.WETZ, [_UDOD[0], "Word"]] ]), //给窗口新id id: "UD_Word" + _UDID, //赋予样式 style: { width: "90%", height: "90%" }, //头部样式设置 htask: { style: { "top": "10px" } }, close: { //onclick: U.Word.Tools.ViewDisplayc onclick: U.D.Office.Colse } // content: _UDOD[0] }); //初始化菜单栏,包含顶部的菜单还有编辑功能 U.Word.Tools.Wordtools(userinfo, "Word", fileinfo, _UDOD[0]); // 清空原有的窗体头部和body $(_UAE.body)[0].innerHTML = ''; $(_UAE.head)[0].innerHTML = ''; //这个是从克隆里面移除掉再追加,比较特殊。。。 //创建顶部菜单,追加到窗体头部 $(_UAE.head).addAttrArray({ "className": "" }).append(_UDOD.Child()[0]); //将Ifrmae添加到指定位置 //追加office工具栏以及内容区域。 克隆的模板,只能一起追加。 $(_UAE.body).append(_UDOD[0]); //向内容区域添加iframe,U.D.Office.AsynWord是iframe加载之后的回调处理。 U.D.Office.Office(_UDOD[0], userinfo, fileinfo, "Word", U.M.apply(null, [[U.D.Office.AsynWord], [cb]])); //创建Office编辑器,即iframe窗体。 _UDOD = _UAE.be; //返回word的整个窗体。 } //置顶,按道理只需要置顶, else { U.D.PopupWindow(_UDOD); } return _UDOD; // 返回当前窗体 } /** * 编辑器点击关闭 */ U.D.Office.Colse = function () { // U.Word.Tools.ViewDisplayc(); // U.D.Office.WBH('Word', 'TimeColse'); } /** * office打开成功,则执行包括创建邀请协作人员,创建编辑历史,创建生成链接.创建热门模板。加载当前word文档的内容。创建光标,监控键盘输入等。 * * @param {object} 登录用户信息 * @param {object} 文档信息数组 或 null * @param {object} loading效果的元素 * @param {object} uw窗体元素(Ifrmae) */ U.D.Office.AsynWord = function (userinfo, fileinfo, loading, iframe) { // //if (UDE && UDE.UserDirectoryID == null) { // UDE = null; //} //如果文件信息不完整,则需要重新获取文件信息,fileinfo.UserDirectoryID是文件id //if (fileinfo && fileinfo.UserDirectoryID == 36) { // U.A.Request(US.CD, [US.DB, "UseStudio_Disk", "GetFileById", fileinfo.UserDirectoryID], U.D.Office.AsynWordO, ["", U.D.Office.AsynWord, userinfo, UDOD, UDFD]); //获取文件信息 //} //生成word处理 var _UW = iframe.contentWindow; //iframe 跨域变量,操作iframe中的变量 U.MD.uploading(loading); //取消loading U.Word.Tools.WETZ($(loading).Parent(), "Word"); //loading取消后,重新设置word大小,设置A3,A4,A5的大小? // 获取数据库保存的Word值 判断是否保存或者覆盖,包括创建邀请协作人员,创建编辑历史,创建生成链接.创建热门模板。加载当前word文档的内容。创建光标,监控键盘输入等。这里是iframe中的word起始点。 //转向ifame中的js的入口点。 //fileinfo ? fileinfo.UserDirectoryID : "" 如果有文件id则表示文件已经在数据库存在,如果没有id,表示是新word。 //fileinfo ? fileinfo.UserId : userInfo.userid 如果有文件信息,则所有者为该文件的创建者,否则为自己的用户id。 _UW.U.Word.Load(fileinfo ? fileinfo.UserDirectoryID : "", fileinfo, fileinfo ? fileinfo.UserId : userInfo.userid, iframe); //郑子民做的导航模式进入word的方式。 // 判断是否从首页点击banner进入编辑器 需要优化 这里需要删除 //if (U.D.Office.Flag) { // $(".U_Boom_CO_Editor_head_navigation_one", $(UDFD).Parent(5)).Child()[U.D.Office.Flag].click(); // $(".U_UI_OBY")[1].click(); // U.D.Office.Flag = null; //} } /** * 获取office指定内容,在首页打开word,传递参数只有id,需要到数据库获取完整的数据实体信息。一篇word的内容,谁创建的。创建的时间等。 * * @param {object} 返回值及回调传参 */ U.D.Office.AsynWordO = function (r) { var context = r.context, //获取回调传参 _UCB = context[1]; //回调函数名 r = r.value; //文件信息 if (r && (r = r[0])) { r = new U.Dk.M.Entity(r.UserFilesID, r.UserFilesSize, r.UserDirectoryID, r.UserFilesName, r.UserFilesName, r.UserFilesExtendName, r.UserFilesServerName, r.UserFilesAddTime, r.UseFilesServerThumbnailName, 9999, r.UserFilesModifyTime, null, 1, null, r.UserDirectoryEncrypt, null, r.UserID, r.UserName, r.UserName, r.UserThumbnailImageHead); //设置disk文件实体 } context.length >= 5 ? _UCB(context[2], r, context[3], context[4]) : _UCB(r, context[2]); //执行回调 } //#endregion //#region Excel初始化 /** * Excel打开 * * @param {object} 登录用户信息 * @param {object} 文档信息数组 * @return {object} 返回当前窗体 */ U.D.Office.Excel = function (UIF, UDE) { //数据结构转换 //弹出word窗体 //创建顶部工具栏 //创建顶部菜单 //创建word编辑区域,包括创建邀请协作人员,创建编辑历史,创建生成链接.创建热门模板。加载当前word文档的内容。创建光标,监控键盘输入等。 // var _UDOD, _UDAD, _UTF, _UDTD, _UAE, //设置变量 _UDID = (UDE && (UDE.UserDirectoryID) || UDE) || Guid.newGuid(); //判断是否存在文件 //数据结构转换 //暂时解决方案,以后会数据结构统一,包括文件夹,文件,好友等数据结构。这个有个权衡:要考虑网络传输数据大小的问题及开发速度的问题。 //由于获取首页获取出来的数据结构和在网盘获取出来的数据结构不匹配,所以这里把他传化成网盘的结构, if (UDE && UDE.UserFilesID) { //通过这个方式重新把首页数据转化成云盘的格式 UDE = new U.Dk.M.Entity(UDE.UserFilesID, UDE.UserFilesSize, UDE.UserDirectoryID, UDE.UserFilesName, UDE.UserFilesName, UDE.UserFilesExtendName, UDE.UserFilesServerName, UDE.UserFilesModifyTime, UDE.UseFilesServerThumbnailName, 0, UDE.UserFilesModifyTime, UDE.UserDirectoryEncrypt, 1, "", UDE.UserDirectoryEncrypt, UDE.UsOffice, UDE.UserId, "", "", ""); } //弹出word窗体,这个地方的判断到底是做什么的?分析是不是置顶,分析是不是打开同一个文件。? if (!(_UDOD = $("#UD_Excel" + _UDID)[0])) { //生成office //Word内容区域,由iframe构成。 _UDOD = $("#UD_Excel").clone(true); //克隆word编辑器 包含头部菜单和功能及word编辑区域 _UDOD[0].id = ""; //清除id //初始化菜单栏,包含顶部的菜单还有编辑功能 U.D.Office.Exceltools(UIF, "Excel", UDE, _UDOD[0]); //创建窗体 设置属性 _UAE = U.UI.Form({ //窗体放大缩小 resize: U.M.apply(null, [ [U.D.Office.WETZ, [_UDOD[0], "Excel"]] ]), //给窗口新id id: "UD_Word" + _UDID, //赋予样式 style: { width: "90%", height: "90%" }, //头部样式设置 htask: { style: { "top": "10px" } } // content: _UDOD[0] }); //创建顶部菜单 $(_UAE.head).addAttrArray({ "className": "" }).append(_UDOD.Child()[0]); //将Ifrmae添加到指定位置 //追加office功能区域 包含 功能菜单和编辑区域 $(_UAE.body).append(_UDOD[0]); U.D.Office.Office(_UDOD[0], UIF, UDE || _UDID, "Excel", U.D.Office.AsynExcel); //创建Office编辑器,即iframe窗体。 _UDOD = _UAE.be; //返回word的整个窗体。 } else { U.D.PopupWindow(_UDOD); } return _UDOD; // 返回当前窗体 } /** * Excel打开异步 * * @param {object} 登录用户信息 * @param {object} 文档信息数组 * @param {object} 获取存放窗体元素 * @param {object} Excel窗体元素(Ifrmae) */ U.D.Office.AsynExcel = function (userinfo, fileinfo, loading, iframe) { //生成word处理 var _win = iframe.contentWindow; //iframe 跨域变量,操作iframe中的变量 U.MD.uploading(loading); //取消loading U.Word.Tools.WETZ($(loading).Parent(), "Excel"); //loading取消后,重新设置word大小,设置A3,A4,A5的大小? var _UDE = { "UFN": { CoEd: U.D.Office.CoEd, Backup: U.M.apply(this, [ [U.D.Office.Backup, [fileinfo, _win]] ]), "Onload": U.M.apply(this, [ [U.D.Office.OLExcel, [US.userInfo, fileinfo, loading, iframe]] ]), "Save": U.M.apply(this, [ [U.D.Office.WBCWJ, [fileinfo, "Excel", loading]] ]) } }; // 获取数据库保存的Word值 判断是否保存或者覆盖,包括创建邀请协作人员,创建编辑历史,创建生成链接.创建热门模板。加载当前word文档的内容。创建光标,监控键盘输入等。这里是iframe中的word起始点。 //转向ifame中的js的入口点。 //fileinfo ? fileinfo.UserDirectoryID : "" 如果有文件id则表示文件已经在数据库存在,如果没有id,表示是新word。 //fileinfo ? fileinfo.UserId : userInfo.userid 如果有文件信息,则所有者为该文件的创建者,否则为自己的用户id。 _win.U.Excel.OPBE(fileinfo ? fileinfo.UserDirectoryID : "", fileinfo, fileinfo ? fileinfo.UserId : userInfo.userid, _UDE); // if (UDE && UDE.length == 36) { //判断是否需要重新获取文件信息 // // U.A.Request(US.Auth,"UseStudioDisk.GetFileByID", [UDE], U.D.Office.AsynWordO, ["", U.D.Office.AsynExcel, UIF, UDOD, UDFD]); //发送获取请求 // U.A.Request(US.CD, [US.DB, "UseStudio_Disk", "GetFileById", UDE], U.D.Office.AsynWordO, ["", U.D.Office.AsynExcel, UIF, UDOD, UDFD]); //发送获取请求 // } else { // var i, //设置变量 // _UW = UDFD.contentWindow, //获取window操作层 // _UDE = { // "UFN": { // CoEd: U.D.Office.CoEd, // Backup: U.M.apply(this, [ // [U.D.Office.Backup, [UDE, _UW]] // ]), // "Onload": U.M.apply(this, [ // [U.D.Office.OLExcel, [UIF, UDE, UDOD, UDFD]] // ]), // "Save": U.M.apply(this, [ // [U.D.Office.WBCWJ, [UDE, "Excel", UDOD]] // ]) // } // }, //设置方法 // _UAE = ["H", "L", "T", "XR", "D", "R", "F", "E", "CE", "FE"]; //Excel各个部分 R不懂 H 列数区域 L 列数区域 T F 原始表格 CE选中区域外部div FE 选择区域编辑区 D查看表格区域 XR标题列表 // for (i = 0; i < _UAE.length; i++) { // _UDE[_UAE[i]] = _UW.$("#UD_SYQE" + _UAE[i])[0]; //在操作层中添加该元素 并记录到变量中 // }; //循环添加 // _UW.U.Excel.OPBE(UDE ? UDE.UserDirectoryID : "", UDE, UIF.UserId, _UDE); //初始化Ecel // } } /** * 生成Excel * * @param {object} 登录用户信息 * @param {object} 文档信息数组 * @param {object} 获取存放窗体元素 * @param {object} Excel窗体元素(Ifrmae) */ U.D.Office.OLExcel = function (UIF, UDE, UDOD, UDFD) { var _UW = UDFD.contentWindow, //获取window操作层 _UDPD = $(UDOD).Parent(); //获取外部div U.MD.uploading(UDOD); //设置loading U.D.Office.WETZ(_UDPD, (_UW.U.OU.TF["TF"] = "Excel")); //设置大小 _UW.U.Excel.SetWH(); _UW.U.Excel.CNO(); //查看Excel } //#endregion //#region 此函数只是用来创建word,excel,PPT等的编辑器,没有包含word,excel,PPT等的功能。word,excel,PPT的功能包含在异步函数U.D.Office.AsynWord中,统一创建office的编辑iframe。 /** * 创建Office窗体 * * @param {element} 创建office的容器元素 * @param {object} 登录用户信息 * @param {object} 文档信息数组 或 null,用于显示文件内容 * @param {str} 类型 Word || Excel||ppt|others... * @param {function} 回调函数 */ U.D.Office.Office = function (el, userinfo, fileinfo, type, cb) { //var _disktree = US.Disk.UserDisk; //硬盘树目录,包含了该用户的所有已经加载的文件夹及文件信息 //如果文件信息传参不完整,只传递了文件的id,设置文件信息 //if (fileinfo && fileinfo.length == 36 && _disktree) { //_disktree[4] 是当前登陆用户的所有文件及文件夹json信息。 //fileinfo = _disktree[4][fileinfo] || "" //} var _file; //iframe操作的初始word,excel等文件 var _iframe = $("iframe", el)[0]; //获取office窗体,判断iframe是否存在 var _sel = $(el); //给元素el添加选择器方法 var _child = _sel.Child()[1]; _sel.css("display", "block"); //显示主体 //根据传入的文件类型设定不同的初始文件。 switch (type) { case "Word": _file = "Word.htm"; break; case "Excel": _file = "Excel.htm"; break; case "PPT": _file = "PPT.htm"; break; default: break; } //(UDE && UDE.length == 36 && _UAE) && (UDE = _UAE[4][UDE] || ""); //设置文件信息 //判断iframe是否存在,不存在则创建 if (!_iframe) { //创建容纳word,Excel,PPT等的iframe。 _iframe = $$("iframe", { "frameBorder": "0", "style": { "border": "0" }, //创建office "src": "/usercontrols/" + _file, "width": "100%", "height": "100%" }, _child); U.MD.loading(_child, true); //设置loading //var UVDD = $(".U_Boom_CO_Editor_head_navigation_two", UDOD).Child()[0]; //异步加载iframe 添加office功能 U.MD.IframeLoad(_iframe, U.M.apply(_iframe, [[cb, [userinfo, fileinfo, _child, _iframe]]])); } } /** * 用户头部生成 * * @param {object} 登录用户信息 * @param {element} 头部元素 * @param {object} 文档信息数组 */ U.D.Office.WUIF = function (UIF, UDOD, UDE) { var _UDKD, _UDAD = $("div", UDOD), //获取头部所有元素 _UDTD = $(".U_Boom_CO_Editor_head_navigation_two_r", _UDAD); //获取头部所有元素 $("input", UDOD)[0].value = (UDE && (UDE["UserallDirectoryName"] || UDE["UserFilesName"])) || "未命名文档(点击编辑)..."; _UDKD = $$("div", { "className": "U_Boom_CO_Editor_head_navigation_two_img" }); $$("img", { "onerror": U.M.ImgError, "src": U.M.GetImgU(UIF.UserThumbnailImageHead), "onclick": [ [U.M.StopBubble], [U.U.I.ViewOtherUserInfo, [UIF.UserId]] ] }, _UDKD); $$("div", { "className": "U_Boom_CO_Editor_head_navigation_username", "innerHTML": UIF.UserNickName || "" }); $(_UDTD).append(_UDKD); } //#endregion //#region 统一区域 /** * ,只需要随便传递一个元素,则可以获取指定的Window操作层 * * @param {element} Ifrmae下的元素 * @return {boject} 指定的Window操作层,即iframe中的windows对象 */ U.D.Office.WI = function (el) { // 如果没有参数,则获取当前事件聚焦的对象。 el = el || event.srcElement; //获取事件的源对象 return $("iframe", $(el).Parent({ usform: "true" }) || el)[0].contentWindow; //却换到指定的window操作层 } /** * 本地上传图片 * @param 参数一 点击事件元素 */ U.D.Office.Local = function (a) { a.click(); U.D.Office.File = a; } /** 从iframe外面的工具栏调用iframe里面的word,excel,ppt等功能。涉及到跨域调用,所以需要此函数辅助。 * 字体(大小)变化区域 基本功能的统一调用 * * @param {object} 参数数组 * @param {string} 函数名称 * @param {string} 类型 * @return {boole} boole值 例:U.D.Office.WBH("OU",'ChangeStyle',[{'fontWeight':['bold','normal']}]);调用公有工具栏OU里面的函数U.OU.ChangeStyle 并传递参数{'fontWeight':['bold','normal']} */ U.D.Office.WBH = function (type, fun, params) { //获取我要操作的word的iframe的window层, var _win = U.D.Office.WI(); //获取指定的Window操作层. //U[type][fun]等于U.OU.ChangeStyle。 _win.U[type][fun].apply(this, params); } U.D.Office.Other = function (UDE, UFN) { var _UDOD = U.D.Office.WI(); //获取指定的Window操作层 U.Word.O.O[UFN].apply(this, UDE); } /** * 背景(字体)颜色修改 * * @param {object} 点击的按钮元素 * @param {boole} 修改类型 true为修改字体 */ U.D.Office.WBYSXG = function (UDOD, TF) { var _UDFD = U.D.Office.WI(UDOD), _UDTD = event.srcElement, _UCE = {}; _UCE[TF ? "color" : "backgroundColor"] = ""; if (_UDTD != UDOD && _UDFD) { _UDFD.U.OU.ColorLiOnClick(_UDTD, [UDOD.parentNode, _UCE]); } UDOD.style.display = 'none'; } /** * 修改文件名 * * @param {object} 点击的按钮元素 */ U.D.Office.WJMXG = function (UDOD) { var _UCE, //设置变量 _UDE = U.D.Office.WI(UDOD).U; //获取指定的Window操作层的方法 _UDE = (_UDE.Word || _UDE.Excel); //判断类型 获取方法 _UCE = (_UDE["SY"] || _UDE["TF"])["ET"]; //设置用户信息 if (!U.U.L.isLogin(3) && (_UCE || _UDE.Save(U.M.apply(this, [ [U.D.Office.BCAWJMXG, ([$(UDOD).Parent({ usform: "true" }), _UCE])] ])))) { //判断是否登录 U.MR.InputTip(this, ["未命名文档(点击编辑)...", ""]); //执行input搜索框变化 $(UDOD).addAttrArray({ "onblur": [ [U.MR.InputTip, [UDOD, ["", "未命名文档(点击编辑)..."]]], [U.D.Office.AWJMXG, [UDOD]] ] }); //设置命名后不允许修改 } //修改文件名 } /** * 保存修改文件名 * * @param {object} 点击的按钮元素 * @param {object} 获取方法类 */ U.D.Office.BCAWJMXG = function (UDOD, UDE) { UDOD.id = "UD_Word" + UDE.UserDirectoryID; //设置元素id 为UD_SYQA + 文件id $("input", UDOD)[0].value = UDE.UserallDirectoryName; //修改文件名 } /** * 修改文件名 * * @param {object} 点击的按钮元素 */ U.D.Office.AWJMXG = function (UDOD) { var _UTH = UDOD.value, //获取内容 _UDH = UDOD.defaultValue; //默认内容 if (!_UTH && _UTH != _UDH) { parent.U.Dk.RE.MFN(_UET, _UTH); } //修改文件名 $(UDOD).addAttrArray({ "value": _UTH || _UDH, "onblur": null }); //设置文件名 } /** * 指定格式下载 * * @param {str} 文件id * @param {object} 文件类型 * @param {object} 方法类 */ U.D.Office.ZDGSXZ = function (UFID, UTP, UFE) { UFE.Save(U.M.apply(null, [ [U.UI.Confirm, ["是否下载该文件", [U.UP.FileGS, [UFID, UTP]]]] ])); //保存文件下载内容 } /** * 把颜色版消失 * */ U.D.Office.QCDJ = function () { U.D.Office.se = window.parent.document.getElementsByClassName("U_Boom_CO_Editor_head_features_ul_d_s"); U.D.Office.cr = $("#U_Boom_O_N_Navg_Ib"); for (var i = 0; i < U.D.Office.se.length; i++) { U.D.Office.se[i].style.display = 'none'; } for (var i = 0; i < U.D.Office.cr.length; i++) { U.D.Office.cr[i].style.display = 'none'; } }