$Drag={};

$Drag.handle={};
$Drag.handle.before//把内容插入到容器内容之前
$Drag.handle.after//把内容插入到容器内容之后


$Drag.findParent=function(parent,cur)
{
	cur=$M.find(cur)
	parent=$M.find(parent)
	$M.isDOM(parent)
	let elm=cur.parentNode
	let berfore=cur
	for (; elm; elm = elm.parentNode) 
	{
		let tag=elm.tagName
		if (tag && tag != "HTML") 
		{
			if(elm===parent)return berfore
		}
		else
		{
			$M.info('未找到存在的父元素:',parent)
		}
		berfore = elm
	}  
}


$Drag.css=function()
{
    var cssStr='[tag_over]{opacity: 0.8;box-shadow: 0 2px 7px gray;margin-top:0.3rem;}'
    var css=document.createElement('style');
    css.setAttribute('drag_style','true')
    css.innerHTML=cssStr;
    if(!$M.find('[drag_style]'))
    {
        $M.find('body').appendChild(css)
    }
}


$Drag.able=function(dom)
{
    let cur=$M.find(dom)
    let curRand='drag_'+$M.rand()
    cur.setAttribute('_id',curRand);
    cur.setAttribute('draggable','true');
    cur.setAttribute('ondragstart','$Drag.dragStart(event)');
    cur.setAttribute('ondragend','$Drag.dragEnd(event)');
    cur.setAttribute('ondrag','$Drag.drag(event)');
}


$Drag.unAble=function(dom)
{
    dom=$M.find(dom)
    dom.removeAttribute('draggable')
    dom.removeAttribute('ondragstart')
    dom.removeAttribute('ondragend')
    dom.removeAttribute('ondrag')
}


$Drag._member=function(list,tag)
{
    if(dom)
    {
        var index
        for (index = 0; index < list.length; index++) 
        {
            let cur=list[index]
            $Drag.copy(cur,tag)
            $Drag.able(cur)
        }
    }
}

//设置子元素可以拖拽
$Drag.member=function(id,tag)
{
    //tag，列表元素，复制还是剪切。
    var dom=$M.find(id);
    if(dom)$Drag._member(dom.children,tag)
    
}

//设置元素可以拖拽
$Drag.members=function(id,tag)
{
    //tag，列表元素，复制还是剪切。
    var dom=$M.find(id,true);
    if(dom)$Drag._member(dom,tag)
}

//发生在被拖动元素上,开始
$Drag.dragStart=function(event)
{
    let dom=event.target
    let id=dom.getAttribute('_id')
    event.dataTransfer.setData("drag_id",`[_id=${id}]`);
    
}

//发生在被拖动元素上，拖动
$Drag.drag=function(event)
{
    
}

//发生在被拖动元素上，拖动结束
$Drag.dragEnd=function(event)
{
    
}



//发生在容器里,放下
$Drag.drop=function(event,doma)
{
    
    var data=event.dataTransfer.getData("drag_id");
    var dom=$M.find(data);
    if(!dom) return;



    var tag=dom.getAttribute("drag_tag");
    if(tag===null)tag=dom.parentNode.getAttribute("drag_tag");

    var html=dom.getAttribute('drag_id_data')

    
    if(html!==null)
    {
        let control='drag_id_data_control_tag'
        let _tag=dom.getAttribute(control)
        if(!_tag)_tag='true'

        if($Drag.handle.before)html=$Drag.handle.before+html
        if($Drag.handle.after)html=html+$Drag.handle.after
        html=unescape(html)
        html=html.trim()
        let _dom=document.createRange().createContextualFragment(html).firstChild

        if(_dom.length>1)
        {
            _dom=document.createElement('div')
            _dom.innerHTML=html
        }

        _dom.setAttribute(control,_tag)




        if(tag=='0' || tag=='1')
        {
            $Drag.able(_dom)
        }
        dom=_dom
    }


    var dom1;
    if(tag && tag!='0')
    { 
        if(tag=='2')
        {
            $Drag.unAble(dom)
            dom1=dom.cloneNode(true)
        }
        else if(tag=='3')
        {
            $Drag.unAble(dom) 
            dom1=dom
        }
        else
        {
            dom1=dom.cloneNode(true)
        }
        
    }
    else
    {
        dom1=dom;
    }
    dom1.setAttribute('id','drag_'+$M.rand());


    let cur=event.target
    //判断是直接进入容器，还是进入容器里面的元素
    if(doma==cur)
    {
        cur.appendChild(dom1);
    }
    else
    { 
        let don=$M.find(doma)
        let bfore=$Drag.findParent(don,cur)
        don.insertBefore(dom1,bfore)
    }

    if(cur.removeAttribute)cur.removeAttribute('tag_over');
    $M.stop(event);
}

//发生在容器里,进入容器
$Drag.dragEnter=function(event,doma)
{
    let cur=event.target
    if(doma!=cur)
    {
        //cur=$Drag.findParents({draggable:''},cur)
        if(cur.setAttribute)cur.setAttribute('tag_over','true');
    } 
}

//发生在容器里,离开容器
$Drag.dragLeave=function(event,doma)
{
    let cur=event.target
    if(doma!=cur)
    {
        //cur=$Drag.findParents({draggable:''},cur)
        if(cur.removeAttribute)cur.removeAttribute('tag_over');
    } 
}

//发生在容器里，设置元素可以粘贴到这个容器里来
$Drag.dragGoal=function(id)
{
    $Drag.css();
    var dom=$M.find(id);
    if(dom)
    {
        dom.ondragenter=function(ev)
        {
            $Drag.dragEnter(ev,dom)
        }
        dom.ondragleave=function(ev)
        {
            $Drag.dragLeave(ev,dom)
        }
        dom.ondrop=function(ev)
        {
            $Drag.drop(ev,dom)
        }
        //可拖动元素或选取的文本正在拖动到放置目标时触发
        dom.ondragover=function(ev)
        {
            //ev.target是被拖动元素
            $M.stop(ev,dom);
        }
    }
}

//发生在容器里，设置元素不可以可以粘贴到这个容器里来
$Drag.unDragGoal=function(id)
{
    var dom=$M.find(id);
    if(dom)
    {
        dom.ondragenter=undefined
        dom.ondragleave=undefined
        dom.ondrop=undefined
        dom.ondragover=undefined
    }
}

//发生在容器里,离开容器
$Drag.copy=function(id,tag)
{
    //tag,0剪切，1复制，2复制且不可在拖拽,3剪切且不可在拖拽
    var dom=$M.find(id);
    if(dom)
    {
        if(!tag)tag='1';
        dom.setAttribute('drag_tag',tag);
    }
}