function duoDataGrid(elemId,table,funcOnClick,funcOnRollover,funcOnRollout,fields,headers,sqlwhere,obname){
//should eventually include, elemId,query,fields etc..
//varis below global to this object
var dataGridSelectedId='';
var scrollBoxes="";
var cellHeight="";
this.sqlwhere=sqlwhere;
var totalrows="";
var csvfields='';
var orderBy='';
var orderDirection='asc';
this.storedData=new Array;
var tableContainerid=elemId;
var oldStatusBarMessage="";
this.getRowCount=dg_getRowCount;
this.getRowCount_res=dg_getRowCount_res;
this.makeAllRows=dg_makeAllRows;
this.reorder=dg_reorder;
this.loadData=dg_gridScrollPosUpdate;
this.fields=fields;
this.headers=headers;
var table=table;
this.loadedrows=new Array;
var object=this;
var minLoadRows=20;
var columnWidths=new Array;
this.getRowCount();
var rowsPerBlock=20;
var test="users|username";
var scrollpos;
function dg_getRowCount(){
var myConn = new XHConn();
if (myConn){
csvfields='';
if (fields){//turn fields into csv
for(rows in fields){
csvfields+=rows+",";
}
csvfields=csvfields.substr(0,(csvfields.length-1));//remove last comma
}
var postdata="&where="+escape(object.sqlwhere);
myConn.connect("/duocms/"+table+"/getTotal/", "POST", postdata, this.getRowCount_res);
}
}
function dg_getRowCount_res(data){
//alert(data.responseText);
var data=eval('('+data.responseText+')');
totalrows=data.info.total;
//if(totalrows>1000){totalrows=1000;}
dg_makeAllRows();
dg_recordScrollPosUpdate();
}
function dg_makeAllRows(){
//prep container div
var tableContainer=document.getElementById(tableContainerid);
tableContainer.innerHTML='';
objectListen(tableContainer,'scroll',dg_recordScrollPosUpdate);
// creating all cellblocks
var html='';
var totalBlocks=Math.round((totalrows/rowsPerBlock)-0.5);//.5 to round down
for(var j = 0; j < totalBlocks; j++) {
html+="
";
}
//create small block at end for remaining overrun
var lastHeight=(((totalrows/rowsPerBlock)-(totalBlocks))*rowsPerBlock)*21;
//alert(Math.round(totalrows/20));
html+="";
tableContainer.innerHTML=html;
makeHeaders();
}
function makeHeaders(){
//make headers
var tableContainer=document.getElementById(tableContainerid);
if(document.getElementById(tableContainerid+"Headers")){//if they've already been made kill 'em
var headerblocks=tableContainer.parentNode.childNodes;
for(i=0;i0){//if they've been set
var rowcount=0;
for (var field in fields){
if(fields[field]==1){
var text=headers[rowcount];
if(typeof(text)=='string'){
var myheader = document.createElement("div");
myheader.id=tableContainerid+"header"+rowcount;
myheader.className="header";
myheader.style.width=colwidth+"%";
myheader.innerHTML=""+text+"";
myheaders.appendChild(myheader);
}
rowcount++;
}
}
tableContainer.parentNode.appendChild(myheaders);
}
}
function dg_recordScrollPosUpdate(){
var scrollBox=document.getElementById(tableContainerid);
scrollpos=scrollBox.scrollTop;
setTimeout(dg_gridScrollPosUpdate,500);//run every second instead of onscroll to evenout dataloads
}
function onclickFunc(e){
//highlight and unhightligh main
safecount=0;
if(document.getElementById('dataGridRowSelected')){
document.getElementById('dataGridRowSelected').setAttribute('id',dataGridSelectedId);
}
if(browser=="ie"){var item=window.event.srcElement;}else{var item=e.target;}
while(item.className!="dgrow" && safecount<10){
item=item.parentNode;
safecount++;
}
dataGridSelectedId=item.id;
object.selectedId=item.id.replace(/[^0-9]+/,'');
eval(funcOnClick);
item.id='dataGridRowSelected';
}
function dg_gridScrollPosUpdate(){
var scrollBox=document.getElementById(tableContainerid);
if(scrollpos==scrollBox.scrollTop){
cellHeight=21;
var totalViewable=Math.round(scrollBox.offsetHeight/cellHeight);
var toprow=Math.round((scrollBox.scrollTop/cellHeight));
var bottomrow=toprow+totalViewable;
//if(bottomrow>totalrows){bottomrow=totalrows;}
var topblock=Math.round((toprow/rowsPerBlock)-0.5);
var bottomblock=Math.round((bottomrow/rowsPerBlock)-0.5);
//document.getElementById('statusbar').innerHTML='Rows '+toprow+'-'+bottomrow+' of '+totalrows+' tb='+topblock+' bb='+bottomblock;
//if(topblock>0){topblock--;}//make sure panel above is loaded too
var block='';
for(i=topblock;i<=bottomblock;i++){
block=scrollBox.childNodes[i];
if( block && block.innerHTML.length<10){
dg_loadBlock(i,toprow,bottomrow);
}
}
}
}
function dg_loadBlock(blocknum,topcount,bottomcount){
var scrollBox=document.getElementById(tableContainerid);
var block=scrollBox.childNodes[blocknum];
if( block && block.innerHTML.length<10){
var myConn = new XHConn();
if (myConn){
if(!object.sqlwhere){object.sqlwhere='0';}
if(!orderBy){orderBy='0';}
var postdata="&where="+escape(object.sqlwhere);
toprow=Math.round(blocknum*rowsPerBlock);
bottomrow=toprow+rowsPerBlock;
block.innerHTML="data loading";
myConn.connect("/duocms/"+table+"/getList/"+toprow+"/"+bottomrow+"/"+csvfields+"/"+orderBy+"/"+orderDirection, "POST", postdata, dg_populate_res);
document.getElementById('statusbar').innerHTML=document.getElementById('statusbar').innerHTML+" loading rows "+toprow+"-"+bottomrow;
oldStatusBarMessage='Rows '+topcount+'-'+bottomcount+' of '+totalrows;
}
}
}
function dg_populate_res(data){
//alert(data.responseText);
var d = new Date();
var s = d.getTime();
var data=eval('('+data.responseText+')');
var scrollBox=document.getElementById(tableContainerid);
var block=scrollBox.childNodes[(parseInt(data.info.from)/rowsPerBlock)];
var colwidth=Math.round((99/headers.length)-0.5);
count=0;
rowid=data.info.from;
if( block && block.innerHTML.length<15){//check it's not already populated
var html='';
for(var i=0;i";
if(data.info[count]){
j=0;
for (row in data.info[count]){
var text=data.info[count][row];
if(typeof(text)=='string' && j"+text+"";
j++;
}
}
}
}
}
object.storedData[rowid]=data.info[count];
count++;
rowid++;
html+="";
}
}
block.innerHTML=html;
var rows=block.childNodes;
for (var i = 0; i < rows.length; i++) {
objectListen(rows[i], 'click', onclickFunc);
}
}
var d2 = new Date();
var e = d2.getTime();
var timetaken=(e-s)/1000;
document.getElementById('statusbar').innerHTML=oldStatusBarMessage+(' - took '+timetaken+' to render');
//setHeaderWidths();
}
function dg_reorder(e,field){
if(orderBy==field && orderDirection=="asc"){
orderDirection="desc";
}else if(orderBy==field && orderDirection=="desc"){
orderDirection="asc";
}
if(document.getElementById('dg_orderdesc')){
document.getElementById('dg_orderdesc').id='';
}
if(document.getElementById('dg_orderasc')){
document.getElementById('dg_orderasc').id='';
}
e.id="dg_order"+orderDirection;
orderBy=field;
dg_clearData();
dg_gridScrollPosUpdate();
}
function dg_clearData(){
var tableContainer=document.getElementById(tableContainerid);
var blocks=tableContainer.childNodes;
for(i=0;i'+data.info[count].title+'';
cells[2].innerHTML=data.info[count].username;
cells[3].innerHTML=data.info[count].when;
cells[4].innerHTML=data.info[count].publish;
*/