OW2 Consortium telosys

Rev

Blame | Last modification | View Log | RSS feed

/* GLOBAL VARIABLES */
var TELOSYS_TREE_SELECTED = null;
var TELOSYS_TREE_SELECTED_MOVED = false;
var TELOSYS_MOUSE_IS_DOWN = false ;
/* END GLOBAL VARIABLES */

function fwkGetTreeDragAndDropContent() {
        var sID = "fwkTelosysTreeDragAndDrop";
        var e = document.getElementById(sID);
        if ( e == null )
        {
                e = document.createElement("UL");
                e.id = sID;
                e.className = "tree";
                e.style.position = "absolute";
                e.style.whiteSpace = "nowrap" ;
                //e.style.backgroundColor = "#DDDDDD";
                e.style.left = 0 ;
                e.style.top  = 0 ;
                e.style.width  = "20px" ;
                e.style.height = "auto" ;
                e.style.marginTop = 0 ;
                e.style.marginLeft = 0 ;
                e.style.paddingLeft = 0 ;
                if (typeof e.style.MozOpacity!="undefined") e.style.MozOpacity=0.7; //Firefox
                if (typeof e.style.filter!="undefined") e.style.filter="alpha(opacity=50)"; 
                if (typeof e.style.opacity!="undefined") e.style.opacity=0.7; 
                document.body.appendChild(e);
        }
        return e ;
}
        
// Open or close one node and fire click
function fwkTreeOpenCloseNode(target) {
        if (target.nodeName=="LI") {
                if (target.className=="closed") {
                        target.className="opened";
                        var uls = target.getElementsByTagName('ul');
                        if (uls!=null && uls.length>0) {
                                uls[0].style.display = "block";
                        }
                } else if (target.className=="opened") {
                        target.className="closed";
                        var uls = target.getElementsByTagName('ul');
                        if (uls!=null && uls.length>0) { // v 0.9.9 ( or -> and )
                                uls[0].style.display = "none";
                        }
                } 
                var act = target.getAttribute("action");
                if (act!=null)
                        eval(act);
        }
}

// Move one node in the tree
function fwkTreeDropSelection(liSrc, liTarget) {
        if (liSrc!=null && liTarget!=null && liSrc!=liTarget) {
                var uls = liTarget.getElementsByTagName('ul');
                if (uls==null || uls.length==0) {
                        var newUlTarget = document.createElement('ul');
                        newUlTarget.appendChild(liSrc);
                        liTarget.appendChild(newUlTarget);
                        liTarget.className="opened"
                } else {
                        uls[0].appendChild(liSrc);
                }
        }
}

// MouseDown event on the tree : prepare for DRAG
function fwkTreeMouseDown(evt) {
        TELOSYS_MOUSE_IS_DOWN = true ;
        if (!evt) 
                var evt = window.event;
        var target   = evt.target || evt.srcElement;
        if (target!=null && target.nodeName=="LI") {
                TELOSYS_TREE_SELECTED = target;
                TELOSYS_TREE_SELECTED_MOVED = false;
                document.onmousemove = fwkTreeMouseMove;
                document.onmouseup   = fwkTreeMouseUp;
        }
}

// MouseMove event on the tree
function fwkTreeMouseMove(evt) {
        if (!evt) 
                var evt = window.event;
        if ( TELOSYS_MOUSE_IS_DOWN )
        {
                if (TELOSYS_TREE_SELECTED != null) 
                {
                        var drag = fwkGetTreeDragAndDropContent();
                        if (!TELOSYS_TREE_SELECTED_MOVED) 
                        {
                                // First move after selection : Init the drag content and show it
                                if ( drag.firstChild )
                                {
                                        drag.removeChild(drag.firstChild);
                                }
                                drag.appendChild(TELOSYS_TREE_SELECTED.cloneNode(true));
                                TELOSYS_TREE_SELECTED_MOVED = true;
                                drag.style.display = "block";
                        }
                        drag.style.left = evt.clientX+5;
                        drag.style.top  = evt.clientY+5;
                }
        }
}

// MouseUp event on the tree : DROP or CLICK
function fwkTreeMouseUp(evt) {
        TELOSYS_MOUSE_IS_DOWN = false ;
        if (!evt) 
                var evt = window.event;
        var target = evt.target || evt.srcElement;
        if (target!=null && TELOSYS_TREE_SELECTED!=null) {
                if (TELOSYS_TREE_SELECTED_MOVED) {
                        // DROP
                        var drag = fwkGetTreeDragAndDropContent();
                        drag.removeChild(drag.lastChild);
                        drag.style.display = "none";
                        if ( fwkTreeTargetIsOK(target) )
                        {
                                if (target.className=="closed" || target.className=="opened") {
                                        fwkTreeDropSelection(TELOSYS_TREE_SELECTED, target);
                                } else if (target.className=="leaf") {
                                        target.parentNode.insertBefore(TELOSYS_TREE_SELECTED, target);
                                }
                        }
                } else {
                        // CLICK
                        fwkTreeOpenCloseNode(target);
                }
                document.onmousemove = null ;
                document.onmouseup   = null ;
                TELOSYS_TREE_SELECTED = null;
                TELOSYS_TREE_SELECTED_MOVED = false;
        }
}

function fwkTreeTargetIsOK(target)
{
        if (target.nodeName!="LI" ) return false ;
        if (target== TELOSYS_TREE_SELECTED) return false ;
        // Do not drop in a child of the current selected node
        if ( TELOSYS_TREE_SELECTED.firstChild != null ) // has children
        {
                var n = target ;
                while ( n.parentNode != null )
                {
                        if ( n.parentNode == TELOSYS_TREE_SELECTED )
                        {
                                return false ;
                        }
                        n = n.parentNode ;
                        if ( n.treeviewroot ) // ( the UL root tag of the treeview )
                                return n.drop ; // DROP enabled ? see init function 
                }
        }
        return true ;
}

//-----------------------------------------------------------
// Init TREE ( enable Drag and Drop )
//-----------------------------------------------------------
// Tree initialisation = fire events, disable text selection and init node style 
function fwkTreeInitTree(id){
        var tree = document.getElementById(id);
        if ( tree != null ) {
                tree.treeviewroot = true ;
                tree.drag = true ;
                tree.drop = true ;
                //tree.onmousemove       = fwkTreeMouseMove;
                tree.onmousedown         = fwkTreeMouseDown;
                //document.onmouseup   = fwkTreeMouseUp;
        }
}

//-----------------------------------------------------------
// Init TREE ( No Drag and Drop )
//-----------------------------------------------------------
function fwkTreeOnClick(evt) {
        if (!evt) 
                var evt = window.event;
        var target = evt.target || evt.srcElement;
        fwkTreeOpenCloseNode(target);
}

function fwkTreeInitTreeNoDND(id){ // NO Drag and Drop
        var tree = document.getElementById(id);
        if ( tree != null ) {
                tree.treeviewroot = true ;
                tree.drag = false ;
                tree.drop = false ;
                tree.onclick = fwkTreeOnClick;
        }
}