Show:
                            
                                /**
                                 * Plugin for dd-drag for creating a proxy drag node, instead of dragging the original node.
                                 * @module dd
                                 * @submodule dd-proxy
                                 */
                                /**
                                 * Plugin for dd-drag for creating a proxy drag node, instead of dragging the original node.
                                 * @class DDProxy
                                 * @extends Base
                                 * @constructor
                                 * @namespace Plugin
                                 */
                                var DDM = Y.DD.DDM,
                                    NODE = 'node',
                                    DRAG_NODE = 'dragNode',
                                    HOST = 'host',
                                    TRUE = true, proto,
                                    P = function() {
                                        P.superclass.constructor.apply(this, arguments);
                                    };
                            
                                P.NAME = 'DDProxy';
                                /**
                                * The Proxy instance will be placed on the Drag instance under the proxy namespace.
                                * @property NS
                                * @default con
                                * @readonly
                                * @protected
                                * @static
                                * @type {String}
                                */
                                P.NS = 'proxy';
                            
                                P.ATTRS = {
                                    host: {
                                    },
                                    /**
                                    * Move the original node at the end of the drag. Default: true
                                    * @attribute moveOnEnd
                                    * @type Boolean
                                    */
                                    moveOnEnd: {
                                        value: TRUE
                                    },
                                    /**
                                    * Hide the drag node at the end of the drag. Default: true
                                    * @attribute hideOnEnd
                                    * @type Boolean
                                    */
                                    hideOnEnd: {
                                        value: TRUE
                                    },
                                    /**
                                    * Make the Proxy node assume the size of the original node. Default: true
                                    * @attribute resizeFrame
                                    * @type Boolean
                                    */
                                    resizeFrame: {
                                        value: TRUE
                                    },
                                    /**
                                    * Make the Proxy node appear in the same place as the original node. Default: true
                                    * @attribute positionProxy
                                    * @type Boolean
                                    */
                                    positionProxy: {
                                        value: TRUE
                                    },
                                    /**
                                    * The default border style for the border of the proxy. Default: 1px solid #808080
                                    * @attribute borderStyle
                                    * @type Boolean
                                    */
                                    borderStyle: {
                                        value: '1px solid #808080'
                                    },
                                    /**
                                    * Should the node be cloned into the proxy for you. Default: false
                                    * @attribute cloneNode
                                    * @type Boolean
                                    */
                                    cloneNode: {
                                        value: false
                                    }
                                };
                            
                                proto = {
                                    /**
                                    * Holds the event handles for setting the proxy
                                    * @private
                                    * @property _hands
                                    */
                                    _hands: null,
                                    /**
                                    * Handler for the proxy config attribute
                                    * @private
                                    * @method _init
                                    */
                                    _init: function() {
                                        if (!DDM._proxy) {
                                            DDM._createFrame();
                                            Y.on('domready', Y.bind(this._init, this));
                                            return;
                                        }
                                        if (!this._hands) {
                                            this._hands = [];
                                        }
                                        var h, h1, host = this.get(HOST), dnode = host.get(DRAG_NODE);
                                        if (dnode.compareTo(host.get(NODE))) {
                                            if (DDM._proxy) {
                                                host.set(DRAG_NODE, DDM._proxy);
                                            }
                                        }
                                        Y.Array.each(this._hands, function(v) {
                                            v.detach();
                                        });
                                        h = DDM.on('ddm:start', Y.bind(function() {
                                            if (DDM.activeDrag === host) {
                                                DDM._setFrame(host);
                                            }
                                        }, this));
                                        h1 = DDM.on('ddm:end', Y.bind(function() {
                                            if (host.get('dragging')) {
                                                if (this.get('moveOnEnd')) {
                                                    host.get(NODE).setXY(host.lastXY);
                                                }
                                                if (this.get('hideOnEnd')) {
                                                    host.get(DRAG_NODE).setStyle('display', 'none');
                                                }
                                                if (this.get('cloneNode')) {
                                                    host.get(DRAG_NODE).remove();
                                                    host.set(DRAG_NODE, DDM._proxy);
                                                }
                                            }
                                        }, this));
                                        this._hands = [h, h1];
                                    },
                                    initializer: function() {
                                        this._init();
                                    },
                                    destructor: function() {
                                        var host = this.get(HOST);
                                        Y.Array.each(this._hands, function(v) {
                                            v.detach();
                                        });
                                        host.set(DRAG_NODE, host.get(NODE));
                                    },
                                    clone: function() {
                                        var host = this.get(HOST),
                                            n = host.get(NODE),
                                            c = n.cloneNode(true);
                            
                                        c.all('input[type="radio"]').removeAttribute('name');
                            
                                        delete c._yuid;
                                        c.setAttribute('id', Y.guid());
                                        c.setStyle('position', 'absolute');
                                        n.get('parentNode').appendChild(c);
                                        host.set(DRAG_NODE, c);
                                        return c;
                                    }
                                };
                            
                                Y.namespace('Plugin');
                                Y.extend(P, Y.Base, proto);
                                Y.Plugin.DDProxy = P;
                            
                                //Add a couple of methods to the DDM
                                Y.mix(DDM, {
                                    /**
                                    * Create the proxy element if it doesn't already exist and set the DD.DDM._proxy value
                                    * @private
                                    * @for DDM
                                    * @namespace DD
                                    * @method _createFrame
                                    */
                                    _createFrame: function() {
                                        if (!DDM._proxy) {
                                            DDM._proxy = TRUE;
                            
                                            var p = Y.Node.create('<div></div>'),
                                            b = Y.one('body');
                            
                                            p.setStyles({
                                                position: 'absolute',
                                                display: 'none',
                                                zIndex: '999',
                                                top: '-999px',
                                                left: '-999px'
                                            });
                            
                                            b.prepend(p);
                                            p.set('id', Y.guid());
                                            p.addClass(DDM.CSS_PREFIX + '-proxy');
                                            DDM._proxy = p;
                                        }
                                    },
                                    /**
                                    * If resizeProxy is set to true (default) it will resize the proxy element to match the size of the Drag Element.
                                    * If positionProxy is set to true (default) it will position the proxy element in the same location as the Drag Element.
                                    * @private
                                    * @for DDM
                                    * @namespace DD
                                    * @method _setFrame
                                    */
                                    _setFrame: function(drag) {
                                        var n = drag.get(NODE), d = drag.get(DRAG_NODE), ah, cur = 'auto';
                            
                                        ah = DDM.activeDrag.get('activeHandle');
                                        if (ah) {
                                            cur = ah.getStyle('cursor');
                                        }
                                        if (cur === 'auto') {
                                            cur = DDM.get('dragCursor');
                                        }
                            
                                        d.setStyles({
                                            visibility: 'hidden',
                                            display: 'block',
                                            cursor: cur,
                                            border: drag.proxy.get('borderStyle')
                                        });
                            
                                        if (drag.proxy.get('cloneNode')) {
                                            d = drag.proxy.clone();
                                        }
                            
                                        if (drag.proxy.get('resizeFrame')) {
                                            d.setStyles({
                                                height: n.get('offsetHeight') + 'px',
                                                width: n.get('offsetWidth') + 'px'
                                            });
                                        }
                            
                                        if (drag.proxy.get('positionProxy')) {
                                            d.setXY(drag.nodeXY);
                                        }
                                        d.setStyle('visibility', 'visible');
                                    }
                                });
                            
                                //Create the frame when DOM is ready
                                //Y.on('domready', Y.bind(DDM._createFrame, DDM));