$Data={};
$Data.getData=function (__id,iscur,fun)
{
	if(!fun && typeof iscur == 'function')
	{
		fun=iscur;
		iscur=false;
	}
	var obj={"id":__id,"data":{}};
	var ch=$M.find(obj.id+' '+"[name]",true);
	this._mess={};
	this.iscur=iscur;
	this.obj=obj;
	this.len={};
	this.need=[];	
	this.unique=$M.rand();
	this.dom=$M.find(__id);
	var that=this;

	var __tag=false;

	$M.autoChange
	(
		this.dom,{childList:true,subtree:true,replace:'DOMNodeInserted,DOMNodeRemoved,DOMSubtreeModified,DOMAttrModified'},function(mutation,tag)
		{
			if(!__tag)
			{
				setTimeout
				(
					function()
					{
						that.update();
						__tag=false;
					},100
				)
				__tag=true;
			}
		}
	)

	async function _back(val,tag)
	{
		var rs=val;
		if(fun)
		{
			rs=await fun(val,tag,tag.getAttribute('title'))
		}
		if(tag)that.notice(tag,rs)
	}
	this._back=_back;
	for (var i = 0; i < ch.length; i++) 
	{
		this.listener(ch[i])
	}
}

$Data.getData.prototype.notice=function(tag,val)
{
	var tag1=tag.nextElementSibling
	if(!tag)return;
	if(val || val==='')
	{
		if(tag1 && tag1.tagName=='NOTICE')
		{
			tag1.style.display='none'
		}
		else if(tag1=this.dom.querySelector('notice[name='+tag.getAttribute('name')+']'))
		{
			tag1.style.display='none'
		}
	}
	else
	{
		if(tag1 && tag1.tagName=='NOTICE')
		{
			tag1.style.display='block'
		}
		else if(tag1=this.dom.querySelector('notice[name='+tag.getAttribute('name')+']'))
		{

			tag1.style.display='block'
		}
	}
}
$Data.getData.prototype.file=async function(file,dom)
{
	let min=dom.getAttribute('min-size')
	let max=dom.getAttribute('max-size')?dom.getAttribute('max-size'):9999999999
	if(file && file.size>=min && file.size<=max)
	{
		var _arr=dom.getAttribute('accept')?dom.getAttribute('accept').split(','):'';
		var _tag=false;
		if(_arr)
		{
			_tag=true;
			for (var i in _arr) 
			{
				if(_arr[i].indexOf('*')!=-1)
				{
					if(_arr[i].indexOf('*')==0)
					{
						_tag=false;
						break;
					}
					else
					{
						_arr[i]=_arr[i].split('/')[0]
						if(file.type.indexOf(_arr[i])==0)
						{
							_tag=false;
							break;
						}
					}
				}	
				else
				{
					if(_arr[i]==file.type)
					{
						_tag=false;
						break;
					}
				}
			}
		}
		if(_tag)
		{
			$M.info('【数据验证】文件验证失败,类型:',file.type)
			return undefined;//文件验证失败,类型
		}
		return file;
	}
	else if(file)
	{
		let oszie=file.size
		let lev=dom.getAttribute('compress')
		if(lev!=undefined)  
		{
			if(!(lev>0 && lev<1))lev=0.7
			if(file.type.indexOf('image')!=-1)
			{
				file=await $Image.photoCompress({url:file,quality:lev,form:true})
			}
			else
			{
				$M.info('【数据验证】','只有图片可以压缩')
				return undefined;//只有图片可以压缩
			}
		}
		if(file && file.size>=min && file.size<=max)
		{
			return file
		}
		else
		{
			$M.info('【数据验证】文件验证失败,大小:',{kb:file.size/1024,byte:file.size,okb:oszie/1024,obyte:oszie})
			return null;//文件验证失败,大小
		}
	}
	else
	{
		$M.info('【数据验证】','文件错误')
		return null;//文件验证失败,文件错误
	}
}
$Data.readFile=function(file,tag,fun)
{
	if(tag && tag instanceof Function)
	{
		fun=tag;
		tag=false
	}
	return new Promise
	(
		(res,rej)=>
		{
			var reader = new FileReader();//读取客户端上的文件
			reader.onload = function() 
			{
				res(reader.result)
			};
			reader.onerror =function(error)
			{
				rej(error)
			}
			reader.onabort=function()
			{
				rej('取消文件读取')
			}
			reader.onprogress=fun
			
			if(tag)reader.readAsArrayBuffer(file)
			else reader.readAsDataURL(file);
		}
	)
}

$Data.getData.prototype.listener=function(dom)
{	
	dom._getdataUnique=dom._getdataUnique?(dom._getdataUnique+','+this.unique):this.unique;
	dom.setAttribute('_getdataUnique',dom._getdataUnique)
	var file;
	var that=this;

	!function(that)
	{
		if(dom.type=="radio" || dom.type=="checkbox"  || dom.tagName=="SELECT")
		{
			//当有afterAble属性时，到监听的时候移除disabled属性。可以防止此元素还没监听，就被用户
			//操作
			if(dom.hasAttribute('afterAble'))dom.removeAttribute('disabled')
			dom.on
			(
				'change',function(eve)
				{
					if(dom.tagName=="SELECT")
					{
						if(dom.multiple)
						{
							var arr=[];
							for (var i = 0; i < dom.length; i++) 
							{  
								if (dom.options[i].selected == true)  
								{
									arr.push(dom.options[i].value)
								}
							}  
							that._back(arr,dom);
						}
						else
						{
							that._back(dom.value,dom);
						}
					}
					else
					{
						if(dom.checked)
						{
							that._back(dom.value,dom);
						}
						else
						{
							that._back(null,dom);
						}
					}
				}
			)
		}
		else if(dom.type=="file")
		{
			dom.on
			(
				'change',async function(eve)
				{
					let result=''
					let arr=[];
					if(dom.multiple)
					{
						for (var index = 0; index < dom.files.length; index++) 
						{
							result=await that.file(dom.files[index],dom)
							if(result)
							{
								arr.push(result)
							}
						}
						if(!arr.length)
						{
							dom.value='';
						}
						dom.fileList=arr;
						that._back(arr,dom);
					}
					else
					{
						file=dom.files[0];
						result=await that.file(file,dom);
						if(!result)
						{
							dom.value='';
						}
						else
						{
							arr.push(result)
						}
						that._back(arr,dom);
					}
				}
			)
		}
		else
		{
			var ev='change';
			if(dom.tagName=='DIV')
			{
				ev='keyup';
				dom.value=dom.innerHTML;
			}
			else if(that.iscur)
			{
				ev='keyup';
			}
			dom.on(ev,function(eve)
			{
				if(dom.getAttribute('pattern'))
				{
					var preg=new RegExp(dom.getAttribute('pattern'))
					if(dom.tagName!='INPUT' && dom.tagName!='TEXTAREA')
					{
						dom.value=dom.innerHTML;
					}
					if(preg.test(dom.value)) 
					{
						that._back(dom.value,dom)				
					}
					else
					{
						that._back(false,dom)					
					}
				}
			})
		}
	}(this)
}

$Data.getData.prototype.update=function()
{
	var ch=$M.find(this.obj.id+' '+"[name]",true);
	var that=this;
	this.len={};
	this._mess={};
	this.obj.data={}; 
	for (var i = 0; i < ch.length; i++) 
	{
		this.len[ch[i].getAttribute('name')]=true;
		if(!ch[i]._getdataUnique)
		{
			this.listener(ch[i],that)
		}
		else if(ch[i]._getdataUnique.indexOf(this.unique)===-1)
		{
			this.listener(ch[i],that)
		}		

		//默认值
		if(ch[i].hasAttribute('def'))
		{
			if(ch[i].type=="checkbox" || (ch[i].tagName=="SELECT" && ch[i].multiple))
			{
				this._mess[ch[i].name]={type:'box',val:ch[i].getAttribute('def')};
			}
			else
			{
				this._mess[ch[i].name]={type:'other',val:ch[i].getAttribute('def')};
			}
		}

		if(ch[i].type=="checkbox")
		{
			if(ch[i].checked)
			{
				if(this.obj.data[ch[i].name])
				{
					this.obj.data[ch[i].name].push(ch[i].value)
				}
				else
				{
					this.obj.data[ch[i].name]=[ch[i].value]
				}
			}
		}
		else if(ch[i].tagName=="SELECT" && ch[i].multiple)
		{
			var arr=[];
			for (var ii = 0; ii < ch[i].length; ii++) 
			{  
				if (ch[i].options[ii].selected == true)  
				{
					arr.push(ch[i].options[ii].value)
				}
			}  
			if(arr.length)
			{
				this.obj.data[ch[i].name]=arr;
			}
		}
		else if(ch[i].type=="radio")
		{
			if(ch[i].checked)
			{
				this.obj.data[ch[i].name]=ch[i].value;
			}			
		}
		else
		{
			if(ch[i].getAttribute('pattern'))
			{
				var preg=new RegExp(ch[i].getAttribute('pattern'))
				if(preg.test(ch[i].value)) 
				{	
					this.obj.data[ch[i].getAttribute('name')]=ch[i].value;		
				}
			}
		}
	}
}


$Data.getData.prototype.usable=function()
{
	this.update();
	this.need=[];
	var i=Object.keys(this.obj.data)?Object.keys(this.obj.data):[];
	var ii=Object.keys(this.len)?Object.keys(this.len):[];
	var index
	for (index in ii) 
	{
		//判断数据里面有没有值
		if(this.obj.data[ii[index]] === undefined)
		{
			//如果有默认值，这把默认值，赋给字段
			if((this._mess[ii[index]] != undefined) || (this._mess[ii[index]] != null))
			{
				if(this._mess[ii[index]].type=='box')
				{
					try 
					{
						this.obj.data[ii[index]]=JSON.parse(this._mess[ii[index]].val)
					} 
					catch (error) 
					{
						$M.info('[获取数据]多选的默认值格式应为数组',this._mess[ii[index]].val)
						this.obj.data[ii[index]]=[]
					}
				}
				else
				{
					this.obj.data[ii[index]]=this._mess[ii[index]].val
				}
			}
			else
			{
				this.notice(this.dom.querySelector('[name='+ii[index]+']'),false);
				this.need.push(ii[index]);
			}
		}
	}
	if(this.need.length===0)
	{
		return true;
	}
	else
	{
		return false;
	}
}

$Data.getData.prototype.get=function(k)
{
	this.usable();
	if(k)
	{
		return this.obj.data[k];
	}
	else
	{
		return this.obj.data;
	}
}
