YDom = YAHOO.util.Dom

var ddPusher = function(id, sGroup, config, groupData) { 
    this.groupData = groupData
    ddPusher.superclass.constructor.call(this, id, sGroup, config)
    var el = this.getDragEl()

    if (groupData.proxyClass) {
        YDom.addClass(el, this.groupData.proxyClass)
    }

    if (groupData.removeDimensions) {
        YDom.setStyle(el, 'width', null)
        YDom.setStyle(el, 'height', null)
    }
}

YAHOO.extend(ddPusher, YAHOO.util.DDProxy, {
   startDrag: function(x, y) {
        var dragEl = this.getDragEl()
        var clickEl = this.getEl()
 
        if ('IMG' == clickEl.nodeName) {
            var img = new Image()
            img.src = clickEl.src
            YDom.setStyle(img, 'width', '100%')
            YDom.setStyle(img, 'height', '100%')
                
            dragEl.innerHTML = ''
            dragEl.appendChild(img)
        }
        else
            dragEl.innerHTML = clickEl.innerHTML

 
        YDom.setStyle(dragEl, "color", YDom.getStyle(clickEl, "color"))
        YDom.setStyle(dragEl, "backgroundColor", YDom.getStyle(clickEl, "backgroundColor"))
        YDom.setStyle(dragEl, "border", "2px solid gray")
    },

    endDrag: function(e) {
        var srcEl = this.getEl()
        var proxy = this.getDragEl()
        proxy.innerHTML = ''
        YDom.setStyle(this.id, "visibility", "")
    },

    onDragEnter: function(e, id) {
        var srcEl = this.getEl()
        var destEl = YDom.get(id)

        var destOrder = this.groupData.orderHash[id]

        orderIdx = this.groupData.orderHash[srcEl.id]
        if (orderIdx < destOrder) {
            if (this.groupData.dragAfterClass)
                YDom.addClass(destEl, this.groupData.dragAfterClass)

            this.after = true
        }
        else if (this.groupData.dragBeforeClass)
            YDom.addClass(destEl, this.groupData.dragBeforeClass)
    },

    onDragOut : function(e, id) {
        this.dragOverFinish(YDom.get(id))
    },

    dragOverFinish : function(destEl) {
        if (this.after) {
            if (this.groupData.dragAfterClass)
                YDom.removeClass(destEl, this.groupData.dragAfterClass)
            delete this.after
        }
        else if (this.groupData.dragBeforeClass)
            YDom.removeClass(destEl, this.groupData.dragBeforeClass)
    },

    onDragDrop : function(e, destId) {
        var destEl = YDom.get(destId)
        var srcEl = this.getEl()
        var srcIdx = this.groupData.orderHash[srcEl.id]
        var destIdx = this.groupData.orderHash[destId]

        if (this.after) {
            if (destEl.nextSibling)
                destEl.parentNode.insertBefore(srcEl, destEl.nextSibling)
            else
                destEl.parentNode.appendChild(srcEl)

            for (var i = srcIdx + 1; i <= destIdx; ++i) {
                --this.groupData.orderHash[this.groupData.order[i]]
                this.groupData.order[i - 1] = this.groupData.order[i]
            }
        }
        else {
            YDom.setStyle(destEl, "border-top-color", "")
            destEl.parentNode.insertBefore(srcEl, destEl)
            for (var i = srcIdx - 1; i >= destIdx; --i) {
                ++this.groupData.orderHash[this.groupData.order[i]]
                this.groupData.order[i + 1] = this.groupData.order[i]
            }
        }
        this.dragOverFinish(destEl)

        this.groupData.order[destIdx] = srcEl.id
        this.groupData.orderHash[srcEl.id] = destIdx

        if (this.groupData.callback)
            this.groupData.callback(this.groupData.order)
    }
})

function getChildElementNodes(cont) {
    var ret = []
    for (var i = 0; i < cont.childNodes.length; ++i) {
        var childNode = cont.childNodes[i]
        if (1 == childNode.nodeType) ret.push(childNode)
    }
    return ret
}

function getIndexedChildElementNodes(cont) {
    var ret = []
    for (var i = 0; i < cont.childNodes.length; ++i) {
        var childNode = cont.childNodes[i]
        if (1 == childNode.nodeType && childNode.id) ret.push(childNode)
    }
    return ret
}

function createDragPushGroup(nodes, groupName, groupData, config) {
    if (groupData) {
        if (! groupData.orderHash) groupData.orderHash = {}
        if (! groupData.order) groupData.order = []
    }
    else {
        groupData = { 'orderHash' : {}, 'order' : [] }
    }

    if (groupData.removeDimensions) {
        if (! config) config = {}
        config.resizeFrame = false
    }

    var orderIdx = groupData.order.length
    for (var i = 0; i < nodes.length; ++i) {
        var node = nodes[i]
        if (node.id) {
            groupData.order.push(node.id)

            // if it is hashed we assume it already has a draghandler attached
            // (we can't detach them so we leave them be)
            if (! groupData.orderHash[node.id]) {
                if (groupData.getDrag) {
                    var swaper = new ddPusher(node.id, groupName, config, groupData)
                    swaper.setHandleElId(groupData.getDrag(node.id))
                }
                else {
                    new ddPusher(node.id, groupName, config, groupData)
                }
            }
            groupData.orderHash[node.id] = orderIdx++
        }
    }
}
