/*
Copyright (c) 2009, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:
http://developer.yahoo.net/yui/license.txt
version: 2.8.0r4
*/
if(!YAHOO.util.DragDropMgr){
    YAHOO.util.DragDropMgr=function(){
        var A=YAHOO.util.Event,B=YAHOO.util.Dom;
        return{
            useShim:false,
            _shimActive:false,
            _shimState:false,
            _debugShim:false,
            _createShim:function(){
                var C=document.createElement("div");
                C.id="yui-ddm-shim";
                if(document.body.firstChild){
                    document.body.insertBefore(C,document.body.firstChild);
                }else{
                    document.body.appendChild(C);
                }
                C.style.display="none";
                C.style.backgroundColor="red";
                C.style.position="absolute";
                C.style.zIndex="99999";
                B.setStyle(C,"opacity","0");
                this._shim=C;
                A.on(C,"mouseup",this.handleMouseUp,this,true);
                A.on(C,"mousemove",this.handleMouseMove,this,true);
                A.on(window,"scroll",this._sizeShim,this,true);
            },
            _sizeShim:function(){
                if(this._shimActive){
                    var C=this._shim;
                    C.style.height=B.getDocumentHeight()+"px";
                    C.style.width=B.getDocumentWidth()+"px";
                    C.style.top="0";
                    C.style.left="0";
                }
            },
            _activateShim:function(){
                if(this.useShim){
                    if(!this._shim){
                        this._createShim();
                    }
                    this._shimActive=true;
                    var C=this._shim,D="0";
                    if(this._debugShim){
                        D=".5";
                    }
                    B.setStyle(C,"opacity",D);
                    this._sizeShim();
                    C.style.display="block";
                }
            },
            _deactivateShim:function(){
                this._shim.style.display="none";
                this._shimActive=false;
            },
            _shim:null,
            ids:{},
            handleIds:{},
            dragCurrent:null,
            dragOvers:{},
            deltaX:0,
            deltaY:0,
            preventDefault:true,
            stopPropagation:true,
            initialized:false,
            locked:false,
            interactionInfo:null,
            init:function(){
                this.initialized=true;
            },
            POINT:0,
            INTERSECT:1,
            STRICT_INTERSECT:2,
            mode:0,
            _execOnAll:function(E,D){
                for(var F in this.ids){
                    for(var C in this.ids[F]){
                        var G=this.ids[F][C];
                        if(!this.isTypeOfDD(G)){
                            continue;
                        }
                        G[E].apply(G,D);
                    }
                }
            },
            _onLoad:function(){
                this.init();
                A.on(document,"mouseup",this.handleMouseUp,this,true);
                A.on(document,"mousemove",this.handleMouseMove,this,true);
                A.on(window,"unload",this._onUnload,this,true);
                A.on(window,"resize",this._onResize,this,true);
            },
            _onResize:function(C){
                this._execOnAll("resetConstraints",[]);
            },
            lock:function(){
                this.locked=true;
            },
            unlock:function(){
                this.locked=false;
            },
            isLocked:function(){
                return this.locked;
            },
            locationCache:{},
            useCache:true,
            clickPixelThresh:3,
            clickTimeThresh:1000,
            dragThreshMet:false,
            clickTimeout:null,
            startX:0,
            startY:0,
            fromTimeout:false,
            regDragDrop:function(D,C){
                if(!this.initialized){
                    this.init();
                }
                if(!this.ids[C]){
                    this.ids[C]={};

                }
                this.ids[C][D.id]=D;
            },
            removeDDFromGroup:function(E,C){
                if(!this.ids[C]){
                    this.ids[C]={};

                }
                var D=this.ids[C];
                if(D&&D[E.id]){
                    delete D[E.id];
                }
            },
            _remove:function(E){
                for(var D in E.groups){
                    if(D){
                        var C=this.ids[D];
                        if(C&&C[E.id]){
                            delete C[E.id];
                        }
                    }
                }
                delete this.handleIds[E.id];
            },
            regHandle:function(D,C){
                if(!this.handleIds[D]){
                    this.handleIds[D]={};

                }
                this.handleIds[D][C]=C;
            },
            isDragDrop:function(C){
                return(this.getDDById(C))?true:false;
            },
            getRelated:function(H,D){
                var G=[];
                for(var F in H.groups){
                    for(var E in this.ids[F]){
                        var C=this.ids[F][E];
                        if(!this.isTypeOfDD(C)){
                            continue;
                        }
                        if(!D||C.isTarget){
                            G[G.length]=C;
                        }
                    }
                }
                return G;
            },
            isLegalTarget:function(G,F){
                var D=this.getRelated(G,true);
                for(var E=0,C=D.length;E<C;++E){
                    if(D[E].id==F.id){
                        return true;
                    }
                }
                return false;
            },
            isTypeOfDD:function(C){
                return(C&&C.__ygDragDrop);
            },
            isHandle:function(D,C){
                return(this.handleIds[D]&&this.handleIds[D][C]);
            },
            getDDById:function(D){
                for(var C in this.ids){
                    if(this.ids[C][D]){
                        return this.ids[C][D];
                    }
                }
                return null;
            },
            handleMouseDown:function(E,D){
                this.currentTarget=YAHOO.util.Event.getTarget(E);
                this.dragCurrent=D;
                var C=D.getEl();
                this.startX=YAHOO.util.Event.getPageX(E);
                this.startY=YAHOO.util.Event.getPageY(E);
                this.deltaX=this.startX-C.offsetLeft;
                this.deltaY=this.startY-C.offsetTop;
                this.dragThreshMet=false;
                this.clickTimeout=setTimeout(function(){
                    var F=YAHOO.util.DDM;
                    F.startDrag(F.startX,F.startY);
                    F.fromTimeout=true;
                },this.clickTimeThresh);
            },
            startDrag:function(C,E){
                if(this.dragCurrent&&this.dragCurrent.useShim){
                    this._shimState=this.useShim;
                    this.useShim=true;
                }
                this._activateShim();
                clearTimeout(this.clickTimeout);
                var D=this.dragCurrent;
                if(D&&D.events.b4StartDrag){
                    D.b4StartDrag(C,E);
                    D.fireEvent("b4StartDragEvent",{
                        x:C,
                        y:E
                    });
                }
                if(D&&D.events.startDrag){
                    D.startDrag(C,E);
                    D.fireEvent("startDragEvent",{
                        x:C,
                        y:E
                    });
                }
                this.dragThreshMet=true;
            },
            handleMouseUp:function(C){
                if(this.dragCurrent){
                    clearTimeout(this.clickTimeout);
                    if(this.dragThreshMet){
                        if(this.fromTimeout){
                            this.fromTimeout=false;
                            this.handleMouseMove(C);
                        }
                        this.fromTimeout=false;
                        this.fireEvents(C,true);
                    }else{}
                    this.stopDrag(C);
                    this.stopEvent(C);
                }
            },
            stopEvent:function(C){
                if(this.stopPropagation){
                    YAHOO.util.Event.stopPropagation(C);
                }
                if(this.preventDefault){
                    YAHOO.util.Event.preventDefault(C);
                }
            },
            stopDrag:function(E,D){
                var C=this.dragCurrent;
                if(C&&!D){
                    if(this.dragThreshMet){
                        if(C.events.b4EndDrag){
                            C.b4EndDrag(E);
                            C.fireEvent("b4EndDragEvent",{
                                e:E
                            });
                        }
                        if(C.events.endDrag){
                            C.endDrag(E);
                            C.fireEvent("endDragEvent",{
                                e:E
                            });
                        }
                    }
                    if(C.events.mouseUp){
                        C.onMouseUp(E);
                        C.fireEvent("mouseUpEvent",{
                            e:E
                        });
                    }
                }
                if(this._shimActive){
                    this._deactivateShim();
                    if(this.dragCurrent&&this.dragCurrent.useShim){
                        this.useShim=this._shimState;
                        this._shimState=false;
                    }
                }
                this.dragCurrent=null;
                this.dragOvers={};

            },
            handleMouseMove:function(F){
                var C=this.dragCurrent;
                if(C){
                    if(YAHOO.util.Event.isIE&&!F.button){
                        this.stopEvent(F);
                        return this.handleMouseUp(F);
                    }else{
                        if(F.clientX<0||F.clientY<0){}
                    }
                    if(!this.dragThreshMet){
                        var E=Math.abs(this.startX-YAHOO.util.Event.getPageX(F));
                        var D=Math.abs(this.startY-YAHOO.util.Event.getPageY(F));
                        if(E>this.clickPixelThresh||D>this.clickPixelThresh){
                            this.startDrag(this.startX,this.startY);
                        }
                    }
                    if(this.dragThreshMet){
                        if(C&&C.events.b4Drag){
                            C.b4Drag(F);
                            C.fireEvent("b4DragEvent",{
                                e:F
                            });
                        }
                        if(C&&C.events.drag){
                            C.onDrag(F);
                            C.fireEvent("dragEvent",{
                                e:F
                            });
                        }
                        if(C){
                            this.fireEvents(F,false);
                        }
                    }
                    this.stopEvent(F);
                }
            },
            fireEvents:function(V,L){
                var a=this.dragCurrent;
                if(!a||a.isLocked()||a.dragOnly){
                    return;
                }
                var N=YAHOO.util.Event.getPageX(V),M=YAHOO.util.Event.getPageY(V),P=new YAHOO.util.Point(N,M),K=a.getTargetCoord(P.x,P.y),F=a.getDragEl(),E=["out","over","drop","enter"],U=new YAHOO.util.Region(K.y,K.x+F.offsetWidth,K.y+F.offsetHeight,K.x),I=[],D={},Q=[],c={
                    outEvts:[],
                    overEvts:[],
                    dropEvts:[],
                    enterEvts:[]
                };

                for(var S in this.dragOvers){
                    var d=this.dragOvers[S];
                    if(!this.isTypeOfDD(d)){
                        continue;
                    }
                    if(!this.isOverTarget(P,d,this.mode,U)){
                        c.outEvts.push(d);
                    }
                    I[S]=true;
                    delete this.dragOvers[S];
                }
                for(var R in a.groups){
                    if("string"!=typeof R){
                        continue;
                    }
                    for(S in this.ids[R]){
                        var G=this.ids[R][S];
                        if(!this.isTypeOfDD(G)){
                            continue;
                        }
                        if(G.isTarget&&!G.isLocked()&&G!=a){
                            if(this.isOverTarget(P,G,this.mode,U)){
                                D[R]=true;
                                if(L){
                                    c.dropEvts.push(G);
                                }else{
                                    if(!I[G.id]){
                                        c.enterEvts.push(G);
                                    }else{
                                        c.overEvts.push(G);
                                    }
                                    this.dragOvers[G.id]=G;
                                }
                            }
                        }
                    }
                }
                this.interactionInfo={
                    out:c.outEvts,
                    enter:c.enterEvts,
                    over:c.overEvts,
                    drop:c.dropEvts,
                    point:P,
                    draggedRegion:U,
                    sourceRegion:this.locationCache[a.id],
                    validDrop:L
                };

                for(var C in D){
                    Q.push(C);
                }
                if(L&&!c.dropEvts.length){
                    this.interactionInfo.validDrop=false;
                    if(a.events.invalidDrop){
                        a.onInvalidDrop(V);
                        a.fireEvent("invalidDropEvent",{
                            e:V
                        });
                    }
                }
                for(S=0;S<E.length;S++){
                    var Y=null;
                    if(c[E[S]+"Evts"]){
                        Y=c[E[S]+"Evts"];
                    }
                    if(Y&&Y.length){
                        var H=E[S].charAt(0).toUpperCase()+E[S].substr(1),X="onDrag"+H,J="b4Drag"+H,O="drag"+H+"Event",W="drag"+H;
                        if(this.mode){
                            if(a.events[J]){
                                a[J](V,Y,Q);
                                a.fireEvent(J+"Event",{
                                    event:V,
                                    info:Y,
                                    group:Q
                                });
                            }
                            if(a.events[W]){
                                a[X](V,Y,Q);
                                a.fireEvent(O,{
                                    event:V,
                                    info:Y,
                                    group:Q
                                });
                            }
                        }else{
                            for(var Z=0,T=Y.length;Z<T;++Z){
                                if(a.events[J]){
                                    a[J](V,Y[Z].id,Q[0]);
                                    a.fireEvent(J+"Event",{
                                        event:V,
                                        info:Y[Z].id,
                                        group:Q[0]
                                    });
                                }
                                if(a.events[W]){
                                    a[X](V,Y[Z].id,Q[0]);
                                    a.fireEvent(O,{
                                        event:V,
                                        info:Y[Z].id,
                                        group:Q[0]
                                    });
                                }
                            }
                        }
                    }
                }
            },
            getBestMatch:function(E){
                var G=null;
                var D=E.length;
                if(D==1){
                    G=E[0];
                }else{
                    for(var F=0;F<D;++F){
                        var C=E[F];
                        if(this.mode==this.INTERSECT&&C.cursorIsOver){
                            G=C;
                            break;
                        }else{
                            if(!G||!G.overlap||(C.overlap&&G.overlap.getArea()<C.overlap.getArea())){
                                G=C;
                            }
                        }
                    }
                }
                return G;
            },
            refreshCache:function(D){
                var F=D||this.ids;
                for(var C in F){
                    if("string"!=typeof C){
                        continue;
                    }
                    for(var E in this.ids[C]){
                        var G=this.ids[C][E];
                        if(this.isTypeOfDD(G)){
                            var H=this.getLocation(G);
                            if(H){
                                this.locationCache[G.id]=H;
                            }else{
                                delete this.locationCache[G.id];
                            }
                        }
                    }
                }
            },
            verifyEl:function(D){
                try{
                    if(D){
                        var C=D.offsetParent;
                        if(C){
                            return true;
                        }
                    }
                }catch(E){}
                return false;
            },
            getLocation:function(H){
                if(!this.isTypeOfDD(H)){
                    return null;
                }
                var F=H.getEl(),K,E,D,M,L,N,C,J,G;
                try{
                    K=YAHOO.util.Dom.getXY(F);
                }catch(I){}
                if(!K){
                    return null;
                }
                E=K[0];
                D=E+F.offsetWidth;
                M=K[1];
                L=M+F.offsetHeight;
                N=M-H.padding[0];
                C=D+H.padding[1];
                J=L+H.padding[2];
                G=E-H.padding[3];
                return new YAHOO.util.Region(N,C,J,G);
            },
            isOverTarget:function(K,C,E,F){
                var G=this.locationCache[C.id];
                if(!G||!this.useCache){
                    G=this.getLocation(C);
                    this.locationCache[C.id]=G;
                }
                if(!G){
                    return false;
                }
                C.cursorIsOver=G.contains(K);
                var J=this.dragCurrent;
                if(!J||(!E&&!J.constrainX&&!J.constrainY)){
                    return C.cursorIsOver;
                }
                C.overlap=null;
                if(!F){
                    var H=J.getTargetCoord(K.x,K.y);
                    var D=J.getDragEl();
                    F=new YAHOO.util.Region(H.y,H.x+D.offsetWidth,H.y+D.offsetHeight,H.x);
                }
                var I=F.intersect(G);
                if(I){
                    C.overlap=I;
                    return(E)?true:C.cursorIsOver;
                }else{
                    return false;
                }
            },
            _onUnload:function(D,C){
                this.unregAll();
            },
            unregAll:function(){
                if(this.dragCurrent){
                    this.stopDrag();
                    this.dragCurrent=null;
                }
                this._execOnAll("unreg",[]);
                this.ids={};

            },
            elementCache:{},
            getElWrapper:function(D){
                var C=this.elementCache[D];
                if(!C||!C.el){
                    C=this.elementCache[D]=new this.ElementWrapper(YAHOO.util.Dom.get(D));
                }
                return C;
            },
            getElement:function(C){
                return YAHOO.util.Dom.get(C);
            },
            getCss:function(D){
                var C=YAHOO.util.Dom.get(D);
                return(C)?C.style:null;
            },
            ElementWrapper:function(C){
                this.el=C||null;
                this.id=this.el&&C.id;
                this.css=this.el&&C.style;
            },
            getPosX:function(C){
                return YAHOO.util.Dom.getX(C);
            },
            getPosY:function(C){
                return YAHOO.util.Dom.getY(C);
            },
            swapNode:function(E,C){
                if(E.swapNode){
                    E.swapNode(C);
                }else{
                    var F=C.parentNode;
                    var D=C.nextSibling;
                    if(D==E){
                        F.insertBefore(E,C);
                    }else{
                        if(C==E.nextSibling){
                            F.insertBefore(C,E);
                        }else{
                            E.parentNode.replaceChild(C,E);
                            F.insertBefore(E,D);
                        }
                    }
                }
            },
            getScroll:function(){
                var E,C,F=document.documentElement,D=document.body;
                if(F&&(F.scrollTop||F.scrollLeft)){
                    E=F.scrollTop;
                    C=F.scrollLeft;
                }else{
                    if(D){
                        E=D.scrollTop;
                        C=D.scrollLeft;
                    }else{}
                }
                return{
                    top:E,
                    left:C
                };

            },
            getStyle:function(D,C){
                return YAHOO.util.Dom.getStyle(D,C);
            },
            getScrollTop:function(){
                return this.getScroll().top;
            },
            getScrollLeft:function(){
                return this.getScroll().left;
            },
            moveToEl:function(C,E){
                var D=YAHOO.util.Dom.getXY(E);
                YAHOO.util.Dom.setXY(C,D);
            },
            getClientHeight:function(){
                return YAHOO.util.Dom.getViewportHeight();
            },
            getClientWidth:function(){
                return YAHOO.util.Dom.getViewportWidth();
            },
            numericSort:function(D,C){
                return(D-C);
            },
            _timeoutCount:0,
            _addListeners:function(){
                var C=YAHOO.util.DDM;
                if(YAHOO.util.Event&&document){
                    C._onLoad();
                }else{
                    if(C._timeoutCount>2000){}else{
                        setTimeout(C._addListeners,10);
                        if(document&&document.body){
                            C._timeoutCount+=1;
                        }
                    }
                }
            },
            handleWasClicked:function(C,E){
                if(this.isHandle(E,C.id)){
                    return true;
                }else{
                    var D=C.parentNode;
                    while(D){
                        if(this.isHandle(E,D.id)){
                            return true;
                        }else{
                            D=D.parentNode;
                        }
                    }
                }
                return false;
            }
        };

    }();
    YAHOO.util.DDM=YAHOO.util.DragDropMgr;
    YAHOO.util.DDM._addListeners();
}(function(){
    var A=YAHOO.util.Event;
    var B=YAHOO.util.Dom;
    YAHOO.util.DragDrop=function(E,C,D){
        if(E){
            this.init(E,C,D);
        }
    };

    YAHOO.util.DragDrop.prototype={
        events:null,
        on:function(){
            this.subscribe.apply(this,arguments);
        },
        id:null,
        config:null,
        dragElId:null,
        handleElId:null,
        invalidHandleTypes:null,
        invalidHandleIds:null,
        invalidHandleClasses:null,
        startPageX:0,
        startPageY:0,
        groups:null,
        locked:false,
        lock:function(){
            this.locked=true;
        },
        unlock:function(){
            this.locked=false;
        },
        isTarget:true,
        padding:null,
        dragOnly:false,
        useShim:false,
        _domRef:null,
        __ygDragDrop:true,
        constrainX:false,
        constrainY:false,
        minX:0,
        maxX:0,
        minY:0,
        maxY:0,
        deltaX:0,
        deltaY:0,
        maintainOffset:false,
        xTicks:null,
        yTicks:null,
        primaryButtonOnly:true,
        available:false,
        hasOuterHandles:false,
        cursorIsOver:false,
        overlap:null,
        b4StartDrag:function(C,D){},
        startDrag:function(C,D){},
        b4Drag:function(C){},
        onDrag:function(C){},
        onDragEnter:function(C,D){},
        b4DragOver:function(C){},
        onDragOver:function(C,D){},
        b4DragOut:function(C){},
        onDragOut:function(C,D){},
        b4DragDrop:function(C){},
        onDragDrop:function(C,D){},
        onInvalidDrop:function(C){},
        b4EndDrag:function(C){},
        endDrag:function(C){},
        b4MouseDown:function(C){},
        onMouseDown:function(C){},
        onMouseUp:function(C){},
        onAvailable:function(){},
        getEl:function(){
            if(!this._domRef){
                this._domRef=B.get(this.id);
            }
            return this._domRef;
        },
        getDragEl:function(){
            return B.get(this.dragElId);
        },
        init:function(F,C,D){
            this.initTarget(F,C,D);
            A.on(this._domRef||this.id,"mousedown",this.handleMouseDown,this,true);
            for(var E in this.events){
                this.createEvent(E+"Event");
            }
        },
        initTarget:function(E,C,D){
            this.config=D||{};

            this.events={};

            this.DDM=YAHOO.util.DDM;
            this.groups={};

            if(typeof E!=="string"){
                this._domRef=E;
                E=B.generateId(E);
            }
            this.id=E;
            this.addToGroup((C)?C:"default");
            this.handleElId=E;
            A.onAvailable(E,this.handleOnAvailable,this,true);
            this.setDragElId(E);
            this.invalidHandleTypes={
                A:"A"
            };

            this.invalidHandleIds={};

            this.invalidHandleClasses=[];
            this.applyConfig();
        },
        applyConfig:function(){
            this.events={
                mouseDown:true,
                b4MouseDown:true,
                mouseUp:true,
                b4StartDrag:true,
                startDrag:true,
                b4EndDrag:true,
                endDrag:true,
                drag:true,
                b4Drag:true,
                invalidDrop:true,
                b4DragOut:true,
                dragOut:true,
                dragEnter:true,
                b4DragOver:true,
                dragOver:true,
                b4DragDrop:true,
                dragDrop:true
            };

            if(this.config.events){
                for(var C in this.config.events){
                    if(this.config.events[C]===false){
                        this.events[C]=false;
                    }
                }
            }
            this.padding=this.config.padding||[0,0,0,0];
            this.isTarget=(this.config.isTarget!==false);
            this.maintainOffset=(this.config.maintainOffset);
            this.primaryButtonOnly=(this.config.primaryButtonOnly!==false);
            this.dragOnly=((this.config.dragOnly===true)?true:false);
            this.useShim=((this.config.useShim===true)?true:false);
        },
        handleOnAvailable:function(){
            this.available=true;
            this.resetConstraints();
            this.onAvailable();
        },
        setPadding:function(E,C,F,D){
            if(!C&&0!==C){
                this.padding=[E,E,E,E];
            }else{
                if(!F&&0!==F){
                    this.padding=[E,C,E,C];
                }else{
                    this.padding=[E,C,F,D];
                }
            }
        },
        setInitPosition:function(F,E){
            var G=this.getEl();
            if(!this.DDM.verifyEl(G)){
                if(G&&G.style&&(G.style.display=="none")){}else{}
                return;
            }
            var D=F||0;
            var C=E||0;
            var H=B.getXY(G);
            this.initPageX=H[0]-D;
            this.initPageY=H[1]-C;
            this.lastPageX=H[0];
            this.lastPageY=H[1];
            this.setStartPosition(H);
        },
        setStartPosition:function(D){
            var C=D||B.getXY(this.getEl());
            this.deltaSetXY=null;
            this.startPageX=C[0];
            this.startPageY=C[1];
        },
        addToGroup:function(C){
            this.groups[C]=true;
            this.DDM.regDragDrop(this,C);
        },
        removeFromGroup:function(C){
            if(this.groups[C]){
                delete this.groups[C];
            }
            this.DDM.removeDDFromGroup(this,C);
        },
        setDragElId:function(C){
            this.dragElId=C;
        },
        setHandleElId:function(C){
            if(typeof C!=="string"){
                C=B.generateId(C);
            }
            this.handleElId=C;
            this.DDM.regHandle(this.id,C);
        },
        setOuterHandleElId:function(C){
            if(typeof C!=="string"){
                C=B.generateId(C);
            }
            A.on(C,"mousedown",this.handleMouseDown,this,true);
            this.setHandleElId(C);
            this.hasOuterHandles=true;
        },
        unreg:function(){
            A.removeListener(this.id,"mousedown",this.handleMouseDown);
            this._domRef=null;
            this.DDM._remove(this);
        },
        isLocked:function(){
            return(this.DDM.isLocked()||this.locked);
        },
        handleMouseDown:function(J,I){
            var D=J.which||J.button;
            if(this.primaryButtonOnly&&D>1){
                return;
            }
            if(this.isLocked()){
                return;
            }
            var C=this.b4MouseDown(J),F=true;
            if(this.events.b4MouseDown){
                F=this.fireEvent("b4MouseDownEvent",J);
            }
            var E=this.onMouseDown(J),H=true;
            if(this.events.mouseDown){
                H=this.fireEvent("mouseDownEvent",J);
            }
            if((C===false)||(E===false)||(F===false)||(H===false)){
                return;
            }
            this.DDM.refreshCache(this.groups);
            var G=new YAHOO.util.Point(A.getPageX(J),A.getPageY(J));
            if(!this.hasOuterHandles&&!this.DDM.isOverTarget(G,this)){}else{
                if(this.clickValidator(J)){
                    this.setStartPosition();
                    this.DDM.handleMouseDown(J,this);
                    this.DDM.stopEvent(J);
                }else{}
            }
        },
        clickValidator:function(D){
            var C=YAHOO.util.Event.getTarget(D);
            return(this.isValidHandleChild(C)&&(this.id==this.handleElId||this.DDM.handleWasClicked(C,this.id)));
        },
        getTargetCoord:function(E,D){
            var C=E-this.deltaX;
            var F=D-this.deltaY;
            if(this.constrainX){
                if(C<this.minX){
                    C=this.minX;
                }
                if(C>this.maxX){
                    C=this.maxX;
                }
            }
            if(this.constrainY){
                if(F<this.minY){
                    F=this.minY;
                }
                if(F>this.maxY){
                    F=this.maxY;
                }
            }
            C=this.getTick(C,this.xTicks);
            F=this.getTick(F,this.yTicks);
            return{
                x:C,
                y:F
            };

        },
        addInvalidHandleType:function(C){
            var D=C.toUpperCase();
            this.invalidHandleTypes[D]=D;
        },
        addInvalidHandleId:function(C){
            if(typeof C!=="string"){
                C=B.generateId(C);
            }
            this.invalidHandleIds[C]=C;
        },
        addInvalidHandleClass:function(C){
            this.invalidHandleClasses.push(C);
        },
        removeInvalidHandleType:function(C){
            var D=C.toUpperCase();
            delete this.invalidHandleTypes[D];
        },
        removeInvalidHandleId:function(C){
            if(typeof C!=="string"){
                C=B.generateId(C);
            }
            delete this.invalidHandleIds[C];
        },
        removeInvalidHandleClass:function(D){
            for(var E=0,C=this.invalidHandleClasses.length;E<C;++E){
                if(this.invalidHandleClasses[E]==D){
                    delete this.invalidHandleClasses[E];
                }
            }
        },
        isValidHandleChild:function(F){
            var E=true;
            var H;
            try{
                H=F.nodeName.toUpperCase();
            }catch(G){
                H=F.nodeName;
            }
            E=E&&!this.invalidHandleTypes[H];
            E=E&&!this.invalidHandleIds[F.id];
            for(var D=0,C=this.invalidHandleClasses.length;E&&D<C;++D){
                E=!B.hasClass(F,this.invalidHandleClasses[D]);
            }
            return E;
        },
        setXTicks:function(F,C){
            this.xTicks=[];
            this.xTickSize=C;
            var E={};

            for(var D=this.initPageX;D>=this.minX;D=D-C){
                if(!E[D]){
                    this.xTicks[this.xTicks.length]=D;
                    E[D]=true;
                }
            }
            for(D=this.initPageX;D<=this.maxX;D=D+C){
                if(!E[D]){
                    this.xTicks[this.xTicks.length]=D;
                    E[D]=true;
                }
            }
            this.xTicks.sort(this.DDM.numericSort);
        },
        setYTicks:function(F,C){
            this.yTicks=[];
            this.yTickSize=C;
            var E={};

            for(var D=this.initPageY;D>=this.minY;D=D-C){
                if(!E[D]){
                    this.yTicks[this.yTicks.length]=D;
                    E[D]=true;
                }
            }
            for(D=this.initPageY;D<=this.maxY;D=D+C){
                if(!E[D]){
                    this.yTicks[this.yTicks.length]=D;
                    E[D]=true;
                }
            }
            this.yTicks.sort(this.DDM.numericSort);
        },
        setXConstraint:function(E,D,C){
            this.leftConstraint=parseInt(E,10);
            this.rightConstraint=parseInt(D,10);
            this.minX=this.initPageX-this.leftConstraint;
            this.maxX=this.initPageX+this.rightConstraint;
            if(C){
                this.setXTicks(this.initPageX,C);
            }
            this.constrainX=true;
        },
        clearConstraints:function(){
            this.constrainX=false;
            this.constrainY=false;
            this.clearTicks();
        },
        clearTicks:function(){
            this.xTicks=null;
            this.yTicks=null;
            this.xTickSize=0;
            this.yTickSize=0;
        },
        setYConstraint:function(C,E,D){
            this.topConstraint=parseInt(C,10);
            this.bottomConstraint=parseInt(E,10);
            this.minY=this.initPageY-this.topConstraint;
            this.maxY=this.initPageY+this.bottomConstraint;
            if(D){
                this.setYTicks(this.initPageY,D);
            }
            this.constrainY=true;
        },
        resetConstraints:function(){
            if(this.initPageX||this.initPageX===0){
                var D=(this.maintainOffset)?this.lastPageX-this.initPageX:0;
                var C=(this.maintainOffset)?this.lastPageY-this.initPageY:0;
                this.setInitPosition(D,C);
            }else{
                this.setInitPosition();
            }
            if(this.constrainX){
                this.setXConstraint(this.leftConstraint,this.rightConstraint,this.xTickSize);
            }
            if(this.constrainY){
                this.setYConstraint(this.topConstraint,this.bottomConstraint,this.yTickSize);
            }
        },
        getTick:function(I,F){
            if(!F){
                return I;
            }else{
                if(F[0]>=I){
                    return F[0];
                }else{
                    for(var D=0,C=F.length;D<C;++D){
                        var E=D+1;
                        if(F[E]&&F[E]>=I){
                            var H=I-F[D];
                            var G=F[E]-I;
                            return(G>H)?F[D]:F[E];
                        }
                    }
                    return F[F.length-1];
                }
            }
        },
        toString:function(){
            return("DragDrop "+this.id);
        }
    };

    YAHOO.augment(YAHOO.util.DragDrop,YAHOO.util.EventProvider);
})();
YAHOO.util.DD=function(C,A,B){
    if(C){
        this.init(C,A,B);
    }
};

YAHOO.extend(YAHOO.util.DD,YAHOO.util.DragDrop,{
    scroll:true,
    autoOffset:function(C,B){
        var A=C-this.startPageX;
        var D=B-this.startPageY;
        this.setDelta(A,D);
    },
    setDelta:function(B,A){
        this.deltaX=B;
        this.deltaY=A;
    },
    setDragElPos:function(C,B){
        var A=this.getDragEl();
        this.alignElWithMouse(A,C,B);
    },
    alignElWithMouse:function(C,G,F){
        var E=this.getTargetCoord(G,F);
        if(!this.deltaSetXY){
            var H=[E.x,E.y];
            YAHOO.util.Dom.setXY(C,H);
            var D=parseInt(YAHOO.util.Dom.getStyle(C,"left"),10);
            var B=parseInt(YAHOO.util.Dom.getStyle(C,"top"),10);
            this.deltaSetXY=[D-E.x,B-E.y];
        }else{
            YAHOO.util.Dom.setStyle(C,"left",(E.x+this.deltaSetXY[0])+"px");
            YAHOO.util.Dom.setStyle(C,"top",(E.y+this.deltaSetXY[1])+"px");
        }
        this.cachePosition(E.x,E.y);
        var A=this;
        setTimeout(function(){
            A.autoScroll.call(A,E.x,E.y,C.offsetHeight,C.offsetWidth);
        },0);
    },
    cachePosition:function(B,A){
        if(B){
            this.lastPageX=B;
            this.lastPageY=A;
        }else{
            var C=YAHOO.util.Dom.getXY(this.getEl());
            this.lastPageX=C[0];
            this.lastPageY=C[1];
        }
    },
    autoScroll:function(J,I,E,K){
        if(this.scroll){
            var L=this.DDM.getClientHeight();
            var B=this.DDM.getClientWidth();
            var N=this.DDM.getScrollTop();
            var D=this.DDM.getScrollLeft();
            var H=E+I;
            var M=K+J;
            var G=(L+N-I-this.deltaY);
            var F=(B+D-J-this.deltaX);
            var C=40;
            var A=(document.all)?80:30;
            if(H>L&&G<C){
                window.scrollTo(D,N+A);
            }
            if(I<N&&N>0&&I-N<C){
                window.scrollTo(D,N-A);
            }
            if(M>B&&F<C){
                window.scrollTo(D+A,N);
            }
            if(J<D&&D>0&&J-D<C){
                window.scrollTo(D-A,N);
            }
        }
    },
    applyConfig:function(){
        YAHOO.util.DD.superclass.applyConfig.call(this);
        this.scroll=(this.config.scroll!==false);
    },
    b4MouseDown:function(A){
        this.setStartPosition();
        this.autoOffset(YAHOO.util.Event.getPageX(A),YAHOO.util.Event.getPageY(A));
    },
    b4Drag:function(A){
        this.setDragElPos(YAHOO.util.Event.getPageX(A),YAHOO.util.Event.getPageY(A));
    },
    toString:function(){
        return("DD "+this.id);
    }
});
YAHOO.util.DDProxy=function(C,A,B){
    if(C){
        this.init(C,A,B);
        this.initFrame();
    }
};

YAHOO.util.DDProxy.dragElId="ygddfdiv";
YAHOO.extend(YAHOO.util.DDProxy,YAHOO.util.DD,{
    resizeFrame:true,
    centerFrame:false,
    createFrame:function(){
        var B=this,A=document.body;
        if(!A||!A.firstChild){
            setTimeout(function(){
                B.createFrame();
            },50);
            return;
        }
        var F=this.getDragEl(),E=YAHOO.util.Dom;
        if(!F){
            F=document.createElement("div");
            F.id=this.dragElId;
            var D=F.style;
            D.position="absolute";
            D.visibility="hidden";
            D.cursor="move";
            D.border="2px solid #aaa";
            D.zIndex=999;
            D.height="25px";
            D.width="25px";
            var C=document.createElement("div");
            E.setStyle(C,"height","100%");
            E.setStyle(C,"width","100%");
            E.setStyle(C,"background-color","#ccc");
            E.setStyle(C,"opacity","0");
            F.appendChild(C);
            A.insertBefore(F,A.firstChild);
        }
    },
    initFrame:function(){
        this.createFrame();
    },
    applyConfig:function(){
        YAHOO.util.DDProxy.superclass.applyConfig.call(this);
        this.resizeFrame=(this.config.resizeFrame!==false);
        this.centerFrame=(this.config.centerFrame);
        this.setDragElId(this.config.dragElId||YAHOO.util.DDProxy.dragElId);
    },
    showFrame:function(E,D){
        var C=this.getEl();
        var A=this.getDragEl();
        var B=A.style;
        this._resizeProxy();
        if(this.centerFrame){
            this.setDelta(Math.round(parseInt(B.width,10)/2),Math.round(parseInt(B.height,10)/2));
        }
        this.setDragElPos(E,D);
        YAHOO.util.Dom.setStyle(A,"visibility","visible");
    },
    _resizeProxy:function(){
        if(this.resizeFrame){
            var H=YAHOO.util.Dom;
            var B=this.getEl();
            var C=this.getDragEl();
            var G=parseInt(H.getStyle(C,"borderTopWidth"),10);
            var I=parseInt(H.getStyle(C,"borderRightWidth"),10);
            var F=parseInt(H.getStyle(C,"borderBottomWidth"),10);
            var D=parseInt(H.getStyle(C,"borderLeftWidth"),10);
            if(isNaN(G)){
                G=0;
            }
            if(isNaN(I)){
                I=0;
            }
            if(isNaN(F)){
                F=0;
            }
            if(isNaN(D)){
                D=0;
            }
            var E=Math.max(0,B.offsetWidth-I-D);
            var A=Math.max(0,B.offsetHeight-G-F);
            H.setStyle(C,"width",E+"px");
            H.setStyle(C,"height",A+"px");
        }
    },
    b4MouseDown:function(B){
        this.setStartPosition();
        var A=YAHOO.util.Event.getPageX(B);
        var C=YAHOO.util.Event.getPageY(B);
        this.autoOffset(A,C);
    },
    b4StartDrag:function(A,B){
        this.showFrame(A,B);
    },
    b4EndDrag:function(A){
        YAHOO.util.Dom.setStyle(this.getDragEl(),"visibility","hidden");
    },
    endDrag:function(D){
        var C=YAHOO.util.Dom;
        var B=this.getEl();
        var A=this.getDragEl();
        C.setStyle(A,"visibility","");
        C.setStyle(B,"visibility","hidden");
        YAHOO.util.DDM.moveToEl(B,A);
        C.setStyle(A,"visibility","hidden");
        C.setStyle(B,"visibility","");
    },
    toString:function(){
        return("DDProxy "+this.id);
    }
});
YAHOO.util.DDTarget=function(C,A,B){
    if(C){
        this.initTarget(C,A,B);
    }
};

YAHOO.extend(YAHOO.util.DDTarget,YAHOO.util.DragDrop,{
    toString:function(){
        return("DDTarget "+this.id);
    }
});
YAHOO.register("dragdrop",YAHOO.util.DragDropMgr,{
    version:"2.8.0r4",
    build:"2449"
});