(function(){ // sk的外延模块,一个类桌面式的web应用框架. if (!window.app) window.app = {}; //-- 用应用开发者配置的部分,因不同应用而不同------------------------------------------------- // sk:字典的类目列表,应根据应用的不用由应用软件程序员进行按{v,t}数组格式进行定义。 // 应用系统在此调整应用的字典分类10000000以下的id为关键性字典条目,受系统保护 // 下面这些代码(v)的值在整个系统中都可能被硬引用,所以不能随意修改 app.root = "/"; // 应用的根和网站根的相对位置 sk.config.respath = app.root + 'sk/'; // sk包安装的位置 sk.rc.procurl = app.root + "serv.php"; // sk应用命令处理模块所在位置 // 默认的客户区是无边框和补白的,如果有则要设置这个常量以进行补偿使界面尺寸正确 app.scrollborderbottomtop = 0; app.scrollborderleftright = 0; app.upload_getprogress_delay = 1500; // 上传文件时取上传状态的时间间隔 //-- 用应用开发者配置的部分,因不同应用而不同-----end-------------------------------------------- app.dicttype = [ // 字典类型值及其含义被硬编码引用,不能随意更改 {v:'bmlist' , t:'部门名称'}, {v:'dwxz' , t:'单位性质'}, {v:'hylb' , t:'行业类别'}, {v:'zzmm' , t:'政治面貌'}, {v:'xl' , t:'学历'}, {v:'xw' , t:'学位'}, {v:'xlxz' , t:'学历性质'}, {v:'mz' , t:'民族'}, {v:'zcdj' , t:'职称等级'}, {v:'jndj' , t:'技能等级'}, {v:'kswtlb' , t:'考试委托类别'}, {v:'kswtxm' , t:'考试委托项目'}, {v:'ksksmap' , t:'考生表导入字段映射'}, {v:'ksgfmap' , t:'不规范输入兑换映射'}, {v:'wzlm' , t:'网站栏目'}, {v:'dqdm1' , t:'行政区划代码(到州)'} ]; // ==== 通用功能和过程集中定义=========================== // dbgrid用------------------ app.xbeditop = { editcreater : function(parent, w, h) { return parent.selectmapvt({w:w, h:h}, [{v:'男',t:'男'},{v:'女', t:'女'}]); } } app.rqeditop = { get : function() {return this.val().trim().dbc2sbc();}, editcreater : function(parent, w, h) {return parent.inputdate({w:w,h:h, cls:"defaultedit"});}, check : function(v) { if (v) { if (v.dbc2sbc().isdate()) return true; else { alert("非法的日期值"); return false; } } return true; } }; app.sbeditopp = function(len, nnull, dlist, showfunc) { return { editcreater : dlist ?function(parent, w, h) {return parent.inputwithlist({w:w,h:h, cls:"defaultedit"}, dlist).sbc(len);} :function(parent, w, h) {return parent.input('text', {w:w,h:h, cls:"defaultedit"}).sbc(len);}, get : function() {return this.val().trim().dbc2sbc();}, show : showfunc, notnull : nnull }; }; app.nurqeditop = { get : app.rqeditop.get, editcreater : app.rqeditop.editcreater, check : app.rqeditop.check, notnull : true }; app.uinteditop = { editcreater : function(parent, w, h) {return parent.input('text', {w:w,h:h, cls:"defaultedit"}).uint(8);}, set : function(v) {this.val(parseint(v,10));}, get : function() {return this.val().length==0||this.val()=='-'?'0':parseint(this.val().dbc2sbc(),10)+'';} }; app.uinteditopp = function(len) { return { editcreater : function(parent, w, h) {return parent.input('text', {w:w,h:h, cls:"defaultedit"}).uint(len);}, set : function(v) {this.val(parseint(v,10));}, get : function() {return this.val().length==0||this.val()=='-'?'0':parseint(this.val().dbc2sbc(),10)+'';} } }; app.inteditop = { editcreater : function(parent, w, h) {return parent.input('text', {w:w,h:h, cls:"defaultedit"}).integer(8);}, set : function(v) {this.val(parseint(v,10));}, get : function() { if (this.val().length==0||this.val()=='-') return '0'; var v = parseint(this.val().dbc2sbc(),10); if (isnan(v)) { this.val("0"); return "0"; } return v + ''; } }; app.inteditopp = function(len) { return { editcreater : function(parent, w, h) {return parent.input('text', {w:w,h:h, cls:"defaultedit"}).integer(len);}, set : function(v) {this.val(parseint(v,10));}, get : function() { if (this.val().length==0||this.val()=='-') return '0'; var v = parseint(this.val().dbc2sbc(),10); if (isnan(v)) { this.val("0"); return "0"; } return v + ''; } }; }; app.realeditop = { editcreater : function(parent, w, h) {return parent.input('text', {w:w,h:h, cls:"defaultedit"}).real(8);}, set : function(v) {this.val(parsefloat(v));}, get : function() { if (this.val().length==0||this.val()=='-') return '0.0'; var v = parsefloat(this.val().dbc2sbc(),10); if (isnan(v)) { this.val("0.0"); return "0.0"; } return v + ''; } }; app.realeditopp = function(len) { return { editcreater : function(parent, w, h) {return parent.input('text', {w:w,h:h, cls:"defaultedit"}).real(len);}, set : function(v) {this.val(parsefloat(v));}, get : function() { if (this.val().length==0||this.val()=='-') return '0.0'; var v = parsefloat(this.val().dbc2sbc(),10); if (isnan(v)) { this.val("0.0"); return "0.0"; } return v + ''; } }; }; app.cjshowfunc = function(rd, colname) { var cj = float(rd[colname]); if (isnan(cj)) { this.text("nan"); this.cls("deffs am red fb"); } if (cj < 0.0) { this.text(cj==-2?'违纪':(cj==-1?'缺考':cj)); this.cls("deffs am red fb"); } else { this.text(sk.kit.formatnnumber(cj, 2)); this.cls("deffs am"); } }; app.cjeditop = { editcreater : function(parent, w, h) {return parent.input('text', {w:w,h:h, cls:"defaultedit"}).real(6);}, set : function(v) {this.val(parsefloat(v));}, get : function() { if (this.val().length==0||this.val()=='-') return '0.00'; var v = parsefloat(this.val().dbc2sbc())+''; if (isnan(v)) return '0.00'; v = math.round(v * 100)/100 + ""; var dp = v.indexof('.'); if (dp < 0) return v + '.00'; var dl = v.length - dp - 1; if (dl == 0) return v + '00'; if (dl == 1) return v + '0'; return v; }, show : app.cjshowfunc }; app.boolshowfunc = function(rd, colname) { this.settext(rd[colname]=='t'?'√':' '); } app.booleditop = { show : function(rd, colname) {this.settext(rd[colname]=='t'?'√':' ');}, editcreater : function(parent) {return parent.input("checkbox", {});}, set : function(v) {this.val(v=='t');}, get : function() {return this.val()?'t':'f';} }; app.booleditopp = function(ts, fs) { return { show : function(rd, colname) {this.settext(rd[colname]=='t'?ts:fs);this.cls("fb", rd[colname]=='t'?"+":"-");}, editcreater : function(parent) {return parent.input("checkbox", {});}, set : function(v) {this.val(v=='t');}, get : function() {return this.val()?'t':'f';} }; }; app.booleditop2 = app.booleditopp('√', ' '); app.mltextop = { editcreater : function(parent, w) { var el = parent.el('textarea', {w:w, h:200, cls:'celltextarea'}); return el; }, show : function(rd, colname) {this.sethtml(rd[colname]?rd[colname].esctag():' ');} }; app.mltextoph = function(h){ return { editcreater : function(parent, w) { var el = parent.el('textarea', {w:w, h:h, cls:'celltextarea', css:{resize:'none'}}); return el; }, show : function(rd, colname) {this.sethtml(rd[colname]?rd[colname].esctag():' ');} }; }; app.mltextminh = function(minh){ return { editcreater : function(parent, w, h) { var el = parent.el('textarea', {w:w, h:h, cls:'celltextarea'}); el.css("minheight", minh + 'px'); return el; }, show : function(rd, colname) {this.sethtml(rd[colname]?rd[colname].esctag():' ');} }; }; app.mltextopp = function(eh, sls, cls) { return { editcreater : function(parent, w, h) { var el = parent.el('textarea', {w:w, h:eh?eh:h, cls:'celltextarea' + (cls?(' '+cls):'')}); return el; }, show : function(rd, colname) { if (sk.isfunction(sls)) var sl = sls(); else sl = sls; if (sl) this.text(rd[colname]); else this.sethtml(rd[colname]?rd[colname].esctag():' '); } }; }; app.datarowproc = function(row) {row.setclass('row');}; app.emptyrowproc = function(row) {row.setclass('nonerow');}; app.emptyrowproc2 = function(row) {row.setclass('nullrow');}; // --- 打印页面 app.print = function() { window.print(); }; // 更严格的确认框,需要打yes进一步确认. app.confirmdlg = function(title, msg, func, ctt) { if (!ctt) ctt='yes'; var dlg = sk.dlg.dialog(360, title); var lay = dlg.layout(); lay.line().span({cls:"fz12"}).html(msg); var inp = lay.line().input("text", {w:100, lab:'请输入“'+ctt+'”进行确认'}).sbc(); lay.line("am").input("button", {value:'执行'}).click(function(){ if (inp.val().dbc2sbc().touppercase()==ctt) func(dlg); }); dlg.center(); settimeout(function() {inp.focus(1);}, 10); }; // 一般性的确认框,和sk.dlg.confirm的不同在于,sk那个的ok函数体内要求回调函数以阻塞方式工作,当ok返回true时关闭窗口, // app.confirm则和app.confirmdlg一样,将关闭窗口的工作交由应用程序完成,回调函数接受一个参数dlg即为窗口对象,这样就 // 可以使回调以异步方式工作了。 app.confirm = function(title, msg, func, defok) { var dlg = sk.dlg.dialog(360, title); var lay = dlg.layout(); lay.line().div({w:340, html:msg}); var cl = lay.line("am"); var bt1 = cl.button('确定', {w:50, mar:80}).click(function(){func(dlg);}); var bt2 = cl.button('取消', {w:50}).click(function(){dlg.close();}); dlg.center(); settimeout(function(){(defok?bt1:bt2).focus(1);},10); return dlg; }; //========================================================= app.logout = function() { sk.dlg.confirmdlg('退出','确定要登出系统吗?', function(){ sk.rc.get("sk.usm.logout", {}, "正在登出...", function(){window.location.reload();}); }); }; app.modipwd = function() { var dlg = sk.dlg.dialog(270, '修改密码'); var lay = dlg.layout(); var cl = lay.line();var orgpwd = cl.input('password', {w:150, lab:' 请输入密码'}); cl = lay.line();var pwd1 = cl.input('password', {w:150, lab:'请输入新密码'}); cl = lay.line();var pwd2 = cl.input('password', {w:150, lab:'请再输入一次'}); var pane = lay.line().el('div', {cls:'error'}); cl = lay.line('am'); cl.input('button', {value:'提交', w:60, attr:{onclick:function(){ if (orgpwd.val() == '') {orgpwd.focus();pane.settext('请输入现在的登录密码');return;} if (pwd1.val() == '') {pwd1.focus();pane.settext('请输入新的登录密码');return;} if (pwd2.val() == '') {pwd2.focus();pane.settext('请再输入一次新的登录密码');return;} if (pwd1.val() != pwd2.val()) {pane.settext('您两次输入的新密码不一致');return;} pane.settext(''); settimeout(function() { sk.rc.get("sk.usm.modipwd", {"oldpwd":orgpwd.getattr('value').md5(), "newpwd":pwd1.getattr('value').md5()}, "正在提交数据...", function(){ dlg.close(); sk.dlg.messagedlg('消息','密码修改成功,请在下次登录时使用新密码。'); }); }, 10); }}}); dlg.center(); }; app.title = function(str) { var el = sk.dom.getel('headtitle'); if (arguments.length > 0) { el.settext(str); return str; } else return el.gettext(); }; app.gettoolpane = function() { return sk.dom.getel("toolpane"); }; // 在指定位置建立一个一行三列表,布局为左\中\右 app.createlmr = function(root, wl, wr, va) { var tb = root.tbody({cs:"0", css:{w:"100%", h:"100%"}}); var tr = tb.tr({attr:{valign:va?va:'center'}}); var td = tb.parent(); td.l = tr.td({css:{w:wl+'px'}}).div({cls:"al", css:{pa:'0px'}}); td.m = tr.td({ }).div({cls:"am", css:{pa:'0px'}}); td.r = tr.td({css:{w:wr+'px'}}).div({cls:"ar", css:{pa:'0px'}}); return td; }; app.winresizeafter = sk.nop; // 当浏览器窗口尺寸变化后时,应用程序的相应调整动作,默认为空操作,由具体应用进行再定义。 app.scroll = null; // 滚动区 app.scrollhead = null; // 滚动区上方的表头条 app.fix = null; // 滚动区左侧的固定区 app.fixr = null; // 滚动区右侧的固定区 app.foot = null; // 脚底区 app.init = function (op) { // op.headheight指定滚动区上方和表头条高度,不指定则没有这个部分,app.scrollhead=null // op.fixwidth 指定滚动区左侧的固定区宽度,不指定则没有这个部分,app.fix = null // op.fixrwidth 指定滚动区右侧的固定区宽度,不指定则没有这个部分,app.fixr = null // op.foot 是否创建脚底区条 // op.adjustclient : 窗户区尺寸调整函数,默认的动作已能应付大部分情况,所以一般不使用这个指标,而多是通过对app.winresizeafter进行再定义以加入默认动作以外的操作 // 这个指标是覆盖了默认的动作,而非附加,所以大部分时候是不会使用的。 if (app.userenv.su) { app.checkjur = function(){return true;}; app.issuperuser = true; } else if (app.userenv.jur) { var js = app.userenv.jur; app.userjur = {}; for (var i = 0; i < js.length; i++) app.userjur[js[i].token] = true; app.checkjur = function(token){ return app.userjur[token]; }; } else app.checkjur = function(){return false;}; app.userconfdata = app.userenv.conf; if (!app.userconfdata) app.userconfdata = {}; // 设置用户参数的段,以确定当前使用的参数集 app.setconfseg = function(sn) { // sn为参数分段标识名 var confseg = sn; if (!app.userconfdata[confseg] || app.userconfdata[confseg].length == 0) app.userconfdata[confseg] = {}; app.getconf = function(pn, defaultvalue) { // 如果指定参数没有找到则可以指定并返回一个缺省值,如果找到则缺省值无效 var rv = app.userconfdata[confseg][pn]; if (rv) return rv; if (defaultvalue) { app.userconfdata[confseg][pn] = defaultvalue; return defaultvalue; } return null; }; app.setconf = function(pn, pv) { app.userconfdata[confseg][pn] = pv; }; app.saveconf = function(func) { // 保存成功后的处理函数 sk.rc.apostjson("sk.usm.saveconfig", app.userconfdata, '保存设置...', func); }; }; app.printdiv = $("app_print"); // 打印画布 var appclient = app.clientroot = $("root"); if (!op) op = {}; app.winheight = sk.bwc.getheight(); if (op.foot) { // 创建页脚工具条 var root = appclient; appclient = root.div(); var tb = root.tbody({cs:"0", css:{w:"100%"}}); var tr = tb.tr({attr:{valign:'center'}}); app.foot = tr.td().div({h:27, cls:"footpane"}); app.sysbutton = tr.td({w:70}); var td = app.sysbutton.div({cls:"footpane", h:27}).div({ attr:{"onmouseover":function(){sk.dom.addclass(this, "sysbtnhover");}, "onmouseout" :function(){sk.dom.removeclass(this, "sysbtnhover");} } ,css:{ textalign :'right', height :'18px', lineheight:'18px', mat:'4px', mab:'4px', cursor:'default', fontsize:'9pt', fontweight:'bold', borderleft:'3px dotted #555' } }).text('系统设置'); var tablesetupafter = null; var tabunita = null; function tablesizesetup(){ if (!tablesetupafter) return; var dlg = sk.dlg.dialog(220, '表格尺寸'); var lay = dlg.layout(); var cl = lay.line(); var tw = cl.input('text', {w:40, value:app.getconf("tabwidth"), lab:'表宽', mar:4}).integer(4); var twu= cl.selectmapvt({w:80, value:app.getconf("tabwidthunit")}, tabunita ); if (op.nonetablewidthsetup) { cl.hide(); tw.val(1000); } cl = lay.line(); var rh = cl.input('text', {w:30, value:app.getconf("rowheight"), lab:'行高', mar:30}).integer(3); var ps = cl.input('text', {w:30, value:app.getconf("pagesize"), lab:'每页行数'}).uint(3); var pane = lay.line().div({cls:'error'}); cl = lay.line('am'); cl.input('button', {value:'提交', w:60}).click(function(){ if (tw.val() == '') {tw.focus();pane.settext('表宽为空');return;} if (rh.val() == '') {rh.focus();pane.settext('行高为空');return;} if (ps.val() == '') {ps.focus();pane.settext('行数为空');return;} if (parseint(ps.val(), 10) <= 0) ps.val(1); app.setconf("tabwidth" , tw.val()); app.setconf("tabwidthunit" , twu.val()); app.setconf("rowheight" , rh.val()); app.setconf("pagesize" , ps.val()); pane.settext(''); app.saveconf(function() { tablesetupafter( app.getconf("tabwidth"), app.getconf("tabwidthunit"), app.getconf("rowheight"), app.getconf("pagesize") );} ); dlg.close(); }); dlg.center(); } app.regtablesetup = function(func, norate) { tablesetupafter = func; if (norate) tabunita = [{v:'px', t:'象素'}]; else tabunita = [{v:'px', t:'象素'}, {v:'%', t:'百分比'}]; }; td.click(function(){ var bt = app.sysbutton; var sm = sk.dlg.popbox(bt.x() + bt.w() - 1,bt.y(),160); sm.tomenu(); if (op.createmenu) { var w = op.createmenu(sm); if (w) sm.dw = w; sm.addmenuline(); } if (tablesetupafter) sm.addmenuitem('表格设置', tablesizesetup); if (app.checkjur('用户管理')) sm.addmenuref('用户管理', app.root + "admin.php?mod=usm"); if (app.checkjur('字典管理')) sm.addmenuref('字典管理', app.root + "admin.php?mod=dict"); if (app.checkjur('系统维护')) sm.addmenuref('系统维护', app.root + "admin.php?mod=su"); sm.adjustpos(); }.bind(td)); } var rp = null; if (op.fixwidth || op.fixrwidth) { tb = appclient.tbody({cs:"0", css:{w:"100%"}}); tr = tb.tr({attr:{valign:'top'}}); if (op.fixwidth) app.fix = tr.td({css:{w:op.fixwidth + "px"}}).div({cls:'al',css:{w:op.fixwidth + "px"/*, overflow:'hidden'*/}}); rp = tr.td().div({cls:'al'}); } else { rp = appclient; tr = null; } if (op.headheight) { app.scrollhead = rp.div({h:op.headheight, cls:'al tablehead'}); app.scroll = rp.div({cls:'al'}); } else app.scroll = rp.div({cls:'al'}); if (op.fixrwidth) app.fixr = tr.td({css:{w:op.fixrwidth + "px"}}).div({cls:'al',css:{w:op.fixrwidth + "px"}}); app.scroll.addclass("scrollclient"); if (op.adjustclient) app.adjustclient = op.adjustclient; var body = sk.dom.root(); body.addlister("onresize", function() { app.adjustclient(); }.throttel()); app.adjustclient.throttel()(); if (!op.uploaddebug) { app.uploadifm = appclient.iframe({w:"0", h:"0", css:{border:"0px"}}); } else { // 上传用iframe调试窗口, var debug = sk.dlg.window(1400, "debug", true); app.uploadifm = debug.layout().line().div().iframe({w:"1400", h:"300", css:{border:"0px"}}); debug.center(); } delete app.userenv; }; app.initupload = function (parent) { app.uploadifm = parent.iframe({w:"0", h:"0", css:{border:"0px"}}); } app.adjustclient = function () { app.winheight = sk.bwc.getheight(); app.winwidth = sk.bwc.getwidth(); var fh = (app.foot?app.foot.getheight():0); var sw = app.winwidth - 8 - (app.scrollborderleftright?app.scrollborderleftright:0); var sh = app.winheight - app.scroll.gettop() - fh - (app.scrollborderbottomtop?app.scrollborderbottomtop:0); if (app.scroll) app.scroll.setheight(sh); if (app.fix) { app.fix.setheight(app.winheight - app.fix.gettop() - fh); sw = sw - app.fix.getwidth(); } if (app.fixr) { app.fixr.setheight(app.winheight - app.fixr.gettop() - fh); sw = sw - app.fixr.getwidth(); } app.scroll.setwidth(sw); app.winresizeafter(sw, sh); }; })(); // 上传下载 (function(){ app.downloadorgurl = function(url) { if (app.uploading()) { sk.dlg.messagedlg("error", "有其他附件正在上传..."); return; } app.uploadifm.reset(); var root = app.uploadifm.dom.root(); root.sethtml(""); var form = root.form({attr:{ id : 'download_form', method: "post", action: url }}); form.em.submit(); //app.uploadifm.reset(); }; app.download = function(mod, data) { if (app.uploading()) { sk.dlg.messagedlg("error", "有其他附件正在上传..."); return; } app.uploadifm.reset(); var root = app.uploadifm.dom.root(); root.sethtml(""); var form = root.form({attr:{ id : 'download_form', method: "post", action: sk.rc.procurl }}); form.input("hidden", {attr:{name:"mod", value:mod}}); form.input("hidden", {attr:{name:"data", value:o(data).tojson()}}); form.em.submit(); }; app.uploading = function() { return window.uploadend; }; // 上传是一个较为复杂的过程,app.upload方法需要以一个this进行调用,即app.upload.call(...) // 这个this对象上可以包含以下一些方法用来处理上传过程中的不同阶段工作,具体做什么由应用程序自定. // this.begin():上传刚开始时被调用一次.(默认什么也不做) // this.uploadding(currentsize, totalsize):上传过程中定时调用以反馈上传的进度.(默认什么也不做) // this.complate():上传刚完成时调用一次,但这时尚不知道上传的结果,服务器有可能还正在处理上传的数据而尚未返回最终的状态信息.(默认什么也不做) // 要注意的是uploadding和complate不是由服务器调用所以时序可能是混乱的,有时甚至不被调用,当服务器上无php_apc模块时就有这种情况. // 所以这两个函数并不可靠,不应用于处理主要逻辑,complate大部分情况都可由下面的三个函数代替. // this.ok(str) :上传完成并成功后,即服务器返回了成功标志和附加信息str时,以附加信息(无标志头)为参数调用一次.(默认将信息str弹出在sk.dlg.popmsg中) // this.error(str):上传完成但失败后,即服务器返回了失败标志和附加信息str时,以附加信息(无标志头)为参数调用一次.(默认将信息str弹出在alert中) // this.end(succflag, returnstr):上传完成后,以成功标志succflag和完整的返回信息returnstr(含标志头和附加信息)为参数调用一次.(默认什么也不做) // 标志头由两位字符组成,ok表示成功,er表示失败,后跟附加信息.例如:ok上传成功、er文件太大...。 // 以上特性要求服务器用returnupload进行返回才有. app.upload = function(mod, data, maxsize) { if (app.uploading()) { sk.dlg.messagedlg("error", "有其他附件正在上传..."); return; } var self = this; var ret = sk.rc.sget("sys.uniqid.id", {}); if (!ret){ return; } app.uploadifm.reset(); // reset也可在上传完成后再调用 var root = app.uploadifm.dom.root(); root.sethtml(""); var form = root.form({attr:{ id : 'upload_form', method:"post", encoding :"multipart/form-data", // 在ie上不加这个不上传文件 enctype :"multipart/form-data", action :sk.rc.procurl+"?mod=" + mod + "&data=" + encodeuricomponent(o(data).tojson()) + "&noencode=true" }}); window.startprogress = startprogress; form.input("hidden", {attr:{name:"apc_upload_progress", id:'key', value:ret.id}}); // 由于php运行内存限制,将文件尺寸限制在12m,一般是够了,如果不够,可放大这个参数,但需要重新配置php,memory_limit=更大内存可用量 form.input('hidden', {attr:{name:"max_file_size", value:maxsize}}); var f = form.input("file", {attr:{name:'upload', id:"upload"}}); f.setattr("onchange", function(){ parent.startprogress.call(self, ret.id, uploadend); form.em.submit(); }); f.em.click(); }; var uploadfinish = false; // 上传完成后由php返回的代码在iframe中调用 function uploadend(t) { uploadfinish = true; // app.uploadifm.reset(); // iframe重建,为下次上传做好准备 var succ = false; if (t.substr(0,2)=='ok') { if (this.ok) this.ok(t.substr(2)); else sk.dlg.popmsg(t.substr(2)); succ = true; } else { if (this.error) this.error(t.substr(2)); else alert(t.substr(2)); } if (this.end) this.end(succ, t); window.startprogress = null; window.uploadend = null; } // 上传过程中取上传进度 var getprogreesserror = 0; function getprogress(key) { if (uploadfinish) return; var self = this; sk.rc.aget("sys.getprocss.null", {'key':key}, null, function(ret){ var fs = ret.fs; if (fs.total == 0) { if (++getprogreesserror < 10) { settimeout(function(){getprogress.call(self, key);}, app.upload_getprogress_delay); return; } } else { if (self.uploadding) self.uploadding(fs.current, fs.total); } getprogreesserror = 0; if (fs.total > fs.current) settimeout(function(){getprogress.call(self, key);}, app.upload_getprogress_delay); else { uploadfinish = true; if (self.complate) self.complate(); } }); } // 开始上传前调用 function startprogress(key, endfunc) { var self = this; if (self.begin) self.begin(); window.uploadend = endfunc.bind(this); uploadfinish = false; settimeout(function(){getprogress.call(self, key);}, app.upload_getprogress_delay); } // 2016.7.21增加一个自带上传进度指示器的上传函数,取自网上报名中的examks.js部分 app.uploadfile = function(mod, param, maxsize, endfunc) { if (app.uploading()) { sk.dlg.messagedlg("error", "有其他附件正在上传..."); return; } var self = {}; var box = sk.dlg.popbox(0, 0, 200, 50); self.tt = box.div({cls:"am", css:{pa:"8px"}}).text("正在上传数据..."); self.pr = box.div({cls:"am", css:{pa:"4px"}}).div({w:190, h:10, css:{border:"1px solid #000000"}}); self.prog = self.pr.div({w:"0", h:10, css:{bgc:"red"}}); self.box = box; box.adjustpos().center(); box.hide(); self.begin = function() { self.box.show(); self.pr.show(); self.prog.setwidth(0); }; self.uploadding = function(current, total) { self.prog.setwidth((self.pr.getwidth()-2)*current/total); } self.complate = function() { self.tt.text("上传完毕,正在保存数据...") self.pr.hide(); }; self.end = function(f, t) { if (f) endfunc(t.substr(2)); self.box.close(); }; app.upload.call(self, mod, param, maxsize); } // 引入sdict字典 sk.initstaticdict(); })(); //---------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------- (function(){ if (!window.ut) window.ut = {}; ut.today = function() { return (new date()).string(); }; ut.dialog = function(name, cw, title, cbf) { if (!name) name = 'dialog'; var dlg = sk.dlg.dialog(cw, title, cbf) dlg.moveafter = function() { lset.setseg(name); lset.set("winx", this.win.x()); lset.set("winy", this.win.y()); lset.save(); } lset.setseg(name); var x = lset.get("winx"), y = lset.get("winy"); if (x!==null) dlg.win.x(x).y(y); else dlg.center(); return dlg; }; ut.window = function(name, cw, title, cm, noclose) { if (!name) name = 'fixwindow'; var win = sk.dlg.window(cw, title, cm, noclose); win.moveafter = function() { lset.setseg(name); lset.set("winx", this.win.x()); lset.set("winy", this.win.y()); lset.save(); } lset.setseg(name); var x = lset.get("winx"), y = lset.get("winy"); if (x!==null) win.win.x(x).y(y); else win.center(); return win; }; ut.box = function(name, cw, title, closemode, sbubble, noclosebtn) { if (!name) name = 'toolbox'; var win = sk.dlg.box(cw, title, closemode, sbubble, noclosebtn); win.moveafter = function() { lset.setseg(name); lset.set("winx", this.win.x()); lset.set("winy", this.win.y()); lset.save(); } lset.setseg(name); var x = lset.get("winx"), y = lset.get("winy"); if (x!==null) win.win.x(x).y(y); else win.center(); return win; } ut.rswindow = function(name, cw, ch, title, cm, noclose) { if (!name) name = 'rswindow'; lset.setseg(name); var w = lset.get("width", cw); var h = lset.get("height", ch); var win = sk.dlg.rswindow(w, h, title, cm, noclose); win.client.resizeafter = function() { if (!win.maxed) { lset.setseg(name); lset.set("width", this.w()); lset.set("height", this.h()); lset.save(); } } win.moveafter = function() { lset.setseg(name); lset.set("winx", this.win.x()); lset.set("winy", this.win.y()); lset.save(); } lset.setseg(name); var x = lset.get("winx"), y = lset.get("winy"); if (x!==null) win.win.x(x).y(y); else win.center(); return win; }; // 基于本地存储的参数记录 var lset = ut.lset = { name : 'oaconfig', data : o(), seg : 'public', load : function() { if (window.localstorage) { var s = localstorage.getitem(this.name); if (s) { this.data = o(s.json_parse()); } else { this.data = o(); } } else { this.data = o(); } }, save : function() { if (window.localstorage) { localstorage.setitem(this.name, this.data.tojson()); } }, clear : function() { this.data = o(); localstorage.removeitem(this.name); //localstorage.clear(); }, setseg : function(s) { this.seg = s; }, get : function(fn, defv) { var segname = this.seg; var sd = this.data[segname]; if (!sd) { if (defv) { this.data[segname] = {}; this.data[segname][fn] = defv; return defv; } return null; } else { if (sd[fn]) return sd[fn]; if (defv) { sd[fn] = defv; return defv; } else return null; } }, set : function(fn, v) { var segname = this.seg; var sd = this.data[segname]; if (!sd) { this.data[segname] = {}; } this.data[segname][fn] = v; } }; })();