YAHOO.ext.dd.StatusProxy = function(config){
    YAHOO.ext.util.Config.apply(this, config);
    this.id = this.id || YAHOO.util.Dom.generateId();
    this.el = new YAHOO.ext.Layer({
        dh: {
            id: this.id, tag: 'div', cls: 'ydd-drag-proxy '+this.dropNotAllowed, children: [
                {tag: 'div', cls: 'ydd-drop-icon'},
                {tag: 'div', cls: 'ydd-drag-ghost'}
            ]
        }, 
        shadow: !config || config.shadow !== false
    });
    /*this.el = YAHOO.ext.DomHelper.insertBefore(document.body.firstChild, {
        id: this.id, tag: 'div', cls: 'ydd-drag-proxy '+this.dropNotAllowed, children: [
            {tag: 'div', cls: 'ydd-drop-icon'},
            {tag: 'div', cls: 'ydd-drag-ghost'}
        ]
    }, true);*/
    this.ghost = getEl(this.el.dom.childNodes[1]);
    this.dropStatus = this.dropNotAllowed;
};

YAHOO.ext.dd.StatusProxy.prototype = {
    dropAllowed : 'ydd-drop-ok',
    dropNotAllowed : 'ydd-drop-nodrop',
    /**
     * Updates the DD visual element to allow/not allow a drop
     * @param {String} cssClass The css class for the new drop status indicator image
     */
    setStatus : function(cssClass){
        cssClass = cssClass || this.dropNotAllowed;
        if(this.dropStatus != cssClass){
            this.el.replaceClass(this.dropStatus, cssClass);
            this.dropStatus = cssClass;
        }
    },
    
    reset : function(clearGhost){
        this.el.dom.className = 'ydd-drag-proxy ' + this.dropNotAllowed;
        this.dropStatus = this.dropNotAllowed;
        if(clearGhost){
            this.ghost.update('');
        }
    },
    
    update : function(html){
        if(typeof html == 'string'){
            this.ghost.update(html);
        }else{
            this.ghost.update('');
            html.style.margin = '0';
            this.ghost.dom.appendChild(html);
        }        
    },
    
    getEl : function(){
        return this.el;
    },
    
    getGhost : function(){
        return this.ghost;
    },
    
    hide : function(clear){
        this.el.hide();
        if(clear){
            this.reset(true);
        }
    },
    
    stop : function(){
        if(this.anim && this.anim.isAnimated()){
            this.anim.stop();
        }
    },
    
    show : function(){
        this.el.show();
    },
    
    sync : function(){
        this.el.syncLocalXY();  
    },
    
    repair : function(xy, callback, scope){
        this.callback = callback;
        this.scope = scope;
        if(xy && this.animRepair !== false && YAHOO.util.Anim){
            this.el.addClass('ydd-drag-repair');
            this.el.hideUnders(true);
            if(!this.anim){
                this.anim = new YAHOO.util.Motion(this.el.dom, {}, this.repairDuration || .5, YAHOO.util.Easing.easeOut);
                this.anim.onComplete.subscribe(this.afterRepair, this, true);
            }
            this.anim.attributes = {points: {to:xy}};
            this.anim.animate();
        }else{
            this.afterRepair();
        }
    },
    
    afterRepair : function(){
        this.hide(true);
        if(typeof this.callback == 'function'){
            this.callback.call(this.scope || this);
        }
        this.callback == null;
        this.scope == null;
    }
};
