/*
    功能用途：实现 drag source
    使用方法：

        1. 在页面的 body 中包含本程序：

             <script language="JavaScript" src="DragSource.js"></script>

        2. 
           (方法1) setDragTable(dragTable);//dragTable是被托拽的表格对象
           (方法2) setDragObject(dragObject);//dragObject是启动托拽操作的对象
           
           以上两种方法，程序都是根据如下逻辑获得托拽字符串：
           首先，如果通过setDragTable(dragTable)定义了被托拽的表格对象，则程序自动分析表格拼装托拽字符串
           其次，如果通过setDragText(textValue)设定了拖拽字符串，则使用该字符串
           最后，托拽字符串==null或托拽字符串==“”，取被托拽对象的dragtext属性
           如果托拽字符串==null，取消托拽

*/

var vDragText="";
var vDragTable=null;
var vDragObject=null;

function _dnd_handleMouseDown() {
    try{
    //alert("_dnd_handleMouseDown");
    
    // 对于 A、INPUT、TEXTAREA 和 IMG，不用替它启动 drag，它自己会处理 drag source
    if (event.srcElement.tagName == "A") return;
    if (event.srcElement.tagName == 'INPUT') return;
    if (event.srcElement.tagName == 'TEXTAREA') return;
    if (event.srcElement.tagName == 'IMG') return;

    // 对于没有定义 'dragtext' 的对象，不启动 drag
    //var vDragText = event.srcElement.getAttribute("dragtext");
    //if (vDragText == null) return;

    // 清空当前的 selection，然后启动 drag
    document.selection.empty();
    event.srcElement.dragDrop();
    }catch(xx){
      alert(xx);
    }
}

function _dnd_handleDragStart() {
    // 对于没有定义 'dragtext' 的对象，不做任何处理，由其自行处理
    //var vDragText = event.srcElement.getAttribute("dragtext");
  //alert("_dnd_handleDragStart"); 
  try{
    if (vDragTable!=null){
        vDragText=getDragTableText(vDragTable);
    }else  if (event.srcElement.getAttribute("dragtext")!=null){
        vDragText = event.srcElement.getAttribute("dragtext");
    }
                 
    if (vDragText==null) return;
    
    // 设置 dragtext
    vDragText = unescape(vDragText);
    event.dataTransfer.setData("Text", vDragText);
    event.dataTransfer.effectAllowed = "copy";
    }catch(xx){
      alert(xx);                 
   }    
}


//分析表格，得到托拽字符串
function getDragTableText(dragTable){
    if (dragTable==null) return "";
    var value="";
    var curTD=event.srcElement;
    if (curTD.tagName!='TD') return "";
    var rows=dragTable.rows.length;
    var cells=dragTable.cells.length;
    if (rows==0 || cells==0) return "";
    var cols=dragTable.rows(0).cells.length;
    
    //首行首列，托拽整张表
    if (dragTable.cells(0,0)==curTD){
        //alert("托拽整张表");
        value="<table border=1>";
        for (var i=0;i<rows;i++){
            value+="<tr>";
            for (var j=0;j<cols;j++){
                var oTD=dragTable.rows(i).cells(j);
                value+=getDragTableTdHtml(oTD);
            }
            value+="</tr>";
        }
        value+="</table>";
        return value;
    }
    
    //首行，托拽一列
    for (var j=0;j<cols;j++){
        if (dragTable.rows(0).cells(j)==curTD){
            //alert("托拽第"+(j+1)+"列");
            value="<table>";
            for (var i=0;i<rows;i++){
                value+="<tr>";
                var oTD=dragTable.rows(i).cells(j);
                value+=getDragTableTdHtml(oTD);
                value+="</tr>";
            }
            value+="</table>";            
            return value;
        }
    }
        
    //首列，托拽一行
    for (var i=0;i<rows;i++){
        if (dragTable.rows(i).cells(0)==curTD){
            //alert("托拽第"+(i+1)+"行");
            value="<table>";
            value+="<tr>";
            for (var j=0;j<cols;j++){
                var oTD=dragTable.rows(i).cells(j);
                value+=getDragTableTdHtml(oTD);
            }
            value+="</tr>";
            value+="</table>";            
            
            return value;
        }
    }
    
    //其它，托拽该单元格
    value="<table><tr>"+getDragTableTdHtml(curTD)+"</tr></table>";
    

    return value;
}  

//取出某个单元格的值，优先从dragtext属性上取值
function getDragTableTdHtml(oTD){
    if (oTD==null) return "<td></td>";
    var value="";
    if (oTD.dragtext!=null && oTD.dragtext!=""){
      value=oTD.dragtext; 
    }else{
      value=oTD.innerHTML;
    }
    value="<td>"+value+"</td>";
    return value;
}


//设定托拽文本,默认为托拽监听对象的内部HTML文本
function setDragText(textValue){
    vDragText=textValue;
}

//设定托拽监听对象
function setDragObject(dragObject){
   if (dragObject!=null){
     //alert("setDragObject()");
     dragObject.attachEvent("onmousedown", _dnd_handleMouseDown);
     dragObject.attachEvent("ondragstart", _dnd_handleDragStart);
     vDragObject=dragObject;
   }
}

//设定托拽表格对象
function setDragTable(dragTable){
    if (dragTable!=null){
        setDragObject(dragTable);
        vDragTable=dragTable;
    }
}




