/*
Copyright Scand LLC http://www.scbr.com
To use this component please contact info@scbr.com to obtain license
*/
/**
* @desc: dhtmlxGrid cell object constructor (shouldn't be accesed directly. Use cells and cells2 methods of the grid instead)
* @type: public
* @returns: dhtmlxGrid cell
*/
function dhtmlXGridCellObject(obj){
/**
* @desc: desctructor, clean used memory
* @type: public
*/
this.destructor=function(){
this.cell.obj=null;
this.cell=null;
this.grid=null;
this.base=null;
return null;
}
this.cell = obj;
/**
* @desc: gets Value of cell
* @type: public
*/
this.getValue = function(){
if ((this.cell.firstChild)&&(this.cell.firstChild.tagName=="TEXTAREA"))
return this.cell.firstChild.value;
else
return this.cell.innerHTML._dhx_trim();//innerText;
}
/**
* @desc: gets math formula of cell if any
* @type: public
*/
this.getMathValue = function(){
if (this.cell._val)
return this.cell._val;//innerText;
else return this.getValue();
}
/**
* @desc: determ. font style if it was set
* @returns: font name only if it was set for the cell
* @type: public
*/
this.getFont = function(){
arOut = new Array(3);
if(this.cell.style.fontFamily)
arOut[0] = this.cell.style.fontFamily
if(this.cell.style.fontWeight=='bold' || this.cell.parentNode.style.fontWeight=='bold')
arOut[1] = 'bold';
if(this.cell.style.fontStyle=='italic' || this.cell.parentNode.style.fontWeight=='italic')
arOut[1] += 'italic';
if(this.cell.style.fontSize)
arOut[2] = this.cell.style.fontSize
else
arOut[2] = "";
return arOut.join("-")
}
/**
* @desc: determ. cell's text color
* @returns: cell's text color
* @type: public
*/
this.getTextColor = function(){
if(this.cell.style.color)
return this.cell.style.color
else
return "#000000";
}
/**
* @desc: determ. cell's background color
* @returns: cell's background color
* @type: public
*/
this.getBgColor = function(){
if(this.cell.bgColor)
return this.cell.bgColor
else
return "#FFFFFF";
}
/**
* @desc: determines horisontal align od the cell
* @returns: horisontal align of cell content
* @type: public
*/
this.getHorAlign = function(){
if(this.cell.style.textAlign)
return this.cell.style.textAlign;
else if(this.cell.align)
return this.cell.align
else
return "left";
}
/**
* @desc: gets width of the cell in pixel
* @returns: width of the cell in pixels
* @type: public
*/
this.getWidth = function(){
return this.cell.scrollWidth;
}
/**
* @desc: sets font family to the cell
* @param: val - string in format: Arial-bold(italic,bolditalic,underline)-12px
* @type: public
*/
this.setFont = function(val){
fntAr = val.split("-");
this.cell.style.fontFamily = fntAr[0];
this.cell.style.fontSize = fntAr[fntAr.length-1]
if(fntAr.length==3){
if(/bold/.test(fntAr[1]))
this.cell.style.fontWeight = "bold";
if(/italic/.test(fntAr[1]))
this.cell.style.fontStyle = "italic";
if(/underline/.test(fntAr[1]))
this.cell.style.textDecoration = "underline";
}
}
/**
* @desc: sets text color to the cell
* @param: val - color value (name or hex)
* @type: public
*/
this.setTextColor = function(val){
this.cell.style.color = val;
}
/**
* @desc: sets background color to the cell
* @param: val - color value (name or hex)
* @type: public
*/
this.setBgColor = function(val){
if(val=="")
val = null;
this.cell.bgColor = val;
}
/**
* @desc: sets horisontal align to the cell
* @param: val - value in single-letter or full format(exmp: r or right)
* @type: public
*/
this.setHorAlign = function(val){
if(val.length==1){
if(val=='c')
this.cell.style.textAlign = 'center'
else if(val=='l')
this.cell.style.textAlign = 'left';
else
this.cell.style.textAlign = 'right';
}else
this.cell.style.textAlign = val
}
/**
* @desc: determines whether cell value was changed
* @returns: true if cell value was changed, otherwise - false
* @type: public
*/
this.wasChanged = function(){
if(this.cell.wasChanged)
return true;
else
return false;
}
/**
* @desc: determines whether first child of the cell is checkbox or radio
* @returns: true if first child of the cell is input element of type radio or checkbox
* @type: public
*/
this.isCheckbox = function(){
var ch = this.cell.firstChild;
if(ch && ch.tagName=='INPUT'){
type = ch.type;
if(type=='radio' || type=='checkbox')
return true;
else
return false;
}else
return false;
}
/**
* @desc: determines whether radio or checkbox inside is checked
* @returns: true if first child of the cell is checked
* @type: public
*/
this.isChecked = function(){
if(this.isCheckbox()){
return this.cell.firstChild.checked;
}
}
/**
* @desc: determines whether cell content (radio,checkbox) is disabled
* @returns: true if first child of the cell is disabled
* @type: public
*/
this.isDisabled = function(){
if(this.isCheckbox()){
return this.cell.firstChild.disabled;
}
}
/**
* @desc: checks checkbox or radion
* @param: fl - true or false
* @type: public
*/
this.setChecked = function(fl){
if(this.isCheckbox()){
if(fl!='true' && fl!=1)
fl = false;
this.cell.firstChild.checked = fl;
}
}
/**
* @desc: disables radio or checkbox
* @param: fl - true or false
* @type: public
*/
this.setDisabled = function(fl){
if(this.isCheckbox()){
if(fl!='true' && fl!=1)
fl = false;
this.cell.firstChild.disabled = fl;
if (this.disabledF) this.disabledF(fl);
}
}
}
/**
* @desc: sets value to the cell
* @param: val - new value
* @type: public
*/
dhtmlXGridCellObject.prototype.setValue = function(val){
if((typeof(val)!="number") && val.toString()._dhx_trim()==""){
val=" "
this.cell._clearCell=true;
}
this.setCValue(val);
}
dhtmlXGridCellObject.prototype.setCValue = function(val,val2){
this.cell.innerHTML = val;
//#__pro_feature:21092006{
//#on_cell_changed:23102006{
if (this.grid._onCCH)
this.grid._onCCH(this.cell.parentNode.idd,this.cell._cellIndex, val2||val);
//#}
//#}
}
/**
* @desc: sets text representation of cell ( setLabel doesn't triger math calculations as setValue do)
* @param: val - new value
* @type: public
*/
dhtmlXGridCellObject.prototype.setLabel = function(val){
this.cell.innerHTML = val;
}
/**
* @desc: geth math code of ExCell
* @param: val - new value
* @type: public
*/
dhtmlXGridCellObject.prototype.getMath = function(val){
if (this._val) return this.val;
else
return this.getValue();
}
/**
* @desc: dhtmlxGrid cell editor constructor (base for all eXcells). Shouldn't be accessed directly
* @returns: dhtmlxGrid cell editor object
* @type: public
*/
function eXcell(){
this.obj = null;//editor
//this.cell = null//cell to get value from
this.val = null;//current value (before edit)
/**
* @desc: occures on space for example
* @type: private
*/
this.changeState = function(){return false}
/**
* @desc: opens editor
* @type: private
*/
this.edit = function(){this.val = this.getValue()}//
/**
* @desc: return value to cell, closes editor
* @returns: if cell's value was changed (true) or not
* @type: private
*/
this.detach = function(){return false}//
/**
* @desc: gets position (left-right) of element
* @param: oNode - element to get position of
* @type: private
* @topic: 8
*/
this.getPosition = function(oNode){
var oCurrentNode=oNode;
var iLeft=0;
var iTop=0;
while(oCurrentNode.tagName!="BODY"){
iLeft+=oCurrentNode.offsetLeft;
iTop+=oCurrentNode.offsetTop;
oCurrentNode=oCurrentNode.offsetParent;
}
return new Array(iLeft,iTop);
}
}
eXcell.prototype = new dhtmlXGridCellObject;
//simple text editor
function eXcell_ed(cell){
try{
this.cell = cell;
this.grid = this.cell.parentNode.grid;
}catch(er){}
this.edit = function(){
this.cell.atag=((!this.grid.multiLine)&&(_isKHTML||_isMacOS||(_FFrv<=1.7)))?"INPUT":"TEXTAREA";
this.val = this.getValue();
this.obj = document.createElement(this.cell.atag);
this.obj.style.height = (this.cell.offsetHeight-(this.grid.multiLine?5:4))+"px";
if (_isFF) this.obj.style.overflow="visible";
this.obj.className="dhx_combo_edit";
this.obj.wrap = "soft";
this.obj.style.textAlign = this.cell.align;
this.obj.onclick = function(e){(e||event).cancelBubble = true}
this.obj.value = this.val
this.cell.innerHTML = "";
this.cell.appendChild(this.obj);
this.obj.onselectstart=function(e){ if (!e) e=event; e.cancelBubble=true; return true; };
this.obj.focus()
this.obj.focus()
}
this.getValue = function(){
if ((this.cell.firstChild)&&((this.cell.atag)&&(this.cell.firstChild.tagName==this.cell.atag)))
return this.cell.firstChild.value;
else
return this.cell.innerHTML.toString()._dhx_trim();
}
this.detach = function(){
this.setValue(this.obj.value);
return this.val!=this.getValue();
}
}
eXcell_ed.prototype = new eXcell;
//#__pro_feature:21092006{
//#data_format:12052006{
//numeric text editor
function eXcell_edn(cell){
try{
this.cell = cell;
this.grid = this.cell.parentNode.grid;
}catch(er){}
this.edit = function(){
this.val = this.getValue();
this.obj = document.createElement(_isKHTML?"INPUT":"TEXTAREA");
this.obj.className="dhx_combo_edit";
this.obj.style.height = (this.cell.offsetHeight-4)+"px";
this.obj.wrap = "soft";
this.obj.style.textAlign = this.cell.align;
this.obj.onclick = function(e){(e||event).cancelBubble = true}
this.obj.value = this.val;
this.cell.innerHTML = "";
this.cell.appendChild(this.obj);
this.obj.onselectstart=function(e){ if (!e) e=event; e.cancelBubble=true; return true; };
this.obj.focus()
this.obj.focus()
}
this.getValue = function(){
//this.grid.editStop();
if ((this.cell.firstChild)&&(this.cell.firstChild.tagName=="TEXTAREA"))
return this.cell.firstChild.value;
else
return this.grid._aplNFb(this.cell.innerHTML.toString()._dhx_trim(),this.cell._cellIndex);
}
this.detach = function(){
var tv=this.obj.value;
this.setValue(tv);
return this.val!=this.getValue();
}
}
eXcell_edn.prototype = new eXcell;
eXcell_edn.prototype.setValue = function(val){
if(!val || val.toString()._dhx_trim()=="")
val="0"
this.setCValue(this.grid._aplNF(val,this.cell._cellIndex));
}
//#}
//#}
//Checkbox
function eXcell_ch(cell){
try{
this.cell = cell;
this.grid = this.cell.parentNode.grid;
this.cell.obj = this;
}catch(er){}
this.disabledF=function(fl){
if ((fl==true)||(fl==1))
this.cell.innerHTML=this.cell.innerHTML.replace("item_chk0.","item_chk0_dis.").replace("item_chk1.","item_chk1_dis.");
else
this.cell.innerHTML=this.cell.innerHTML.replace("item_chk0_dis.","item_chk0.").replace("item_chk1_dis.","item_chk1.");
}
this.changeState = function(){
//nb:
if ((!this.grid.isEditable)||(this.cell.parentNode._locked)) return;
if(this.grid.onEditCell(0,this.cell.parentNode.idd,this.cell._cellIndex)!=false){
this.val = this.getValue()
if(this.val=="1")
this.setValue("0")
else
this.setValue("1")
//nb:
this.grid.onEditCell(1,this.cell.parentNode.idd,this.cell._cellIndex)
this.grid.onCheckbox(this.cell.parentNode.idd,this.cell._cellIndex,(this.val!='1'))
}else{//preserve editing (not tested thoroughly for this editor)
this.editor=null;
}
}
this.getValue = function(){
try{
return this.cell.chstate.toString();
}catch(er){
return null;
}
}
this.isCheckbox = function(){
return true;
}
this.isChecked = function(){
if(this.getValue()=="1")
return true;
else
return false;
}
this.setChecked = function(fl){
this.setValue(fl.toString())
}
this.detach = function(){
return this.val!=this.getValue();
}
}
eXcell_ch.prototype = new eXcell;
eXcell_ch.prototype.setValue = function(val){
this.cell.style.verticalAlign = "middle";//nb:to center checkbox in line
//val can be int
if (val){
val=val.toString()._dhx_trim();
if ((val=="false")||(val=="0")) val="";
}
if(val){
val = "1";
this.cell.chstate = "1";
}else{
val = "0";
this.cell.chstate = "0"
}
var obj = this;
this.setCValue("
",this.cell.chstate);
}
//Radiobutton
function eXcell_ra(cell){
this.base = eXcell_ch;
this.base(cell)
this.grid = cell.parentNode.grid;
this.disabledF=function(fl){
if ((fl==true)||(fl==1))
this.cell.innerHTML=this.cell.innerHTML.replace("radio_chk0.","radio_chk0_dis.").replace("radio_chk1.","radio_chk1_dis.");
else
this.cell.innerHTML=this.cell.innerHTML.replace("radio_chk0_dis.","radio_chk0.").replace("radio_chk1_dis.","radio_chk1.");
}
this.changeState = function(){
if ((!this.grid.isEditable)||(this.cell.parentNode._locked)) return;
if(this.grid.onEditCell(0,this.cell.parentNode.idd,this.cell._cellIndex)!=false){
this.val = this.getValue()
if(this.val=="1")
this.setValue("0")
else
this.setValue("1")
//nb:
this.grid.onEditCell(1,this.cell.parentNode.idd,this.cell._cellIndex)
if(typeof(this.grid.onCheckbox)=='function')
this.grid.onCheckbox(this.cell.parentNode.idd,this.cell._cellIndex,(this.val!='1'))
for(var i=0;i",this.cell.chstate);
}
//Multiline popup text editor
function eXcell_txt(cell){
try{
this.cell = cell;
this.grid = this.cell.parentNode.grid;
}catch(er){}
this.edit = function(){
this.val = this.getValue()
this.obj = document.createElement("TEXTAREA");
this.obj.className="dhx_textarea";
this.obj.onclick = function(e){(e||event).cancelBubble = true}
var arPos = this.grid.getPosition(this.cell);//,this.grid.objBox
if (!this.cell._clearCell)
this.obj.value = this.cell.innerHTML.replace(/
]*>/gi,"\n");
this.obj.style.display = "";
this.obj.style.textAlign = this.cell.align;
if (_isFF){
var z_ff=document.createElement("DIV");
z_ff.appendChild(this.obj);
z_ff.className="dhx_textarea";
z_ff.style.overflow="auto";
this.obj.style.margin="0x 0px 0px 0px";
this.obj.style.border="0px";
this.obj=z_ff;
}
document.body.appendChild(this.obj);//nb:
this.obj.onkeydown=function(e){
var ev=(e||event);
if (ev.keyCode==9) {
globalActiveDHTMLGridObject.entBox.focus();
globalActiveDHTMLGridObject.doKey({keyCode:ev.keyCode,shiftKey:ev.shiftKey,srcElement:"0"});
return false;
}
}
this.obj.style.left = arPos[0]+"px";
this.obj.style.top = arPos[1]+this.cell.offsetHeight+"px";
if(this.cell.scrollWidth<200)
this.obj.style.width = "200px";
else
this.obj.style.width = this.cell.scrollWidth+"px";
if (_isFF){
this.obj.firstChild.style.width = parseInt(this.obj.style.width)+"px";
this.obj.firstChild.style.height = this.obj.offsetHeight-3+"px";
}
this.obj.focus();
if (_isFF) this.obj.firstChild.focus();
else this.obj.focus()
}
this.detach = function(){
var a_val="";
if (_isFF) a_val=this.obj.firstChild.value;
else a_val=this.obj.value;
if (a_val=="") {
this.cell._clearCell=true;
}
else this.cell._clearCell=false;
this.setValue(a_val);
//isIE()?this.obj.removeNode(true):this.grid.objBox.removeChild(this.obj);
document.body.removeChild(this.obj);
return this.val!=this.getValue();
}
this.getValue = function(){
if (this.cell.firstChild){
if (this.cell.firstChild.tagName=="TEXTAREA")
return this.obj.firstChild.value;
else
if (this.cell.firstChild.tagName=="DIV")
return this.obj.firstChild.firstChild.value;
}
return this.cell.innerHTML.replace(/
]*>/gi,"\n")._dhx_trim();//innerText;
}
}
eXcell_txt.prototype = new eXcell;
eXcell_txt.prototype.setValue = function(val){
if(!val || val.toString()._dhx_trim()==""){
val=" "
this.cell._clearCell=true;
}
this.setCValue(val.replace(/\n/g,"
"),val);
}
//Combobox
function eXcell_co(cell){
try{
this.cell = cell;
this.grid = this.cell.parentNode.grid;
this.combo = this.grid.getCombo(this.cell._cellIndex);
this.editable = true
}catch(er){}
this.shiftNext=function(){
var z=this.list.options[this.list.selectedIndex+1];
if (z) z.selected=true;
this.obj.value=this.list.value;
return true;
}
this.shiftPrev=function(){
var z=this.list.options[this.list.selectedIndex-1];
if (z) z.selected=true;
this.obj.value=this.list.value;
return true;
}
this.edit = function(){
this.val = this.getValue();
this.text = this.cell.innerHTML._dhx_trim();
var arPos = this.grid.getPosition(this.cell)//,this.grid.objBox)
this.obj = document.createElement("TEXTAREA");
this.obj.className="dhx_combo_edit";
this.obj.style.height=(this.cell.offsetHeight-4)+"px";
this.obj.wrap = "soft";
this.obj.style.textAlign = this.cell.align;
this.obj.onclick = function(e){(e||event).cancelBubble = true}
this.obj.value = this.text
this.list = document.createElement("SELECT");
this.list.editor_obj = this;
this.list.className='dhx_combo_select';
this.list.style.width=this.cell.offsetWidth+"px";
this.list.style.left = arPos[0]+"px";//arPos[0]
this.list.style.top = arPos[1]+this.cell.offsetHeight+"px";//arPos[1]+this.cell.offsetHeight;
this.list.onclick = function(e){
var ev = e||window.event;
var cell = ev.target||ev.srcElement
//tbl.editor_obj.val=cell.combo_val;
if (cell.tagName=="OPTION") cell=cell.parentNode;
cell.editor_obj.setValue(cell.value);
cell.editor_obj.editable=false;
cell.editor_obj.grid.editStop();
}
var comboKeys = this.combo.getKeys();
var fl=false
var selOptId=0;
for(var i=0;i ",val);
}
//image
/*
The corresponding cell value in XML should be a "^" delimited list of following values:
1st - image src
2nd - image alt text (optional)
3rd - link (optional)
4rd - target (optional, default is _self)
*/
function eXcell_img(cell){
try{
this.cell = cell;
this.grid = this.cell.parentNode.grid;
}catch(er){}
this.getValue = function(){
if(this.cell.firstChild.tagName=="IMG")
return this.cell.firstChild.src+(this.cell.titFl!=null?"^"+this.cell.tit:"");
else if(this.cell.firstChild.tagName=="A"){
var out = this.cell.firstChild.firstChild.src+(this.cell.titFl!=null?"^"+this.cell.tit:"");
out+="^"+this.cell.lnk;
if(this.cell.trg)
out+="^"+this.cell.trg
return out;
}
}
this.getTitle = function(){
return this.cell.tit
}
}
eXcell_img.prototype = new eXcell;
eXcell_img.prototype.setValue = function(val){
var title = val;
if(val.indexOf("^")!=-1){
var ar = val.split("^");
val = ar[0]
title = ar[1];
//link
if(ar.length>2){
this.cell.lnk = ar[2]
if(ar[3])
this.cell.trg = ar[3]
}
this.cell.titFl = "1";
}
this.setCValue("
",val);
if(this.cell.lnk){
this.cell.innerHTML = ""+this.cell.innerHTML+""
}
this.cell.tit = title;
}
//extended simple editor (money oriented)
function eXcell_price(cell){
this.base = eXcell_ed;
this.base(cell)
this.getValue = function(){
if(this.cell.childNodes.length>1)
return this.cell.childNodes[1].innerHTML.toString()._dhx_trim()
else
return "0";
}
}
eXcell_price.prototype = new eXcell_ed;
eXcell_price.prototype.setValue = function(val){
if(isNaN(Number(val))){
if(!(val||"") || (val||"")._dhx_trim()!="")
val = 0;//alert("Value must be an integer")
val = this.val || 0;
}
if(val>0){
var color = "green";
this.setCValue("$"+val+"",val);
}else{
this.setCValue("
",0);
}
}
//extended simple editor (dynamic of sales)
function eXcell_dyn(cell){
this.base = eXcell_ed;
this.base(cell)
this.getValue = function(){
return this.cell.firstChild.childNodes[1].innerHTML.toString()._dhx_trim()
}
}
eXcell_dyn.prototype = new eXcell_ed;
eXcell_dyn.prototype.setValue = function(val){
if(!val || isNaN(Number(val))){
val = 0;
}
if(val>0){
var color = "green";
var img = "dyn_up.gif";
}else if (val==0){
var color = "black";
var img = "dyn_.gif";
}else{
var color = "red";
var img = "dyn_down.gif";
}
this.setCValue("
"+val+" ",val);
}
//readonly
function eXcell_ro(cell){
this.cell = cell;
this.grid = this.cell.parentNode.grid;
this.edit = function(){}
}
eXcell_ro.prototype = new eXcell;
/**
* @desc: combobox object constructor (shouldn't be accessed directly - instead please use getCombo(...) method of the grid)
* @type: public
* @returns: combobox for dhtmlxGrid
*/
function dhtmlXGridComboObject(){
this.keys = new dhtmlxArray();
this.values = new dhtmlxArray();
/**
* @desc: puts new combination of key and value into combobox
* @type: public
* @param: key - object to use as a key (should be a string in the case of combobox)
* @param: value - object value of combobox line
*/
this.put = function(key,value){
for(var i=0;i