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; */