function $random_string(E){E=E||8;var D="0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";var C="";for(var B=0;B<E;B++){var A=Math.floor(Math.random()*D.length);C+=D.substring(A,A+1)}return C}function $range(D,B){console.assert((B>=D),"end must be gte start");var A=[];for(var C=D;C<=B;C++){A.push(C)}return A}var ContentScroller=new Class({options:{debug:false,node:null,rows_per_page:3,row_height:(getBrowser()==="ie7")?75:83,url:"/cbi/table/shardDataPage",sortatr:null,sortdir:"increasing",body:{uuid:null,suppress_paging:1,page:0,sort_direction:null,sort_by_attr:null},onLoad:Class.empty,onStart:Class.empty,onComplete:Class.empty},initialize:function(B,A){this.concept=B;this.setOptions(A);console.assert(this.options.node,"you have not defined a node");this.pending=0;this.url=this.options.url;this.options.body.uuid=this.concept;this.options.body.sort_direction=this.options.sortdir;this.options.body.sort_by_attr=this.options.sortatr;this.options.body.page_length=this.options.rows_per_page;this.loaded_pages=[];this.loading_pages=[];this.loading_page=null;this.ajax_proxy=null;this.configure();this.registerhandlers()},configure:function(){console.time("configure");var D=this.options.node.getElements("div.item");var E=this.options.node.getSize().size.y;var F;for(var C=0,B=0;C<E;C+=(this.options.row_height*this.options.rows_per_page),B++){if(this.options.debug){if(B%2==0){F=new Element("div",{styles:{height:(this.options.row_height*this.options.rows_per_page),border:"1px solid green",background:"#eeeeee"},id:"page_"+parseInt(B)})}else{F=new Element("div",{styles:{height:(this.options.row_height*this.options.rows_per_page),border:"1px solid blue",background:"#87cefa"},id:"page_"+parseInt(B)})}}else{F=new Element("div",{styles:{height:(this.options.row_height*this.options.rows_per_page)},id:"page_"+parseInt(B)})}F.injectInside(this.options.node);if(D.length>0){F.adopt($A(D.slice(0,this.options.rows_per_page)));D.splice(0,this.options.rows_per_page)}}if(F){F.setStyle("height","")}var A=this.options.node.getParent();A.scrollTo(0,0);console.timeEnd("configure")},registerhandlers:function(){var A=this.options.node.getParent();A.addEvent("scroll",(function(){var E=A.getSize().scroll.y;var D=E+A.getSize().size.y;var G=Math.floor(E/this.options.row_height);var F=Math.floor(D/this.options.row_height);var C=Math.floor(G/this.options.rows_per_page);var B=Math.floor(F/this.options.rows_per_page);this.getpages($range(C,B))}).bind(this))},hasfullpage:function(B){var A=B.getElements("div.item");return(A.length==this.options.rows_per_page)},seturl:function(A){this.url=A},getpages:function(A){switch($type(A)){case"number":console.log("not yet implemented");break;case"array":A.each((function(B){this._update_loading(B)}).bind(this));this.ajaxloop();break;default:console.assert(false,"not implemented");break}},_update_loaded:function(A){this.loaded_pages.push(A);this._update_pending()},_update_loading:function(A){if(!this.loaded_pages.contains(A)){console.log("requesting page:",A);this.loading_pages.unshift(A)}this._update_pending()},_update_pending:function(){var B=this.pending;var A=this.loading_pages.length;if(this.ajax_proxy&&this.ajax_proxy.running){A+=1}this.pending=A;if((B==0)&&(A>0)){this.fireEvent("onStart")}else{if((B>0)&&(A==0)){this.fireEvent("onComplete")}}},ajaxloop:function(){this._update_pending();if(this.loading_pages.length==0){return }else{if(this.ajax_proxy&&this.ajax_proxy.running){return }}var D=this.loading_pages.shift();if(this.loaded_pages.contains(D)){return this.ajaxloop()}var B=$("page_"+parseInt(D));if(!(B)||this.hasfullpage(B)){return this.ajaxloop()}console.log("loading page:",D);var C=$merge(this.options.body,{page:D});var A=new Ajax(this.url,{method:"get",update:$("page_"+parseInt(D)),evalScripts:true,onSuccess:function(){this._update_loaded(D);this.options.onLoad();this.ajaxloop()}.bind(this)});this.ajax_proxy=A;A.request(C)}});ContentScroller.implement(new Options,new Events);window.addEvent("domready",function(){});var ContentScroller2=new Class({options:{num_rows_per_page:null,row_height_in_pixels:null,scrollable_element:null,content_retrieval:{url:null,method:null},onViewportChanged:Class.empty,onLoad:Class.empty},initialize:function(A){this.setOptions(A);this.template=null;this.requested_payloads=[];this.requested_pages=[];this.request_obj=null;this.configure();this.registerhandlers()},set_template:function(A){this.template=Json.evaluate(Json.toString(A))},viewportChanged:function(){var E=this.options.scrollable_element;var D=E.getSize();console.log("scrollable size:",D);var F=D.scroll.y;var G=D.scroll.y+D.size.y;var C=this.options.num_rows_per_page*this.options.row_height_in_pixels;var A=Math.floor(F/(C));var B=Math.ceil(G/(C));$range(A,B).each(function(H){this.get_page_content(H)},this)},configure:function(){this.request_obj=new Ajax(this.options.content_retrieval.url,{method:this.options.content_retrieval.method,autoCancel:true,onComplete:function(E,B){var F=Json.evaluate(E)[0];var H=F[0];var C=F[1];var G=this.get_num_pages();var J=Math.ceil(H/this.options.num_rows_per_page);if(G!=J){this.inject_pages(J);console.log("injected",J,"pages")}var I=this.requested_pages.shift();if(I<J){console.log("working on page:",I);var A=$ES(".page",this.options.scrollable_element);var D=A[I];D.setHTML(C)}else{console.warn("seem to have requested something off the end of the world")}this.fireEvent("onLoad",[F]);this.send_next()}.bind(this)})},registerhandlers:function(){this.options.scrollable_element.addEvent("scroll",function(){console.log("scroll");this.viewportChanged()}.bind(this))},send_next:function(){if(this.request_obj.running||(this.requested_payloads.length===0)){return }var D=this.requested_pages[0];var B=$ES(".page",this.options.scrollable_element);if(D<B.length){var A=B[D];if(A.getChildren().length>0){console.log("skipping ",D,"; already loaded");this.requested_payloads.shift();this.requested_pages.shift();this.send_next();return }}var C=this.requested_payloads.shift();this.send(C)},send:function(B){var A;switch(this.options.content_retrieval.method){case"post":A=Json.toString(B);break;case"get":A=Object.toQueryString(B);break;default:console.assert(false,"method should have been post or get");break}if(typeof (A)!=="undefined"){this.request_obj.request(A)}},get_page_content:function(A){var B=$merge(this.template,{start:A*this.options.num_rows_per_page,end:(A+1)*this.options.num_rows_per_page});this.requested_payloads.push(B);this.requested_pages.push(A);this.send_next()},get_num_pages:function(){var A=$ES(".page",this.options.scrollable_element);return A.length},clear_pages:function(){var A=this.options.scrollable_element;A.setHTML("")},inject_pages:function(D){this.clear_pages();var C=this.options.scrollable_element;for(var B=0;B<D;B++){var A=new Element("div",{"styles":{"height":this.options.num_rows_per_page*this.options.row_height_in_pixels,"border":"1px solid orange","background":(B%2)?"#FFF8DC":"#ADFF2F"},"class":"page"}).injectInside(C)}}});ContentScroller2.implement(new Options(),new Events())
