1 /**
  2  * 附件相关操作方法
  3  * @namespace
  4  */
  5 Sucang.attach={
  6 		changeFile:function(obj){
  7 			if(Ext.isEmpty(obj.value)) return;
  8 			 var clearVal = function(){
  9 			 	if(Ext.isIE){
 10 					obj.select();
 11     				document.execCommand("delete");
 12 				}else obj.value='';
 13 			 };
 14 			//console.log('name1:'+obj.name);
 15 			var pos=obj.name.lastIndexOf('_');
 16 			if(pos<0) pos=obj.name.length;
 17 			var name=obj.name.substring(0,pos);
 18 			var listDiv=Ext.getDom(name+'list');
 19 			//console.log('listDiv:'+listDiv+",name:"+name+"list");
 20 			var fileType=listDiv.getAttribute('data-filetype');
 21 			var extName=obj.value.substring(obj.value.lastIndexOf('.'))+',';
 22 			if(fileType!=null && !Ext.isEmpty(fileType)){
 23 				if((fileType+',').indexOf(extName)<0){//这里还会有附件格式不符合时会上传的问题,也不应该计入大小限制
 24 					alert('必须是'+fileType+'格式的文件类型!');
 25 					clearVal();
 26 					return false;
 27 				}
 28 			}
 29 			var isImage = ".jpg,.jpeg,.png,.gif,.bmp,".indexOf(extName.toLowerCase()) >= 0;
 30 			if(!Attach.checkAttach(listDiv,1)){
 31 				clearVal();
 32 				return false;
 33 			}
 34 			var chgFun = listDiv.getAttribute('data-change-function');
 35 			if(chgFun!=null){
 36 				var fun1 = new Function("o", "list","return " + chgFun + "(o,list);");
 37 				if(!fun1(obj, listDiv)){
 38 					clearVal();
 39 					return false;
 40 				}
 41 			}
 42 
 43 			var dt=Ext.DomHelper.append(listDiv,{tag:'div'});
 44 			var pos1=obj.value.lastIndexOf('/');
 45 			if(pos1<0) pos1=obj.value.lastIndexOf('\\');
 46 			var fname=obj.value.substring(pos1+1);
 47 			dt.title=obj.value;
 48 			dt.innerHTML=fname+' <a class="delBtn" href="javascript:;" onclick="Attach.Del(this,false,\''+obj.id+'\');">×</a>';
 49 			dt.id = obj.id + 'span';
 50 			obj.style.display='none';
 51 			obj.className='';
 52 			Attach.Add(name);
 53 			//判断是否启用图片裁剪
 54 			var cropimage = listDiv.getAttribute('data-cropimage');
 55 			if(isImage && cropimage=='true'){//如果是图片且启动裁切的,则自动弹出窗口
 56 				Attach._showCropper(listDiv, obj, name, fname);
 57 			}
 58 			return true;
 59 		},
 60 		_showCropper:function(listDiv, obj, name, fname){
 61 			//console.log('open cropper image...');
 62 			var prefix = $('#_formPrefix').val();
 63 			var formid = $('#_formid').val();
 64 			var filedName = name;
 65 			var isDetail = false;
 66 			var listEl = $(listDiv);
 67 			if(name.startsWith(prefix)) fieldName = name.substring(prefix.length);
 68 			else{//可能是明细字段
 69 				isDetail = true;
 70 				formid = '';
 71 			}
 72 			var surl = String.format('/image/cropper.do?imgsrc=local&formid={0}&fieldname={1}&inputid={2}&fname={3}',
 73 					formid, fieldName, obj.id, encodeURIComponent(fname));
 74 			if(isDetail) surl += '&isdetail=true';//表示明细字段
 75 			var aspectRatio = listEl.attr('data-ratio');//图片裁切默认比例
 76 			if(!Sucang.isEmpty(aspectRatio)) surl += '&aspectRatio=' + aspectRatio;
 77 			var defaultMaxSize = listEl.attr('data-imagesize');//最大图片尺寸
 78 			if(!Sucang.isEmpty(defaultMaxSize)) surl += '&defaultMaxSize=' + defaultMaxSize;
 79 			
 80 			var tp = __top();
 81 			tp.Sucang.page.__win = window;
 82 			var docEl = tp.document.documentElement;
 83 			var opt = {width: docEl.clientWidth * 0.8, height: docEl.clientHeight * 0.9};
 84 			opt.callback = function(oframe,isCancel){
 85 				if(isCancel){
 86 					$('#' + obj.id + 'span').remove();
 87 					//3.删除文件
 88 					$(obj).remove();
 89 					return;
 90 				}
 91 				//alert('窗口关闭。。。');
 92 			};
 93 			Sucang.page.openWindow(surl, null, opt);
 94 		},
 95 		_replaceFile:function(inputid, data){//把File附件对象替换为attachid来保存
 96 			//inputid即如上的obj.id
 97 			var el = $('#'+inputid);
 98 			if(el.length==0){
 99 				throw '非法参数{' + inputid + '}调用';
100 			}
101 			//console.log('replace=file---'+Ext.encode(data));
102 			//1.增加显示
103 			var fieldName = inputid.substring(0, inputid.lastIndexOf('_'));
104 			var attachData = {id: data.attachid, isCropper:true };
105 			attachData.name = data.fname;
106 			attachData.size = data.length;
107 			this.addFileRow(fieldName, true, attachData);
108 			//2.删除显示
109 			$('#' + inputid + 'span').remove();
110 			//3.删除文件
111 			el.remove();
112 			//console.log('附件处理成功...');
113 		},
114 		/**
115 		 * @description 附件增加一行,只能是已存在的附件id
116 		 * @param {fieldName} String
117 		 * @param {isEdit} boolean
118 		 * @param {attachData} Object {id:'xxx',size:323234,name:'ew3423.jpg'}
119 		 */
120 		addFileRow:function(fieldName,isEdit,attachData){
121 			if(!attachData || Ext.isEmpty(attachData.id) || Ext.isEmpty(attachData.name)){
122 				console.log('参数attachData必须要有id和name属性');return;
123 			}
124 			var listDiv = Ext.getDom(fieldName + 'list');
125 			var dt = Ext.DomHelper.append(listDiv,{tag:'div'});
126 			var _sizeTxt = '';
127 			var isDelOnSave = true;//表示删除是否保存ID至删除字段中
128 			if(attachData.isCropper) isDelOnSave = false;//如果是裁剪的则不保存至删除字段
129 			
130 			if(attachData.size) _sizeTxt = '文件大小:' + Ext.util.Format.fileSize(attachData.size);
131 			var shtml = '<a href="/attachview.do?id=' + attachData.id + '" target="attach' + attachData.id + '" title="' + _sizeTxt + '">' + attachData.name + '</a>';
132 			if(isEdit) shtml += '  <a class="delBtn" href="javascript:;" onclick="Attach.Del(this,'
133 				+ isDelOnSave + ', \''+attachData.id+'\');">×</a>';
134 			dt.innerHTML = shtml;
135 			var d = Ext.getDom(fieldName);
136 			var nid = '_A' + Math.random().toString().substring(2);
137 			if(!d) d = Ext.DomHelper.insertAfter(fieldName + 'deletes', {tag:'input', type:'hidden', id:fieldName, name:fieldName + nid, value:''}, false);
138 			if(d){
139 				 d.value = Ext.isEmpty(d.value) 
140 				 	? attachData.id 
141 				 	: d.value + ',' + attachData.id;
142 			} //end.if(d)
143 		},
144 		/**
145 		 * @description 检查附件是否必填或为空
146 		 * @param {fieldName} String
147 		 */
148 		checkAttach:function(listDiv,i){
149 			if(typeof(i)!='number') i=0;
150 			var ret=true;
151 			var maxNums=parseInt(listDiv.getAttribute('data-attach-max'));
152 			if(isNaN(maxNums)) maxNums=0;
153 			var nums=Ext.query('a[class=delBtn]',listDiv).length+i;//加一表示当前操作的对象算一个附件
154 			if(listDiv.className.indexOf('attachRequired')>=0){
155 				if(nums<=0){Attach.showMsg(listDiv, '附件不能为空!');return false;}
156 			}
157 			var viewType=listDiv.parentNode.getAttribute('data-viewtype');
158 			if(viewType=='classic' && maxNums>0 && nums>maxNums){
159 				Attach.showMsg(listDiv, '附件最多为'+maxNums+'个,请删除再添加!');
160 				ret=false;
161 			}
162 			if(ret) Attach.showMsg(listDiv, '');
163 			return ret;
164 		},
165 		showMsg:function(dom,msg){
166 			if(Validation && typeof(Validation.showMsg)!='function'){
167 				console.log('Attach.ShowErrMsg: Validation.showMsg is not function.');
168 				return;
169 			}
170 			Validation.showMsg(dom,msg,msg!='',true);
171 		},
172 		/**
173 		 * @description 替换指定ID的附件,并形成版本关系
174 		 * @param {attachid} String 指定的附件id
175 		 */
176 		replace:function(obj, attachid){
177 			if(Ext.isEmpty(obj.value)) return;
178 			var val = obj.value;
179 			var pos = val.lastIndexOf('\\');
180 			if(pos < 0) pos = val.lastIndexOf('/');
181 			if(pos > 0) val = val.substring(pos + 1);
182 			$(obj.parentNode).addClass('added-file').attr('title', '被替换成[' + val +'],点击可取消');
183 		},
184 		cancelReplace:function(obj,aid){
185 			var el = $(obj);
186 			if(!el.hasClass('added-file')) return;//如果已存在,表示已有替换的文件
187 			if(!confirm('确定取消替换吗(Y/N)?')) return;
188 			el.removeClass('added-file').removeAttr('title');
189 			var obj = el.find('input')[0];
190 			if(Ext.isIE){
191 				obj.select();
192 				document.execCommand("delete");
193 			}else obj.value = '';
194 			console.log('替换附件已被清除。。。'+obj.name);
195 		},
196 		/**
197 		 * @description 附件列表中增加一行
198 		 * @param {fieldName} String
199 		 */
200 		Add:function(name){
201 			var _name=Ext.id(null,name+"_");
202 			Ext.DomHelper.insertFirst(name+'FileSpan',{tag:'input',size:1,'onchange':'return Attach.changeFile(this);',
203 				'cls':'formAttach','type':'file',name:_name,id:_name});
204 		},
205 		chooseBigFile: function(data,fieldname){
206 			if(Ext.isArray(data) && Ext.isEmpty(data[0])) return;//表示没有选择文件
207 			
208 			var aid = data[0];
209 			var filename = data[1];
210 			var filesize = Ext.util.Format.fileSize(data[2]);
211 			var ar = $('#F2fjsclist').find('input[type="hidden"][name^="F2fjsc_"]');
212 			var index = 0;
213 			if(ar.length > 0){
214 				var lastName = ar[ar.length-1].name;
215 				index = parseInt(lastName.substring(lastName.lastIndexOf('_')+2))+1;
216 			}
217 			var ar = ['<div><a target="',aid,'" class="supportOpen bigfile" title="文件大小(',filesize,')" href="/attachview.do?id=',aid,'">',filename,'</a> ',
218 				'<a class="delBtn" href="javascript:;" onclick="Attach.Del(this,false,\'', aid ,'\');">×</a>',
219 				'<input type="hidden" id="A', aid ,'" name="', fieldname ,'_B', index ,'" value="', aid , '">',
220 				'</div>'];
221 			 
222 			//console.log(ar.join(''));
223 			Ext.DomHelper.append(fieldname+'list', ar.join(''));
224 		},
225 		/**
226 		 * @description 删除附件列表中的一项
227 		 * @param {fieldName} String
228 		 * @param {isExist} boolean 表示是否已存在的附件还是新增加的
229 		 * @param {value} Number 新增加附件的顺序号
230 		 */
231 		Del:function(obj,isOld,vid){
232 			obj=obj.parentNode;
233 			var objid=obj.parentNode.id;
234 			var name=objid.substring(0,objid.length-4);
235 			Ext.get(obj).remove();
236 			if(isOld){//remember delete's id.
237 				objid=name+'deletes';
238 				var val=Ext.getDom(objid).value;
239 				if(val!='')val+=",";
240 				Ext.getDom(objid).value=val+vid;
241 			}else{
242 				var d=Ext.get(vid);
243 				if(d) d.remove();
244 			}
245 			Attach.checkAttach(Ext.getDom(name+'list'));
246 		},
247 	init:function(id,args){
248 		var frmDom = Ext.getDom('_formid');
249 		if(frmDom){
250 			args.formData.formid = frmDom.value;
251 			if(!args.formData.isDetail)
252 				args.formData.fieldname=args.formData.fieldname.replace(Sucang.getValue('_formPrefix'),'');
253 		}
254 		var queryString='';
255 		if(!Ext.isIE){
256 			queryString = '&_uid=' + args.suid;
257 			queryString += '&__randCode=' + Sucang.page.getCookieValue('__randCode');
258 		}
259 		//console.log('formdarta:'+Ext.encode(args.formData));
260 		//console.log('queryString:'+queryString);
261 		var cfg={
262 	     'debug'             : false,
263 	     'auto'              : args.autoUpload, //是否自动上传,   
264 	     'buttonClass'       : 'haha', //按钮辅助class   
265 	     'buttonText'        : args.buttonText,//'上传图片', //按钮文字   
266 	     'height'            : 20, //按钮高度   
267 	     'width'             : 80, //按钮宽度   
268 	     'fileObjName'       : 'uploadifyFileData', //默认 Filedata, 指定file控制名称
269 	     'fileSizeLimit'     : args.limitSize+'B', //文件大小限制 0为无限制 默认KB   
270 	     'fileTypeDesc'      : args.fileType=='*.*'?'All Files':args.fileType+'类型的文件', //图片选择描述   
271 	     'fileTypeExts'      : args.fileType,//'*.gif; *.jpg; *.png',//文件后缀限制 默认:'*.*'   
272 	     'formData'          : args.formData,//传输数据JSON格式
273 	     //flash脚本文件的访问模式,如果在本地测试设置为always,默认值:sameDomain   
274 	     'scriptAccess'		: 'always',
275 	     'queueID'           : id+'_queue', //默认队列ID   
276 	     'queueSizeLimit'    : 20, //一个队列上传文件数限制   
277 	     'removeCompleted'   : true, //完成时是否清除队列 默认true   
278 	     'removeTimeout'     : 3, //完成时清除队列显示秒数,默认3秒   
279 	     'requeueErrors'     : false, //队列上传出错,是否继续回滚队列   
280 	     'successTimeout'    : 10, //上传超时   
281 	     'uploadLimit'       : args.limitCount, //允许上传的最多张数   
282 	     'swf'               : '/js/uploadify/uploadify.swf', //swfUpload
283 		 'uploader'		: '/attachview.do?action=save&__from=uploadify'+queryString,
284 	     //上传成功   
285 	     'onUploadSuccess' : function(file, data,isSucc) {
286 						if(!isSucc){
287 							 console.log('onUploadSucce:: failed.' + (file?file.name:"null")+"\tdata:"+data);
288 							 return;
289 						}
290 						var aid=data;
291 						if(!Sucang.isGUID(aid)){//表示服务器出错但是非200
292 							var Ft = Ext.util.Format;
293 							alert(Ft.ellipsis(Ft.trim(Ft.stripTags(data)).replace(/ /,''),50));
294 							return;
295 						}
296 						var fieldName=id;//是从上面的参数中传递过来的表示字段名
297 						var shtml='<div><a target="attach'+aid+'" class="supportOpen" href="/attachview.do?id='+aid+'" title="文件大小('+Ext.util.Format.fileSize(file.size)+')">';
298 						shtml += file.name+'</a> <a class="delBtn" href="javascript:void(0);" onclick="Attach.Del(this,false,\''+aid+'\')">×</a>';
299 						shtml += '<input type="hidden" id="A'+aid+'" name="'+fieldName+'_'+aid+'" value="'+aid+'"/>';
300 						shtml += '</div>';
301 						$('#'+fieldName+"list").append(shtml);
302 	     } //end.function(onUploadSuccess)
303 	     ,'onDialogOpen':function(){
304 	     	this.queueData.errorMsg = '错误信息: ';
305 	     }
306 	     ,'onDialogClose': function(queueData){
307 	     		var files = queueData.files;
308 	     		if(Sucang.isEmptyObject(files)) return;
309 	     		var ar=[];
310 	     		for(var i in files) if(i.startsWith('SWFUpload_')) ar.push(i);
311 	     		var max = args.limitCount;
312 	     		var listDiv = Ext.getDom(id+'list');
313 	     		//console.log(Ext.encode(ar)+"listDiv:"+listDiv+"\tdata:"+Ext.encode(queueData));
314 	     		var nums=Ext.query('a[class=delBtn]',listDiv).length;//已存在的附件个数
315 	     		if((ar.length+nums)>max){//如果大于文件最大的个数则需要取消几个
316 	     			var n = ar.length+nums - max;
317 	     			for(var i=0; i<n; i++){$('#attachFields_'+id).uploadify('cancel', ar[i]);}
318 	     			Attach.showMsg(listDiv, '附件上传个数最多为'+max+'个.');
319 	     		}else Attach.showMsg(listDiv, '');//该句使如果附件是必填项,有值是会去除必填标记
320             }
321 		};
322 		if(typeof(AttachLang)!='undefined') cfg.lang = AttachLang;
323 		$('#attachFields_'+id).uploadify(cfg);//end.uploadify
324 	}//init()
325 };
326 
327 /** Scaung.attach附件类的缩写前缀 */
328 var Attach=Sucang.attach;
329