Files
aportil/themes/sources4.0/dhtmlxGrid/codebase/ext/dhtmlxgrid_nxml.js

613 lines
18 KiB
JavaScript

/*
Product Name: dhtmlxSuite
Version: 4.0.3
Edition: Professional
License: content of this file is covered by DHTMLX Commercial or Enterprise license. Usage without proper license is prohibited. To obtain it contact sales@dhtmlx.com
Copyright UAB Dinamenta http://www.dhtmlx.com
*/
/**
* @desc: load grid from CSV file
* @param: path - path to file
* @param: afterCall - function which will be called after xml loading
* @type: public
* @edition: Professional
* @topic: 0
*/
dhtmlXGridObject.prototype.loadCSVFile = function(path,afterCall){
this.load(path,afterCall,"csv")
}
/**
* @desc: enable mode, where ID for rows loaded from CSV autogenerated
* @param: mode - true/false
* @type: public
* @edition: Professional
* @topic: 0
*/
dhtmlXGridObject.prototype.enableCSVAutoID = function(mode){
this._csvAID=convertStringToBoolean(mode);
}
/**
* @desc: enable recognizing first row in CSV as header
* @param: mode - true/false
* @type: public
* @edition: Professional
* @topic: 0
*/
dhtmlXGridObject.prototype.enableCSVHeader = function(mode){
this._csvHdr=convertStringToBoolean(mode);
}
/**
* @desc: load grid from CSV string
* @param: str - delimer used in CSV operations, comma by default ( only single char delimeters allowed )
* @type: public
* @edition: Professional
* @topic: 0
*/
dhtmlXGridObject.prototype.setCSVDelimiter = function(str){
this.csv.cell=str;
}
dhtmlXGridObject.prototype._csvAID = true;
/**
* @desc: load grid from CSV string
* @param: str - CSV string
* @type: public
* @edition: Professional
* @topic: 0
*/
dhtmlXGridObject.prototype.loadCSVString = function(str){
this.parse(str,"csv")
}
/**
* @desc: serialize to CSV string
* @type: public
* @param: text only - force serialization of text values ( skip HTML elements ) )
* @edition: Professional
* @topic: 0
*/
dhtmlXGridObject.prototype.serializeToCSV = function(textmode){
this.editStop()
if (this._mathSerialization)
this._agetm="getMathValue";
else if (this._strictText || textmode)
this._agetm="getTitle";
else this._agetm="getValue";
var out=[];
if (this._csvHdr){
for (var j=1; j < this.hdr.rows.length; j++) {
var a=[];
for (var i=0; i<this._cCount; i++)
if ((!this._srClmn)||(this._srClmn[i]))
a.push(this.getColumnLabel(i,j-1));
out.push(this.csvParser.str(a,this.csv.cell, this.csv.row));
}
}
//rows collection
var i=0;
var leni=this.rowsBuffer.length;
for(i; i<leni; i++){
var temp=this._serializeRowToCVS(null,i)
if (temp!="") out.push(temp);
}
return this.csvParser.block(out,this.csv.row);
}
/**
* @desc: serialize TR to CSV
* @param: r - TR or xml node (row)
* @retruns: string - CSV representation of passed row
* @type: private
*/
dhtmlXGridObject.prototype._serializeRowToCVS = function(r,i,start,end){
var out = new Array();
if (!r){
r=this.render_row(i)
if (this._fake && !this._fake.rowsAr[r.idd]) this._fake.render_row(i);
}
if (!this._csvAID)
out[out.length]=r.idd;
start = start||0;
end = end||this._cCount;
//cells
var changeFl=false;
var ind=start;
//rowspans before block selection
while (r.childNodes[start]._cellIndex>ind && start) start--;
for(var jj=start;ind<end;jj++){
if (!r.childNodes[jj]) break;
var real_ind=r.childNodes[jj]._cellIndex;
if (((!this._srClmn)||(this._srClmn[real_ind])) && (!this._serialize_visible || !this._hrrar[real_ind])){
var cvx=r.childNodes[jj];
var zx=this.cells(r.idd,real_ind);
while (ind!=real_ind){
ind++;
out.push("")
if (ind>=end) break;
}
if (ind>=end) break;
ind++;
/* if (zx.getText)
zxVal=zx.getText();
else*/
if (zx.cell)
zxVal=zx[this._agetm]();
else zxVal="";
if ((this._chAttr)&&(zx.wasChanged()))
changeFl=true;
out[out.length]=((zxVal===null)?"":zxVal)
//#colspan:20092006{
if ( this._ecspn && cvx.colSpan && cvx.colSpan >1 ){
cvx=cvx.colSpan-1;
for (var u=0; u<cvx; u++){
out[out.length] = "";
ind++;
}
}
//#}
} else ind++;
}
if ((this._onlChAttr)&&(!changeFl)) return "";
return this.csvParser.str(out,this.csv.cell, this.csv.row);
}
dhtmlXGridObject.prototype.toClipBoard=function(val){
if (window.clipboardData)
window.clipboardData.setData("Text",val);
else
(new Clipboard()).copy(val);
}
dhtmlXGridObject.prototype.fromClipBoard=function(){
if (window.clipboardData)
return window.clipboardData.getData("Text");
else
return (new Clipboard()).paste();
}
/**
* @desc: copy value of cell to clipboard
* @type: public
* @param: rowId - id of row (optional, use selected row by default)
* @param: cellInd - column index(optional, use selected cell by default)
* @edition: Professional
* @topic: 5
*/
dhtmlXGridObject.prototype.cellToClipboard = function(rowId,cellInd){
if ((!rowId)||(!cellInd)){
if (!this.selectedRows[0]) return;
rowId=this.selectedRows[0].idd;
cellInd=this.cell._cellIndex;
}
var ed=this.cells(rowId,cellInd);
this.toClipBoard(((ed.getLabel?ed.getLabel():ed.getValue())||"").toString());
}
/**
* @desc: set value of cell from clipboard
* @type: public
* @edition: Professional
* @param: rowId - id of row (optional, use selected row by default)
* @param: cellInd - column index(optional, use selected cell by default)
* @topic: 5
*/
dhtmlXGridObject.prototype.updateCellFromClipboard = function(rowId,cellInd){
if ((!rowId)||(!cellInd)){
if (!this.selectedRows[0]) return;
rowId=this.selectedRows[0].idd;
cellInd=this.cell._cellIndex;
}
var ed=this.cells(rowId,cellInd);
ed[ed.setImage?"setLabel":"setValue"](this.fromClipBoard());
}
/**
* @desc: copy value of row to clipboard
* @type: public
* @edition: Professional
* @param: rowId - id of row (optional, use selected row by default)
* @topic: 5
*/
dhtmlXGridObject.prototype.rowToClipboard = function(rowId){
var out="";
if (this._mathSerialization)
this._agetm="getMathValue";
else if (this._strictText)
this._agetm="getTitle";
else
this._agetm="getValue";
this._serialize_visible = true;
if (rowId)
out=this._serializeRowToCVS(this.getRowById(rowId));
else {
var data = [];
for (var i=0; i<this.selectedRows.length; i++){
data[data.length] = this._serializeRowToCVS(this.selectedRows[i]);
out = this.csvParser.block(data, this.csv.row);
}
}
this._serialize_visible = false;
this.toClipBoard(out);
}
/**
* @desc: set value of row from clipboard
* @type: public
* @edition: Professional
* @param: rowId - id of row (optional, use selected row by default)
* @topic: 5
*/
dhtmlXGridObject.prototype.updateRowFromClipboard = function(rowId){
var csv=this.fromClipBoard();
if (!csv) return;
if (rowId)
var r=this.getRowById(rowId);
else
var r=this.selectedRows[0];
if (!r) return;
var parser = this.csvParser;
csv=parser.unblock(csv,this.csv.cell, this.csv.row)[0];
if (!this._csvAID) csv.splice(0,1);
for (var i=0; i<csv.length; i++){
var ed=this.cells3(r,i);
ed[ed.setImage?"setLabel":"setValue"](csv[i]);
}
}
dhtmlXGridObject.prototype.csvParser={
block:function(data,row){
return data.join(row);
},
unblock:function(str,cell,row){
var data = (str||"").split(row);
for (var i=0; i < data.length; i++)
data[i]=(data[i]||"").split(cell);
var last = data.length-1;
if (data[last].length == 1 && data[last][0]=="")
data.splice(last,1);
return data;
},
str:function(data,cell,row){
return data.join(cell);
}
};
dhtmlXGridObject.prototype.csvExtParser={
_quote:RegExp('"',"g"),
_quote_esc:RegExp("\\\\\"","g"),
block:function(data,row){
return data.join(row);
},
unblock:function(str,cell,row){
var out = [[]];
var ind = 0;
if (!str) return out;
var quote_start = /^[ ]*"/;
var quote_end = /"[ ]*$/;
var row_exp = new RegExp(".*"+row+".*$");
var data = str.split(cell);
for (var i=0; i<data.length; i++){
if (data[i].match(quote_start)){
var buff = data[i].replace(quote_start, "");
while (!data[i].match(quote_end)) {
i++;
buff+=data[i];
}
out[ind].push(buff.replace(quote_end, "").replace(this._quote_esc,'"'));
} else if (data[i].match(row_exp)){
var row_pos = data[i].indexOf(row);
out[ind].push(data[i].substr(0, row_pos));
ind++;
out[ind] = [];
data[i]=data[i].substr(row_pos+1); i--;
} else {
if (data[i] || i!=data.length-1)
out[ind].push(data[i]);
}
}
var last = out.length-1;
if (last>0 && !out[last].length)
out.splice(last,1);
return out;
},
str:function(data,cell,row){
for (var i=0; i < data.length; i++)
data[i] = '"'+data[i].replace(this._quote, "\\\"")+'"';
return data.join(cell);
}
};
/**
* @desc: add new row from clipboard
* @type: public
* @edition: Professional
* @topic: 5
*/
dhtmlXGridObject.prototype.addRowFromClipboard = function(){
var csv=this.fromClipBoard();
if (!csv) return;
var z=this.csvParser.unblock(csv, this.csv.cell, this.csv.row);
for (var i=0; i<z.length; i++)
if (z[i]){
csv=z[i];
if (!csv.length) continue;
if (this._csvAID)
this.addRow(this.getRowsNum()+2,csv);
else{
if (this.rowsAr[csv[0]])
csv[0]=this.uid();
this.addRow(csv[0],csv.slice(1));
}
}
}
/**
* @desc: copy grid in CSV to clipboard
* @type: public
* @edition: Professional
* @topic: 5
*/
dhtmlXGridObject.prototype.gridToClipboard = function(){
this.toClipBoard(this.serializeToCSV());
}
/**
* @desc: init grid from CSV stored in clipboard
* @type: public
* @edition: Professional
* @topic: 5
*/
dhtmlXGridObject.prototype.gridFromClipboard = function(){
var csv=this.fromClipBoard();
if (!csv) return;
this.loadCSVString(csv);
}
/**
* @desc: get grid as XML - php required
* @param: path - path to server side code,optional
* @type: private
* @edition: Professional
* @topic: 5
*/
dhtmlXGridObject.prototype.getXLS = function(path){
if (!this.xslform){
this.xslform=document.createElement("FORM");
this.xslform.action=(path||"")+"xls.php";
this.xslform.method="post";
this.xslform.target=(_isIE?"_blank":"");
document.body.appendChild(this.xslform);
var i1=document.createElement("INPUT");
i1.type="hidden";
i1.name="csv";
this.xslform.appendChild(i1);
var i2=document.createElement("INPUT");
i2.type="hidden";
i2.name="csv_header";
this.xslform.appendChild(i2);
}
var cvs = this.serializeToCSV();
this.xslform.childNodes[0].value = cvs;
var cvs_header = [];
var l = this._cCount;
for (var i=0; i<l; i++) {
cvs_header.push(this.getHeaderCol(i));
}
cvs_header = cvs_header.join(',');
this.xslform.childNodes[1].value = cvs_header;
this.xslform.submit();
}
/**
* @desc: generate print friendly view
* @type: public
* @edition: Professional
* @topic: 5
*/
dhtmlXGridObject.prototype.printView = function(before,after){
var html="<style>TD { font-family:Arial; text-align:center; padding-left:2px;padding-right:2px; } \n td.filter input, td.filter select { display:none; } \n </style>";
var st_hr=null;
if (this._fake) {
st_hr=[].concat(this._hrrar);
for (var i=0; i<this._fake._cCount; i++)
this._hrrar[i]=null;
}
html+="<base href='"+document.location.href+"'></base>";
if (!this.parentGrid) html+=(before||"");
html += '<table width="100%" border="2px" cellpadding="0" cellspacing="0">';
var row_length = Math.max(this.rowsBuffer.length,this.rowsCol.length); //paging and smartrendering
var col_length = this._cCount;
var width = this._printWidth();
html += '<tr class="header_row_1">';
for (var i=0; i<col_length; i++){
if (this._hrrar && this._hrrar[i]) continue;
var hcell=this.hdr.rows[1].cells[this.hdr.rows[1]._childIndexes?this.hdr.rows[1]._childIndexes[parseInt(i)]:i];
var colspan=(hcell.colSpan||1);
var rowspan=(hcell.rowSpan||1);
for (var j=1; j<colspan; j++)
width[i]+=width[j];
html += '<td rowspan="'+rowspan+'" width="'+width[i]+'%" style="background-color:lightgrey;" colspan="'+colspan+'">'+this.getHeaderCol(i)+'</td>';
i+=colspan-1;
}
html += '</tr>';
for (var i=2; i<this.hdr.rows.length; i++){
if (_isIE){
html+="<tr style='background-color:lightgrey' class='header_row_"+i+"'>";
var cells=this.hdr.rows[i].childNodes;
for (var j=0; j < cells.length; j++)
if (!this._hrrar || !this._hrrar[cells[j]._cellIndex]){
html+=cells[j].outerHTML;
}
html+="</tr>";
}
else
html+="<tr class='header_row_"+i+"' style='background-color:lightgrey'>"+(this._fake?this._fake.hdr.rows[i].innerHTML:"")+this.hdr.rows[i].innerHTML+"</tr>";
}
for (var i=0; i<row_length; i++) {
html += '<tr>';
if (this.rowsCol[i] && this.rowsCol[i]._cntr){
html+=this.rowsCol[i].innerHTML.replace(/<img[^>]*>/gi,"")+'</tr>';
continue;
}
if (this.rowsCol[i] && this.rowsCol[i].style.display=="none") continue;
var row_id
if (this.rowsCol[i])
row_id=this.rowsCol[i].idd;
else if (this.rowsBuffer[i])
row_id=this.rowsBuffer[i].idd;
else continue; //dyn loading
for (var j=0; j<col_length; j++) {
if (this._hrrar && this._hrrar[j]) continue;
if(this.rowsAr[row_id] && this.rowsAr[row_id].tagName=="TR") {
var c=this.cells(row_id, j);
if (c._setState) var value="";
else if (c.getContent) value = c.getContent();
else if (c.getImage || c.combo) var value=c.cell.innerHTML;
else var value = c.getValue();
} else
var value=this._get_cell_value(this.rowsBuffer[i],j);
var color = this.columnColor[j]?'background-color:'+this.columnColor[j]+';':'';
var align = this.cellAlign[j]?'text-align:'+this.cellAlign[j]+';':'';
var cspan = c.getAttribute("colspan");
html += '<td style="'+color+align+'" '+(cspan?'colSpan="'+cspan+'"':'')+'>'+(value===""?"&nbsp;":value)+'</td>';
if (cspan) j+=cspan-1;
}
html += '</tr>';
if (this.rowsCol[i] && this.rowsCol[i]._expanded){
var sub=this.cells4(this.rowsCol[i]._expanded.ctrl);
if (sub.getSubGrid)
html += '<tr><td colspan="'+col_length+'">'+sub.getSubGrid().printView()+'</td></tr>';
else
html += '<tr><td colspan="'+col_length+'">'+this.rowsCol[i]._expanded.innerHTML+'</td></tr>';
}
}
if (this.ftr)
for (var i=1; i<this.ftr.childNodes[0].rows.length; i++)
html+="<tr style='background-color:lightgrey'>"+((this._fake)?this._fake.ftr.childNodes[0].rows[i].innerHTML:"")+this.ftr.childNodes[0].rows[i].innerHTML+"</tr>";
html += '</table>';
if (this.parentGrid) return html;
html+=(after||"");
var d = window.open('', '_blank');
d.document.write(html);
d.document.write("<script>window.onerror=function(){return true;}</script>");
d.document.close();
if (this._fake) {
this._hrrar=st_hr;
}
}
dhtmlXGridObject.prototype._printWidth=function(){
var width = [];
var total_width = 0;
for (var i=0; i<this._cCount; i++) {
var w = this.getColWidth(i);
width.push(w);
total_width += w;
}
var percent_width = [];
var total_percent_width = 0;
for (var i=0; i<width.length; i++) {
var p = Math.floor((width[i]/total_width)*100);
total_percent_width += p;
percent_width.push(p);
}
percent_width[percent_width.length-1] += 100-total_percent_width;
return percent_width;
}
/*
user_pref("signed.applets.codebase_principal_support", true);
*/
if (!window.clipboardData)
window.clipboardData={
_make:function(){
var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
if (!clip) return null;
var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
if (!trans) return null;
trans.addDataFlavor('text/unicode');
var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
this._p=[clip,trans,str];
return true;
},
setData:function(type,text){
try{
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
} catch(e){ dhtmlxError.throwError("Clipboard","Access to clipboard denied",[type,text]); return ""; }
if (!this._make()) return false;
this._p[2].data=text;
this._p[1].setTransferData("text/unicode",this._p[2],text.length*2);
var clipid=Components.interfaces.nsIClipboard;
this._p[0].setData(this._p[1],null,clipid.kGlobalClipboard);
},
getData:function(type){
try{
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
} catch(e){ dhtmlxError.throwError("Clipboard","Access to clipboard denied",[type]); return ""; }
if (!this._make()) return false;
this._p[0].getData(this._p[1],this._p[0].kGlobalClipboard);
var strLength = new Object();
var str = new Object();
try{
this._p[1].getTransferData("text/unicode",str,strLength);
} catch(e){
//empty clipboard in FF
return "";
}
if (str) str = str.value.QueryInterface(Components.interfaces.nsISupportsString);
if (str) return str.data.substring(0,strLength.value / 2);
return "";
}
}
//(c)dhtmlx ltd. www.dhtmlx.com