/**********************************************************
 Adapted from the sortable lists example by Tim Taylor
 http://tool-man.org/examples/sorting.html

 Modified by Xele from http://neb.net/playground/dragdrop/
         - Changed onDragStart, onDrag and onDragEnd functions

 **********************************************************/

var DragDrop = {
        firstContainer : null,
        lastContainer : null,

        makeListContainer : function(list) {

                // each container becomes a linked list node
                if (this.firstContainer == null) {
                        this.firstContainer = this.lastContainer = list;
                        list.previousContainer = null;
                        list.nextContainer = null;
                } else {
                        list.previousContainer = this.lastContainer;
                        list.nextContainer = null;
                        this.lastContainer.nextContainer = list;
                        this.lastContainer = list;
                }

                // these functions are called when an item is draged over
                // a container or out of a container bounds.  onDragOut
                // is also called when the drag ends with an item having
                // been added to the container
                list.onDragOver = new Function();
                list.onDragOut = new Function();

         // modif perso .....
            var items = list.getElementsByTagName( "li" );

                for (var i = 0; i < items.length; i++) {
                nomid=items[i].id;
                //alert (nomid + " | " + nomid.substring(0,6) );
                if (nomid.substring(0,6)=="module")
                    {
                      //alert (nomid + " | " + nomid.substring(0,6) );
                        DragDrop.makeItemDragable(items[i]);
                        }
                }
        },

        makeItemDragable : function(item) {
                Drag.makeDraggable(item);
                item.setDragThreshold(5);

                // tracks if the item is currently outside all containers
                item.isOutside = false;

                item.onDragStart = DragDrop.onDragStart;
                item.onDrag = DragDrop.onDrag;
                item.onDragEnd = DragDrop.onDragEnd;
        },

        onDragStart : function(nwPosition, sePosition, nwOffset, seOffset) {
                // update all container bounds, since they may have changed
                // on a previous drag
                //
                // could be more smart about when to do this
                var container = DragDrop.firstContainer;
                while (container != null) {
                        container.northwest = Coordinates.northwestOffset( container, true );
                        container.southeast = Coordinates.southeastOffset( container, true );
                        container.center = Coordinates.centerOffset( container, true );
                        container = container.nextContainer;
                }

                // item starts out over current parent
                this.parentNode.onDragOver();
        },

        onDrag : function(nwPosition, sePosition, nwOffset, seOffset, ceOffset) {

                // search the container with less distance
                var container = DragDrop.firstContainer;
                var dist = ceOffset.distance(this.parentNode.center);
                var nextContainer = this.parentNode;
                while (container != null) {
                        if(ceOffset.inside(container.northwest,container.southeast))
                        {
                                nextContainer = container;
                                break;
                        }
                        if(dist > ceOffset.distance(container.center)) {
                                nextContainer = container;
                        }
                        container = container.nextContainer;
                         }


                // changement de case

                         // The container has changed
                if(nextContainer!=this.parentNode)
                {

                 var_dessous=nextContainer.id;
                 var_dessus=this.parentNode.id;
                 //document.getElementById("val").value="ok : "+var_dessous+" : "+var_dessus;

                 //if ( (var_dessous=="liste1" and var_dessus=="liste3")     or (var_dessous=="liste3" and var_dessus=="liste1") )
                 if ( (var_dessous=="zone1" && var_dessus=="zone2")     || (var_dessous=="zone2" && var_dessus=="zone1")     || (var_dessous=="zone2" && var_dessus=="zone3")    || (var_dessous=="zone3" && var_dessus=="zone2")    || (var_dessous=="zone1" && var_dessus=="zone3")    || (var_dessous=="zone3" && var_dessus=="zone1")  )
                       {

                         this.parentNode.onDragOut();
                        nextContainer.onDragOver();
                        this.parentNode.removeChild( this );
                        nextContainer.appendChild( this );
                        }
                }
                else
                {
                //document.getElementById("val").value="not ok : "+nextContainer.id+" : "+this.parentNode.id;
                }


                // if we get here, we're inside some container bounds, so we do
                // everything the original dragsort script did to swap us into the
                // correct position

                var parent = this.parentNode;

                var item = this;
                var next = DragUtils.nextItem(item);
                while (next != null && ((this.offsetTop+this.offsetHeight/2) >= next.offsetTop+next.offsetHeight/2 - 2 || (this.offsetTop+this.offsetHeight) >= next.offsetTop+next.offsetHeight - 2)) {
                        var item = next;
                        var next = DragUtils.nextItem(item);
                }
                if (this != item) {
                        DragUtils.swap(this, next);
                        return;
                }

                var item = this;
                var previous = DragUtils.previousItem(item);
                while (previous != null && ((this.offsetTop+this.offsetHeight/2) <= previous.offsetTop+previous.offsetHeight/2 + 2 || this.offsetTop <= previous.offsetTop + 2)) {
                        var item = previous;
                        var previous = DragUtils.previousItem(item);
                }
                if (this != item) {
                        DragUtils.swap(this, item);
                        return;
                }
        },

        onDragEnd : function(nwPosition, sePosition, nwOffset, seOffset) {
                this.parentNode.onDragOut();
                this.style["top"] = "0px";
                this.style["left"] = "0px";
                DragDrop.saveListOrder();
        },

        restoreListOrder : function() {

                var items = new Array();
                var container = DragDrop.firstContainer;
                while (container != null) {
                        var tab = ListOrder._itemsByID(container);
                        for(test in tab)
                                items[test] = tab[test];
                        container = container.nextContainer;
                }

                var container = DragDrop.firstContainer;
                while (container != null) {

                        var cookie = Cookies.get("list-" + container.id)
                        if (!cookie) return;

                        var IDs = cookie.split('|')

                        for (var i = 0, n = IDs.length; i < n; i++) {
                                var itemID = IDs[i]
                                if (itemID in items) {
                                        var item = items[itemID]
                                        item.parentNode.removeChild(item)
                                        container.insertBefore(item, null)
                                }
                        }
                        container = container.nextContainer;
                }
        },

        saveListOrder : function() {
                var container = DragDrop.firstContainer;
                var var_ordre=":";
                while (container != null)
                       {
                       var_liste=ListOrder.serializeList(container);
                       Cookies.set("list-" + container.id, var_liste, 365)
                       //alert ("test : "+container.id+"="+ var_liste );
                       var_ordre=var_ordre + container.id + "=" +  var_liste + ":";
                       container = container.nextContainer;

                       //
                       }
                //alert ("ordre : "+var_ordre);
                if (document.getElementById("ordre"))
                    document.getElementById("ordre").value=var_ordre;

        }
};

var DragUtils = {
        swap : function(item1, item2) {
                var parent = item1.parentNode;
                parent.removeChild(item1);
                parent.insertBefore(item1, item2);

                item1.style["top"] = "0px";
                item1.style["left"] = "0px";
        },

        nextItem : function(item) {
                var sibling = item.nextSibling;
                while (sibling != null) {
                        if (sibling.nodeName == item.nodeName) return sibling;
                        sibling = sibling.nextSibling;
                }
                return null;
        },

        previousItem : function(item) {
                var sibling = item.previousSibling;
                while (sibling != null) {
                        if (sibling.nodeName == item.nodeName) return sibling;
                        sibling = sibling.previousSibling;
                }
                return null;
        }
};

