$(function() { CustomForm = { onEditCallBack:null, tables: {}, init : function() { var self=this; self.initUI(); self.initComdify(); self.validate(); }, //处理添加和删除按钮。 handButton:function(table,canWrite){ var self=this; if(!canWrite) { $(".add",table).addClass("disabled"); $(".del",table).addClass("disabled"); return; }; $(".add",table).click(function(){ self.add(table); //TODO self.initSubQuery(); self.subSelectorInit(); }); table.delegate(".del", "click", function(){ var t = $(this).closest('[formtype]'), brother = t.next('[formtype]').length?t.next('[formtype]'):t.prev('[formtype]'); t.remove(); if(brother) FormUtil.InitMathfunction(brother); }); }, //处理块模式和表内编译模式下千分位 initComdify:function(){ $("div[type='custform']").delegate('[showtype]', 'blur',function (){ CustomForm.delaComdify($(this)); }); }, //处理弹出框模式下千分位 initComdifyForWindow:function(){ $("[formtype='window']").delegate('[showtype]', 'blur',function(){ CustomForm.delaComdify($(this)); }); }, //处理千分位 delaComdify:function(varObj){ var me=$(varObj); var value = me.val(); var json=null; try{ var jsonStr=me.attr("showtype"); json=eval('('+jsonStr+')'); } catch(err){} if(json!=null){ var coinvalue=json.coinValue; var iscomdify=json.isShowComdify; var decimallen=json.decimalValue; //去除货币标签 if (coinvalue && value.split(coinvalue) != -1) { var ary = value.split(coinvalue); value = ary.join(""); } if (value.indexOf(',') != -1) { value = $.toNumber(value); } if(iscomdify && iscomdify=='1'){ var value = $.comdify(value); } // 小数处理 if (decimallen > 0 && value) { var zeroLen = ''; if (value.indexOf('.') != -1) { var ary = value.split('.'); var temp = ary[ary.length - 1]; if (temp.length > 0 && temp.length < decimallen) { for (var i = 0; i < decimallen- temp.length; i++) { zeroLen = zeroLen + '0'; } value = value + zeroLen; } } else { for (var i = 0; i < decimallen; i++) { zeroLen = zeroLen + '0'; } value = value + '.' + zeroLen; } } //添加货币标签 if (coinvalue && value) { value = coinvalue + value; } } me.val(value); }, /** * 初始化表单界面。 * * @param parent */ initUI : function(parent) { $('input[type="checkbox"]').each(function() { var value=$(this).val(); var data=$(this).attr('data'); if(!data||data==''||data=='null')return; var ary=data.split(","); for(var i=0;i').attr('name', name).val(val)); //修改表格的文本显示。 var filter="[fieldName='"+name+"']"; var objTd=$(filter,row); if(objTd.length>0){ var controltype = $(this).attr('controltype'); if(!$.isEmpty(controltype) && controltype=='attachment'){ AttachMent.insertHtml(objTd,val); }else if(!$.isEmpty(controltype) && controltype=='select'){ var text = $(this).find("option:selected").text(); objTd.text(text); }else{ objTd.text(val); } } $(this).val(''); }); //回填checkbox的值。 form.find('input:checkbox,input:radio').each(function() { var name=$(this).attr('name'); var value=$(this).val(); var filterHidden="input[name='"+ name +"']"; var isChecked=($(this).attr("checked")!=undefined); var obj=$(filterHidden,row); var filter="[fieldName='"+name+"']"; var objTd=$(filter,row); var val=(isChecked)?value:""; if(obj.length==0){ row.append($('').attr('name', name).val(val)); } else{ var existVal = obj.val()=="" ? val : obj.val() ; if(existVal!="" && val!=""){ existVal += "," +val; } obj.val(existVal); val = existVal; } if(objTd.length>0){ objTd.text(val); } }); }, _add : function(table, newRow, beforeElement) { //处理newRow的字段的必填 $("input,textarea,select",newRow).each(function(){ var me=$(this); //处理默认日期 if (me.is('.Wdate[displayDate=1]') && $.isEmpty(me.val())){ var datefmt = me.attr("datefmt"); var nowDate=new Date().Format(datefmt); me.val(nowDate); } var validRule = me.attr("validate"); if ( validRule != null && 'undefined' != validRule.toLowerCase() && validRule.length>2 ){ var json = eval('(' + validRule + ')'); if(json.required){ me.addClass("validError"); } } }); if (beforeElement) { $(beforeElement).before(newRow); } //在最后面加入 else { table.find('[formtype]:last').after(newRow); } //初始化界面 this.initUI(newRow); //添加右键绑定 this.addBind(newRow, table); FormUtil.triggerChoice(newRow); //删除必填样式 if(table.hasClass('validError')){ table.removeClass('validError'); } }, /** * 添加行数据的右键事件绑定。 * @param row * @param table */ addBind: function(row, table) { //是否需要编辑菜单项目 //如果该表弹出窗口定义,那么就不需要编辑菜单项目。 var needEdit = (this.tables[table.attr('tableName')].data('form') != null); var menu = this.getMenu(needEdit); row.bind("contextmenu", function(e) { menu.target = e.target; menu.show({top : e.pageY,left : e.pageX}); return false; }); }, /** * 编辑行数据。 * @param table * @param row */ edit : function(table, row) { var self=this; var tableName = table.attr('tableName'); //获取表单 var form = $(this.tables[tableName].data('form')); //对表单数据进行初始化 self.initFormData(form,row); form.data('row', row); this.openWin('编辑', form, table, null, function(form, table) { var v = form.data('validate'); var rtn=v.valid(); if(!rtn) return false; var row = form.data('row'); //对表单进行遍历 self.setRowData(form,row); return true; }); }, initFormData:function(form,row){ form.find('input:text,textarea,select,input[type="hidden"]').each(function() { var name= $(this).attr('name'); var value = row.find('[name="' + name+ '"]').val(); $(this).val(value); }); form.find('input:checkbox,input:radio').each(function(){ var name=$(this).attr("name"); var chkValue=$(this).val(); var value=row.find('[name="' + name+ '"]').val(); if(value.indexOf(chkValue)!=-1){ $(this).attr("checked","checked"); } }); }, setRowData:function(form,row){ var self=this; //对表单进行遍历 form.find('input:text, textarea,input[type="hidden"],select').each(function() { var name=$(this).attr('name'); var val=$(this).val(); //修改隐藏域的数据值 var objHidden=$("input[name='"+name+"']",row); objHidden.val(val); //修改表格的文本显示。 var filter="[fieldName='"+name+"']"; var objTd=$(filter,row); if(objTd.length<=0) return true; //处理附件 var controltype = $(this).attr('controltype'); if(!$.isEmpty(controltype) && controltype=='attachment'){ AttachMent.insertHtml(objTd,val); }else{ objTd.text(val); } }); form.find('input:checkbox,input:radio').each(function(){ var name=$(this).attr('name'); var objHidden=$("input[name='"+name+"']",row); objHidden.val(""); //修改表格的文本显示。 var filter="[fieldName='"+name+"']"; var objTd=$(filter,row); if(objTd.length>0){ objTd.text(""); } }); form.find('input:checkbox:checked,input:radio:checked').each(function(){ var name=$(this).attr('name'); var value=$(this).val(); var objHidden=$("input[name='"+name+"']",row); var filter="[fieldName='"+name+"']"; var objTd=$(filter,row); var hidValue=objHidden.val(); if(hidValue){ objHidden.val(hidValue +"," +value); objTd.text(hidValue +"," +value); } else{ objHidden.val(value); objTd.text(value); } }); }, /** * 获取验证器。 * @param target 为一个表单。 * @returns */ getValidate : function(target) { return target.form({ /** * 错误消息处理 */ errorPlacement : function(el, msg) { var element=$(el),corners =['right center','left center'],flipIt= element.parents('span.right').length > 0; element.addClass('validError'); //添加必填样式 var parentTd = element.closest("td"); if(parentTd){ var formTitle = parentTd.prev("td.formTitle"); if(formTitle){ var span = $("span.red", formTitle); if(!span || span.length==0){ formTitle.append($("*")); } } } if(element.hasClass("myeditor")){ setTimeout(function(){ element = element.next(); element.css("border","1px solid red"); },1000); }else if(element.hasClass("Wdate")||element.is('textarea')){ element.css("border","1px solid red"); }else if(element.is("select")||element.attr('type')&&(element.attr('type')=='checkbox'||element.attr('type')=='radio')){ var name = element.attr('name'); if(!name)return; var priElement = $("*[name='"+name+"']",$("span.select_contain_span")); if(priElement.length>0)return; element.removeClass('validError'); var errorSpan = $('').css({"border":"1px solid red","padding":"1px"}).addClass("select_contain_span"); element.before(errorSpan); errorSpan.append(element); } if(!$(msg).is(':empty')){ element.qtip({ overwrite:false, content : msg, position:{ my:corners[flipIt?0:1], at:corners[flipIt?1:0], viewport:$(window) }, show:{ effect: function(offset) { $(this).slideDown(100); } }, hide:{ event:'click mouseleave', leave: false, fixed:true, delay:200 }, style:{ classes:'ui-tooltip-red' } }); }else{ element.qtip("destroy"); } }, /** * 成错误消息 */ success : function(el) { var element=$(el); if(element.hasClass("myeditor")){ element = element.next(); element.css("border",""); }else if(element.hasClass("Wdate")||element.is('textarea')){ element.css("border","1px solid #999"); }else if(element.is("select")||element.attr('type')&&(element.attr('type')=='checkbox'||element.attr('type')=='radio')){ var selectSpan = element.parents("span.select_contain_span"); if(!selectSpan||selectSpan.length==0){ var name = element.attr('name'); if(!name)return; var priElement = $("*[name='"+name+"']",$("span.select_contain_span")); if(!priElement||priElement.length==0)return; var tipSpan = priElement.parents("span.select_contain_span"); var formtype = priElement.parents("[formtype]"); if(formtype&&formtype.length>0){ $("[name='"+name+"']",formtype).each(function(){ $(this).removeClass('validError'); $(this).qtip("destroy"); $(this).unbind('mouseover'); }); } else{ $("[name='"+name+"']").each(function(){ $(this).removeClass('validError'); $(this).qtip("destroy"); $(this).unbind('mouseover'); }); } tipSpan.before(priElement); tipSpan.remove(); } else{ selectSpan.before(element); selectSpan.remove(); } }else if(element.attr('type')=='subtable'){ } element.removeClass('validError'); element.qtip("destroy"); element.unbind('mouseover'); } ,rules:com.hotent.form.rule.CustomRules }); }, validate:function(conf){ return this.valid.valid(conf); }, //处理有数据格式定义的数据。 handNumberData:function(obj){ var value=$(obj).val(); var showType=$(obj).attr("showtype"); if(!showType) return value; try{ showType=showType.replaceAll("'","\""); var json=jQuery.parseJSON(showType); var coinvalue = json.coinValue; var isShowComdify = json.isShowComdify; if (coinvalue != null && coinvalue != '' && value.split(coinvalue) != -1) { var ary = value.split(coinvalue); value = ary.join(""); } if (isShowComdify && value.split(",") != -1) { var temp = value.split(","); value = temp.join(""); } } catch(err){} return value; }, /** * 获取数据。 * 返回json数据。 */ getData: function() { var self=this; // 主表数据 var main = { fields:{} }; //取主表的字段。 $("input:text[name^='m:'],input:hidden[name^='m:'],textarea[name^='m:'],select[name^='m:']").each(function() { var name = $(this).attr('name'); var value=self.handNumberData(this); main.fields[name.replace(/.*:/, '')] = value; }); $("textarea[name^='m:'].myeditor").each(function(num) { var name = $(this).attr('name'); var data=getEditorData(editor[num]); main.fields[name.replace(/.*:/, '')] =data; $(this).val(data); }); //设置单选按钮。 self.setMainRadioData(main.fields); //设置复选框。 self.setMainCheckBoxData(main.fields); //子表数据 var sub = []; $('div[type=subtable][right=w || right=b][show=true||undefined]').each(function() { var table = { tableName: $(this).attr('tableName'), fields: [] }; $(this).find('[formtype]:visible').each(function() { var row = {}; var objRow=$(this); $("input:text[name^='s:'],input[type='hidden'][name^='s:'],textarea[name^='s:'],select[name^='s:']",objRow).each(function() { var name = $(this).attr('name').replace(/.*:/, ''); var value=self.handNumberData(this); row[name] = value; }); //设置复选框按钮的数据。 self.setSubCheckBoxData(objRow,row); //设置单选按钮的数据 self.setSubRadioData(objRow, row); table.fields.push(row); }); sub.push(table); JSON2.stringify(sub); }); //意见 var opinion = []; $('textarea[name^=opinion]').each(function() { opinion.push({ name: $(this).attr('name').split(':')[1], value: $(this).val() }); }); var data = {main: main, sub: sub, opinion: opinion}; return JSON2.stringify(data); }, /** * 设置子表的radio单选按钮字段。 * @param dataObj */ setSubRadioData:function(objParent,dataObj){ var operatorObj = $('input:radio', objParent); this.setRadioData(dataObj, operatorObj); }, /** * 设置主表的radio单选按钮字段。 * @param dataObj */ setMainRadioData:function(dataObj){ var operatorObj = $('input[name^=m]:radio'); this.setRadioData(dataObj, operatorObj); }, setRadioData:function(dataObj, operatorObj){ $(operatorObj).each(function() { var name = $(this).attr('name').replace(/.*:/, ''); var value= $(this).val(); if($(this).attr("checked")!=undefined){ dataObj[name]=value; } }); }, setCheckBoxData:function(dataObj, operatorObj, checkedObj){ //将所有复选框选址清空。 $(operatorObj).each(function() { var name = $(this).attr('name').replace(/.*:/, ''); dataObj[name]=""; }); //复选框取值。 $(checkedObj).each(function() { var name = $(this).attr('name').replace(/.*:/, ''); var value= $(this).val(); if(dataObj[name]==""){ dataObj[name]=value; } else{ dataObj[name]+="," + value; } }); }, /** * 设置子表复选框的数据 * @param objParent * @param dataObj */ setSubCheckBoxData:function(objParent,dataObj){ var operatorObj = $('input:checkbox',objParent); var checkedObj = $('input:checkbox:checked',objParent); this.setCheckBoxData(dataObj, operatorObj, checkedObj); }, setMainCheckBoxData:function(dataObj){ var operatorObj = $('input[name^=m]:checkbox'); var checkedObj = $('input[name^=m]:checkbox:checked'); this.setCheckBoxData(dataObj, operatorObj, checkedObj); }, /** * 打开操作数据窗口。 * @param title 窗口标题 * @param form 窗口对象。 * @param table 表 * @param beforeElement * @param callback 回调函数 */ openWin : function(title, form, table, beforeElement, callback) { var formProperty=table.data("formProperty"); var width=formProperty.width+20; var height=formProperty.height+100; var self=this; form.data('beforeElement', beforeElement); var win = $.ligerDialog({target:form, width:width, height:height, title : title, showMax : true, showToggle : true, onClose : true, showButton : true, buttons : [ { text : "确定", onclick: function (item, dialog) { var result = callback(form, table, form.data('beforeElement')); if(!result) return; if(self.onEditCallBack!=null){ self.onEditCallBack(title); } dialog.close(); } } ] }); //初始化表单界面 this.initUI(form); win.show(); }, /** * 获取右键菜单。 * @param needEdit * @returns */ getMenu : function(needEdit) { var self=this; //判断菜单是否存在,不存在则新建菜单。 if ((needEdit && this.menuWithEdit) || (!needEdit && this.menu)) { return needEdit ? this.menuWithEdit : this.menu; } else { var menu; var items = [ { text : '在前面插入记录', click : function() { var row = $(menu.target).closest('[formtype]'); var table = row.closest('div[type=subtable]'); self.add(table, row); //TODO self.subSelectorInit(); self.initSubQuery(); self.handRow('add',table); } }, { text : '在后面插入记录', click : function() { var row = $(menu.target).closest('[formtype]'); var table = row.closest('div[type=subtable]'); row = row.next('[formtype]:visible'); if (row.length == 0) { row = null; } self.add(table, row); //TODO self.subSelectorInit(); self.initSubQuery(); self.handRow('add',table); } }, { line : true }, { text : '编辑', click : function() { var row = $(menu.target).closest('[formtype]'); var table = row.closest('div[type=subtable]'); self.edit(table, row); } }, { text : '删除此记录', click : function() { var t = $(menu.target).closest('[formtype]'), table = t.closest('div[type=subtable]'), brother = t.next('[formtype]').length?t.next('[formtype]'):t.prev('[formtype]'); t.remove(); self.handRow('del',table); if(brother) FormUtil.InitMathfunction(brother); } }, { line : true }, { text : '向上移动', click : function() { var t = $(menu.target).closest('[formtype]'); var prev = t.prev('[formtype]:visible'); if (prev.length > 0) { prev.before(t); } var table = t.closest('div[type=subtable]'); self.handRow('add',table); } }, { text : '向下移动', click : function() { var t = $(menu.target).closest('[formtype]'); var next = t.next('[formtype]:visible'); if (next.length > 0) { next.after(t); } var table = t.closest('div[type=subtable]'); self.handRow('add',table); } } ]; //如果不需要编辑,删除编辑菜单。 if (!needEdit) { items.splice(3, 1); } menu = $.ligerMenu({top : 100,left : 100,width : 130,items : items}); if (needEdit) { this.menuWithEdit = menu; } else{ this.menu = menu; } return menu; } }, /** * 从数据库加载子表权限。 */ loadSubTablePermission:function(){ var defId = $(':hidden[name=defId]').val(); var actDefId = $(':hidden[name=actDefId]').val(); var formKey = $(':hidden[name=formKey]').val(); var nodeId = $(':hidden[name=nodeId]').val(); var params={defId:defId,actDefId:actDefId,formKey:formKey,nodeId:nodeId}; var url = "getSubTablePermission.ht"; var map = null; $.ajaxSetup({async:false}); //修改成同步 $.post(url, params,function(data){ map = data; }); $.ajaxSetup({async:true}); //改为原来的异步 return map; }, selectValue:function(select){ var html=''; var query=select.attr("selectquery") var queryJson; if(query!=undefined && query!=null ){ query=query.replaceAll("'","\""); queryJson = JSON2.parse(query); }else{ queryJson = ""; query = ""; } var sValue=select.attr("val"); //select中有一个属性是保存选中的值的(初始化时用这个) if(sValue==undefined || sValue==null && sValue.length<=0){ sValue = ""; } if(query){ html="" }else{ if(sValue==""){ html=select.find("option:selected").text(); //获取Select选择的Text 选中(不可编辑时或者没有值时,是默认的) }else{ html += select.find("option[value='"+sValue+"']").text(); //和值相对应的显示 } } return html; }, /** * 主表的权限补充(必埴) */ isMainTableRequest:function(){ //主表的附件必埴验证问题 $("div[name=div_attachment_container]").each(function() { var div_me=$(this); if(div_me.attr("right")!='b') return true; $("a.link",div_me).each(function(){ var me=$(this); var validRule = me.attr("validate"); if ( validRule != null && 'undefined' != validRule.toLowerCase() && validRule.length>2 ){ var json = eval('(' + validRule + ')'); if(!json.required){ var jsonStr = validRule.substring(0, validRule.lastIndexOf('}')); jsonStr +=",'required':true}"; //加上必填 me.attr("validate",jsonStr); } }else{ me.attr("validate","{'required':true}"); //必填 } }); }); }, //初始化子表级联 initSubQuery:function(){ $("select[selectquery]",$("[type=subtable],[formtype='window']")).each(function(){ var me = $(this); var selected=me.attr("selectqueryed"); //selectqueryed标识这个子表是否已经执行过了change绑定,存在就是已经绑定了,不存在就是没用被绑定过 if(selected)return true; var selectquery = me.attr("selectquery"); if (!selectquery) return true; selectquery = selectquery.replaceAll("'", "\""); var queryJson = JSON2.parse(selectquery); var query = queryJson.query; for (var i = 0; i < query.length; i++) { var field; // isMain是true 就是绑定主表的字段 if (query[i].isMain=="true") { field = $(".formTable [name$=':" + query[i].trigger + "']"); } else { field = me.parents('table.listTable,[formtype="window"]').find("[name='" + query[i].trigger + "']"); //添加新一个子表时,执行了多次绑定change事件,把之前的change事件都解绑 field.unbind("change"); } if (field != "") QueryUI.change(field, me, queryJson); } //添加一个属性,标识已经被绑定过, me.attr("selectqueryed","selectqueryed"); QueryUI.getvalue(me, queryJson); }); }, //初始化子表选择器 subSelectorInit:function(){ $('[ctlType="selector"]','.listTable,[formtype="window"]').each(function(){ var me =$(this); var nameID=me.attr('name')+'ID'; var isHidden=me.siblings("input[name='"+nameID+"']"); //如果存在隐藏域,则是已经添加了 if(isHidden.length!=0) return; var type = me.attr('class'); //方法在SelectotInit.js buildSelector(me, type); }); }, // 验证子表是否必填(至少要有一条记录) isSubTableRequest:function(){ var result = {success : true} $('div[right="b"][type="subtable"]').each(function(){ var subtable = $(this); var listRows = $('tr.listRow', subtable); if(listRows.length > 1) return true; var tableDesc = subtable.attr('tabledesc'); result.success = false; result.errorMsg = tableDesc; return false; }); return result; } }; //对表单初始化。 CustomForm.init(); });