ug.DataSource=function(A){ug.DataSource.superclass.constructor.call(this);
Ext.apply(this,A)
};
Ext.extend(ug.DataSource,Ext.util.Observable,{fetchData:Ext.emptyFn,getData:Ext.emptyFn});
ug.RpcDataSource=function(A){ug.RpcDataSource.superclass.constructor.call(this,A);
this.init(A)
};
Ext.extend(ug.RpcDataSource,ug.DataSource,{generation:0,fetchData:function(C,B){if(this.loading){this.nextData=[C,B]
}else{delete this.nextData;
var A=function(){this.loading=false;
if(this.nextData){this.fetchData(this.nextData[0],this.nextData[1])
}};
this.loading=true;
this.getData(C,B,A,this)
}},getData:function(F,C,B,G){if((this.rpc=="")&&(this.url=="")){B.call(G);
return 
}if(this.storage.getSize()>=0){var E=this.storage.getInterval(F,C);
var A=E.getMissingData(F,C);
if(!A){B.call(G);
return 
}F=A[0];
C=A[1];
if(C-F<16){if(C==E.max){C=Math.min(this.storage.getSize(),F+16)
}else{if(F==E.min){F=Math.max(0,C-16)
}}}}else{F=Math.max(0,F)
}var H=this.generation;
var D=function(I){if(H==this.generation){this.processData(I,F,C,B,G)
}};
if(this.storage.getSize()<=0){this.storage.setMessage("Loading...")
}ug.rpc({rpc:this.rpc,url:this.url,params:Ext.apply({start:F-this.offset,limit:C-F},this.params),callback:D,scope:this})
},processData:function(C,D,H,B,I){var E,G;
if(this.paged){delete this.params.count;
G=C[this.countField];
E=C[this.dataField]
}else{G=C.length;
E=C;
D=0
}if(G==0){if(!Ext.isEmpty(this.params[this.filterParam])){this.storage.setMessage("No results.")
}else{this.storage.setMessage(this.storage.emptyText||null)
}}else{this.storage.setMessage(null)
}if(typeof G=="number"){this.storage.setSize(G+this.offset)
}for(var F=0,A=E.length;
F<A;
++F){if(this.preprocessor){this.preprocessor(E[F])
}else{Ext.apply(E[F],this.annotation)
}}this.storage.setData(D,E);
B.call(I)
},setFilter:function(A){++this.generation;
this.loading=false;
this.offset=0;
this.params.count=true;
this.params[this.filterParam]=A
},init:function(A){++this.generation;
Ext.apply(this,A,{rpc:"",url:"",params:{},annotation:{},preprocessor:null,dataField:"data",countField:"count",filterParam:"query",offset:0,loading:false,paged:false});
if(A&&A.data){this.processData(A.data,0,A.data.length,Ext.emptyFn)
}}});
ug.DataInterval=function(B,A){Ext.apply(this,{min:B,max:A,cells:[],data:[],selected:[],selectCount:0,missingSelected:false})
};
ug.DataInterval.prototype={contains:function(A){return(A>=this.min)&&(A<this.max)
},getCell:function(A){return this.contains(A)&&this.cells[A-this.min]
},setCell:function(B,A){this.cells[B-this.min]=A
},setSelected:function(A,B){if(this.selected[A-this.min]?!B:B){this.selected[A-this.min]=B;
this.selectCount=this.selectCount+(B?1:-1);
if(B&&!this.data[A-this.min]){this.missingSelected=true
}return true
}return false
},clearSelection:function(){var B=[];
if(this.selectCount){this.selectCount=0;
for(var A=this.min;
A<this.max;
++A){if(this.selected[A-this.min]){this.selected[A-this.min]=false;
B.push(A)
}}}this.missingSelected=false;
return B
},isSelected:function(A){return(A>=this.min)&&(A<this.max)&&this.selected[A-this.min]
},getSelection:function(){var B=[];
if(this.selectCount){for(var A=this.min;
A<this.max;
++A){if(this.selected[A-this.min]){B.push(A)
}}}return B
},getSelectCount:function(){return this.selectCount
},getDatum:function(A){return((A>=this.min)&&(A<this.max))?this.data[A-this.min]:null
},isDisabled:function(B){var A=this.getDatum(B);
return A&&A.disabled
},setDatum:function(B,A){this.data[B-this.min]=A
},hasData:function(C,A){if((C<this.min)||(A>this.max)){return false
}for(var B=C;
B<A;
++B){if(!this.data[B-this.min]){return false
}}return true
},hasSelectedData:function(){if(this.missingSelected){for(var A=0,B=this.max-this.min;
A<B;
++A){if(this.selected[A]&&!this.data[A]){return false
}}this.missingSelected=false
}return true
},getMissingData:function(B,A){B=Math.max(B,this.min);
A=Math.min(A,this.max);
while((B<A)&&this.data[B-this.min]){++B
}while((A>B)&&this.data[A-1-this.min]){--A
}return(B<A)?[B,A]:null
},getSelectedData:function(){var B=[];
for(var A=0,C=this.max-this.min;
A<C;
++A){if(this.selected[A]){B.push(this.data[A])
}}return B
},mergeInterval:function(B){if((B.min<this.min)||(B.max>this.max)){throw"Interval merge error"
}this.selectCount+=B.selectCount;
for(var C=B.min;
C<B.max;
++C){this.cells[C-this.min]=B.cells[C-B.min];
var D=B.selected[C-B.min];
var A=B.data[C-B.min];
this.data[C-this.min]=A;
this.selected[C-this.min]=D;
this.missingSelected|=D&&!A
}}};
ug.SparseStorage=function(A){ug.SparseStorage.superclass.constructor.call(this,A);
this.source.storage=this
};
Ext.extend(ug.SparseStorage,ug.DataStorage,{doReset:function(){this.intervals=[];
if(this.source.params){this.source.params.count=true
}},filterData:function(A){this.reset();
this.source.setFilter(A)
},map:function(D,H,G,J){if(typeof D=="function"){G=D;
J=H;
D=0;
H=this.size
}for(var E=0,C=this.intervals.length;
E<C;
++E){var B=this.intervals[E];
var A=Math.max(D,B.min);
var I=Math.min(H,B.max);
for(var F=A;
F<I;
++F){G.call(J,B,F)
}}},mapIndices:function(F,E,D){var A=null;
for(var C=0,G=F.length;
C<G;
++C){var B=F[C];
if(!A||!A.contains(B)){A=this.findInterval(B)
}if(A){E.call(D,A,B)
}}},getSelectCount:function(){var B=0;
for(var A=0,C=this.intervals.length;
A<C;
++A){B+=this.intervals[A].getSelectCount()
}return B
},isSelected:function(A){var B=this.findInterval(A);
return B&&B.isSelected(A)
},setSelected:function(A,B){return this.getInterval(A).setSelected(A,B)
},getSelection:function(){var B=[];
for(var A=0;
A<this.intervals.length;
++A){B.push(this.intervals[A].getSelection())
}return ug.concatArrays(B)
},clearSelection:function(){var B=[];
for(var A=0;
A<this.intervals.length;
++A){B.push(this.intervals[A].clearSelection())
}return ug.concatArrays(B)
},getSelectedData:function(A,D,F){for(var C=((typeof F=="number")?(F+1):0);
C<this.intervals.length;
++C){var B=this.intervals[C];
if((B.getSelectCount()>0)&&!B.hasSelectedData()){this.source.getData(B.min,B.max,function(){this.getSelectedData(A,D,C)
},this);
return 
}}var E=[];
for(var C=0;
C<this.intervals.length;
++C){E.push(this.intervals[C].getSelectedData())
}A.call(D,ug.concatArrays(E))
},getCell:function(A){var B=this.findInterval(A);
return B&&B.getCell(A)
},setCell:function(B,A){var C=this.getInterval(B);
C.setCell(B,A)
},fetchData:function(A,B){this.source.fetchData(A,B)
},getDatum:function(A){var B=this.findInterval(A);
return B&&B.getDatum(A)
},setData:function(B,D){var E=D.length;
var A=this.getInterval(B,B+E);
for(var C=0;
C<E;
++C){A.setDatum(B+C,D[C])
}this.fireRegionEvent("change",B,E)
},hasData:function(C,A){C=Math.max(0,C);
A=Math.min(this.size,A);
var D=this.intervals,B=0,E=D.length;
while((B<E)&&(C>D[B].max)){++B
}return(B<E)&&D[B].hasData(C,A)
},remove:function(A,B){throw"unsupported"
},findInterval:function(A){var C=this.intervals,D=C.length,B=0;
while((B<D)&&(A>=C[B].max)){++B
}return((B>=0)&&(B<D))?C[B]:null
},getInterval:function(F,I){if(I==undefined){I=F+1
}F=Math.max(0,F);
I=Math.min(this.size,I);
var B=this.intervals,D=B.length,G=0;
j=D;
while((G<D)&&(F>B[G].max)){++G
}while((j>G)&&(I<B[j-1].min)){--j
}if((G<D)&&(G==j)){return B[G]
}var A=F,J=I;
if(G<j){A=Math.min(F,this.intervals[G].min);
J=Math.max(I,this.intervals[j-1].max)
}var C=new ug.DataInterval(A,J);
var H=this.intervals.splice(G,j-G,C);
for(var E=0;
E<H.length;
++E){C.mergeInterval(H[E])
}this.fireEvent("change",F,I);
return C
}});
ug.VirtualPanel=function(A){ug.VirtualPanel.superclass.constructor.call(this,Ext.apply({},A,{cls:"virtualPanel"}));
this.addEvents("next","previous")
};
Ext.extend(ug.VirtualPanel,ug.DataPanel,{scrollTop:0,onRender:function(B,A){ug.VirtualPanel.superclass.onRender.call(this,B,A);
if(this.storage.getSize()<=0){this.inner.setHeight(this.renderer.height)
}this.columns=this.renderer.width?Math.floor(this.inner.getWidth()/this.renderer.width):1
},afterRender:function(){ug.VirtualPanel.superclass.afterRender.apply(this,arguments);
if(this.loadOnRender){setTimeout(this.preload.createDelegate(this),100)
}},preload:function(){this.storage.fetchData(0,2*this.pageSize(true))
},initEvents:function(){ug.VirtualPanel.superclass.initEvents.apply(this,arguments);
this.keyNav=new Ext.KeyNav(this.el,{up:this.onNavigatePrevious,down:this.onNavigateNext,right:function(A){this.fireEvent("next",A)
},left:function(A){this.fireEvent("previous",A)
},pageUp:function(A){this.onNavigate(this.focusIndex-this.pageSize(),A)
},pageDown:function(A){this.onNavigate(this.focusIndex+this.pageSize(),A)
},home:this.onNavigateFirst,end:this.onNavigateLast,scope:this})
},onScroll:function(){if(this.inReset){return 
}var E=this.el.getScroll().top;
var G=E-this.scrollTop;
this.scrollTop=E;
var C=this.el.getHeight(true);
var D=Math.floor(E/this.renderer.height)*this.columns;
var B=Math.ceil((E+C)/this.renderer.height)*this.columns;
var F=(G<0)?this.pageSize(true):0;
var A=(G<0)?0:this.pageSize(true);
if(!this.storage.hasData(D-F,B+A)){D=D-F*2;
B=B+A*2;
this.storage.getInterval(D,B);
this.storage.fetchData(D,B)
}},findCell:function(A,B){return Math.floor(B/this.renderer.height)*this.columns+Math.floor(A/(this.renderer.width||1000))
},onStorageResize:function(A){ug.VirtualPanel.superclass.onStorageResize.apply(this,arguments);
this.adjustHeight(A)
},onStorageInsert:function(C,E){var D=(this.columns||1),A=this.renderer.width||this.inner.getWidth(),B=this.renderer.height;
this.adjustHeight(this.storage.getSize());
this.storage.map(C+E,this.storage.getSize(),function(H,I){var M=H.getCell(I);
if(M){var L=I%D,J=Math.floor(I/D),K=J*B,G=L*A,N=((L+J)%2),F=Ext.fly(M);
F.setLeft(G);
F.setTop(K);
F.replaceClass(N?"even":"odd",N?"odd":"even")
}},this);
ug.VirtualPanel.superclass.onStorageInsert.call(this,C,E)
},adjustHeight:function(B){var A=this.columns?Math.ceil(Math.max(1,B)/this.columns):Math.max(1,B);
this.inner.setHeight(A*this.renderer.height)
},onResize:function(D,A,E,B){var C=this.inner.getWidth();
if((C>0)&&!this.renderer.width){this.storage.map(function(H,G){var F=H.getCell(G);
if(F){Ext.fly(F).setWidth(C)
}},this)
}},createCell:function(C,I){var D=(this.columns||1),G=C%D,E=Math.floor(C/D),H=this.renderer.width||this.inner.getWidth(),F=E*this.renderer.height,A=G*H;
var B=((G+E)%2)?"cell odd ":"cell even ";
return this.inner.insertHtml("beforeEnd","<div class='"+B+I+"' style='top: "+F+"px; left: "+A+"px; width: "+H+"px;'><div class='inner'></div></div>")
},onBeforeStorageReset:function(){ug.VirtualPanel.superclass.onBeforeStorageReset.apply(this,arguments);
this.scrollTop=0;
this.inner.setHeight(this.renderer.height)
},pageSize:function(A){var B=this.el.getHeight(true)/this.renderer.height;
return(A?Math.ceil(B):Math.floor(B))*this.columns
},getCellBox:function(A){return{x:(A%this.columns)*(this.renderer.width||0),y:Math.floor(A/this.columns)*this.renderer.height,height:this.renderer.height}
}});

