FormUtil.js 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939
  1. if (typeof FormUtil == 'undefined') {
  2. FormUtil = {};
  3. }
  4. //tab前置回调事件
  5. //前置可以通过返回 return false组织tab切换。
  6. var onBeforeSelectTabItemCallBack=null;
  7. //tab后置回调事件
  8. var onAfterSelectTabItemCallBack=null;
  9. /**
  10. * 初始化表单tab。
  11. */
  12. FormUtil.initTab=function(){
  13. var amount=$("#formTab").length;
  14. if(amount>0){
  15. $("#formTab").tabs({
  16. onSelect:function(title,index){
  17. if(onBeforeSelectTabItemCallBack){
  18. return onBeforeSelectTabItemCallBack(title,index);
  19. }
  20. },
  21. onUnselect:function(title,index){
  22. FormUtil.changeTabStyle(index); //要放到TAB产生后,才执行这个样式的改变,方可可以生效,否则效果不一定有效
  23. if(onAfterSelectTabItemCallBack){
  24. onAfterSelectTabItemCallBack(title,index);
  25. }
  26. }
  27. });
  28. }
  29. };
  30. /**
  31. * 初始化TAB中不能隐藏的对象。
  32. */
  33. FormUtil.changeTabStyle=function(tabid){
  34. var tabidObj = $("div[tabid='"+tabid+"']"); //在产生的 DIV tab对象(由ligerTab产生的)
  35. //处理OFFICE控件中 工具栏目 在个别浏览器上有出现不能隐藏的问题
  36. FormUtil.changeTabOfficeStyle(tabidObj);
  37. //处理图片控件容器会出现 不能隐藏的问题 要结合PictureShowPlugin处理
  38. FormUtil.changeTabZoomStyle(tabidObj);
  39. };
  40. /**
  41. * 处理OFFICE控件中 工具栏目 在个别浏览器上有出现不能隐藏的问题
  42. */
  43. FormUtil.changeTabOfficeStyle=function(tabidObj){
  44. var menuBars = $("div[name='menuBar']");
  45. var offices =$("input[controltype='office']");
  46. if( menuBars.length>0 && offices.length>0 ){
  47. menuBars.each(function(index){ //把所有的OFFICE控件中 工具栏目隐藏掉
  48. $(this).css("display","none");
  49. });
  50. $("div[name='menuBar']",tabidObj).each(function(index){ //把 DIV tab对象(由ligerTab产生的)的OFFICE控件中 工具栏目显示出来
  51. var menuBarRight = $(this).attr("menuBarRight"); //读取菜单的权限
  52. if(menuBarRight!="r"){
  53. $(this).css("display","block");
  54. }
  55. });
  56. //把在TAB里面的所有的OFFICE控件有影响的l-tab-content-item样式:overflow去掉
  57. tabidObj.attr("style","");
  58. OfficePlugin.isTabItemOffice = false; //初始化图片控件样式的完成标志, 防止定时器不停止检查
  59. }
  60. };
  61. /**
  62. * 处理图片控件容器会在个别浏览器上有出现不能隐藏的问题 要结合PictureShowPlugin处理
  63. */
  64. FormUtil.changeTabZoomStyle=function(tabidObj){
  65. var pictureShows =$("input[controltype='pictureShow']");
  66. if( pictureShows.length>0 ){
  67. /**liyj注释掉的,注释掉就可以用了*/
  68. //图片控件显示处理(原因:个别浏览器有问题需要处理)
  69. /*pictureShows.each(function(index){ //把所有的图片控件容器隐藏掉
  70. var name = $(this).attr("name");
  71. var divId="div_" + name.replaceAll(":","_");
  72. $("#"+divId).css("display","none");
  73. });*/
  74. //把 DIV tab对象(由ligerTab产生的)的图片控件 显示出来
  75. $("input[controltype='pictureShow']",tabidObj).each(function(index){
  76. var name = $(this).attr("name");
  77. var divId="div_" + name.replaceAll(":","_");
  78. $("#"+divId).css("display","block");
  79. });
  80. //把 DIV tab对象(由ligerTab产生的)的图片控件在IE下面(IE6、9)大图有可能会发生偏移区域,只有做居左补上
  81. if(PictureShowPlugin.browserName=="MSIE"){
  82. $("div.wrap_div",tabidObj).each(function(index){
  83. $(this).css("text-align","left");
  84. });
  85. }
  86. PictureShowPlugin.isTabItemZoom = false; //初始化图片控件样式的完成标志,防止定时器不停止检查
  87. }
  88. };
  89. /**
  90. * 默认是进入每一个TAB的特别处理
  91. */
  92. FormUtil.initTabStyle=function(){
  93. var tabid = null;
  94. var amount=$("#formTab").length;
  95. if(amount>0){
  96. //默认是进入每一个TAB
  97. var tabid = null;
  98. $('div.l-tab-content-item').each(function(index){
  99. tabid = $(this).attr("tabid"); //选中每一个TAB
  100. if(typeof(tabid)!=undefined||tabid!=null||tabid!=""||tabid!="null"){
  101. return false;
  102. }
  103. });
  104. var tabidObj = $("div[tabid='"+tabid+"']"); //在产生的 DIV tab对象(由ligerTab产生的)
  105. //FormUtil.recursiveTabItemOffice(tabidObj);
  106. //FormUtil.recursiveTabItemZoom(tabidObj);
  107. }
  108. };
  109. /**
  110. * 递归函数每隔1.5秒,直到Office工具栏目的样式修改好才,停止!
  111. */
  112. FormUtil.recursiveTabItemOffice=function(tabidObj){
  113. window.setTimeout(function(){
  114. if(OfficePlugin.isTabItemOffice){
  115. FormUtil.changeTabOfficeStyle(tabidObj);
  116. if(OfficePlugin.isTabItemOffice){
  117. FormUtil.recursiveTabItemOffice(tabidObj);
  118. }
  119. }
  120. },1500);
  121. };
  122. /**
  123. * 递归函数每隔1.5秒,直到图片控件的容器的样式修改好才,停止!
  124. */
  125. FormUtil.recursiveTabItemZoom=function(tabidObj){
  126. window.setTimeout(function(){
  127. if(PictureShowPlugin.isTabItemZoom){
  128. FormUtil.changeTabZoomStyle(tabidObj);
  129. if(PictureShowPlugin.isTabItemZoom){
  130. FormUtil.recursiveTabItemZoom(tabidObj);
  131. }
  132. }
  133. },1500);
  134. };
  135. /**
  136. * 初始化日历控件。
  137. */
  138. FormUtil.initCalendar=function(){
  139. $("body").delegate("input.Wdate", "click",function(){
  140. var fmt=$(this).attr("dateFmt");
  141. WdatePicker({el:this,dateFmt:fmt});
  142. });
  143. };
  144. /**
  145. * 绑定对话框。 按钮或者文本框定义如下:
  146. * dialog="{name:'globalType',fields:[{src:'TYPENAME',target:'m:mainTable:name'},{src:'TYPEID',target:'m:mainTable:address'}],query:[{'id':'bm','name':'ORGID','isMain':'true'}]}"
  147. *
  148. * name:对话框的别名 fields:为字段映射,可以有多个映射。 src:对话框返回的字段。 target:需要映射的控件名称。dialogQuery:向自定义对话框传递的参数字段
  149. */
  150. FormUtil.initCommonDialog=function(){
  151. //先把主表中dialog对话框的包含字段中有只读的权限时,只能把对话框功能删除(子表情况的放在CustomForm.js中处理了)
  152. $("a.extend",$(".formTable")).each(function(){ //只读时,历遍超链接中自定义对话框的按钮
  153. var extend=$(this);
  154. var jsonStr = extend.attr('dialog');
  155. if(jsonStr != null && 'undefined' != jsonStr.toLowerCase() && jsonStr.length>2 ){
  156. var jsonObj = eval('(' + jsonStr + ')');
  157. var fileds = jsonObj.fields;
  158. for ( var i = 0; i < fileds.length; i++) {
  159. if($.isEmpty(fileds[i].target))//如果为空
  160. continue;
  161. var ds = $(".formTable [name$=':"+fileds[i].target+"']").not("[name^='s:']");
  162. if(ds.length<1){
  163. extend.remove(); //主表字段在只读时,其内容直接为值,所以当对话框读取对应主表字段时没有,证明字段是只读的,所以要删除
  164. break;
  165. }else{
  166. var mark = false;
  167. ds.each(function(index){ //主表字段
  168. var right = $(this).attr("right");
  169. if(right=="r"||right=="rp"){
  170. extend.remove(); //只读和只读提交时删除
  171. mark = true;
  172. return false;
  173. }
  174. });
  175. if(mark){
  176. break;
  177. }
  178. }
  179. }
  180. }
  181. });
  182. $("body").delegate("[dialog]", "click", function(){
  183. var obj=$(this);
  184. var dialogJson=obj.attr("dialog");
  185. var json=eval("("+dialogJson+")" );
  186. var name=json.name;
  187. var fields=json.fields;
  188. var parentObj=obj.closest("[formtype]");
  189. var isGlobal=parentObj.length==0;
  190. var paramsValueString = "" ;
  191. var queryArr = json.query;
  192. var isMain,preSelector,isReturn=false ;
  193. if(!queryArr==false && queryArr.length>0){
  194. for(var i=0;i<queryArr.length;i++){
  195. isMain = queryArr[i].isMain ;
  196. if(isMain=="true"){
  197. preSelector = ".formTable" ;
  198. }else{
  199. preSelector = "div[type='subtable']" ;
  200. }
  201. //解析获取对应的数据
  202. $(preSelector+" :hidden[name$=':"+queryArr[i].id+"ID']").each(function(){
  203. if($(this).val()!=""){
  204. paramsValueString += queryArr[i].name + "=" + $(this).val() +"&" ;
  205. return false ;
  206. }
  207. });
  208. if(paramsValueString.indexOf(queryArr[i].name)<0){
  209. $(preSelector+" [name$=':"+queryArr[i].id+"']").each(function(){
  210. var self = $(this) ;
  211. if(self.val()!=""){
  212. paramsValueString += queryArr[i].name + "=" + $(this).val() +"&" ;
  213. return false ;
  214. }else{
  215. var selfClass = self.attr("class") ;
  216. if(!selfClass==false){
  217. if(selfClass.indexOf("validError")>=0){
  218. isReturn = true ;
  219. $.ligerDialog.warn('请填写好--'+self.attr("lablename"),'提示');
  220. return false ;
  221. }
  222. }
  223. }
  224. });
  225. }
  226. if(isReturn) return false ;
  227. }
  228. }
  229. CommonDialog(name,function(data){
  230. var len=data.length;
  231. for(var i=0;i<fields.length;i++){
  232. var json=fields[i];
  233. var src=json.src;
  234. var targets=json.target.split(','),target;
  235. while(target=targets.pop()){
  236. if(!target)return;
  237. var filter="[name$=':"+target+"']";
  238. //在子表中选择
  239. var targetObj=isGlobal?$(filter):$(filter,parentObj);
  240. //单选
  241. if(len==undefined){
  242. targetObj.val(data[src]);
  243. targetObj.trigger("change");
  244. }
  245. //多选
  246. else{
  247. for(var k=0;k<len;k++){
  248. var dataJson=data[k];
  249. if(json.data){
  250. json.data.push(dataJson[src]);
  251. }
  252. else{
  253. var tmp=[];
  254. tmp.push(dataJson[src]);
  255. json.data=tmp;
  256. }
  257. }
  258. targetObj.val(json.data.join(","));
  259. targetObj.trigger("change");
  260. }
  261. }
  262. }
  263. },paramsValueString);
  264. });
  265. };
  266. /**
  267. * 初始化统计函数事件绑定
  268. */
  269. FormUtil.InitMathfunction = function(t){
  270. if(t){
  271. $("input",t).trigger("change");
  272. }
  273. else{
  274. $("input").live('change',FormMath.doMath);
  275. }
  276. };
  277. /**
  278. * 获取目标控件的值是否为指定值
  279. */
  280. FormUtil.getTargetVal = function(t,obj){
  281. var type = obj.attr("type");
  282. if(obj.is("select")){ //下拉框
  283. var val = obj.find('option:selected').val();
  284. if(val==t.value)
  285. return true;
  286. return false;
  287. }else if(type == "radio" || type =="checkbox"){//单选框,多选框
  288. var temp = false;
  289. obj.each(function(){
  290. var me = $(this),
  291. state = me.attr("checked"),
  292. val = me.val();
  293. if(state&&t.value.indexOf(val)>-1)
  294. temp = true;
  295. });
  296. return temp;
  297. }else{
  298. return false;
  299. }
  300. };
  301. /**
  302. * 获取是否所有的选择框字段都是指定值
  303. */
  304. FormUtil.validHasChange = function(chooseField){
  305. var result = true;
  306. for(var i=0,c;c=chooseField[i++];){
  307. var obj = FormUtil.getTargetObj(c.key);
  308. if(!FormUtil.getTargetVal(c,obj))
  309. result = false;
  310. }
  311. return result;
  312. };
  313. /**
  314. * 进行变更字段和表的变更
  315. * @param changes
  316. */
  317. FormUtil.doChange = function(choiceKey,changes){
  318. for(var i=0,c;c=changes[i++];){
  319. //对表进行变更
  320. if(!$.isEmpty(c.fieldtype) && c.fieldtype == '1')
  321. FormUtil.doChangeTable(choiceKey,c);
  322. else//对字段进行变更
  323. FormUtil.doChangeField(choiceKey,c);
  324. }
  325. };
  326. /**
  327. * 变换预处理
  328. */
  329. FormUtil.preChange = function(choice,changes,t){
  330. var choiceKey = [],
  331. trace = $changeObj.data("formtrace");
  332. for(var i=0,c;c=choice[i++];){
  333. choiceKey.push(c.key);
  334. if(trace){
  335. for(var j=0,n;n=changes[j++];){
  336. var traceCall = trace[n.key+'_'+n.type];
  337. if(traceCall){
  338. var me = null;
  339. if(!$.isEmpty(n.fieldtype) && n.fieldtype == '1')
  340. me = $("div[type='subtable'][tablename='"+n.key+"']");
  341. else{
  342. me = FormUtil.getTargetObj(n.key);
  343. }
  344. traceCall.call(me,n);
  345. me.trigger("blur");
  346. delete trace[n.key+'_'+n.type];
  347. }
  348. }
  349. }
  350. }
  351. if(t){
  352. $changeFunc.push({choiceKey:choiceKey,changes:changes});
  353. }
  354. };
  355. FormUtil.isAttachment = function(obj){
  356. var type = obj.attr("controltype");
  357. if(!$.isEmpty(type) && type== 'attachment')
  358. return true;
  359. else
  360. return false;
  361. }
  362. //字段变换方法
  363. var $fieldChange = {
  364. 1:function(c){//隐藏
  365. var self = $(this).val('');
  366. if(FormUtil.isAttachment(self)){
  367. self.parent("div").hide();
  368. }else{
  369. self.hide();
  370. self.parents("label").hide();
  371. //隐藏自定义对话框按钮
  372. self.closest("span").siblings().hide();
  373. }
  374. }
  375. ,
  376. 2:function(c){//非隐藏
  377. var self = $(this);
  378. if(FormUtil.isAttachment(self)){
  379. self.parent("div").show();
  380. }else{
  381. self.show();
  382. self.parents("label").show();
  383. //显示自定义对话框按钮
  384. self.closest("span").siblings().show();
  385. }
  386. }
  387. ,
  388. 3:function(c){//只读
  389. var self = $(this);
  390. if(self.is("a"))//对选择器的特殊处理
  391. return;
  392. if(FormUtil.isAttachment(self)){
  393. self.siblings("a[field='"+c.key+"']").hide();
  394. self.siblings(".attachement").find("a.cancel").each(function(){
  395. $(this).hide();
  396. });
  397. }else{
  398. self.attr("disabled",true);
  399. }
  400. }
  401. ,
  402. 4:function(c){//非只读
  403. var self = $(this);
  404. if(self.is("a"))//对选择器的特殊处理
  405. return;
  406. if(FormUtil.isAttachment(self)){
  407. self.siblings("a[field='"+c.key+"']").show();
  408. self.siblings(".attachement").find("a.cancel").each(function(){
  409. $(this).show();
  410. });
  411. }else{
  412. self.removeAttr("disabled");
  413. }
  414. }
  415. ,
  416. 5:function(c){//必填
  417. var self = $(this),
  418. validate = self.attr("validate");
  419. if(self.is("a"))//对选择器的特殊处理
  420. return;
  421. if(FormUtil.isAttachment(self)){
  422. self.siblings("a.selectFile").addClass("validError");
  423. self.parent().attr('right','b');
  424. }else{
  425. self.addClass("validError");
  426. if(!validate){
  427. self.attr("validate","{required:true}");
  428. }
  429. else{
  430. validate = eval("("+validate+")");
  431. if(!validate.required){
  432. validate.required = true;
  433. self.attr("validate",JSON2.stringify(validate));
  434. }
  435. }
  436. if(!$.isEmpty(self.val()))
  437. self.removeClass("validError");
  438. else{
  439. if(self.hasClass("Wdate")){
  440. self.css("border","1px solid red");
  441. }
  442. }
  443. }
  444. }
  445. ,
  446. 6:function(c){//非必填
  447. var self = $(this),
  448. validate = self.attr("validate");
  449. if(self.is("a"))//对选择器的特殊处理
  450. return;
  451. if(FormUtil.isAttachment(self)){
  452. self.siblings("a.selectFile").removeClass("validError")
  453. self.parent().attr('right','w');
  454. }else{
  455. if(validate){
  456. validate = eval("("+validate+")");
  457. if(validate.required){
  458. delete validate.required;
  459. self.attr("validate",JSON2.stringify(validate));
  460. }
  461. //删除样式
  462. self.removeClass("validError");
  463. if(self.hasClass("Wdate")){
  464. self.css("border","1px solid #999999");
  465. }
  466. }
  467. }
  468. }
  469. ,
  470. 7:function(c){//置空
  471. var self = $(this);
  472. if(self.is("a"))//对选择器的特殊处理
  473. return;
  474. if(FormUtil.isAttachment(self))
  475. self.siblings(".attachement").html('');
  476. if(self.attr("type")=="checkbox"||self.attr("type")=="radio")
  477. self.removeAttr("checked");
  478. $(this).val('');
  479. }
  480. };
  481. /**
  482. * 获取关联的需要变动的字段
  483. */
  484. FormUtil.getTargetObj = function(filter){
  485. if(!$changeObj){
  486. return $("[name='"+filter+"']");
  487. }
  488. var formtype = $changeObj.parents("[formtype]"),
  489. me = null;
  490. if(formtype&&formtype.length>0){
  491. me = $("[name='"+filter+"']",formtype);
  492. }
  493. else{
  494. me = $("[name='"+filter+"']");
  495. }
  496. return me;
  497. };
  498. /**
  499. * 字段变换
  500. * @param {} changeField
  501. */
  502. FormUtil.doChangeField = function(choiceKey,c){
  503. var me = FormUtil.getTargetObj(c.key);
  504. if(!me||me.length==0)return;
  505. var changeType = c.type,
  506. traceCall = null;
  507. if(changeType!='8'){
  508. var changeFun = $fieldChange[changeType];
  509. if(changeType%2){
  510. traceCall = $fieldChange[++changeType];
  511. }
  512. else{
  513. traceCall = $fieldChange[--changeType];
  514. }
  515. me.each(function(){
  516. changeFun.call(this,c);
  517. });
  518. }
  519. else{
  520. var reduceSet = c.cascade.reduce,
  521. oldHtml = '';
  522. me.each(function(){
  523. var self = $(this),
  524. myType = self.attr('type');
  525. if($(this).is("a"))//对选择器的特殊处理
  526. return;
  527. if(myType=='radio'||myType=='checkbox'){
  528. var spanPar = self.parents("span");
  529. for(var i=0,c;c=reduceSet[i++];){
  530. if(self.val()==c.id){
  531. spanPar.remove();
  532. }
  533. }
  534. }
  535. else{//下拉框
  536. isSelect = true;
  537. oldHtml = self.html();
  538. var options = self.find("option");
  539. for(var i=0,c;c=reduceSet[i++];){
  540. for(var j=0,n;n=options[j++];){
  541. var t = $(n);
  542. if(!t.val())continue;
  543. if(t.val()==c.id){
  544. t.remove();
  545. }
  546. }
  547. }
  548. }
  549. });
  550. FormUtil.putInFormTrace(choiceKey,"tracedata",c.key,oldHtml);
  551. traceCall = function(c){
  552. var oldHtmlObj = $changeObj.data("tracedata");
  553. if(oldHtmlObj){
  554. oldHtml = oldHtmlObj[c.key];
  555. $(this).each(function(){
  556. var curValue = $(this).val();
  557. $(this).html(oldHtml).val(curValue).trigger("change");
  558. });
  559. delete oldHtmlObj[c.key];
  560. }
  561. };
  562. }
  563. FormUtil.putInFormTrace(choiceKey,"formtrace",c.key+'_'+c.type,traceCall);
  564. me.trigger("blur");
  565. };
  566. /**
  567. * 将变动轨迹放入控件的缓存数据中
  568. */
  569. FormUtil.putInFormTrace = function(choiceKey,datakey,key,value){
  570. for(var j=0,n;n=choiceKey[j++];){
  571. var changeObj = FormUtil.getTargetObj(n);
  572. if(!changeObj)continue;
  573. var formTrace = changeObj.data(datakey);
  574. if(!formTrace){
  575. formTrace = {};
  576. formTrace[key] = value;
  577. changeObj.data(datakey,formTrace);
  578. }
  579. else{
  580. formTrace[key] = value;
  581. }
  582. }
  583. };
  584. //表表换方法集合
  585. var $tableChange = {
  586. 1:function(){//隐藏
  587. var self = $(this);
  588. self.hide();
  589. },
  590. 2:function(){//非隐藏
  591. var self = $(this);
  592. self.show();
  593. },
  594. 3:function(){//只读(不可以添加)
  595. var self = $(this);
  596. $('a.add',self).hide();
  597. self.find('[formType]').prev().unbind('contextmenu');
  598. $('td',self).find('input,select,textarea').attr("disabled","disabled");
  599. $('td',self).find('a').hide();
  600. },
  601. 4:function(){//非只读(可以添加)
  602. var self = $(this);
  603. $('a.add',self).show();
  604. $('td',self).find('input,select,textarea').removeAttr("disabled","disabled");
  605. $('td',self).find('a').show();
  606. },
  607. 5:function(){//必填
  608. var self = $(this);
  609. var y =self.attr('right');
  610. self.attr('right','b');
  611. self.attr("yright",y);
  612. },
  613. 6:function(){//非必填
  614. var self = $(this);
  615. var y = self.attr("yright");
  616. self.attr('right',y?'w':y);
  617. },
  618. 7:function(){//置空
  619. var self = $(this);
  620. $(":text,select",self).each(function(){
  621. $(this).val('');
  622. });
  623. $("textarea",self).each(function(){
  624. var s= $(this);
  625. //处理附件
  626. if(FormUtil.isAttachment(s))
  627. s.siblings(".attachement").html('');
  628. s.val('');
  629. });
  630. $("input[type='radio']",self).each(function(){
  631. $(this).removeAttr("checked");
  632. });
  633. $("input[type='checkbox']",self).each(function(){
  634. $(this).removeAttr("checked");
  635. });
  636. }
  637. };
  638. /**
  639. * 表变换
  640. * @param {} c
  641. */
  642. FormUtil.doChangeTable = function(choiceKey,c){
  643. var me = $("div[type='subtable'][tablename='"+c.key+"']"),
  644. changeType = c.type;
  645. var changeFun = $tableChange[changeType];
  646. if(changeType%2){
  647. traceCall = $tableChange[++changeType];
  648. }
  649. else{
  650. traceCall = $tableChange[--changeType];
  651. }
  652. me.each(function(){
  653. changeFun.call(this,c);
  654. });
  655. FormUtil.putInFormTrace(choiceKey,"formtrace",c.key+'_'+c.type,traceCall);
  656. };
  657. var $changeObj = null,
  658. $changeFunc = [],
  659. $changeNoChoise = [];
  660. FormUtil.ChangeNoChoise = function(){
  661. FormUtil.doChange([],$changeNoChoise);
  662. };
  663. /**
  664. * 联动设置的初始化
  665. */
  666. FormUtil.InitGangedSet = function(d){
  667. $changeNoChoise = [];
  668. for(var i=0,c;c=d[i++];){
  669. var choisefield = eval("("+c.choisefield+")"),
  670. changefield = eval("("+c.changefield+")");
  671. if(choisefield&&choisefield.length==0){
  672. $changeNoChoise = $changeNoChoise.concat(changefield);
  673. }
  674. for(var j=0,m;m=choisefield[j++];){
  675. var changeObj = $("*[name='"+m.key+"']");
  676. changeObj.die("change").live("change",function(e){
  677. $changeFunc = [];
  678. $changeObj = $(e.target);
  679. var key = $changeObj.attr("name");
  680. //当一个select控件绑定了多次事件时,需要多次验证这个控件的所选值
  681. //比如 性别这个字段,在联动中设置了选择'男'时隐藏一个字段,选择'女'时 显示一个字段,此时需要2次验证
  682. if(!key)return;
  683. for(var x=0,n;n=d[x++];){
  684. if(n.choisefield.indexOf(key)>-1){
  685. var curChoise = eval("("+n.choisefield+")"),
  686. r = FormUtil.validHasChange(curChoise);
  687. FormUtil.preChange(curChoise,eval("("+n.changefield+")"),r);
  688. }
  689. }
  690. //延迟处理:等待该变换字段的所有还原方法调用完以后再进行变换
  691. if($changeFunc.length>0){
  692. for(var y=0,o;o=$changeFunc[y++];){
  693. FormUtil.doChange(o.choiceKey,o.changes);
  694. }
  695. }
  696. });
  697. changeObj.trigger("change");
  698. }
  699. }
  700. FormUtil.ChangeNoChoise();
  701. };
  702. /**
  703. * 新增子表记录时,触发联动字段change,使新增记录保持合适的联动状态
  704. */
  705. FormUtil.triggerChoice = function(newRow){
  706. $("[name]",newRow).each(function(){
  707. var me = $(this),
  708. name = me.attr("name"),
  709. choiceName = FormUtil.findWithChange(name);
  710. if(choiceName){
  711. var choiceObj = $("[name='"+choiceName+"']"),
  712. val = choiceObj.val();
  713. choiceObj.trigger("change");
  714. }
  715. });
  716. };
  717. /**
  718. * 遍历联动设置记录,查找 应该触发哪个字段
  719. */
  720. FormUtil.findWithChange = function(name){
  721. if(typeof bpmGangedSets == 'undefined')return null;
  722. for(var i=0,c;c=bpmGangedSets[i++];){
  723. var choisefield = eval("("+c.choisefield+")"),
  724. changefield = eval("("+c.changefield+")");
  725. if(choisefield&&choisefield.length==0){
  726. return null;
  727. }
  728. for(var j=0,m;m=changefield[j++];){
  729. if(m.key==name){
  730. return choisefield[0]["key"];
  731. }
  732. }
  733. }
  734. };
  735. /**
  736. * 绑定自定义查询。 按钮或者文本框定义如下:
  737. * query="{name:'globalType',evt:'click',fields:[{src:'TYPENAME',target:'m:mainTable:name'},{src:'TYPEID',target:'m:mainTable:address'}]}"
  738. *
  739. * name:自定义查询的别名 fields:为字段映射,可以有多个映射。 src:对话框返回的字段。 target:需要映射的控件名称。
  740. */
  741. FormUtil.initCommonQuery=function(){
  742. $("[query]").live("keyup change", function(event){
  743. var obj = $(this),
  744. queryJson=obj.attr("query"),
  745. json = eval("("+queryJson+")"),
  746. evt = json.evt,
  747. next = obj.next();
  748. if(evt.key!=event.type){
  749. return;
  750. }
  751. if("carriage_return" == evt.name && event.keyCode != evt.code){
  752. return;
  753. }
  754. var obj=$(this);
  755. var queryJson=obj.attr("query");
  756. var json = eval("("+queryJson+")");
  757. var name = json.name;
  758. var cond = json.cond;
  759. var value = obj.val();
  760. if(next&&next.length > 0){
  761. //如果是 选择器类型字段 则获取 选择器的ID字段值 作为查询条件
  762. if(next.hasClass("link")&&next[0].tagName == "A"){
  763. value = $("input[name='"+obj.attr("name")+"ID']").val();
  764. }
  765. }
  766. if(!value){
  767. return;
  768. }
  769. var fields=json.fields;
  770. var parentObj=obj.closest("[formtype]");
  771. var isGlobal=parentObj.length==0;
  772. var querydataStr = "{"+cond+":\""+value+"\"}";
  773. var queryCond = {alias:name,querydata:querydataStr,page:1,pagesize:10};
  774. DoQuery(queryCond,function(data){
  775. if(data.errors){
  776. return;
  777. }
  778. for(var i=0;i<fields.length;i++){
  779. var json=fields[i];
  780. var src=json.src;
  781. var targets=json.target;
  782. var target;
  783. while(target=targets.pop()){
  784. if(!target)return;
  785. var filter="[name$=':"+target+"']";
  786. //在子表中选择
  787. var targetObj=isGlobal?$(filter):$(filter,parentObj);
  788. if(data.list.length<1){
  789. targetObj.val("");
  790. continue;
  791. }
  792. var dataArr = [] ;
  793. for(var k=0;k<data.list.length;k++){
  794. var dataJson=data.list[k];
  795. if(dataArr){
  796. dataArr.push(dataJson[src.toLowerCase()]);
  797. }
  798. else{
  799. var tmp=[];
  800. tmp.push(dataJson[src.toLowerCase()]);
  801. dataArr=tmp;
  802. }
  803. }
  804. targetObj.val(dataArr.join(","));
  805. targetObj.trigger("change").trigger("blur");
  806. }
  807. }
  808. });
  809. }).trigger("change");
  810. };
  811. FormUtil.initExtLink = function(){
  812. $("body").delegate("a[linktype]","click",function(){
  813. var linktype = $(this).attr("linktype");
  814. if(!linktype){
  815. return;
  816. }
  817. var type = parseInt(linktype);
  818. var winArgs="dialogWidth:800px;dialogHeight:600px;help:0;status:1;scroll:1;center:1";
  819. switch (type) {
  820. case 4://用户单选
  821. case 8://用户多选
  822. var userid = $(this).attr("refid");
  823. url = __ctx+"/platform/system/sysUser/getByUserId.ht?canReturn=2&userId="+userid;
  824. //window.showModalDialog(url,"",winArgs);
  825. /*KILLDIALOG*/
  826. DialogUtil.open({
  827. height:600,
  828. width: 800,
  829. title : '用户多选',
  830. url: url,
  831. isResize: true,
  832. });
  833. break;
  834. case 5://角色
  835. case 17://角色
  836. var roleId = $(this).attr("refid");
  837. ShowExeInfo.showRole(roleId);
  838. break;
  839. case 6://组织
  840. case 18://组织
  841. var orgId = $(this).attr("refid");
  842. ShowExeInfo.showOrg(orgId);
  843. break;
  844. case 7://岗位
  845. case 19://岗位
  846. var posId = $(this).attr("refid");
  847. ShowExeInfo.showPos(posId);
  848. break;
  849. case 20://流程引用
  850. var runId = $(this).attr("refid");
  851. var url=__ctx+"/platform/bpm/processRun/info.ht?isOpenDialog=1&link=1&runId="+runId;
  852. var args="dialogWidth:900px;dialogHeight:700px;help:0;status:1;scroll:1;center:1";
  853. //window.showModalDialog(url,"",args);
  854. /*KILLDIALOG*/
  855. DialogUtil.open({
  856. height:700,
  857. width: 900,
  858. title : '',
  859. url: url,
  860. isResize: true,
  861. });
  862. break;
  863. }
  864. });
  865. };
  866. /**
  867. * 初始化word套打按钮
  868. **/
  869. FormUtil.initWordTemplate=function(){
  870. $("body").delegate("[templateAlias]", "click", function(){
  871. var obj=$(this);
  872. var templateAlias=obj.attr("templateAlias");
  873. var businessKey = $('#businessKey').val();
  874. if(!businessKey) businessKey = 0;
  875. var previewUrl = __ctx+'/platform/system/sysWordTemplate/preview_'+templateAlias+'.ht?pk='+businessKey;
  876. $.openFullWindow(previewUrl.getNewUrl());
  877. });
  878. };