Ext.ux.Portlet=Ext.extend(Ext.Panel,{anchor:"100%",collapsible:true,draggable:true,cls:"x-portlet"});Ext.reg("portlet",Ext.ux.Portlet);Ext.ux.PortalColumn=Ext.extend(Ext.Container,{layout:"anchor",autoEl:"div",defaultType:"graphpanel",cls:"x-portal-column"});Ext.reg("portalcolumn",Ext.ux.PortalColumn);Ext.ux.Portal=Ext.extend(Ext.Panel,{layout:"column",autoScroll:true,cls:"x-portal",defaultType:"portalcolumn",initComponent:function(){Ext.ux.Portal.superclass.initComponent.call(this);this.addEvents({validatedrop:true,beforedragover:true,dragover:true,beforedrop:true,drop:true})},initEvents:function(){Ext.ux.Portal.superclass.initEvents.call(this);this.dd=new Ext.ux.Portal.DropZone(this,this.dropConfig)}});Ext.reg("portal",Ext.ux.Portal);Ext.ux.Portal.DropZone=function(A,B){this.portal=A;Ext.dd.ScrollManager.register(A.body);Ext.ux.Portal.DropZone.superclass.constructor.call(this,A.bwrap.dom,B);A.body.ddScrollConfig=this.ddScrollConfig};Ext.extend(Ext.ux.Portal.DropZone,Ext.dd.DropTarget,{ddScrollConfig:{vthresh:50,hthresh:-1,animate:true,increment:200},createEvent:function(A,D,C,B,F,E){return{portal:this.portal,panel:C.panel,columnIndex:B,column:F,position:E,data:C,source:A,rawEvent:D,status:this.dropAllowed}},notifyOver:function(Q,O,R){var D=O.getXY(),A=this.portal,J=Q.proxy;if(!this.grid){this.grid=this.getGrid()}var B=A.body.dom.clientWidth;if(!this.lastCW){this.lastCW=B}else{if(this.lastCW!=B){this.lastCW=B;A.doLayout();this.grid=this.getGrid()}}var C=0,H=this.grid.columnX,I=false;for(var M=H.length;C<M;C++){if(D[0]<(H[C].x+H[C].w)){I=true;break}}if(!I){C--}var L,G=false,F=0,P=A.items.itemAt(C),K=P.items.items;for(var M=K.length;F<M;F++){L=K[F];var N=L.el.getHeight();if(N!==0&&(L.el.getY()+(N/2))>D[1]){G=true;break}}var E=this.createEvent(Q,O,R,C,P,G&&L?F:P.items.getCount());if(A.fireEvent("validatedrop",E)!==false&&A.fireEvent("beforedragover",E)!==false){J.getProxy().setWidth("auto");if(L){J.moveProxy(L.el.dom.parentNode,G?L.el.dom:null)}else{J.moveProxy(P.el.dom,null)}this.lastPos={c:P,col:C,p:G&&L?F:false};this.scrollPos=A.body.getScroll();A.fireEvent("dragover",E);return E.status}else{return E.status}},notifyOut:function(){delete this.grid},notifyDrop:function(H,D,C){delete this.grid;if(!this.lastPos){return }var F=this.lastPos.c,B=this.lastPos.col,G=this.lastPos.p;var A=this.createEvent(H,D,C,B,F,G!==false?G:F.items.getCount());if(this.portal.fireEvent("validatedrop",A)!==false&&this.portal.fireEvent("beforedrop",A)!==false){H.proxy.getProxy().remove();H.panel.el.dom.parentNode.removeChild(H.panel.el.dom);if(G!==false){F.insert(G,H.panel)}else{F.add(H.panel)}F.doLayout();this.portal.fireEvent("drop",A);var I=this.scrollPos.top;if(I){var E=this.portal.body.dom;setTimeout(function(){E.scrollTop=I},10)}}delete this.lastPos},getGrid:function(){var A=this.portal.bwrap.getBox();A.columnX=[];this.portal.items.each(function(B){A.columnX.push({x:B.el.getX(),w:B.el.getWidth()})});return A}});