/**
(c) DHTMLX Ltd, 2011
Licensing: You allowed to use this component for free under GPL or you need to obtain Commercial/Enterprise license to use it in non-GPL project
Contact: sales@dhtmlx.com
**/
dhtmlx=function(obj){
for (var a in obj) dhtmlx[a]=obj[a];
return dhtmlx; //simple singleton
};
dhtmlx.extend_api=function(name,map,ext){
var t = window[name];
if (!t) return; //component not defined
window[name]=function(obj){
if (obj && typeof obj == "object" && !obj.tagName){
var that = t.apply(this,(map._init?map._init(obj):arguments));
//global settings
for (var a in dhtmlx)
if (map[a]) this[map[a]](dhtmlx[a]);
//local settings
for (var a in obj){
if (map[a]) this[map[a]](obj[a]);
else if (a.indexOf("on")==0){
this.attachEvent(a,obj[a]);
}
}
} else
var that = t.apply(this,arguments);
if (map._patch) map._patch(this);
return that||this;
};
window[name].prototype=t.prototype;
if (ext)
dhtmlXHeir(window[name].prototype,ext);
};
dhtmlxAjax={
get:function(url,callback){
var t=new dtmlXMLLoaderObject(true);
t.async=(arguments.length<3);
t.waitCall=callback;
t.loadXML(url)
return t;
},
post:function(url,post,callback){
var t=new dtmlXMLLoaderObject(true);
t.async=(arguments.length<4);
t.waitCall=callback;
t.loadXML(url,true,post)
return t;
},
getSync:function(url){
return this.get(url,null,true)
},
postSync:function(url,post){
return this.post(url,post,null,true);
}
}
/**
* @desc: xmlLoader object
* @type: private
* @param: funcObject - xml parser function
* @param: object - jsControl object
* @param: async - sync/async mode (async by default)
* @param: rSeed - enable/disable random seed ( prevent IE caching)
* @topic: 0
*/
function dtmlXMLLoaderObject(funcObject, dhtmlObject, async, rSeed){
this.xmlDoc="";
if (typeof (async) != "undefined")
this.async=async;
else
this.async=true;
this.onloadAction=funcObject||null;
this.mainObject=dhtmlObject||null;
this.waitCall=null;
this.rSeed=rSeed||false;
return this;
};
dtmlXMLLoaderObject.count = 0;
/**
* @desc: xml loading handler
* @type: private
* @param: dtmlObject - xmlLoader object
* @topic: 0
*/
dtmlXMLLoaderObject.prototype.waitLoadFunction=function(dhtmlObject){
var once = true;
this.check=function (){
if ((dhtmlObject)&&(dhtmlObject.onloadAction != null)){
if ((!dhtmlObject.xmlDoc.readyState)||(dhtmlObject.xmlDoc.readyState == 4)){
if (!once)
return;
once=false; //IE 5 fix
dtmlXMLLoaderObject.count++;
if (typeof dhtmlObject.onloadAction == "function")
dhtmlObject.onloadAction(dhtmlObject.mainObject, null, null, null, dhtmlObject);
if (dhtmlObject.waitCall){
dhtmlObject.waitCall.call(this,dhtmlObject);
dhtmlObject.waitCall=null;
}
}
}
};
return this.check;
};
/**
* @desc: return XML top node
* @param: tagName - top XML node tag name (not used in IE, required for Safari and Mozilla)
* @type: private
* @returns: top XML node
* @topic: 0
*/
dtmlXMLLoaderObject.prototype.getXMLTopNode=function(tagName, oldObj){
if (this.xmlDoc.responseXML){
var temp = this.xmlDoc.responseXML.getElementsByTagName(tagName);
if(temp.length==0 && tagName.indexOf(":")!=-1)
var temp = this.xmlDoc.responseXML.getElementsByTagName((tagName.split(":"))[1]);
var z = temp[0];
} else
var z = this.xmlDoc.documentElement;
if (z){
this._retry=false;
return z;
}
if ((_isIE)&&(!this._retry)){
//fall back to MS.XMLDOM
var xmlString = this.xmlDoc.responseText;
var oldObj = this.xmlDoc;
this._retry=true;
this.xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
this.xmlDoc.async=false;
this.xmlDoc["loadXM"+"L"](xmlString);
return this.getXMLTopNode(tagName, oldObj);
}
dhtmlxError.throwError("LoadXML", "Incorrect XML", [
(oldObj||this.xmlDoc),
this.mainObject
]);
return document.createElement("DIV");
};
/**
* @desc: load XML from string
* @type: private
* @param: xmlString - xml string
* @topic: 0
*/
dtmlXMLLoaderObject.prototype.loadXMLString=function(xmlString){
{
if (!_isIE){
var parser = new DOMParser();
this.xmlDoc=parser.parseFromString(xmlString, "text/xml");
} else {
this.xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
this.xmlDoc.async=this.async;
this.xmlDoc.onreadystatechange = function(){};
this.xmlDoc["loadXM"+"L"](xmlString);
}
}
if (this.onloadAction)
this.onloadAction(this.mainObject, null, null, null, this);
if (this.waitCall){
this.waitCall();
this.waitCall=null;
}
}
/**
* @desc: load XML
* @type: private
* @param: filePath - xml file path
* @param: postMode - send POST request
* @param: postVars - list of vars for post request
* @topic: 0
*/
dtmlXMLLoaderObject.prototype.loadXML=function(filePath, postMode, postVars, rpc){
if (this.rSeed)
filePath+=((filePath.indexOf("?") != -1) ? "&" : "?")+"a_dhx_rSeed="+(new Date()).valueOf();
this.filePath=filePath;
if ((!_isIE)&&(window.XMLHttpRequest))
this.xmlDoc=new XMLHttpRequest();
else {
this.xmlDoc=new ActiveXObject("Microsoft.XMLHTTP");
}
if (this.async)
this.xmlDoc.onreadystatechange=new this.waitLoadFunction(this);
this.xmlDoc.open(postMode ? "POST" : "GET", filePath, this.async);
if (rpc){
this.xmlDoc.setRequestHeader("User-Agent", "dhtmlxRPC v0.1 ("+navigator.userAgent+")");
this.xmlDoc.setRequestHeader("Content-type", "text/xml");
}
else if (postMode)
this.xmlDoc.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
this.xmlDoc.setRequestHeader("X-Requested-With","XMLHttpRequest");
this.xmlDoc.send(null||postVars);
if (!this.async)
(new this.waitLoadFunction(this))();
};
/**
* @desc: destructor, cleans used memory
* @type: private
* @topic: 0
*/
dtmlXMLLoaderObject.prototype.destructor=function(){
this._filterXPath = null;
this._getAllNamedChilds = null;
this._retry = null;
this.async = null;
this.rSeed = null;
this.filePath = null;
this.onloadAction = null;
this.mainObject = null;
this.xmlDoc = null;
this.doXPath = null;
this.doXPathOpera = null;
this.doXSLTransToObject = null;
this.doXSLTransToString = null;
this.loadXML = null;
this.loadXMLString = null;
// this.waitLoadFunction = null;
this.doSerialization = null;
this.xmlNodeToJSON = null;
this.getXMLTopNode = null;
this.setXSLParamValue = null;
return null;
}
dtmlXMLLoaderObject.prototype.xmlNodeToJSON = function(node){
var t={};
for (var i=0; i-1)
_isChrome=true;
if ((navigator.userAgent.indexOf('Safari') != -1)||(navigator.userAgent.indexOf('Konqueror') != -1)){
_KHTMLrv = parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf('Safari')+7, 5));
if (_KHTMLrv > 525){ //mimic FF behavior for Safari 3.1+
_isFF=true;
_FFrv = 1.9;
} else
_isKHTML=true;
} else if (navigator.userAgent.indexOf('Opera') != -1){
_isOpera=true;
_OperaRv=parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf('Opera')+6, 3));
}
else if (navigator.appName.indexOf("Microsoft") != -1){
_isIE=true;
if (navigator.appVersion.indexOf("MSIE 8.0")!= -1 && document.compatMode != "BackCompat") _isIE=8;
if (navigator.appVersion.indexOf("MSIE 9.0")!= -1 && document.compatMode != "BackCompat") _isIE=8;
} else {
_isFF=true;
_FFrv = parseFloat(navigator.userAgent.split("rv:")[1])
}
//multibrowser Xpath processor
dtmlXMLLoaderObject.prototype.doXPath=function(xpathExp, docObj, namespace, result_type){
if (_isKHTML || (!_isIE && !window.XPathResult))
return this.doXPathOpera(xpathExp, docObj);
if (_isIE){ //IE
if (!docObj)
if (!this.xmlDoc.nodeName)
docObj=this.xmlDoc.responseXML
else
docObj=this.xmlDoc;
if (!docObj)
dhtmlxError.throwError("LoadXML", "Incorrect XML", [
(docObj||this.xmlDoc),
this.mainObject
]);
if (namespace != null)
docObj.setProperty("SelectionNamespaces", "xmlns:xsl='"+namespace+"'"); //
if (result_type == 'single'){
return docObj.selectSingleNode(xpathExp);
}
else {
return docObj.selectNodes(xpathExp)||new Array(0);
}
} else { //Mozilla
var nodeObj = docObj;
if (!docObj){
if (!this.xmlDoc.nodeName){
docObj=this.xmlDoc.responseXML
}
else {
docObj=this.xmlDoc;
}
}
if (!docObj)
dhtmlxError.throwError("LoadXML", "Incorrect XML", [
(docObj||this.xmlDoc),
this.mainObject
]);
if (docObj.nodeName.indexOf("document") != -1){
nodeObj=docObj;
}
else {
nodeObj=docObj;
docObj=docObj.ownerDocument;
}
var retType = XPathResult.ANY_TYPE;
if (result_type == 'single')
retType=XPathResult.FIRST_ORDERED_NODE_TYPE
var rowsCol = new Array();
var col = docObj.evaluate(xpathExp, nodeObj, function(pref){
return namespace
}, retType, null);
if (retType == XPathResult.FIRST_ORDERED_NODE_TYPE){
return col.singleNodeValue;
}
var thisColMemb = col.iterateNext();
while (thisColMemb){
rowsCol[rowsCol.length]=thisColMemb;
thisColMemb=col.iterateNext();
}
return rowsCol;
}
}
function _dhtmlxError(type, name, params){
if (!this.catches)
this.catches=new Array();
return this;
}
_dhtmlxError.prototype.catchError=function(type, func_name){
this.catches[type]=func_name;
}
_dhtmlxError.prototype.throwError=function(type, name, params){
if (this.catches[type])
return this.catches[type](type, name, params);
if (this.catches["ALL"])
return this.catches["ALL"](type, name, params);
alert("Error type: "+arguments[0]+"\nDescription: "+arguments[1]);
return null;
}
window.dhtmlxError=new _dhtmlxError();
//opera fake, while 9.0 not released
//multibrowser Xpath processor
dtmlXMLLoaderObject.prototype.doXPathOpera=function(xpathExp, docObj){
//this is fake for Opera
var z = xpathExp.replace(/[\/]+/gi, "/").split('/');
var obj = null;
var i = 1;
if (!z.length)
return [];
if (z[0] == ".")
obj=[docObj]; else if (z[0] == ""){
obj=(this.xmlDoc.responseXML||this.xmlDoc).getElementsByTagName(z[i].replace(/\[[^\]]*\]/g, ""));
i++;
} else
return [];
for (i; i < z.length; i++)obj=this._getAllNamedChilds(obj, z[i]);
if (z[i-1].indexOf("[") != -1)
obj=this._filterXPath(obj, z[i-1]);
return obj;
}
dtmlXMLLoaderObject.prototype._filterXPath=function(a, b){
var c = new Array();
var b = b.replace(/[^\[]*\[\@/g, "").replace(/[\[\]\@]*/g, "");
for (var i = 0; i < a.length; i++)
if (a[i].getAttribute(b))
c[c.length]=a[i];
return c;
}
dtmlXMLLoaderObject.prototype._getAllNamedChilds=function(a, b){
var c = new Array();
if (_isKHTML)
b=b.toUpperCase();
for (var i = 0; i < a.length; i++)for (var j = 0; j < a[i].childNodes.length; j++){
if (_isKHTML){
if (a[i].childNodes[j].tagName&&a[i].childNodes[j].tagName.toUpperCase() == b)
c[c.length]=a[i].childNodes[j];
}
else if (a[i].childNodes[j].tagName == b)
c[c.length]=a[i].childNodes[j];
}
return c;
}
function dhtmlXHeir(a, b){
for (var c in b)
if (typeof (b[c]) == "function")
a[c]=b[c];
return a;
}
function dhtmlxEvent(el, event, handler){
if (el.addEventListener)
el.addEventListener(event, handler, false);
else if (el.attachEvent)
el.attachEvent("on"+event, handler);
}
//============= XSL Extension ===================================
dtmlXMLLoaderObject.prototype.xslDoc=null;
dtmlXMLLoaderObject.prototype.setXSLParamValue=function(paramName, paramValue, xslDoc){
if (!xslDoc)
xslDoc=this.xslDoc
if (xslDoc.responseXML)
xslDoc=xslDoc.responseXML;
var item =
this.doXPath("/xsl:stylesheet/xsl:variable[@name='"+paramName+"']", xslDoc,
"http:/\/www.w3.org/1999/XSL/Transform", "single");
if (item != null)
item.firstChild.nodeValue=paramValue
}
dtmlXMLLoaderObject.prototype.doXSLTransToObject=function(xslDoc, xmlDoc){
if (!xslDoc)
xslDoc=this.xslDoc;
if (xslDoc.responseXML)
xslDoc=xslDoc.responseXML
if (!xmlDoc)
xmlDoc=this.xmlDoc;
if (xmlDoc.responseXML)
xmlDoc=xmlDoc.responseXML
//MOzilla
if (!_isIE){
if (!this.XSLProcessor){
this.XSLProcessor=new XSLTProcessor();
this.XSLProcessor.importStylesheet(xslDoc);
}
var result = this.XSLProcessor.transformToDocument(xmlDoc);
} else {
var result = new ActiveXObject("Msxml2.DOMDocument.3.0");
try{
xmlDoc.transformNodeToObject(xslDoc, result);
}catch(e){
result = xmlDoc.transformNode(xslDoc);
}
}
return result;
}
dtmlXMLLoaderObject.prototype.doXSLTransToString=function(xslDoc, xmlDoc){
var res = this.doXSLTransToObject(xslDoc, xmlDoc);
if(typeof(res)=="string")
return res;
return this.doSerialization(res);
}
dtmlXMLLoaderObject.prototype.doSerialization=function(xmlDoc){
if (!xmlDoc)
xmlDoc=this.xmlDoc;
if (xmlDoc.responseXML)
xmlDoc=xmlDoc.responseXML
if (!_isIE){
var xmlSerializer = new XMLSerializer();
return xmlSerializer.serializeToString(xmlDoc);
} else
return xmlDoc.xml;
}
/**
* @desc:
* @type: private
*/
dhtmlxEventable=function(obj){
obj.attachEvent=function(name, catcher, callObj){
name='ev_'+name.toLowerCase();
if (!this[name])
this[name]=new this.eventCatcher(callObj||this);
return(name+':'+this[name].addEvent(catcher)); //return ID (event name & event ID)
}
obj.callEvent=function(name, arg0){
name='ev_'+name.toLowerCase();
if (this[name])
return this[name].apply(this, arg0);
return true;
}
obj.checkEvent=function(name){
return (!!this['ev_'+name.toLowerCase()])
}
obj.eventCatcher=function(obj){
var dhx_catch = [];
var z = function(){
var res = true;
for (var i = 0; i < dhx_catch.length; i++){
if (dhx_catch[i] != null){
var zr = dhx_catch[i].apply(obj, arguments);
res=res&&zr;
}
}
return res;
}
z.addEvent=function(ev){
if (typeof (ev) != "function")
ev=eval(ev);
if (ev)
return dhx_catch.push(ev)-1;
return false;
}
z.removeEvent=function(id){
dhx_catch[id]=null;
}
return z;
}
obj.detachEvent=function(id){
if (id != false){
var list = id.split(':'); //get EventName and ID
this[list[0]].removeEvent(list[1]); //remove event
}
}
obj.detachAllEvents = function(){
for (var name in this){
if (name.indexOf("ev_")==0)
delete this[name];
}
}
};
(function(){
var t = dhtmlx.message = function(text, type, lifetime, id){
if (!t.area){
t.area = document.createElement("DIV");
t.area.style.cssText = "position:absolute;right:5px;width:250px;z-index:100;";
t.area.className = "dhtmlx_message_area";
t.area.style[t.defPosition]="5px";
document.body.appendChild(t.area);
}
if (typeof text != "object")
text = { text:text, type:type, lifetime:lifetime, id:id };
text.type = text.type||"info";
text.id = text.id||t.uid();
text.lifetime = text.lifetime||t.defTimeout;
t.hide(text.id);
var message = document.createElement("DIV");
message.style.cssText = "border-radius:4px; padding:4px 4px 4px 20px;background-color:#FFFFCC;font-size:12px;font-family:Tahoma;color:navy;z-index: 10000;margin:5px;border:1px solid lightgrey;";
message.innerHTML = text.text;
message.className = text.type;
if (t.defPosition == "bottom" && t.area.firstChild)
t.area.insertBefore(message,t.area.firstChild);
else
t.area.appendChild(message);
t.timers[text.id]=window.setTimeout(function(){
t.hide(text.id);
}, text.lifetime);
t.pull[text.id] = message;
return text.id;
};
t.defTimeout = 4000;
t.defPosition = "top";
t.pull = {};
t.timers = {};
t.seed = (new Date()).valueOf();
t.uid = function(){ return t.seed++; };
t.hideAll = function(){
for (var key in t.pull)
t.hide(key);
};
t.hide = function(id){
var obj = t.pull[id];
if (obj && obj.parentNode){
obj.parentNode.removeChild(obj);
window.clearTimeout(t.timers[id]);
delete t.pull[id];
}
};
})();
/**
* @desc: dhtmlxGrid cell object constructor (shouldn't be accesed directly. Use cells and cells2 methods of the grid instead)
* @type: cell
* @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.original)
return this.cell.original; //innerText;
else
return this.getValue();
}
//excell_methods:04062008{
/**
* @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.style.textAlign)
return this.cell.style.textAlign;
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: deprecated
*/
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(){
return this.cell._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 (fl != 'true'&&fl != 1)
fl=false;
if (this.isCheckbox()){
this.cell.firstChild.disabled=fl;
if (this.disabledF)
this.disabledF(fl);
}
this.cell._disabled=fl;
}
}
dhtmlXGridCellObject.prototype={
getAttribute: function(name){
return this.cell._attrs[name];
},
setAttribute: function(name, value){
this.cell._attrs[name]=value;
},
getInput:function(){
if (this.obj && (this.obj.tagName=="INPUT" || this.obj.tagName=="TEXTAREA")) return this.obj;
var inps=(this.obj||this.cell).getElementsByTagName("TEXTAREA");
if (!inps.length)
inps=(this.obj||this.cell).getElementsByTagName("INPUT");
return inps[0];
}
}
/**
* @desc: sets value to the cell
* @param: val - new value
* @type: public
*/
dhtmlXGridCellObject.prototype.setValue=function(val){
if (( typeof (val) != "number")&&(!val||val.toString()._dhx_trim() == "")){
val=" "
this.cell._clearCell=true;
} else
this.cell._clearCell=false;
this.setCValue(val);
}
/**
* @desc: sets value to the cell
* @param: val - new value
* @param: val2
* @type: private
*/
dhtmlXGridCellObject.prototype.getTitle=function(){
return (_isIE ? this.cell.innerText : this.cell.textContent);
}
dhtmlXGridCellObject.prototype.setCValue=function(val, val2){
this.cell.innerHTML=val;
//__pro_feature:21092006{
//on_cell_changed:23102006{
this.grid.callEvent("onCellChanged", [
this.cell.parentNode.idd,
this.cell._cellIndex,
(arguments.length > 1 ? val2 : val)
]);
//}
//}
}
dhtmlXGridCellObject.prototype.setCTxtValue=function(val){
this.cell.innerHTML="";
this.cell.appendChild(document.createTextNode(val));
//__pro_feature:21092006{
//on_cell_changed:23102006{
this.grid.callEvent("onCellChanged", [
this.cell.parentNode.idd,
this.cell._cellIndex,
val
]);
//}
//}
}
/**
* @desc: sets text representation of cell which contains math formula ( 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: get formula of ExCell ( actual only for math based exCells )
* @type: public
*/
dhtmlXGridCellObject.prototype.getMath=function(){
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;
/**
* @desc: simple text editor
* @returns: dhtmlxGrid cell editor object
* @type: public
*/
function eXcell_ed(cell){
if (cell){
this.cell=cell;
this.grid=this.cell.parentNode.grid;
}
this.edit=function(){
this.cell.atag=((!this.grid.multiLine)&&(_isKHTML||_isMacOS||_isFF)) ? "INPUT" : "TEXTAREA";
this.val=this.getValue();
this.obj=document.createElement(this.cell.atag);
this.obj.setAttribute("autocomplete", "off");
this.obj.style.height=(this.cell.offsetHeight-(_isIE ? 4 : 4))+"px";
this.obj.className="dhx_combo_edit";
this.obj.wrap="soft";
this.obj.style.textAlign=this.cell.style.textAlign;
this.obj.onclick=function(e){
(e||event).cancelBubble=true
}
this.obj.onmousedown=function(e){
(e||event).cancelBubble=true
}
this.obj.value=this.val
this.cell.innerHTML="";
this.cell.appendChild(this.obj);
if (_isFF && !window._KHTMLrv){
this.obj.style.overflow="visible";
if ((this.grid.multiLine)&&(this.obj.offsetHeight >= 18)&&(this.obj.offsetHeight < 40)){
this.obj.style.height="36px";
this.obj.style.overflow="scroll";
}
}
this.obj.onselectstart=function(e){
if (!e)
e=event;
e.cancelBubble=true;
return true;
};
if (_isIE)
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;
if (this.cell._clearCell)
return "";
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;
/**
* @desc: pure text editor ( HTML not supported )
* @returns: dhtmlxGrid cell editor object
* @type: public
*/
function eXcell_edtxt(cell){
if (cell){
this.cell=cell;
this.grid=this.cell.parentNode.grid;
}
this.getValue=function(){
if ((this.cell.firstChild)&&((this.cell.atag)&&(this.cell.firstChild.tagName == this.cell.atag)))
return this.cell.firstChild.value;
if (this.cell._clearCell)
return "";
return (_isIE ? this.cell.innerText : this.cell.textContent);
}
this.setValue=function(val){
if (!val||val.toString()._dhx_trim() == ""){
val=" ";
this.cell._clearCell=true;
} else
this.cell._clearCell=false;
this.setCTxtValue(val);
}
}
eXcell_edtxt.prototype=new eXcell_ed;
//__pro_feature:21092006{
/**
* @desc: simple numeric text editor
* @returns: dhtmlxGrid cell editor object
* @type: public
* @edition: professional
*/
function eXcell_edn(cell){
if (cell){
this.cell=cell;
this.grid=this.cell.parentNode.grid;
}
this.getValue=function(){
//this.grid.editStop();
if ((this.cell.firstChild)&&(this.cell.firstChild.tagName == "TEXTAREA"))
return this.cell.firstChild.value;
if (this.cell._clearCell)
return "";
return this.cell._orig_value||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_ed;
eXcell_edn.prototype.setValue=function(val){
if (!val||val.toString()._dhx_trim() == ""){
this.cell._clearCell=true;
return this.setCValue(" ",0);
} else {
this.cell._clearCell=false;
this.cell._orig_value = val;
}
this.setCValue(this.grid._aplNF(val, this.cell._cellIndex), val);
}
//}
//ch_excell:04062008{
/**
* @desc: checkbox editor
* @returns: dhtmlxGrid cell editor object
* @type: public
*/
function eXcell_ch(cell){
if (cell){
this.cell=cell;
this.grid=this.cell.parentNode.grid;
}
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(fromClick){
//nb:
if (fromClick===true && !this.grid.isActive) {
if (window.globalActiveDHTMLGridObject != null && window.globalActiveDHTMLGridObject != this.grid && window.globalActiveDHTMLGridObject.isActive) window.globalActiveDHTMLGridObject.setActive(false);
this.grid.setActive(true);
}
if ((!this.grid.isEditable)||(this.cell.parentNode._locked)||(this.isDisabled()))
return;
if (this.grid.callEvent("onEditCell", [
0,
this.cell.parentNode.idd,
this.cell._cellIndex
])){
this.val=this.getValue()
if (this.val == "1")
this.setValue("0")
else
this.setValue("1")
this.cell.wasChanged=true;
//nb:
this.grid.callEvent("onEditCell", [
1,
this.cell.parentNode.idd,
this.cell._cellIndex
]);
this.grid.callEvent("onCheckbox", [
this.cell.parentNode.idd,
this.cell._cellIndex,
(this.val != '1')
]);
this.grid.callEvent("onCheck", [
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(){
return this.cell.chstate ? this.cell.chstate.toString() : "0";
}
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();
}
this.edit=null;
}
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);
}
//}
//ra_excell:04062008{
/**
* @desc: radio editor
* @returns: dhtmlxGrid cell editor object
* @type: public
*/
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(mode){
if (mode===false && this.getValue()==1) return;
if ((!this.grid.isEditable)||(this.cell.parentNode._locked))
return;
if (this.grid.callEvent("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")
this.cell.wasChanged=true;
//nb:
this.grid.callEvent("onEditCell", [
1,
this.cell.parentNode.idd,
this.cell._cellIndex
]);
this.grid.callEvent("onCheckbox", [
this.cell.parentNode.idd,
this.cell._cellIndex,
(this.val != '1')
]);
this.grid.callEvent("onCheck", [
this.cell.parentNode.idd,
this.cell._cellIndex,
(this.val != '1')
]);
} else { //preserve editing (not tested thoroughly for this editor)
this.editor=null;
}
}
this.edit=null;
}
eXcell_ra.prototype=new eXcell_ch;
eXcell_ra.prototype.setValue=function(val){
this.cell.style.verticalAlign="middle"; //nb:to center checkbox in line
if (val){
val=val.toString()._dhx_trim();
if ((val == "false")||(val == "0"))
val="";
}
if (val){
if (!this.grid._RaSeCol)
this.grid._RaSeCol=[];
if (this.grid._RaSeCol[this.cell._cellIndex]){
var z = this.grid.cells4(this.grid._RaSeCol[this.cell._cellIndex]);
z.setValue("0")
if (this.grid.rowsAr[z.cell.parentNode.idd])
this.grid.callEvent("onEditCell", [
1,
z.cell.parentNode.idd,
z.cell._cellIndex
]);
}
this.grid._RaSeCol[this.cell._cellIndex]=this.cell;
val="1";
this.cell.chstate="1";
} else {
val="0";
this.cell.chstate="0"
}
this.setCValue("",
this.cell.chstate);
}
//}
//txt_excell:04062008{
/**
* @desc: multilene popup editor
* @returns: dhtmlxGrid cell editor object
* @type: public
*/
function eXcell_txt(cell){
if (cell){
this.cell=cell;
this.grid=this.cell.parentNode.grid;
}
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
this.obj.value=this.val;
this.obj.style.display="";
this.obj.style.textAlign=this.cell.style.textAlign;
if (_isFF){
var z_ff = document.createElement("DIV");
z_ff.appendChild(this.obj);
z_ff.style.overflow="auto";
z_ff.className="dhx_textarea";
this.obj.style.margin="0px 0px 0px 0px";
this.obj.style.border="0px";
this.obj=z_ff;
}
document.body.appendChild(this.obj); //nb:
if(_isOpera) this.obj.onkeypress=function(ev){ if (ev.keyCode == 9) return false; }
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.offsetWidth < 200)
var pw = 200;
else
var pw = this.cell.offsetWidth;
this.obj.style.width=pw+(_isFF ? 18 : 16)+"px"
if (_isFF){
this.obj.firstChild.style.width=parseInt(this.obj.style.width)+"px";
this.obj.firstChild.style.height=this.obj.offsetHeight-3+"px";
}
if (_isIE) { this.obj.select(); this.obj.value=this.obj.value; }//dzen of IE
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);
document.body.removeChild(this.obj);
this.obj=null;
return this.val != this.getValue();
}
this.getValue=function(){
if (this.obj){
if (_isFF)
return this.obj.firstChild.value;
else
return this.obj.value;
}
if (this.cell._clearCell)
return "";
if ((!this.grid.multiLine))
return this.cell._brval||this.cell.innerHTML;
else
return this.cell.innerHTML.replace(/ ]*>/gi, "\n")._dhx_trim(); //innerText;
}
}
eXcell_txt.prototype=new eXcell;
/**
* @desc: multiline text editor without HTML support
* @returns: dhtmlxGrid cell editor object
* @type: public
*/
function eXcell_txttxt(cell){
if (cell){
this.cell=cell;
this.grid=this.cell.parentNode.grid;
}
this.getValue=function(){
if ((this.cell.firstChild)&&(this.cell.firstChild.tagName == "TEXTAREA"))
return this.cell.firstChild.value;
if (this.cell._clearCell)
return "";
if ((!this.grid.multiLine)&&this.cell._brval)
return this.cell._brval;
return (_isIE ? this.cell.innerText : this.cell.textContent);
}
this.setValue=function(val){
this.cell._brval=val;
if (!val||val.toString()._dhx_trim() == ""){
val=" ";
this.cell._clearCell=true;
} else
this.cell._clearCell=false;
this.setCTxtValue(val);
}
}
eXcell_txttxt.prototype=new eXcell_txt;
eXcell_txt.prototype.setValue=function(val){
if (!val||val.toString()._dhx_trim() == ""){
val=" "
this.cell._clearCell=true;
} else
this.cell._clearCell=false;
this.cell._brval=val;
if ((!this.grid.multiLine))
this.setCValue(val, val);
else
this.setCValue(val.replace(/\n/g, " "), val);
}
//}
//co_excell:04062008{
/**
* @desc: combobox editor
* @returns: dhtmlxGrid cell editor object
* @type: public
*/
function eXcell_co(cell){
if (cell){
this.cell=cell;
this.grid=this.cell.parentNode.grid;
this.combo=(this.cell._combo||this.grid.getCombo(this.cell._cellIndex));
this.editable=true
}
this.shiftNext=function(){
var z = this.list.options[this.list.selectedIndex+1];
if (z)
z.selected=true;
this.obj.value=this.list.options[this.list.selectedIndex].text;
return true;
}
this.shiftPrev=function(){
if (this.list.selectedIndex != 0){
var z = this.list.options[this.list.selectedIndex-1];
if (z)
z.selected=true;
this.obj.value=this.list.options[this.list.selectedIndex].text;
}
return true;
}
this.edit=function(){
this.val=this.getValue();
this.text=this.getText()._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.style.textAlign;
this.obj.onclick=function(e){
(e||event).cancelBubble=true
}
this.obj.onmousedown=function(e){
(e||event).cancelBubble=true
}
this.obj.value=this.text
this.obj.onselectstart=function(e){
if (!e)
e=event;
e.cancelBubble=true;
return true;
};
var editor_obj = this;
this.obj.onkeyup=function(e){
var key=(e||event).keyCode;
if (key==38 || key==40 || key==9) return;
var val = this.readonly ? String.fromCharCode(key) : this.value;
var c = editor_obj.list.options;
for (var i = 0; i < c.length; i++)
if (c[i].text.indexOf(val) == 0)
return c[i].selected=true;
}
this.list=document.createElement("SELECT");
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;
//editor_obj.list.value = cell.value;
editor_obj.editable=false;
editor_obj.grid.editStop();
ev.cancelBubble = true;
}
var comboKeys = this.combo.getKeys();
var fl = false
var selOptId = 0;
for (var i = 0; i < comboKeys.length; i++){
var val = this.combo.get(comboKeys[i])
this.list.options[this.list.options.length]=new Option(val, comboKeys[i]);
if (comboKeys[i] == this.val){
selOptId=this.list.options.length-1;
fl=true;
}
}
if (fl == false){ //if no such value in combo list
this.list.options[this.list.options.length]=new Option(this.text, this.val === null ? "" : this.val);
selOptId=this.list.options.length-1;
}
document.body.appendChild(this.list) //nb:this.grid.objBox.appendChild(this.listBox);
this.list.size="6";
this.cstate=1;
if (this.editable){
this.cell.innerHTML="";
}
else {
this.obj.style.width="1px";
this.obj.style.height="1px";
}
this.cell.appendChild(this.obj);
this.list.options[selOptId].selected=true;
//fix for coro - FF scrolls grid in incorrect position
if ((!_isFF)||(this.editable)){
this.obj.focus();
this.obj.focus();
}
if (!this.editable){
this.obj.style.visibility="hidden";
this.list.focus();
this.list.onkeydown=function(e){
e=e||window.event;
editor_obj.grid.setActive(true)
if (e.keyCode < 30)
return editor_obj.grid.doKey({
target: editor_obj.cell,
keyCode: e.keyCode,
shiftKey: e.shiftKey,
ctrlKey: e.ctrlKey
})
}
}
}
this.getValue=function(){
return ((this.cell.combo_value == window.undefined) ? "" : this.cell.combo_value);
}
this.detach=function(){
if (this.val != this.getValue()){
this.cell.wasChanged=true;
}
if (this.list.parentNode != null){
if (this.editable){
var ind = this.list.options[this.list.selectedIndex]
if (ind&&ind.text == this.obj.value)
this.setValue(this.list.value)
else{
var combo=(this.cell._combo||this.grid.getCombo(this.cell._cellIndex));
var val=combo.values._dhx_find(this.obj.value);
if (val!=-1) this.setValue(combo.keys[val]);
else this.setCValue(this.cell.combo_value=this.obj.value);
}
}
else
this.setValue(this.list.value)
}
if (this.list.parentNode)
this.list.parentNode.removeChild(this.list);
if (this.obj.parentNode)
this.obj.parentNode.removeChild(this.obj);
return this.val != this.getValue();
}
}
eXcell_co.prototype=new eXcell;
eXcell_co.prototype.getText=function(){
return this.cell.innerHTML;
}
eXcell_co.prototype.setValue=function(val){
if (typeof (val) == "object"){
var optCol = this.grid.xmlLoader.doXPath("./option", val);
if (optCol.length)
this.cell._combo=new dhtmlXGridComboObject();
for (var j = 0;
j < optCol.length;
j++)this.cell._combo.put(optCol[j].getAttribute("value"),
optCol[j].firstChild
? optCol[j].firstChild.data
: "");
val=val.firstChild.data;
}
if ((val||"").toString()._dhx_trim() == "")
val=null
this.cell.combo_value=val;
if (val !== null){
var label = (this.cell._combo||this.grid.getCombo(this.cell._cellIndex)).get(val);
this.setCValue(label===null?val:label, val);
}else
this.setCValue(" ", val);
}
/**
* @desc: selectbox editor
* @returns: dhtmlxGrid cell editor object
* @type: public
*/
function eXcell_coro(cell){
this.base=eXcell_co;
this.base(cell)
this.editable=false;
}
eXcell_coro.prototype=new eXcell_co;
function eXcell_cotxt(cell){
this.base=eXcell_co;
this.base(cell)
}
eXcell_cotxt.prototype=new eXcell_co;
eXcell_cotxt.prototype.getText=function(){
return (_isIE ? this.cell.innerText : this.cell.textContent);
}
eXcell_cotxt.prototype.setValue=function(val){
if (typeof (val) == "object"){
var optCol = this.grid.xmlLoader.doXPath("./option", val);
if (optCol.length)
this.cell._combo=new dhtmlXGridComboObject();
for (var j = 0;
j < optCol.length;
j++)this.cell._combo.put(optCol[j].getAttribute("value"),
optCol[j].firstChild
? optCol[j].firstChild.data
: "");
val=val.firstChild.data;
}
if ((val||"").toString()._dhx_trim() == "")
val=null
if (val !== null)
this.setCTxtValue((this.cell._combo||this.grid.getCombo(this.cell._cellIndex)).get(val)||val, val);
else
this.setCTxtValue(" ", val);
this.cell.combo_value=val;
}
function eXcell_corotxt(cell){
this.base=eXcell_co;
this.base(cell)
this.editable=false;
}
eXcell_corotxt.prototype=new eXcell_cotxt;
//}
//cp_excell:04062008{
/**
* @desc: color picker editor
* @returns: dhtmlxGrid cell editor object
* @type: public
*/
function eXcell_cp(cell){
try{
this.cell=cell;
this.grid=this.cell.parentNode.grid;
}
catch (er){}
this.edit=function(){
this.val=this.getValue()
this.obj=document.createElement("SPAN");
this.obj.style.border="1px solid black";
this.obj.style.position="absolute";
var arPos = this.grid.getPosition(this.cell); //,this.grid.objBox
this.colorPanel(4, this.obj)
document.body.appendChild(this.obj); //this.grid.objBox.appendChild(this.obj);
this.obj.style.left=arPos[0]+"px";
this.obj.style.zIndex=1;
this.obj.style.top=arPos[1]+this.cell.offsetHeight+"px";
}
this.toolDNum=function(value){
if (value.length == 1)
value='0'+value;
return value;
}
this.colorPanel=function(index, parent){
var tbl = document.createElement("TABLE");
parent.appendChild(tbl)
tbl.cellSpacing=0;
tbl.editor_obj=this;
tbl.style.cursor="default";
tbl.onclick=function(e){
var ev = e||window.event
var cell = ev.target||ev.srcElement;
var ed = cell.parentNode.parentNode.parentNode.editor_obj
ed.setValue(cell._bg)
ed.grid.editStop();
}
var cnt = 256 / index;
for (var j = 0; j <= (256 / cnt); j++){
var r = tbl.insertRow(j);
for (var i = 0; i <= (256 / cnt); i++){
for (var n = 0; n <= (256 / cnt); n++){
R=new Number(cnt*j)-(j == 0 ? 0 : 1)
G=new Number(cnt*i)-(i == 0 ? 0 : 1)
B=new Number(cnt*n)-(n == 0 ? 0 : 1)
var rgb =
this.toolDNum(R.toString(16))+""+this.toolDNum(G.toString(16))+""+this.toolDNum(B.toString(16));
var c = r.insertCell(i);
c.width="10px";
c.innerHTML=" "; //R+":"+G+":"+B;//
c.title=rgb.toUpperCase()
c.style.backgroundColor="#"+rgb
c._bg="#"+rgb;
if (this.val != null&&"#"+rgb.toUpperCase() == this.val.toUpperCase()){
c.style.border="2px solid white"
}
}
}
}
}
this.getValue=function(){
return this.cell.firstChild._bg||""; //this.getBgColor()
}
this.getRed=function(){
return Number(parseInt(this.getValue().substr(1, 2), 16))
}
this.getGreen=function(){
return Number(parseInt(this.getValue().substr(3, 2), 16))
}
this.getBlue=function(){
return Number(parseInt(this.getValue().substr(5, 2), 16))
}
this.detach=function(){
if (this.obj.offsetParent != null)
document.body.removeChild(this.obj);
//this.obj.removeNode(true)
return this.val != this.getValue();
}
}
eXcell_cp.prototype=new eXcell;
eXcell_cp.prototype.setValue=function(val){
this.setCValue("
",
val);
this.cell.firstChild._bg=val;
}
//}
//img_excell:04062008{
/**
* @desc: image editor
* @returns: dhtmlxGrid cell editor object
* @type: public
*/
/*
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._brval
: "");
else if (this.cell.firstChild.tagName == "A"){
var out = this.cell.firstChild.firstChild.src+(this.cell.titFl != null ? "^"+this.cell._brval : "");
out+="^"+this.cell.lnk;
if (this.cell.trg)
out+="^"+this.cell.trg
return out;
}
}
this.isDisabled=function(){
return true;
}
}
eXcell_img.prototype=new eXcell;
eXcell_img.prototype.getTitle=function(){
return this.cell._brval
}
eXcell_img.prototype.setValue=function(val){
var title = val;
if (val.indexOf("^") != -1){
var ar = val.split("^");
val=ar[0]
title=this.cell._attrs.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._brval=title;
}
//}
//price_excell:04062008{
/**
* @desc: text editor with price (USD) formatting
* @returns: dhtmlxGrid cell editor object
* @type: public
*/
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(parseFloat(val))){
val=this.val||0;
}
var color = "green";
if (val < 0)
color="red";
this.setCValue("$"+val+"", val);
}
//}
//dyn_excells:04062008{
/**
* @desc: text editor with additional formatting for positive and negative numbers (arrow down/up and color)
* @returns: dhtmlxGrid cell editor object
* @type: public
*/
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))){
if (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);
}
//}
/**
* @desc: readonly editor
* @returns: dhtmlxGrid cell editor object
* @type: public
*/
function eXcell_ro(cell){
if (cell){
this.cell=cell;
this.grid=this.cell.parentNode.grid;
}
this.edit=function(){
}
this.isDisabled=function(){
return true;
}
this.getValue=function(){
return this.cell._clearCell?"":this.cell.innerHTML.toString()._dhx_trim();
}
}
eXcell_ro.prototype=new eXcell;
function eXcell_ron(cell){
this.cell=cell;
this.grid=this.cell.parentNode.grid;
this.edit=function(){
}
this.isDisabled=function(){
return true;
}
this.getValue=function(){
return this.cell._clearCell?"":this.grid._aplNFb(this.cell.innerHTML.toString()._dhx_trim(), this.cell._cellIndex);
}
}
eXcell_ron.prototype=new eXcell;
eXcell_ron.prototype.setValue=function(val){
if (val === 0){}
else if (!val||val.toString()._dhx_trim() == ""){
this.setCValue(" ");
return this.cell._clearCell=true;
}
this.cell._clearCell=false;
this.setCValue(val?this.grid._aplNF(val, this.cell._cellIndex):"0");
}
/**
* @desc: readonly pure text editor (without HTML support)
* @returns: dhtmlxGrid cell editor object
* @type: public
*/
function eXcell_rotxt(cell){
this.cell=cell;
this.grid=this.cell.parentNode.grid;
this.edit=function(){
}
this.isDisabled=function(){
return true;
}
this.setValue=function(val){
if (!val){
val=" ";
this.cell._clearCell = true;
}
else
this.cell._clearCell = false;
this.setCTxtValue(val);
}
this.getValue=function(){
if (this.cell._clearCell)
return "";
return (_isIE ? this.cell.innerText : this.cell.textContent);
}
}
eXcell_rotxt.prototype=new eXcell;
/**
* @desc: combobox object constructor (shouldn't be accessed directly - instead please use getCombo(...) method of the grid)
* @type: private
* @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 < this.keys.length; i++){
if (this.keys[i] == key){
this.values[i]=value;
return true;
}
}
this.values[this.values.length]=value;
this.keys[this.keys.length]=key;
}
/**
* @desc: gets value corresponding to the given key
* @type: public
* @param: key - object to use as a key (should be a string in the case of combobox)
* @returns: value correspond. to given key or null if no such key
*/
this.get=function(key){
for (var i = 0; i < this.keys.length; i++){
if (this.keys[i] == key){
return this.values[i];
}
}
return null;
}
/**
* @desc: clears combobox
* @type: public
*/
this.clear=function(){
/*for(var i=0;i= ind; i--)
this[i]=this[i-1]
this[ind]=value
},
_dhx_removeAt:function(ind){
this.splice(ind,1)
},
_dhx_swapItems:function(ind1, ind2){
var tmp = this[ind1];
this[ind1]=this[ind2]
this[ind2]=tmp;
}
}
/**
* @desc: dhtmlxGrid constructor
* @param: id - (optional) id of div element to base grid on
* @returns: dhtmlxGrid object
* @type: public
*/
function dhtmlXGridObject(id){
if (_isIE)
try{
document.execCommand("BackgroundImageCache", false, true);
}
catch (e){}
if (id){
if (typeof (id) == 'object'){
this.entBox=id
this.entBox.id="cgrid2_"+this.uid();
} else
this.entBox=document.getElementById(id);
} else {
this.entBox=document.createElement("DIV");
this.entBox.id="cgrid2_"+this.uid();
}
this.entBox.innerHTML="";
dhtmlxEventable(this);
var self = this;
this._wcorr=0;
this.fontWidth = 7;
this.cell=null;
this.row=null;
this.iconURL="";
this.editor=null;
this._f2kE=true;
this._dclE=true;
this.combos=new Array(0);
this.defVal=new Array(0);
this.rowsAr={
};
this.rowsBuffer=dhtmlxArray();
this.rowsCol=dhtmlxArray(); //array of rows by index
this._data_cache={
};
this._ecache={
}
this._ud_enabled=true;
this.xmlLoader=new dtmlXMLLoaderObject(this.doLoadDetails, this, true, this.no_cashe);
this._maskArr=[];
this.selectedRows=dhtmlxArray(); //selected rows array
this.UserData={};//hash of row related userdata (and for grid - "gridglobaluserdata")
this._sizeFix=this._borderFix=0;
/*MAIN OBJECTS*/
this.entBox.className+=" gridbox";
this.entBox.style.width=this.entBox.getAttribute("width")
||(window.getComputedStyle
? (this.entBox.style.width||window.getComputedStyle(this.entBox, null)["width"])
: (this.entBox.currentStyle
? this.entBox.currentStyle["width"]
: this.entBox.style.width||0))
||"100%";
this.entBox.style.height=this.entBox.getAttribute("height")
||(window.getComputedStyle
? (this.entBox.style.height||window.getComputedStyle(this.entBox, null)["height"])
: (this.entBox.currentStyle
? this.entBox.currentStyle["height"]
: this.entBox.style.height||0))
||"100%";
//cursor and text selection
this.entBox.style.cursor='default';
this.entBox.onselectstart=function(){
return false
}; //avoid text select
var t_creator=function(name){
var t=document.createElement("TABLE");
t.cellSpacing=t.cellPadding=0;
t.style.cssText='width:100%;table-layout:fixed;';
t.className=name.substr(2);
return t;
}
this.obj=t_creator("c_obj");
this.hdr=t_creator("c_hdr");
this.hdr.style.marginRight="20px";
this.hdr.style.paddingRight="20px";
this.objBox=document.createElement("DIV");
this.objBox.style.width="100%";
this.objBox.style.overflow="auto";
this.objBox.appendChild(this.obj);
this.objBox.className="objbox";
this.hdrBox=document.createElement("DIV");
this.hdrBox.style.width="100%"
this.hdrBox.style.height="25px";
this.hdrBox.style.overflow="hidden";
this.hdrBox.className="xhdr";
this.preloadImagesAr=new Array(0)
this.sortImg=document.createElement("IMG")
this.sortImg.style.display="none";
this.hdrBox.appendChild(this.sortImg)
this.hdrBox.appendChild(this.hdr);
this.hdrBox.style.position="relative";
this.entBox.appendChild(this.hdrBox);
this.entBox.appendChild(this.objBox);
//add links to current object
this.entBox.grid=this;
this.objBox.grid=this;
this.hdrBox.grid=this;
this.obj.grid=this;
this.hdr.grid=this;
/*PROPERTIES*/
this.cellWidthPX=[]; //current width in pixels
this.cellWidthPC=[]; //width in % if cellWidthType set in pc
this.cellWidthType=this.entBox.cellwidthtype||"px"; //px or %
this.delim=this.entBox.delimiter||",";
this._csvDelim=",";
this.hdrLabels=[];
this.columnIds=[];
this.columnColor=[];
this._hrrar=[];
this.cellType=dhtmlxArray();
this.cellAlign=[];
this.initCellWidth=[];
this.fldSort=[];
this._srdh=(_isIE && (document.compatMode != "BackCompat") ? 22 : 20);
this.imgURL=window.dhx_globalImgPath||"";
this.isActive=false; //fl to indicate if grid is in work now
this.isEditable=true;
this.useImagesInHeader=false; //use images in header or not
this.pagingOn=false; //paging on/off
this.rowsBufferOutSize=0; //number of rows rendered at a moment
/*EVENTS*/
dhtmlxEvent(window, "unload", function(){
try{
if (self.destructor) self.destructor();
}
catch (e){}
});
/*XML LOADER(S)*/
/**
* @desc: set one of predefined css styles (xp, mt, gray, light, clear, modern)
* @param: name - style name
* @type: public
* @topic: 0,6
*/
this.setSkin=function(name){
this.skin_name=name;
this.entBox.className="gridbox gridbox_"+name;
this.skin_h_correction=0;
//alter_css:06042008{
this.enableAlterCss("ev_"+name, "odd_"+name, this.isTreeGrid())
this._fixAlterCss()
//}
switch (name){
case "clear":
this._topMb=document.createElement("DIV");
this._topMb.className="topMumba";
this._topMb.innerHTML="";
this.entBox.appendChild(this._topMb);
this._botMb=document.createElement("DIV");
this._botMb.className="bottomMumba";
this._botMb.innerHTML="";
this.entBox.appendChild(this._botMb);
if (this.entBox.style.position != "absolute")
this.entBox.style.position="relative";
this.skin_h_correction=20;
break;
case "dhx_skyblue":
case "dhx_web":
case "glassy_blue":
case "dhx_black":
case "dhx_blue":
case "modern":
case "light":
this._srdh=20;
this.forceDivInHeader=true;
break;
case "xp":
this.forceDivInHeader=true;
if ((_isIE)&&(document.compatMode != "BackCompat"))
this._srdh=26;
else this._srdh=22;
break;
case "mt":
if ((_isIE)&&(document.compatMode != "BackCompat"))
this._srdh=26;
else this._srdh=22;
break;
case "gray":
if ((_isIE)&&(document.compatMode != "BackCompat"))
this._srdh=22;
break;
case "sbdark":
break;
}
if (_isIE&&this.hdr){
var d = this.hdr.parentNode;
d.removeChild(this.hdr);
d.appendChild(this.hdr);
}
this.setSizes();
}
if (_isIE)
this.preventIECaching(true);
if (window.dhtmlDragAndDropObject)
this.dragger=new dhtmlDragAndDropObject();
/*METHODS. SERVICE*/
/**
* @desc: on scroll grid inner actions
* @type: private
* @topic: 7
*/
this._doOnScroll=function(e, mode){
this.callEvent("onScroll", [
this.objBox.scrollLeft,
this.objBox.scrollTop
]);
this.doOnScroll(e, mode);
}
/**
* @desc: on scroll grid more inner action
* @type: private
* @topic: 7
*/
this.doOnScroll=function(e, mode){
this.hdrBox.scrollLeft=this.objBox.scrollLeft;
if (this.ftr)
this.ftr.parentNode.scrollLeft=this.objBox.scrollLeft;
if (mode)
return;
if (this._srnd){
if (this._dLoadTimer)
window.clearTimeout(this._dLoadTimer);
this._dLoadTimer=window.setTimeout(function(){
if (self._update_srnd_view)
self._update_srnd_view();
}, 100);
}
}
/**
* @desc: attach grid to some object in DOM
* @param: obj - object to attach to
* @type: public
* @topic: 0,7
*/
this.attachToObject=function(obj){
obj.appendChild(this.globalBox?this.globalBox:this.entBox);
//this.objBox.style.height=this.entBox.style.height;
this.setSizes();
}
/**
* @desc: initialize grid
* @param: fl - if to parse on page xml data island
* @type: public
* @topic: 0,7
*/
this.init=function(fl){
if ((this.isTreeGrid())&&(!this._h2)){
this._h2=new dhtmlxHierarchy();
if ((this._fake)&&(!this._realfake))
this._fake._h2=this._h2;
this._tgc={
imgURL: null
};
}
if (!this._hstyles)
return;
this.editStop()
/*TEMPORARY STATES*/
this.lastClicked=null; //row clicked without shift key. used in multiselect only
this.resized=null; //hdr cell that is resized now
this.fldSorted=this.r_fldSorted=null; //hdr cell last sorted
//empty grid if it already was initialized
this.cellWidthPX=[];
this.cellWidthPC=[];
if (this.hdr.rows.length > 0){
this.clearAll(true);
}
var hdrRow = this.hdr.insertRow(0);
for (var i = 0; i < this.hdrLabels.length; i++){
hdrRow.appendChild(document.createElement("TH"));
hdrRow.childNodes[i]._cellIndex=i;
hdrRow.childNodes[i].style.height="0px";
}
if (_isIE && _isIE<8)
hdrRow.style.position="absolute";
else
hdrRow.style.height='auto';
var hdrRow = this.hdr.insertRow(_isKHTML ? 2 : 1);
hdrRow._childIndexes=new Array();
var col_ex = 0;
for (var i = 0; i < this.hdrLabels.length; i++){
hdrRow._childIndexes[i]=i-col_ex;
if ((this.hdrLabels[i] == this.splitSign)&&(i != 0)){
if (_isKHTML)
hdrRow.insertCell(i-col_ex);
hdrRow.cells[i-col_ex-1].colSpan=(hdrRow.cells[i-col_ex-1].colSpan||1)+1;
hdrRow.childNodes[i-col_ex-1]._cellIndex++;
col_ex++;
hdrRow._childIndexes[i]=i-col_ex;
continue;
}
hdrRow.insertCell(i-col_ex);
hdrRow.childNodes[i-col_ex]._cellIndex=i;
hdrRow.childNodes[i-col_ex]._cellIndexS=i;
this.setColumnLabel(i, this.hdrLabels[i]);
}
if (col_ex == 0)
hdrRow._childIndexes=null;
this._cCount=this.hdrLabels.length;
if (_isIE)
window.setTimeout(function(){
if (self.setSizes)
self.setSizes();
}, 1);
//create virtual top row
if (!this.obj.firstChild)
this.obj.appendChild(document.createElement("TBODY"));
var tar = this.obj.firstChild;
if (!tar.firstChild){
tar.appendChild(document.createElement("TR"));
tar=tar.firstChild;
if (_isIE && _isIE<8)
tar.style.position="absolute";
else
tar.style.height='auto';
for (var i = 0; i < this.hdrLabels.length; i++){
tar.appendChild(document.createElement("TH"));
tar.childNodes[i].style.height="0px";
}
}
this._c_order=null;
if (this.multiLine != true)
this.obj.className+=" row20px";
//
//this.combos = new Array(this.hdrLabels.length);
//set sort image to initial state
this.sortImg.style.position="absolute";
this.sortImg.style.display="none";
this.sortImg.src=this.imgURL+"sort_desc.gif";
this.sortImg.defLeft=0;
if (this.noHeader){
this.hdrBox.style.display='none';
}
else {
this.noHeader=false
}
//__pro_feature:21092006{
//column_hidden:21092006{
if (this._ivizcol)
this.setColHidden();
//}
//}
//header_footer:06042008{
this.attachHeader();
this.attachHeader(0, 0, "_aFoot");
//}
this.setSizes();
if (fl)
this.parseXML()
this.obj.scrollTop=0
if (this.dragAndDropOff)
this.dragger.addDragLanding(this.entBox, this);
if (this._initDrF)
this._initD();
if (this._init_point)
this._init_point();
};
this.setColumnSizes=function(gridWidth){
var summ = 0;
var fcols = []; //auto-size columns
var fix = 0;
for (var i = 0; i < this._cCount; i++){
if ((this.initCellWidth[i] == "*") && !this._hrrar[i]){
this._awdth=false; //disable auto-width
fcols.push(i);
continue;
}
if (this.cellWidthType == '%'){
if (typeof this.cellWidthPC[i]=="undefined")
this.cellWidthPC[i]=this.initCellWidth[i];
var cwidth = (gridWidth*this.cellWidthPC[i]/100)||0;
if (fix>0.5){
cwidth++;
fix--;
}
var rwidth = this.cellWidthPX[i]=Math.floor(cwidth);
var fix =fix + cwidth - rwidth;
} else{
if (typeof this.cellWidthPX[i]=="undefined")
this.cellWidthPX[i]=this.initCellWidth[i];
}
if (!this._hrrar[i])
summ+=this.cellWidthPX[i]*1;
}
//auto-size columns
if (fcols.length){
var ms = Math.floor((gridWidth-summ)/fcols.length);
if (ms < 0) ms=1;
for (var i = 0; i < fcols.length; i++){
var next=Math.max((this._drsclmW ? (this._drsclmW[fcols[i]]||0) : 0),ms)
this.cellWidthPX[fcols[i]]=next;
summ+=next;
}
if(gridWidth > summ){
var last=fcols[fcols.length-1];
this.cellWidthPX[last]=this.cellWidthPX[last] + (gridWidth-summ);
summ = gridWidth;
}
this._setAutoResize();
}
this.obj.style.width=summ+"px";
this.hdr.style.width=summ+"px";
if (this.ftr) this.ftr.style.width=summ+"px";
this.chngCellWidth();
return summ;
}
/**shz)_
* @desc: sets sizes of grid elements
* @type: private
* @topic: 0,7
*/
this.setSizes=function(){
//drop processing if grid still not initialized
if ((!this.hdr.rows[0])) return;
var quirks=this.quirks = (_isIE && document.compatMode=="BackCompat");
var outerBorder=(this.entBox.offsetWidth-this.entBox.clientWidth)/2;
if (this.globalBox){
var splitOuterBorder=(this.globalBox.offsetWidth-this.globalBox.clientWidth)/2;
if (this._delta_x && !this._realfake){
var ow = this.globalBox.clientWidth;
this.globalBox.style.width=this._delta_x;
this.entBox.style.width=Math.max(0,(this.globalBox.clientWidth+(quirks?splitOuterBorder*2:0))-this._fake.entBox.clientWidth)+"px";
if (ow != this.globalBox.clientWidth){
this._fake._correctSplit(this._fake.entBox.clientWidth);
}
}
if (this._delta_y && !this._realfake){
this.globalBox.style.height = this._delta_y;
this.entBox.style.overflow = this._fake.entBox.style.overflow="hidden";
this.entBox.style.height = this._fake.entBox.style.height=this.globalBox.clientHeight+(quirks?splitOuterBorder*2:0)+"px";
}
} else {
if (this._delta_x){
/*when placed directly in TD tag, container can't use native percent based sizes,
because table auto-adjust to show all content - too clever*/
if (this.entBox.parentNode && this.entBox.parentNode.tagName=="TD"){
this.entBox.style.width="1px";
this.entBox.style.width=parseInt(this._delta_x)*this.entBox.parentNode.clientWidth/100-outerBorder*2+"px";
}else
this.entBox.style.width=this._delta_x;
}
if (this._delta_y)
this.entBox.style.height=this._delta_y;
}
//if we have container without sizes, wait untill sizes defined
window.clearTimeout(this._sizeTime);
if (!this.entBox.offsetWidth && (!this.globalBox || !this.globalBox.offsetWidth)){
this._sizeTime=window.setTimeout(function(){
if (self.setSizes)
self.setSizes();
}, 250);
return;
}
var border_x = ((!this._wthB) && ((this.entBox.cmp||this._delta_x) && (this.skin_name||"").indexOf("dhx")==0 && !quirks)?2:0);
var border_y = ((!this._wthB) && ((this.entBox.cmp||this._delta_y) && (this.skin_name||"").indexOf("dhx")==0 && !quirks)?2:0);
var isVScroll = this.parentGrid?false:(this.objBox.scrollHeight > this.objBox.offsetHeight);
var scrfix = _isFF?18:18;
var gridWidth=this.entBox.clientWidth-(this.skin_h_correction||0)*(quirks?0:1)-border_x;
var gridWidthActive=this.entBox.clientWidth-(this.skin_h_correction||0)-border_x;
var gridHeight=this.entBox.clientHeight-border_y;
var summ=this.setColumnSizes(gridWidthActive-(isVScroll?scrfix:0)-(this._correction_x||0));
var isHScroll = this.parentGrid?false:((this.objBox.scrollWidth > this.objBox.offsetWidth)||(this.objBox.style.overflowX=="scroll"));
var headerHeight = this.hdr.clientHeight;
var footerHeight = this.ftr?this.ftr.clientHeight:0;
var newWidth=gridWidth;
var newHeight=gridHeight-headerHeight-footerHeight;
//if we have auto-width without limitations - ignore h-scroll
if (this._awdth && this._awdth[0] && this._awdth[1]==99999) isHScroll=0;
//auto-height
if (this._ahgr){
if (this._ahgrMA)
newHeight=this.entBox.parentNode.clientHeight-headerHeight-footerHeight;
else
newHeight=this.obj.offsetHeight+(isHScroll?scrfix:0)+(this._correction_y||0);
if (this._ahgrM){
if (this._ahgrF)
newHeight=Math.min(this._ahgrM,newHeight+headerHeight+footerHeight)-headerHeight-footerHeight;
else
newHeight=Math.min(this._ahgrM,newHeight);
}
if (isVScroll && newHeight>=this.obj.scrollHeight+(isHScroll?scrfix:0)){
isVScroll=false;//scroll will be compensated;
this.setColumnSizes(gridWidthActive-(this._correction_x||0)); //correct auto-size columns
}
}
//auto-width
if ((this._awdth)&&(this._awdth[0])){
//convert percents to PX, because auto-width with procents has no sense
if (this.cellWidthType == '%') this.cellWidthType="px";
if (this._fake) summ+=this._fake.entBox.clientWidth; //include fake grid in math
var newWidth=Math.min(Math.max(summ+(isVScroll?scrfix:0),this._awdth[2]),this._awdth[1])+(this._correction_x||0);
if (this._fake) newWidth-=this._fake.entBox.clientWidth;
}
newHeight=Math.max(0,newHeight);//validate value for IE
//FF3.1, bug in table rendering engine
this._ff_size_delta=(this._ff_size_delta==0.1)?0.2:0.1;
if (!_isFF) this._ff_size_delta=0;
this.entBox.style.width=Math.max(0,newWidth+(quirks?2:0)*outerBorder+this._ff_size_delta)+"px";
this.entBox.style.height=newHeight+(quirks?2:0)*outerBorder+headerHeight+footerHeight+"px";
this.objBox.style.height=newHeight+((quirks&&!isVScroll)?2:0)*outerBorder+"px";//):this.entBox.style.height);
this.hdrBox.style.height=headerHeight+"px";
if (newHeight != gridHeight)
this.doOnScroll(0, !this._srnd);
var ext=this["setSizes_"+this.skin_name];
if (ext) ext.call(this);
this.setSortImgPos();
//it possible that changes of size, has changed header height
if (headerHeight != this.hdr.clientHeight && this._ahgr)
this.setSizes();
this.callEvent("onSetSizes",[]);
};
this.setSizes_clear=function(){
var y=this.hdr.offsetHeight;
var x=this.entBox.offsetWidth;
var y2=y+this.objBox.offsetHeight;
this._topMb.style.top=(y||0)+"px";
this._topMb.style.width=(x+20)+"px";
this._botMb.style.top=(y2-3)+"px";
this._botMb.style.width=(x+20)+"px";
};
/**
* @desc: changes cell width
* @param: [ind] - index of row in grid
* @type: private
* @topic: 4,7
*/
this.chngCellWidth=function(){
if ((_isOpera)&&(this.ftr))
this.ftr.width=this.objBox.scrollWidth+"px";
var l = this._cCount;
for (var i = 0; i < l; i++){
this.hdr.rows[0].cells[i].style.width=this.cellWidthPX[i]+"px";
this.obj.rows[0].childNodes[i].style.width=this.cellWidthPX[i]+"px";
if (this.ftr)
this.ftr.rows[0].cells[i].style.width=this.cellWidthPX[i]+"px";
}
}
/**
* @desc: set delimiter character used in list values (default is ",")
* @param: delim - delimiter as string
* @before_init: 1
* @type: public
* @topic: 0
*/
this.setDelimiter=function(delim){
this.delim=delim;
}
/**
* @desc: set width of columns in percents
* @type: public
* @before_init: 1
* @param: wp - list of column width in percents
* @topic: 0,7
*/
this.setInitWidthsP=function(wp){
this.cellWidthType="%";
this.initCellWidth=wp.split(this.delim.replace(/px/gi, ""));
if (!arguments[1]) this._setAutoResize();
}
/**
* @desc:
* @type: private
* @topic: 0
*/
this._setAutoResize=function(){
if (this._realfake) return;
var el = window;
var self = this;
dhtmlxEvent(window,"resize",function(){
window.clearTimeout(self._resize_timer);
if (self._setAutoResize)
self._resize_timer=window.setTimeout(function(){
if (self.setSizes)
self.setSizes();
if (self._fake)
self._fake._correctSplit();
}, 100);
})
}
/**
* @desc: set width of columns in pixels
* @type: public
* @before_init: 1
* @param: wp - list of column width in pixels
* @topic: 0,7
*/
this.setInitWidths=function(wp){
this.cellWidthType="px";
this.initCellWidth=wp.split(this.delim);
if (_isFF){
for (var i = 0; i < this.initCellWidth.length; i++)
if (this.initCellWidth[i] != "*")
this.initCellWidth[i]=parseInt(this.initCellWidth[i]);
}
}
/**
* @desc: set multiline rows support to enabled or disabled state
* @type: public
* @before_init: 1
* @param: state - true or false
* @topic: 0,7
*/
this.enableMultiline=function(state){
this.multiLine=convertStringToBoolean(state);
}
/**
* @desc: set multiselect mode to enabled or disabled state
* @type: public
* @param: state - true or false
* @topic: 0,7
*/
this.enableMultiselect=function(state){
this.selMultiRows=convertStringToBoolean(state);
}
/**
* @desc: set path to grid internal images (sort direction, any images used in editors, checkbox, radiobutton)
* @type: public
* @param: path - url (or relative path) of images folder with closing "/"
* @topic: 0,7
*/
this.setImagePath=function(path){
this.imgURL=path;
}
this.setImagesPath=this.setImagePath;
/**
* @desc: set path to external images used in grid ( tree and img column types )
* @type: public
* @param: path - url (or relative path) of images folder with closing "/"
* @topic: 0,7
*/
this.setIconPath=function(path){
this.iconURL=path;
}
this.setIconsPath=this.setIconPath;
//column_resize:06042008{
/**
* @desc: part of column resize routine
* @type: private
* @param: ev - event
* @topic: 3
*/
this.changeCursorState=function(ev){
var el = ev.target||ev.srcElement;
if (el.tagName != "TD")
el=this.getFirstParentOfType(el, "TD")
if (!el) return;
if ((el.tagName == "TD")&&(this._drsclmn)&&(!this._drsclmn[el._cellIndex]))
return el.style.cursor="default";
var check = (ev.layerX||0)+(((!_isIE)&&(ev.target.tagName == "DIV")) ? el.offsetLeft : 0);
if ((el.offsetWidth-(ev.offsetX||(parseInt(this.getPosition(el, this.hdrBox))-check)*-1)) < (_isOpera?20:10)){
el.style.cursor="E-resize";
}
else{
el.style.cursor="default";
}
if (_isOpera)
this.hdrBox.scrollLeft=this.objBox.scrollLeft;
}
/**
* @desc: part of column resize routine
* @type: private
* @param: ev - event
* @topic: 3
*/
this.startColResize=function(ev){
if (this.resized) this.stopColResize();
this.resized=null;
var el = ev.target||ev.srcElement;
if (el.tagName != "TD")
el=this.getFirstParentOfType(el, "TD")
var x = ev.clientX;
var tabW = this.hdr.offsetWidth;
var startW = parseInt(el.offsetWidth)
if (el.tagName == "TD"&&el.style.cursor != "default"){
if ((this._drsclmn)&&(!this._drsclmn[el._cellIndex]))
return;
self._old_d_mm=document.body.onmousemove;
self._old_d_mu=document.body.onmouseup;
document.body.onmousemove=function(e){
if (self)
self.doColResize(e||window.event, el, startW, x, tabW)
}
document.body.onmouseup=function(){
if (self)
self.stopColResize();
}
}
}
/**
* @desc: part of column resize routine
* @type: private
* @param: ev - event
* @topic: 3
*/
this.stopColResize=function(){
document.body.onmousemove=self._old_d_mm||"";
document.body.onmouseup=self._old_d_mu||"";
this.setSizes();
this.doOnScroll(0, 1)
this.callEvent("onResizeEnd", [this]);
}
/**
* @desc: part of column resize routine
* @param: el - element (column resizing)
* @param: startW - started width
* @param: x - x coordinate to resize from
* @param: tabW - started width of header table
* @type: private
* @topic: 3
*/
this.doColResize=function(ev, el, startW, x, tabW){
el.style.cursor="E-resize";
this.resized=el;
var fcolW = startW+(ev.clientX-x);
var wtabW = tabW+(ev.clientX-x)
if (!(this.callEvent("onResize", [
el._cellIndex,
fcolW,
this
])))
return;
if (_isIE)
this.objBox.scrollLeft=this.hdrBox.scrollLeft;
if (el.colSpan > 1){
var a_sizes = new Array();
for (var i = 0;
i < el.colSpan;
i++)a_sizes[i]=Math.round(fcolW*this.hdr.rows[0].childNodes[el._cellIndexS+i].offsetWidth/el.offsetWidth);
for (var i = 0; i < el.colSpan; i++)
this._setColumnSizeR(el._cellIndexS+i*1, a_sizes[i]);
} else
this._setColumnSizeR(el._cellIndex, fcolW);
this.doOnScroll(0, 1);
this.setSizes();
if (this._fake && this._awdth) this._fake._correctSplit();
}
/**
* @desc: set width of grid columns ( zero row of header and body )
* @type: private
* @topic: 7
*/
this._setColumnSizeR=function(ind, fcolW){
if (fcolW > ((this._drsclmW&&!this._notresize) ? (this._drsclmW[ind]||10) : 10)){
this.obj.rows[0].childNodes[ind].style.width=fcolW+"px";
this.hdr.rows[0].childNodes[ind].style.width=fcolW+"px";
if (this.ftr)
this.ftr.rows[0].childNodes[ind].style.width=fcolW+"px";
if (this.cellWidthType == 'px'){
this.cellWidthPX[ind]=fcolW;
}
else {
var gridWidth = parseInt(this.entBox.offsetWidth);
if (this.objBox.scrollHeight > this.objBox.offsetHeight)
gridWidth-=17;
var pcWidth = Math.round(fcolW / gridWidth*100)
this.cellWidthPC[ind]=pcWidth;
}
if (this.sortImg.style.display!="none")
this.setSortImgPos();
}
}
//}
//sorting:06042008{
/**
* @desc: sets position and visibility of sort arrow
* @param: state - true/false - show/hide image
* @param: ind - index of field
* @param: order - asc/desc - type of image
* @param: row - one based index of header row ( used in multirow headers, top row by default )
* @type: public
* @topic: 7
*/
this.setSortImgState=function(state, ind, order, row){
order=(order||"asc").toLowerCase();
if (!convertStringToBoolean(state)){
this.sortImg.style.display="none";
this.fldSorted=this.r_fldSorted = null;
return;
}
if (order == "asc")
this.sortImg.src=this.imgURL+"sort_asc.gif";
else
this.sortImg.src=this.imgURL+"sort_desc.gif";
this.sortImg.style.display="";
this.fldSorted=this.hdr.rows[0].childNodes[ind];
var r = this.hdr.rows[row||1];
if (!r) return;
for (var i = 0; i < r.childNodes.length; i++){
if (r.childNodes[i]._cellIndexS == ind){
this.r_fldSorted=r.childNodes[i];
return this.setSortImgPos();
}
}
return this.setSortImgState(state,ind,order,(row||1)+1);
}
/**
* @desc: sets position and visibility of sort arrow
* @param: ind - index of field
* @param: ind - index of field
* @param: hRowInd - index of row in case of complex header, one-based, optional
* @type: private
* @topic: 7
*/
this.setSortImgPos=function(ind, mode, hRowInd, el){
if (this._hrrar && this._hrrar[this.r_fldSorted?this.r_fldSorted._cellIndex:ind]) return;
if (!el){
if (!ind)
var el = this.r_fldSorted;
else
var el = this.hdr.rows[hRowInd||0].cells[ind];
}
if (el != null){
var pos = this.getPosition(el, this.hdrBox)
var wdth = el.offsetWidth;
this.sortImg.style.left=Number(pos[0]+wdth-13)+"px"; //Number(pos[0]+5)+"px";
this.sortImg.defLeft=parseInt(this.sortImg.style.left)
this.sortImg.style.top=Number(pos[1]+5)+"px";
if ((!this.useImagesInHeader)&&(!mode))
this.sortImg.style.display="inline";
this.sortImg.style.left=this.sortImg.defLeft+"px"; //-parseInt(this.hdrBox.scrollLeft)
}
}
//}
/**
* @desc: manage activity of the grid.
* @param: fl - true to activate,false to deactivate
* @type: private
* @topic: 1,7
*/
this.setActive=function(fl){
if (arguments.length == 0)
var fl = true;
if (fl == true){
//document.body.onkeydown = new Function("","document.getElementById('"+this.entBox.id+"').grid.doKey()")//
if (globalActiveDHTMLGridObject&&(globalActiveDHTMLGridObject != this)){
globalActiveDHTMLGridObject.editStop();
globalActiveDHTMLGridObject.callEvent("onBlur",[globalActiveDHTMLGridObject]);
}
globalActiveDHTMLGridObject=this;
this.isActive=true;
} else {
this.isActive=false;
this.callEvent("onBlur",[this]);
}
};
/**
* @desc: called on click occured
* @type: private
*/
this._doClick=function(ev){
var selMethod = 0;
var el = this.getFirstParentOfType(_isIE ? ev.srcElement : ev.target, "TD");
if (!el) return;
var fl = true;
//mm
//markers start
if (this.markedCells){
var markMethod = 0;
if (ev.shiftKey||ev.metaKey){
markMethod=1;
}
if (ev.ctrlKey){
markMethod=2;
}
this.doMark(el, markMethod);
return true;
}
//markers end
//mm
if (this.selMultiRows != false){
if (ev.shiftKey && this.row != null && this.selectedRows.length){
selMethod=1;
}
if (ev.ctrlKey||ev.metaKey){
selMethod=2;
}
}
this.doClick(el, fl, selMethod)
};
//context_menu:06042008{
/**
* @desc: called onmousedown inside grid area
* @type: private
*/
this._doContClick=function(ev){
var el = this.getFirstParentOfType(_isIE ? ev.srcElement : ev.target, "TD");
if ((!el)||( typeof (el.parentNode.idd) == "undefined"))
return true;
if (ev.button == 2||(_isMacOS&&ev.ctrlKey)){
if (!this.callEvent("onRightClick", [
el.parentNode.idd,
el._cellIndex,
ev
])){
var z = function(e){
(e||event).cancelBubble=true;
return false;
};
(ev.srcElement||ev.target).oncontextmenu=z;
return z(ev);
}
if (this._ctmndx){
if (!(this.callEvent("onBeforeContextMenu", [
el.parentNode.idd,
el._cellIndex,
this
])))
return true;
if (_isIE)
ev.srcElement.oncontextmenu=function(){
event.cancelBubble=true;
return false;
};
if (this._ctmndx.showContextMenu){
var dEl0=window.document.documentElement;
var dEl1=window.document.body;
var corrector = new Array((dEl0.scrollLeft||dEl1.scrollLeft),(dEl0.scrollTop||dEl1.scrollTop));
if (_isIE){
var x= ev.clientX+corrector[0];
var y = ev.clientY+corrector[1];
} else {
var x= ev.pageX;
var y = ev.pageY;
}
this._ctmndx.showContextMenu(x-1,y-1)
this.contextID=this._ctmndx.contextMenuZoneId=el.parentNode.idd+"_"+el._cellIndex;
this._ctmndx._skip_hide=true;
} else {
el.contextMenuId=el.parentNode.idd+"_"+el._cellIndex;
el.contextMenu=this._ctmndx;
el.a=this._ctmndx._contextStart;
el.a(el, ev);
el.a=null;
}
ev.cancelBubble=true;
return false;
}
}
else if (this._ctmndx){
if (this._ctmndx.hideContextMenu)
this._ctmndx.hideContextMenu()
else
this._ctmndx._contextEnd();
}
return true;
}
//}
/**
* @desc: occures on cell click (supports treegrid)
* @param: [el] - cell to click on
* @param: [fl] - true if to call onRowSelect function
* @param: [selMethod] - 0 - simple click, 1 - shift, 2 - ctrl
* @param: show - true/false - scroll row to view, true by defaul
* @type: private
* @topic: 1,2,4,9
*/
this.doClick=function(el, fl, selMethod, show){
if (!this.selMultiRows) selMethod=0; //block programmatical multiselecton if mode not enabled explitly
var psid = this.row ? this.row.idd : 0;
this.setActive(true);
if (!selMethod)
selMethod=0;
if (this.cell != null)
this.cell.className=this.cell.className.replace(/cellselected/g, "");
if (el.tagName == "TD"){
if (this.checkEvent("onSelectStateChanged"))
var initial = this.getSelectedId();
var prow = this.row;
if (selMethod == 1){
var elRowIndex = this.rowsCol._dhx_find(el.parentNode)
var lcRowIndex = this.rowsCol._dhx_find(this.lastClicked)
if (elRowIndex > lcRowIndex){
var strt = lcRowIndex;
var end = elRowIndex;
} else {
var strt = elRowIndex;
var end = lcRowIndex;
}
for (var i = 0; i < this.rowsCol.length; i++)
if ((i >= strt&&i <= end)){
if (this.rowsCol[i]&&(!this.rowsCol[i]._sRow)){
if (this.rowsCol[i].className.indexOf("rowselected")
== -1&&this.callEvent("onBeforeSelect", [
this.rowsCol[i].idd,
psid
])){
this.rowsCol[i].className+=" rowselected";
this.selectedRows[this.selectedRows.length]=this.rowsCol[i]
}
} else {
this.clearSelection();
return this.doClick(el, fl, 0, show);
}
}
} else if (selMethod == 2){
if (el.parentNode.className.indexOf("rowselected") != -1){
el.parentNode.className=el.parentNode.className.replace(/rowselected/g, "");
this.selectedRows._dhx_removeAt(this.selectedRows._dhx_find(el.parentNode))
var skipRowSelection = true;
show = false;
}
}
this.editStop()
if (typeof (el.parentNode.idd) == "undefined")
return true;
if ((!skipRowSelection)&&(!el.parentNode._sRow)){
if (this.callEvent("onBeforeSelect", [
el.parentNode.idd,
psid
])){
if (this.getSelectedRowId() != el.parentNode.idd){
if (selMethod == 0)
this.clearSelection();
this.cell=el;
if ((prow == el.parentNode)&&(this._chRRS))
fl=false;
this.row=el.parentNode;
this.row.className+=" rowselected"
if (this.cell && _isIE && _isIE == 8 ){
//fix incorrect table cell size in IE8 bug
var next = this.cell.nextSibling;
var parent = this.cell.parentNode;
parent.removeChild(this.cell)
parent.insertBefore(this.cell,next);
}
if (this.selectedRows._dhx_find(this.row) == -1)
this.selectedRows[this.selectedRows.length]=this.row;
} else {
this.cell=el;
this.row = el.parentNode;
}
} else fl = false;
}
if (this.cell && this.cell.parentNode.className.indexOf("rowselected") != -1)
this.cell.className=this.cell.className.replace(/cellselected/g, "")+" cellselected";
if (selMethod != 1)
if (!this.row)
return;
this.lastClicked=el.parentNode;
var rid = this.row.idd;
var cid = this.cell;
if (fl&& typeof (rid) != "undefined" && cid && !skipRowSelection) {
self.onRowSelectTime=setTimeout(function(){
if (self.callEvent)
self.callEvent("onRowSelect", [
rid,
cid._cellIndex
]);
}, 100);
} else this.callEvent("onRowSelectRSOnly",[rid]);
if (this.checkEvent("onSelectStateChanged")){
var afinal = this.getSelectedId();
if (initial != afinal)
this.callEvent("onSelectStateChanged", [afinal,initial]);
}
}
this.isActive=true;
if (show !== false && this.cell && this.cell.parentNode.idd)
this.moveToVisible(this.cell)
}
/**
* @desc: select all rows in grid, it doesn't fire any events
* @param: edit - switch selected cell to edit mode
* @type: public
* @topic: 1,4
*/
this.selectAll=function(){
this.clearSelection();
var coll = this.rowsBuffer;
//in paging mode, we select only current page
if (this.pagingOn) coll = this.rowsCol;
for (var i = 0; i (this.objBox.offsetWidth+this.objBox.scrollLeft)){
if (cell_obj.offsetLeft > this.objBox.scrollLeft)
scrollLeft=cell_obj.offsetLeft-5
} else if (cell_obj.offsetLeft < this.objBox.scrollLeft){
distance-=cell_obj.offsetWidth*2/3;
if (distance < this.objBox.scrollLeft)
scrollLeft=cell_obj.offsetLeft-5
}
if ((scrollLeft)&&(!onlyVScroll))
this.objBox.scrollLeft=scrollLeft;
}
if (!cell_obj.offsetHeight){
var mask=this._realfake?this._fake.rowsAr[cell_obj.parentNode.idd]:cell_obj.parentNode;
distance = this.rowsBuffer._dhx_find(mask)*this._srdh;
}
else
distance = cell_obj.offsetTop;
var distancemax = distance + cell_obj.offsetHeight+38;
if (distancemax > (this.objBox.offsetHeight+this.objBox.scrollTop)){
var scrollTop = distancemax-this.objBox.offsetHeight;
} else if (distance < this.objBox.scrollTop){
var scrollTop = distance-5
}
if (scrollTop)
this.objBox.scrollTop=scrollTop;
}
catch (er){}
}
/**
* @desc: creates Editor object and switch cell to edit mode if allowed
* @type: public
* @topic: 4
*/
this.editCell=function(){
if (this.editor&&this.cell == this.editor.cell)
return; //prevent reinit for same cell
this.editStop();
if ((this.isEditable != true)||(!this.cell))
return false;
var c = this.cell;
//locked_row:11052006{
if (c.parentNode._locked)
return false;
//}
this.editor=this.cells4(c);
//initialize editor
if (this.editor != null){
if (this.editor.isDisabled()){
this.editor=null;
return false;
}
if (this.callEvent("onEditCell", [
0,
this.row.idd,
this.cell._cellIndex
]) != false&&this.editor.edit){
this._Opera_stop=(new Date).valueOf();
c.className+=" editable";
this.editor.edit();
this.callEvent("onEditCell", [
1,
this.row.idd,
this.cell._cellIndex
])
} else { //preserve editing
this.editor=null;
}
}
}
/**
* @desc: retuns value from editor(if presents) to cell and closes editor
* @mode: if true - current edit value will be reverted to previous one
* @type: public
* @topic: 4
*/
this.editStop=function(mode){
if (_isOpera)
if (this._Opera_stop){
if ((this._Opera_stop*1+50) > (new Date).valueOf())
return;
this._Opera_stop=null;
}
if (this.editor&&this.editor != null){
this.editor.cell.className=this.editor.cell.className.replace("editable", "");
if (mode){
var t = this.editor.val;
this.editor.detach();
this.editor.setValue(t);
this.editor=null;
this.callEvent("onEditCancel", [
this.row.idd,
this.cell._cellIndex,
t
]);
return;
}
if (this.editor.detach())
this.cell.wasChanged=true;
var g = this.editor;
this.editor=null;
var z = this.callEvent("onEditCell", [
2,
this.row.idd,
this.cell._cellIndex,
g.getValue(),
g.val
]);
if (( typeof (z) == "string")||( typeof (z) == "number"))
g[g.setImage ? "setLabel" : "setValue"](z);
else if (!z)
g[g.setImage ? "setLabel" : "setValue"](g.val);
if (this._ahgr && this.multiLine) this.setSizes();
}
}
/**
* @desc:
* @type: private
*/
this._nextRowCell=function(row, dir, pos){
row=this._nextRow((this._groups?this.rowsCol:this.rowsBuffer)._dhx_find(row), dir);
if (!row)
return null;
return row.childNodes[row._childIndexes ? row._childIndexes[pos] : pos];
}
/**
* @desc:
* @type: private
*/
this._getNextCell=function(acell, dir, i){
acell=acell||this.cell;
var arow = acell.parentNode;
if (this._tabOrder){
i=this._tabOrder[acell._cellIndex];
if (typeof i != "undefined")
if (i < 0)
acell=this._nextRowCell(arow, dir, Math.abs(i)-1);
else
acell=arow.childNodes[i];
} else {
var i = acell._cellIndex+dir;
if (i >= 0&&i < this._cCount){
if (arow._childIndexes)
i=arow._childIndexes[acell._cellIndex]+dir;
acell=arow.childNodes[i];
} else {
acell=this._nextRowCell(arow, dir, (dir == 1 ? 0 : (this._cCount-1)));
}
}
if (!acell){
if ((dir == 1)&&this.tabEnd){
this.tabEnd.focus();
this.tabEnd.focus();
this.setActive(false);
}
if ((dir == -1)&&this.tabStart){
this.tabStart.focus();
this.tabStart.focus();
this.setActive(false);
}
return null;
}
//tab out
// tab readonly
if (acell.style.display != "none"
&&(!this.smartTabOrder||!this.cells(acell.parentNode.idd, acell._cellIndex).isDisabled()))
return acell;
return this._getNextCell(acell, dir);
// tab readonly
}
/**
* @desc:
* @type: private
*/
this._nextRow=function(ind, dir){
var r = this.render_row(ind+dir);
if (!r || r==-1) return null;
if (r&&r.style.display == "none")
return this._nextRow(ind+dir, dir);
return r;
}
/**
* @desc:
* @type: private
*/
this.scrollPage=function(dir){
if (!this.rowsBuffer.length) return;
var master = this._realfake?this._fake:this;
var new_ind = Math.floor((master._r_select||this.getRowIndex(this.row.idd)||0)+(dir)*this.objBox.offsetHeight / (this._srdh||20));
if (new_ind < 0)
new_ind=0;
if (new_ind >= this.rowsBuffer.length)
new_ind=this.rowsBuffer.length-1;
if (this._srnd && !this.rowsBuffer[new_ind]){
this.objBox.scrollTop+=Math.floor((dir)*this.objBox.offsetHeight / (this._srdh||20))*(this._srdh||20);
if (this._fake) this._fake.objBox.scrollTop = this.objBox.scrollTop;
master._r_select=new_ind;
} else {
this.selectCell(new_ind, this.cell._cellIndex, true, false,false,(this.multiLine || this._srnd));
if (!this.multiLine && !this._srnd && !this._realfake){
this.objBox.scrollTop=this.getRowById(this.getRowId(new_ind)).offsetTop;
if (this._fake) this._fake.objBox.scrollTop = this.objBox.scrollTop;
}
master._r_select=null;
}
}
/**
* @desc: manages keybord activity in grid
* @type: private
* @topic: 7
*/
this.doKey=function(ev){
if (!ev)
return true;
if ((ev.target||ev.srcElement).value !== window.undefined){
var zx = (ev.target||ev.srcElement);
if ((!zx.parentNode)||(zx.parentNode.className.indexOf("editable") == -1))
return true;
}
if ((globalActiveDHTMLGridObject)&&(this != globalActiveDHTMLGridObject))
return globalActiveDHTMLGridObject.doKey(ev);
if (this.isActive == false){
//document.body.onkeydown = "";
return true;
}
if (this._htkebl)
return true;
if (!this.callEvent("onKeyPress", [
ev.keyCode,
ev.ctrlKey || ev.metaKey,
ev.shiftKey,
ev
]))
return false;
var code = "k"+ev.keyCode+"_"+(ev.ctrlKey || ev.metaKey ? 1 : 0)+"_"+(ev.shiftKey ? 1 : 0);
if (this.cell){ //if selection exists in grid only
if (this._key_events[code]){
if (false === this._key_events[code].call(this))
return true;
if (ev.preventDefault)
ev.preventDefault();
ev.cancelBubble=true;
return false;
}
if (this._key_events["k_other"])
this._key_events.k_other.call(this, ev);
}
return true;
}
/**
* @desc: selects row (and first cell of it)
* @param: r - row index or row object
* @param: fl - if true, then call function on select
* @param: preserve - preserve previously selected rows true/false (false by default)
* @param: show - true/false - scroll row to view, true by defaul
* @type: public
* @topic: 1,2
*/
this.selectRow=function(r, fl, preserve, show){
if (typeof (r) != 'object')
r=this.render_row(r);
this.selectCell(r, 0, fl, preserve, false, show)
};
/**
* @desc: called when row was double clicked
* @type: private
* @topic: 1,2
*/
this.wasDblClicked=function(ev){
var el = this.getFirstParentOfType(_isIE ? ev.srcElement : ev.target, "TD");
if (el){
var rowId = el.parentNode.idd;
return this.callEvent("onRowDblClicked", [
rowId,
el._cellIndex
]);
}
}
/**
* @desc: called when header was clicked
* @type: private
* @topic: 1,2
*/
this._onHeaderClick=function(e, el){
var that = this.grid;
el=el||that.getFirstParentOfType(_isIE ? event.srcElement : e.target, "TD");
if (this.grid.resized == null){
if (!(this.grid.callEvent("onHeaderClick", [
el._cellIndexS,
(e||window.event)
])))
return false;
//sorting:06042008{
that.sortField(el._cellIndexS, false, el)
//}
}
this.grid.resized = null;
}
/**
* @desc: deletes selected row(s)
* @type: public
* @topic: 2
*/
this.deleteSelectedRows=function(){
var num = this.selectedRows.length //this.obj.rows.length
if (num == 0)
return;
var tmpAr = this.selectedRows;
this.selectedRows=dhtmlxArray()
for (var i = num-1; i >= 0; i--){
var node = tmpAr[i]
if (!this.deleteRow(node.idd, node)){
this.selectedRows[this.selectedRows.length]=node;
}
else {
if (node == this.row){
var ind = i;
}
}
/*
this.rowsAr[node.idd] = null;
var posInCol = this.rowsCol._dhx_find(node)
this.rowsCol[posInCol].parentNode.removeChild(this.rowsCol[posInCol]);//nb:this.rowsCol[posInCol].removeNode(true);
this.rowsCol._dhx_removeAt(posInCol)*/
}
if (ind){
try{
if (ind+1 > this.rowsCol.length) //this.obj.rows.length)
ind--;
this.selectCell(ind, 0, true)
}
catch (er){
this.row=null
this.cell=null
}
}
}
/**
* @desc: gets selected row id
* @returns: id of selected row (list of ids with default delimiter) or null if non row selected
* @type: public
* @topic: 1,2,9
*/
this.getSelectedRowId=function(){
var selAr = new Array(0);
var uni = {
};
for (var i = 0; i < this.selectedRows.length; i++){
var id = this.selectedRows[i].idd;
if (uni[id])
continue;
selAr[selAr.length]=id;
uni[id]=true;
}
//..
if (selAr.length == 0)
return null;
else
return selAr.join(this.delim);
}
/**
* @desc: gets index of selected cell
* @returns: index of selected cell or -1 if there is no selected sell
* @type: public
* @topic: 1,4
*/
this.getSelectedCellIndex=function(){
if (this.cell != null)
return this.cell._cellIndex;
else
return -1;
}
/**
* @desc: gets width of specified column in pixels
* @param: ind - column index
* @returns: column width in pixels
* @type: public
* @topic: 3,7
*/
this.getColWidth=function(ind){
return parseInt(this.cellWidthPX[ind]);
}
/**
* @desc: sets width of specified column in pixels (soen't works with procent based grid)
* @param: ind - column index
* @param: value - new width value
* @type: public
* @topic: 3,7
*/
this.setColWidth=function(ind, value){
if (value == "*")
this.initCellWidth[ind] = "*";
else {
if (this._hrrar[ind]) return; //hidden
if (this.cellWidthType == 'px')
this.cellWidthPX[ind]=parseInt(value);
else
this.cellWidthPC[ind]=parseInt(value);
}
this.setSizes();
}
/**
* @desc: gets row index by id (grid only)
* @param: row_id - row id
* @returns: row index or -1 if there is no row with specified id
* @type: public
* @topic: 2
*/
this.getRowIndex=function(row_id){
for (var i = 0; i < this.rowsBuffer.length; i++)
if (this.rowsBuffer[i]&&this.rowsBuffer[i].idd == row_id)
return i;
return -1;
}
/**
* @desc: gets row id by index
* @param: ind - row index
* @returns: row id or null if there is no row with specified index
* @type: public
* @topic: 2
*/
this.getRowId=function(ind){
return this.rowsBuffer[ind] ? this.rowsBuffer[ind].idd : this.undefined;
}
/**
* @desc: sets new id for row by its index
* @param: ind - row index
* @param: row_id - new row id
* @type: public
* @topic: 2
*/
this.setRowId=function(ind, row_id){
this.changeRowId(this.getRowId(ind), row_id)
}
/**
* @desc: changes id of the row to the new one
* @param: oldRowId - row id to change
* @param: newRowId - row id to set
* @type:public
* @topic: 2
*/
this.changeRowId=function(oldRowId, newRowId){
if (oldRowId == newRowId)
return;
/*
for (var i=0; i]+)\].*/, "$1");
label=label.substr(label.indexOf("]")+1, label.length)
hdrHTML+=""
}
hdrHTML+=label;
hdrHTML+="";
z.cells[col].innerHTML=hdrHTML;
if (this._hstyles[col])
z.cells[col].style.cssText=this._hstyles[col];
} else { //if images in header header
z.cells[col].style.textAlign="left";
z.cells[col].innerHTML="";
//preload sorting headers (asc/desc)
var a = new Image();
a.src=this.imgURL+""+label.replace(/(\.[a-z]+)/, ".des$1");
this.preloadImagesAr[this.preloadImagesAr.length]=a;
var b = new Image();
b.src=this.imgURL+""+label.replace(/(\.[a-z]+)/, ".asc$1");
this.preloadImagesAr[this.preloadImagesAr.length]=b;
}
if ((label||"").indexOf("#") != -1){
var t = label.match(/(^|{)#([^}]+)(}|$)/);
if (t){
var tn = "_in_header_"+t[2];
if (this[tn])
this[tn]((this.forceDivInHeader ? z.cells[col].firstChild : z.cells[col]), col, label.split(t[0]));
}
}
};
this.setColLabel = function(a,b,ind,c){
return this.setColumnLabel(a,b,(ind||0)+1,c);
};
/**
* @desc: deletes all rows in grid
* @param: header - (boolean) enable/disable cleaning header
* @type: public
* @topic: 5,7,9
*/
this.clearAll=function(header){
if (!this.obj.rows[0]) return; //call before initilization
if (this._h2){
this._h2=new dhtmlxHierarchy();
if (this._fake){
if (this._realfake)
this._h2=this._fake._h2;
else
this._fake._h2=this._h2;
}
}
this.limit=this._limitC=0;
this.editStop(true);
if (this._dLoadTimer)
window.clearTimeout(this._dLoadTimer);
if (this._dload){
this.objBox.scrollTop=0;
this.limit=this._limitC||0;
this._initDrF=true;
}
var len = this.rowsCol.length;
//for some case
len=this.obj.rows.length;
for (var i = len-1; i > 0; i--){
var t_r = this.obj.rows[i];
t_r.parentNode.removeChild(t_r);
}
if (header){
this._master_row=null;
this.obj.rows[0].parentNode.removeChild(this.obj.rows[0]);
for (var i = this.hdr.rows.length-1; i >= 0; i--){
var t_r = this.hdr.rows[i];
t_r.parentNode.removeChild(t_r);
}
if (this.ftr){
this.ftr.parentNode.removeChild(this.ftr);
this.ftr=null;
}
this._aHead=this.ftr=this.cellWidth=this._aFoot=null;
this.cellType=dhtmlxArray();
this._hrrar=[];
this.columnIds=[];
this.combos=[];
this._ivizcol = null;
}
//..
this.row=null;
this.cell=null;
this.rowsCol=dhtmlxArray()
this.rowsAr={}; //array of rows by idd
this._RaSeCol=[];
this.rowsBuffer=dhtmlxArray()
this.UserData=[]
this.selectedRows=dhtmlxArray();
if (this.pagingOn || this._srnd)
this.xmlFileUrl="";
if (this.pagingOn)
this.changePage(1);
// if (!this._fake){
/*
if ((this._hideShowColumn)&&(this.hdr.rows[0]))
for (var i=0; i= el._cellIndex
&&this.fldSort[el._cellIndex] != 'na'){ //this.entBox.fieldstosort!="" &&
var data=this.getSortingState();
var sortType= ( data[0]==ind && data[1]=="asc" ) ? "des" : "asc";
if (!this.callEvent("onBeforeSorting", [
ind,
this.fldSort[ind],
sortType
]))
return;
this.sortImg.src=this.imgURL+"sort_"+(sortType == "asc" ? "asc" : "desc")+".gif";
//for header images
if (this.useImagesInHeader){
var cel = this.hdr.rows[1].cells[el._cellIndex].firstChild;
if (this.fldSorted != null){
var celT = this.hdr.rows[1].cells[this.fldSorted._cellIndex].firstChild;
celT.src=celT.src.replace(/(\.asc\.)|(\.des\.)/, ".");
}
cel.src=cel.src.replace(/(\.[a-z]+)$/, "."+sortType+"$1")
}
//.
this.sortRows(el._cellIndex, this.fldSort[el._cellIndex], sortType)
this.fldSorted=el;
this.r_fldSorted=r_el;
var c = this.hdr.rows[1];
var c = r_el.parentNode;
var real_el = c._childIndexes ? c._childIndexes[el._cellIndex] : el._cellIndex;
this.setSortImgPos(false, false, false, r_el);
}
}
//__pro_feature:21092006{
//custom_sort:21092006{
/**
* @desc: set custom sorting (custom sort has three params - valueA,valueB,order; where order can be asc or des)
* @param: func - function to use for comparison
* @param: col - index of column to apply custom sorting to
* @type: public
* @edition: Professional
* @topic: 3
*/
this.setCustomSorting=function(func, col){
if (!this._customSorts)
this._customSorts=new Array();
this._customSorts[col]=( typeof (func) == "string") ? eval(func) : func;
this.fldSort[col]="cus";
}
//}
//}
//}
/**
* @desc: specify if values passed to Header are images file names
* @param: fl - true to treat column header values as image names
* @type: public
* @before_init: 1
* @topic: 0,3
*/
this.enableHeaderImages=function(fl){
this.useImagesInHeader=fl;
}
/**
* @desc: set header label and default params for new headers
* @param: hdrStr - header string with delimiters
* @param: splitSign - string used as a split marker, optional. Default is "#cspan"
* @param: styles - array of header styles
* @type: public
* @before_init: 1
* @topic: 0,3
*/
this.setHeader=function(hdrStr, splitSign, styles){
if (typeof (hdrStr) != "object")
var arLab = this._eSplit(hdrStr);
else
arLab=[].concat(hdrStr);
var arWdth = new Array(0);
var arTyp = new dhtmlxArray(0);
var arAlg = new Array(0);
var arVAlg = new Array(0);
var arSrt = new Array(0);
for (var i = 0; i < arLab.length; i++){
arWdth[arWdth.length]=Math.round(100 / arLab.length);
arTyp[arTyp.length]="ed";
arAlg[arAlg.length]="left";
arVAlg[arVAlg.length]="middle"; //top
arSrt[arSrt.length]="na";
}
this.splitSign=splitSign||"#cspan";
this.hdrLabels=arLab;
this.cellWidth=arWdth;
if (!this.initCellWidth.length) this.setInitWidthsP(arWdth.join(this.delim),true);
this.cellType=arTyp;
this.cellAlign=arAlg;
this.cellVAlign=arVAlg;
this.fldSort=arSrt;
this._hstyles=styles||[];
}
/**
* @desc:
* @param: str - ...
* @type: private
*/
this._eSplit=function(str){
if (![].push)
return str.split(this.delim);
var a = "r"+(new Date()).valueOf();
var z = this.delim.replace(/([\|\+\*\^])/g, "\\$1")
return (str||"").replace(RegExp(z, "g"), a).replace(RegExp("\\\\"+a, "g"), this.delim).split(a);
}
/**
* @desc: get column type by column index
* @param: cInd - column index
* @returns: type code
* @type: public
* @topic: 0,3,4
*/
this.getColType=function(cInd){
return this.cellType[cInd];
}
/**
* @desc: get column type by column ID
* @param: cID - column id
* @returns: type code
* @type: public
* @topic: 0,3,4
*/
this.getColTypeById=function(cID){
return this.cellType[this.getColIndexById(cID)];
}
/**
* @desc: set column types
* @param: typeStr - type codes list (default delimiter is ",")
* @before_init: 2
* @type: public
* @topic: 0,3,4
*/
this.setColTypes=function(typeStr){
this.cellType=dhtmlxArray(typeStr.split(this.delim));
this._strangeParams=new Array();
for (var i = 0; i < this.cellType.length; i++){
if ((this.cellType[i].indexOf("[") != -1)){
var z = this.cellType[i].split(/[\[\]]+/g);
this.cellType[i]=z[0];
this.defVal[i]=z[1];
if (z[1].indexOf("=") == 0){
this.cellType[i]="math";
this._strangeParams[i]=z[0];
}
}
if (!window["eXcell_"+this.cellType[i]]) dhtmlxError.throwError("Configuration","Incorrect cell type: "+this.cellType[i],[this,this.cellType[i]]);
}
}
/**
* @desc: set column sort types (avaialble: str, int, date, na or function object for custom sorting)
* @param: sortStr - sort codes list with default delimiter
* @before_init: 1
* @type: public
* @topic: 0,3,4
*/
this.setColSorting=function(sortStr){
this.fldSort=sortStr.split(this.delim)
//__pro_feature:21092006{
//custom_sort:21092006{
for (var i = 0; i < this.fldSort.length; i++)
if (((this.fldSort[i]).length > 4)&&( typeof (window[this.fldSort[i]]) == "function")){
if (!this._customSorts)
this._customSorts=new Array();
this._customSorts[i]=window[this.fldSort[i]];
this.fldSort[i]="cus";
}
//}
//}
}
/**
* @desc: set align of values in columns
* @param: alStr - list of align values (possible values are: right,left,center,justify). Default delimiter is ","
* @before_init: 1
* @type: public
* @topic: 0,3
*/
this.setColAlign=function(alStr){
this.cellAlign=alStr.split(this.delim)
for (var i=0; i < this.cellAlign.length; i++)
this.cellAlign[i]=this.cellAlign[i]._dhx_trim();
}
/**
* @desc: set vertical align of columns
* @param: valStr - vertical align values list for columns (possible values are: baseline,sub,super,top,text-top,middle,bottom,text-bottom)
* @before_init: 1
* @type: public
* @topic: 0,3
*/
this.setColVAlign=function(valStr){
this.cellVAlign=valStr.split(this.delim)
}
/**
* @desc: create grid with no header. Call before initialization, but after setHeader. setHeader have to be called in any way as it defines number of columns
* @param: fl - true to use no header in the grid
* @type: public
* @before_init: 1
* @topic: 0,7
*/
this.setNoHeader=function(fl){
this.noHeader=convertStringToBoolean(fl);
}
/**
* @desc: scrolls row to the visible area
* @param: rowID - row id
* @type: public
* @topic: 2,7
*/
this.showRow=function(rowID){
this.getRowById(rowID)
if (this._h2) this.openItem(this._h2.get[rowID].parent.id);
var c = this.getRowById(rowID).childNodes[0];
while (c&&c.style.display == "none")
c=c.nextSibling;
if (c)
this.moveToVisible(c, true)
}
/**
* @desc: modify default style of grid and its elements. Call before or after Init
* @param: ss_header - style def. expression for header
* @param: ss_grid - style def. expression for grid cells
* @param: ss_selCell - style def. expression for selected cell
* @param: ss_selRow - style def. expression for selected Row
* @type: public
* @before_init: 2
* @topic: 0,6
*/
this.setStyle=function(ss_header, ss_grid, ss_selCell, ss_selRow){
this.ssModifier=[
ss_header,
ss_grid,
ss_selCell,
ss_selCell,
ss_selRow
];
var prefs = ["#"+this.entBox.id+" table.hdr td", "#"+this.entBox.id+" table.obj td",
"#"+this.entBox.id+" table.obj tr.rowselected td.cellselected",
"#"+this.entBox.id+" table.obj td.cellselected", "#"+this.entBox.id+" table.obj tr.rowselected td"];
var index = 0;
while (!_isIE){
try{
var temp = document.styleSheets[index].cssRules.length;
} catch(e) { index++; continue; }
break;
}
for (var i = 0; i < prefs.length; i++)
if (this.ssModifier[i]){
if (_isIE)
document.styleSheets[0].addRule(prefs[i], this.ssModifier[i]);
else
document.styleSheets[index].insertRule(prefs[i]+(" { "+this.ssModifier[i]+" }"), document.styleSheets[index].cssRules.length);
}
}
/**
* @desc: colorize columns background.
* @param: clr - colors list
* @type: public
* @before_init: 1
* @topic: 3,6
*/
this.setColumnColor=function(clr){
this.columnColor=clr.split(this.delim)
}
//alter_css:06042008{
/**
* @desc: set even/odd css styles
* @param: cssE - name of css class for even rows
* @param: cssU - name of css class for odd rows
* @param: perLevel - true/false - mark rows not by order, but by level in treegrid
* @param: levelUnique - true/false - creates additional unique css class based on row level
* @type: public
* @before_init: 1
* @topic: 3,6
*/
this.enableAlterCss=function(cssE, cssU, perLevel, levelUnique){
if (cssE||cssU)
this.attachEvent("onGridReconstructed",function(){
this._fixAlterCss();
if (this._fake)
this._fake._fixAlterCss();
});
this._cssSP=perLevel;
this._cssSU=levelUnique;
this._cssEven=cssE;
this._cssUnEven=cssU;
}
//}
/**
* @desc: recolor grid from defined point
* @type: private
* @before_init: 1
* @topic: 3,6
*/
this._fixAlterCss=function(ind){
//alter_css:06042008{
if (this._h2 && (this._cssSP || this._cssSU))
return this._fixAlterCssTGR(ind);
if (!this._cssEven && !this._cssUnEven) return;
ind=ind||0;
var j = ind;
for (var i = ind; i < this.rowsCol.length; i++){
if (!this.rowsCol[i])
continue;
if (this.rowsCol[i].style.display != "none"){
if (this.rowsCol[i]._cntr) { j=1; continue; }
if (this.rowsCol[i].className.indexOf("rowselected") != -1){
if (j%2 == 1)
this.rowsCol[i].className=this._cssUnEven+" rowselected "+(this.rowsCol[i]._css||"");
else
this.rowsCol[i].className=this._cssEven+" rowselected "+(this.rowsCol[i]._css||"");
} else {
if (j%2 == 1)
this.rowsCol[i].className=this._cssUnEven+" "+(this.rowsCol[i]._css||"");
else
this.rowsCol[i].className=this._cssEven+" "+(this.rowsCol[i]._css||"");
}
j++;
}
}
//}
}
//__pro_feature:21092006{
/**
* @desc: clear wasChanged state for all cells in grid
* @type: public
* @edition: Professional
* @topic: 7
*/
this.clearChangedState=function(){
for (var i = 0; i < this.rowsCol.length; i++){
var row = this.rowsCol[i];
var cols = row.childNodes.length;
for (var j = 0; j < cols; j++)row.childNodes[j].wasChanged=false;
}
};
/**
* @desc: get list of IDs of changed rows
* @type: public
* @edition: Professional
* @return: list of ID of changed rows
* @topic: 7
*/
this.getChangedRows=function(and_added){
var res = new Array();
this.forEachRow(function(id){
var row = this.rowsAr[id];
if (row.tagName!="TR") return;
var cols = row.childNodes.length;
if (and_added && row._added)
res[res.length]=row.idd;
else
for (var j = 0; j < cols; j++)
if (row.childNodes[j].wasChanged){
res[res.length]=row.idd;
break;
}
})
return res.join(this.delim);
};
//serialization:21092006{
this._sUDa=false;
this._sAll=false;
/**
* @desc: configure XML serialization
* @type: public
* @edition: Professional
* @param: userData - enable/disable user data serialization
* @param: fullXML - enable/disable full XML serialization (selection state)
* @param: config - serialize grid configuration
* @param: changedAttr - include changed attribute
* @param: onlyChanged - include only Changed rows in result XML
* @param: asCDATA - output cell values as CDATA sections (prevent invalid XML)
* @topic: 0,5,7
*/
this.setSerializationLevel=function(userData, fullXML, config, changedAttr, onlyChanged, asCDATA){
this._sUDa=userData;
this._sAll=fullXML;
this._sConfig=config;
this._chAttr=changedAttr;
this._onlChAttr=onlyChanged;
this._asCDATA=asCDATA;
}
/**
* @desc: configure which column must be serialized (if you do not use this method, then all columns will be serialized)
* @type: public
* @edition: Professional
* @param: list - list of true/false values separated by comma, if list empty then all fields will be serialized
* @topic: 0,5,7
*/
this.setSerializableColumns=function(list){
if (!list){
this._srClmn=null;
return;
}
this._srClmn=(list||"").split(",");
for (var i = 0; i < this._srClmn.length; i++)this._srClmn[i]=convertStringToBoolean(this._srClmn[i]);
}
/**
* @desc: serialize a collection of rows
* @type: private
* @topic: 0,5,7
*/
this._serialise=function(rCol, inner, closed){
this.editStop()
var out = [];
//rows collection
var close = ""+this.xml.s_row+">"
if (this.isTreeGrid()){
this._h2.forEachChildF(0, function(el){
var temp = this._serializeRow(this.render_row_tree(-1, el.id));
out.push(temp);
if (temp)
return true;
else
return false;
}, this, function(){
out.push(close);
});
}
else
for (var i = 0; i < this.rowsBuffer.length; i++)
if (this.rowsBuffer[i]){
if (this._chAttr && this.rowsBuffer[i]._locator)
continue;
var temp = this._serializeRow(this.render_row(i));
out.push(temp);
if (temp)
out.push(close);
}
return [out.join("")];
}
/**
* @desc: serialize TR or xml node to grid formated xml (row tag)
* @param: r - TR or xml node (row)
* @retruns: string - xml representation of passed row
* @type: private
*/
this._serializeRow=function(r, i){
var out = [];
var ra = this.xml.row_attrs;
var ca = this.xml.cell_attrs;
out.push("<"+this.xml.s_row);
out.push(" id='"+r.idd+"'");
if ((this._sAll)&&this.selectedRows._dhx_find(r) != -1)
out.push(" selected='1'");
if (this._h2&&this._h2.get[r.idd].state == "minus")
out.push(" open='1'");
if (ra.length)
for (var i = 0; i < ra.length; i++)out.push(" "+ra[i]+"='"+r._attrs[ra[i]]+"'");
out.push(">");
//userdata
if (this._sUDa&&this.UserData[r.idd]){
keysAr=this.UserData[r.idd].getKeys()
for (var ii = 0;
ii < keysAr.length;
ii++)out.push(""+(this._asCDATA?"":"")+"");
}
//cells
var changeFl = false;
for (var jj = 0; jj < this._cCount; jj++){
if ((!this._srClmn)||(this._srClmn[jj])){
var zx = this.cells3(r, jj);
out.push("";
//colspan:20092006{
if ((this._ecspn)&&(zx.cell.colSpan)&&zx.cell.colSpan > 1)
out.push(" colspan=\""+zx.cell.colSpan+"\" ");
//}
if (this._chAttr){
if (zx.wasChanged()){
out.push(" changed=\"1\"");
changeFl=true;
}
}
else if ((this._onlChAttr)&&(zx.wasChanged()))
changeFl=true;
if (this._sAll && this.cellType[jj]=="tree")
out.push((this._h2 ? (" image='"+this._h2.get[r.idd].image+"'") : "")+">"+zxVal+"");
else
out.push(">"+zxVal+"");
//colspan:20092006{
if ((this._ecspn)&&(zx.cell.colSpan))
for (var u = 0; u < zx.cell.colSpan-1; u++){
out.push("");
jj++;
}
//}
}
}
if ((this._onlChAttr)&&(!changeFl)&&(!r._added))
return "";
return out.join("");
}
/**
* @desc: serialize grid configuration
* @type: private
* @topic: 0,5,7
*/
this._serialiseConfig=function(){
var out = "";
for (var i = 0; i < this.hdr.rows[0].cells.length; i++){
if (this._srClmn && !this._srClmn[i]) continue;
var sort = this.fldSort[i];
if (sort == "cus"){
sort = this._customSorts[i].toString();
sort=sort.replace(/function[\ ]*/,"").replace(/\([^\f]*/,"");
}
out+="";
if (this._asCDATA)
out+="";
else
out+=this.getHeaderCol(i);
var z = this.getCombo(i);
if (z)
for (var j = 0; j < z.keys.length; j++)out+="";
out+=""
}
return out+="";
}
/**
* @desc: get actual xml of grid. The depth of serialization can be set with setSerializationLevel method
* @type: public
* @edition: Professional
* @topic: 5,7
*/
this.serialize=function(){
var out = '';
if (this._mathSerialization)
this._agetm="getMathValue";
else
this._agetm="getValue";
if (this._sUDa&&this.UserData["gridglobaluserdata"]){
var keysAr = this.UserData["gridglobaluserdata"].getKeys()
for (var i = 0;
i < keysAr.length;
i++)out+=""+this.UserData["gridglobaluserdata"].get(keysAr[i])
+"";
}
if (this._sConfig)
out+=this._serialiseConfig();
out+=this._serialise();
out+='';
return out;
}
//}
//}
/**
* @desc: returns absolute left and top position of specified element
* @returns: array of two values: absolute Left and absolute Top positions
* @param: oNode - element to get position of
* @type: private
* @topic: 8
*/
this.getPosition=function(oNode, pNode){
if (!pNode && !_isChrome){
var pos = getOffset(oNode);
return [pos.left, pos.top];
}
pNode = pNode||document.body;
var oCurrentNode = oNode;
var iLeft = 0;
var iTop = 0;
while ((oCurrentNode)&&(oCurrentNode != pNode)){ //.tagName!="BODY"){
iLeft+=oCurrentNode.offsetLeft-oCurrentNode.scrollLeft;
iTop+=oCurrentNode.offsetTop-oCurrentNode.scrollTop;
oCurrentNode=oCurrentNode.offsetParent;
}
if (pNode == document.body){
if (_isIE){
iTop+=document.body.offsetTop||document.documentElement.offsetTop;
iLeft+=document.body.offsetLeft||document.documentElement.offsetLeft;
} else if (!_isFF){
iLeft+=document.body.offsetLeft;
iTop+=document.body.offsetTop;
}
}
return [iLeft, iTop];
}
/**
* @desc: gets nearest parent of specified type
* @param: obj - input object
* @param: tag - string. tag to find as parent
* @returns: object. nearest paraent object (including spec. obj) of specified type.
* @type: private
* @topic: 8
*/
this.getFirstParentOfType=function(obj, tag){
while (obj&&obj.tagName != tag&&obj.tagName != "BODY"){
obj=obj.parentNode;
}
return obj;
}
/*INTERNAL EVENT HANDLERS*/
this.objBox.onscroll=function(){
this.grid._doOnScroll();
};
//column_resize:06042008{
if ((!_isOpera)||(_OperaRv > 8.5)){
this.hdr.onmousemove=function(e){
this.grid.changeCursorState(e||window.event);
};
this.hdr.onmousedown=function(e){
return this.grid.startColResize(e||window.event);
};
}
//}
//tooltips:06042008{
this.obj.onmousemove=this._drawTooltip;
//}
this.objBox.onclick=function(e){
(e||event).cancelBubble=true;
};
this.obj.onclick=function(e){
this.grid._doClick(e||window.event);
if (this.grid._sclE)
this.grid.editCell(e||window.event);
else
this.grid.editStop();
(e||event).cancelBubble=true;
};
//context_menu:06042008{
if (_isMacOS){
this.entBox.oncontextmenu=function(e){
e.cancelBubble=true;
e.returnValue=false;
return this.grid._doContClick(e||window.event);
};
} else {
this.entBox.onmousedown=function(e){
return this.grid._doContClick(e||window.event);
};
this.entBox.oncontextmenu=function(e){
if (this.grid._ctmndx)
(e||event).cancelBubble=true;
return !this.grid._ctmndx;
};
}
//}
this.obj.ondblclick=function(e){
if (!this.grid.wasDblClicked(e||window.event))
return false;
if (this.grid._dclE) {
var row = this.grid.getFirstParentOfType((_isIE?event.srcElement:e.target),"TR");
if (row == this.grid.row)
this.grid.editCell(e||window.event);
}
(e||event).cancelBubble=true;
if (_isOpera) return false; //block context menu for Opera 9+
};
this.hdr.onclick=this._onHeaderClick;
this.sortImg.onclick=function(){
self._onHeaderClick.apply({
grid: self
}, [
null,
self.r_fldSorted
]);
};
this.hdr.ondblclick=this._onHeaderDblClick;
if (!document.body._dhtmlxgrid_onkeydown){
dhtmlxEvent(document, "keydown",function(e){
if (globalActiveDHTMLGridObject)
return globalActiveDHTMLGridObject.doKey(e||window.event);
});
document.body._dhtmlxgrid_onkeydown=true;
}
dhtmlxEvent(document.body, "click", function(){
if (self.editStop) self.editStop();
if (self.isActive) self.setActive(false);
});
//activity management
this.entBox.onbeforeactivate=function(){
this._still_active=null;
this.grid.setActive();
event.cancelBubble=true;
};
this.entBox.onbeforedeactivate=function(){
if (this.grid._still_active)
this.grid._still_active=null;
else
this.grid.isActive=false;
event.cancelBubble=true;
};
if (this.entBox.style.height.toString().indexOf("%") != -1)
this._delta_y = this.entBox.style.height;
if (this.entBox.style.width.toString().indexOf("%") != -1)
this._delta_x = this.entBox.style.width;
if (this._delta_x||this._delta_y)
this._setAutoResize();
/* deprecated names */
this.setColHidden=this.setColumnsVisibility
this.enableCollSpan = this.enableColSpan
this.setMultiselect=this.enableMultiselect;
this.setMultiLine=this.enableMultiline;
this.deleteSelectedItem=this.deleteSelectedRows;
this.getSelectedId=this.getSelectedRowId;
this.getHeaderCol=this.getColumnLabel;
this.isItemExists=this.doesRowExist;
this.getColumnCount=this.getColumnsNum;
this.setSelectedRow=this.selectRowById;
this.setHeaderCol=this.setColumnLabel;
this.preventIECashing=this.preventIECaching;
this.enableAutoHeigth=this.enableAutoHeight;
this.getUID=this.uid;
if (dhtmlx.image_path) this.setImagePath(dhtmlx.image_path);
if (dhtmlx.skin) this.setSkin(dhtmlx.skin);
return this;
}
dhtmlXGridObject.prototype={
getRowAttribute: function(id, name){
return this.getRowById(id)._attrs[name];
},
setRowAttribute: function(id, name, value){
this.getRowById(id)._attrs[name]=value;
},
/**
* @desc: detect is current grid is a treeGrid
* @type: private
* @topic: 2
*/
isTreeGrid:function(){
return (this.cellType._dhx_find("tree") != -1);
},
//column_hidden:21092006{
/**
* @desc: hide/show row (warning! - this command doesn't affect row indexes, only visual appearance)
* @param: ind - column index
* @param: state - true/false - hide/show row
* @type: public
*/
setRowHidden:function(id, state){
var f = convertStringToBoolean(state);
//var ind=this.getRowIndex(id);
//if (id<0)
// return;
var row = this.getRowById(id) //this.rowsCol[ind];
if (!row)
return;
if (row.expand === "")
this.collapseKids(row);
if ((state)&&(row.style.display != "none")){
row.style.display="none";
var z = this.selectedRows._dhx_find(row);
if (z != -1){
row.className=row.className.replace("rowselected", "");
for (var i = 0;
i < row.childNodes.length;
i++)row.childNodes[i].className=row.childNodes[i].className.replace(/cellselected/g, "");
this.selectedRows._dhx_removeAt(z);
}
this.callEvent("onGridReconstructed", []);
}
if ((!state)&&(row.style.display == "none")){
row.style.display="";
this.callEvent("onGridReconstructed", []);
}
this.callEvent("onRowHide",[id, state]);
this.setSizes();
},
//__pro_feature:21092006{
/**
* @desc: hide/show column
* @param: ind - column index
* @param: state - true/false - hide/show column
* @type: public
* @edition: Professional
*/
setColumnHidden:function(ind, state){
if (!this.hdr.rows.length){
if (!this._ivizcol)
this._ivizcol=[];
return this._ivizcol[ind]=state;
}
if ((this.fldSorted)&&(this.fldSorted.cellIndex == ind)&&(state))
this.sortImg.style.display="none";
var f = convertStringToBoolean(state);
if (f){
if (!this._hrrar)
this._hrrar=new Array();
else if (this._hrrar[ind])
return;
this._hrrar[ind]="display:none;";
this._hideShowColumn(ind, "none");
} else {
if ((!this._hrrar)||(!this._hrrar[ind]))
return;
this._hrrar[ind]="";
this._hideShowColumn(ind, "");
}
if ((this.fldSorted)&&(this.fldSorted.cellIndex == ind)&&(!state))
this.sortImg.style.display="inline";
this.setSortImgPos();
this.callEvent("onColumnHidden",[ind,state])
},
/**
* @desc: get show/hidden status of column
* @param: ind - column index
* @type: public
* @edition: Professional
* @returns: if column hidden then true else false
*/
isColumnHidden:function(ind){
if ((this._hrrar)&&(this._hrrar[ind]))
return true;
return false;
},
/**
* @desc: set list of visible/hidden columns
* @param: list - list of true/false separated by comma
* @type: public
* @newmethod: setColumnsVisibility
* @edition: Professional
* @topic:0
*/
setColumnsVisibility:function(list){
if (list)
this._ivizcol=list.split(this.delim);
if (this.hdr.rows.length&&this._ivizcol)
for (var i = 0; i < this._ivizcol.length; i++)this.setColumnHidden(i, this._ivizcol[i]);
},
/**
* @desc: fix hidden state for column in all rows
* @type: private
*/
_fixHiddenRowsAll:function(pb, ind, prop, state, index){
index=index||"_cellIndex";
var z = pb.rows.length;
for (var i = 0; i < z; i++){
var x = pb.rows[i].childNodes;
if (x.length != this._cCount){
for (var j = 0; j < x.length; j++)
if (x[j][index] == ind){
x[j].style[prop]=state;
break;
}
} else
x[ind].style[prop]=state;
}
},
/**
* @desc: hide column
* @param: ind - column index
* @param: state - hide/show
* @edition: Professional
* @type: private
*/
_hideShowColumn:function(ind, state){
var hind = ind;
if ((this.hdr.rows[1]._childIndexes)&&(this.hdr.rows[1]._childIndexes[ind] != ind))
hind=this.hdr.rows[1]._childIndexes[ind];
if (state == "none"){
this.hdr.rows[0].cells[ind]._oldWidth=this.hdr.rows[0].cells[ind].style.width||(this.initCellWidth[ind]+"px");
this.hdr.rows[0].cells[ind]._oldWidthP=this.cellWidthPC[ind];
this.obj.rows[0].cells[ind].style.width="0px";
var t={rows:[this.obj.rows[0]]}
this.forEachRow(function(id){
if (this.rowsAr[id].tagName=="TR")
t.rows.push(this.rowsAr[id])
})
this._fixHiddenRowsAll(t, ind, "display", "none");
if (this.isTreeGrid())
this._fixHiddenRowsAllTG(ind, "none");
if ((_isOpera&&_OperaRv < 9)||_isKHTML||(_isFF)){
this._fixHiddenRowsAll(this.hdr, ind, "display", "none","_cellIndexS");
}
if (this.ftr)
this._fixHiddenRowsAll(this.ftr.childNodes[0], ind, "display", "none");
this._fixHiddenRowsAll(this.hdr, ind, "whiteSpace", "nowrap","_cellIndexS");
if (!this.cellWidthPX.length&&!this.cellWidthPC.length)
this.cellWidthPX=[].concat(this.initCellWidth);
if (this.cellWidthPX[ind])
this.cellWidthPX[ind]=0;
if (this.cellWidthPC[ind])
this.cellWidthPC[ind]=0;
} else {
if (this.hdr.rows[0].cells[ind]._oldWidth){
var zrow = this.hdr.rows[0].cells[ind];
if (_isOpera||_isKHTML||(_isFF))
this._fixHiddenRowsAll(this.hdr, ind, "display", "","_cellIndexS");
if (this.ftr)
this._fixHiddenRowsAll(this.ftr.childNodes[0], ind, "display", "");
var t={rows:[this.obj.rows[0]]}
this.forEachRow(function(id){
if (this.rowsAr[id].tagName=="TR")
t.rows.push(this.rowsAr[id])
})
this._fixHiddenRowsAll(t, ind, "display", "");
if (this.isTreeGrid())
this._fixHiddenRowsAllTG(ind, "");
this._fixHiddenRowsAll(this.hdr, ind, "whiteSpace", "normal","_cellIndexS");
if (zrow._oldWidthP)
this.cellWidthPC[ind]=zrow._oldWidthP;
if (zrow._oldWidth)
this.cellWidthPX[ind]=parseInt(zrow._oldWidth);
}
}
this.setSizes();
if ((!_isIE)&&(!_isFF)){
//dummy Opera/Safari fix
this.obj.border=1;
this.obj.border=0;
}
},
//}
//}
//__pro_feature:21092006{
//colspan:20092006{
/**
* @desc: enable/disable colspan support
* @param: mode - true/false
* @type: public
* @edition: Professional
*/
enableColSpan:function(mode){
this._ecspn=convertStringToBoolean(mode);
},
//}
//}
//hovering:060402008{
/**
* @desc: enable/disable hovering row on mouse over
* @param: mode - true/false
* @param: cssClass - css class for hovering row
* @type: public
*/
enableRowsHover:function(mode, cssClass){
this._unsetRowHover(false,true);
this._hvrCss=cssClass;
if (convertStringToBoolean(mode)){
if (!this._elmnh){
this.obj._honmousemove=this.obj.onmousemove;
this.obj.onmousemove=this._setRowHover;
if (_isIE)
this.obj.onmouseleave=this._unsetRowHover;
else
this.obj.onmouseout=this._unsetRowHover;
this._elmnh=true;
}
} else {
if (this._elmnh){
this.obj.onmousemove=this.obj._honmousemove;
if (_isIE)
this.obj.onmouseleave=null;
else
this.obj.onmouseout=null;
this._elmnh=false;
}
}
},
//}
/**
* @desc: enable/disable events which fire excell editing, mutual exclusive with enableLightMouseNavigation
* @param: click - true/false - enable/disable editing by single click
* @param: dblclick - true/false - enable/disable editing by double click
* @param: f2Key - enable/disable editing by pressing F2 key
* @type: public
*/
enableEditEvents:function(click, dblclick, f2Key){
this._sclE=convertStringToBoolean(click);
this._dclE=convertStringToBoolean(dblclick);
this._f2kE=convertStringToBoolean(f2Key);
},
//hovering:060402008{
/**
* @desc: enable/disable light mouse navigation mode (row selection with mouse over, editing with single click), mutual exclusive with enableEditEvents
* @param: mode - true/false
* @type: public
*/
enableLightMouseNavigation:function(mode){
if (convertStringToBoolean(mode)){
if (!this._elmn){
this.entBox._onclick=this.entBox.onclick;
this.entBox.onclick=function(){
return true;
};
this.obj._onclick=this.obj.onclick;
this.obj.onclick=function(e){
var c = this.grid.getFirstParentOfType(e ? e.target : event.srcElement, 'TD');
if (!c) return;
this.grid.editStop();
this.grid.doClick(c);
this.grid.editCell();
(e||event).cancelBubble=true;
}
this.obj._onmousemove=this.obj.onmousemove;
this.obj.onmousemove=this._autoMoveSelect;
this._elmn=true;
}
} else {
if (this._elmn){
this.entBox.onclick=this.entBox._onclick;
this.obj.onclick=this.obj._onclick;
this.obj.onmousemove=this.obj._onmousemove;
this._elmn=false;
}
}
},
/**
* @desc: remove hover state on row
* @type: private
*/
_unsetRowHover:function(e, c){
if (c)
that=this;
else
that=this.grid;
if ((that._lahRw)&&(that._lahRw != c)){
for (var i = 0;
i < that._lahRw.childNodes.length;
i++)that._lahRw.childNodes[i].className=that._lahRw.childNodes[i].className.replace(that._hvrCss, "");
that._lahRw=null;
}
},
/**
* @desc: set hover state on row
* @type: private
*/
_setRowHover:function(e){
var c = this.grid.getFirstParentOfType(e ? e.target : event.srcElement, 'TD');
if (c && c.parentNode!=this.grid._lahRw) {
this.grid._unsetRowHover(0, c);
c=c.parentNode;
if (!c.idd || c.idd=="__filler__") return;
for (var i = 0; i < c.childNodes.length; i++)c.childNodes[i].className+=" "+this.grid._hvrCss;
this.grid._lahRw=c;
}
this._honmousemove(e);
},
/**
* @desc: onmousemove, used in light mouse navigaion mode
* @type: private
*/
_autoMoveSelect:function(e){
//this - grid.obj
if (!this.grid.editor){
var c = this.grid.getFirstParentOfType(e ? e.target : event.srcElement, 'TD');
if (c.parentNode.idd)
this.grid.doClick(c, true, 0);
}
this._onmousemove(e);
},
//}
//__pro_feature:21092006{
//distrb_parsing:21092006{
/**
* @desc: enable/disable distributed parsing (rows paresed portion by portion with some timeout)
* @param: mode - true/false
* @param: count - count of nodes parsed by one step (the 10 by default)
* @param: time - time between parsing counts in milli seconds (the 250 by default)
* @type: public
* @edition: Professional
*/
enableDistributedParsing:function(mode, count, time){
if (convertStringToBoolean(mode)){
this._ads_count=count||10;
this._ads_time=time||250;
} else
this._ads_count=0;
},
//}
//}
/**
* @desc: destructor, removes grid and cleans used memory
* @type: public
* @topic: 0
*/
destructor:function(){
this.editStop(true);
//add links to current object
if (this._sizeTime)
this._sizeTime=window.clearTimeout(this._sizeTime);
this.entBox.className=(this.entBox.className||"").replace(/gridbox.*/,"");
if (this.formInputs)
for (var i = 0; i < this.formInputs.length; i++)this.parentForm.removeChild(this.formInputs[i]);
var a;
this.xmlLoader=this.xmlLoader.destructor();
for (var i = 0; i < this.rowsCol.length; i++)
if (this.rowsCol[i])
this.rowsCol[i].grid=null;
for (i in this.rowsAr)
if (this.rowsAr[i])
this.rowsAr[i]=null;
this.rowsCol=new dhtmlxArray();
this.rowsAr={};
this.entBox.innerHTML="";
var dummy=function(){};
this.entBox.onclick = this.entBox.onmousedown = this.entBox.onbeforeactivate = this.entBox.onbeforedeactivate = this.entBox.onbeforedeactivate = this.entBox.onselectstart = dummy;
this.setSizes = this._update_srnd_view = this.callEvent = dummy;
this.entBox.grid=this.objBox.grid=this.hdrBox.grid=this.obj.grid=this.hdr.grid=null;
if (this._fake){
this.globalBox.innerHTML = "";
this._fake.setSizes = this._fake._update_srnd_view = this._fake.callEvent = dummy;
this.globalBox.onclick = this.globalBox.onmousedown = this.globalBox.onbeforeactivate = this.globalBox.onbeforedeactivate = this.globalBox.onbeforedeactivate = this.globalBox.onselectstart = dummy;
}
for (a in this){
if ((this[a])&&(this[a].m_obj))
this[a].m_obj=null;
this[a]=null;
}
if (this == globalActiveDHTMLGridObject)
globalActiveDHTMLGridObject=null;
// self=null;
return null;
},
//sorting:06042008{
/**
* @desc: get sorting state of grid
* @type: public
* @returns: array, first element is index of sortef column, second - direction of sorting ("asc" or "des").
* @topic: 0
*/
getSortingState:function(){
var z = new Array();
if (this.fldSorted){
z[0]=this.fldSorted._cellIndex;
z[1]=(this.sortImg.src.indexOf("sort_desc.gif") != -1) ? "des" : "asc";
}
return z;
},
//}
/**
* @desc: enable autoheight of grid
* @param: mode - true/false
* @param: maxHeight - maximum height before scrolling appears (no limit by default)
* @param: countFullHeight - control the usage of maxHeight parameter - when set to true all grid height included in max height calculation, if false then only data part (no header) of grid included in calcualation (false by default)
* @type: public
* @topic: 0
*/
enableAutoHeight:function(mode, maxHeight, countFullHeight){
this._ahgr=convertStringToBoolean(mode);
this._ahgrF=convertStringToBoolean(countFullHeight);
this._ahgrM=maxHeight||null;
if (arguments.length == 1){
this.objBox.style.overflowY=mode?"hidden":"auto";
}
if (maxHeight == "auto"){
this._ahgrM=null;
this._ahgrMA=true;
this._setAutoResize();
// this._activeResize();
}
},
//sorting:06042008{
enableStableSorting:function(mode){
this._sst=convertStringToBoolean(mode);
this.rowsCol.stablesort=function(cmp){
var size = this.length-1;
for (var i = 0; i < this.length-1; i++){
for (var j = 0; j < size; j++)
if (cmp(this[j], this[j+1]) > 0){
var temp = this[j];
this[j]=this[j+1];
this[j+1]=temp;
}
size--;
}
}
},
//}
/**
* @desc: enable/disable hot keys in grid
* @param: mode - true/false
* @type: public
* @topic: 0
*/
enableKeyboardSupport:function(mode){
this._htkebl=!convertStringToBoolean(mode);
},
//context_menu:06042008{
/**
* @desc: enable/disable context menu
* @param: dhtmlxMenu object, if null - context menu will be disabled
* @type: public
* @topic: 0
*/
enableContextMenu:function(menu){
this._ctmndx=menu;
},
//}
/*backward compatibility*/
setScrollbarWidthCorrection:function(width){
},
//tooltips:06042008{
/**
* @desc: enable/disable tooltips for specified colums
* @param: list - list of true/false values, tooltips enabled for all columns by default
* @type: public
* @topic: 0
*/
enableTooltips:function(list){
this._enbTts=list.split(",");
for (var i = 0; i < this._enbTts.length; i++)this._enbTts[i]=convertStringToBoolean(this._enbTts[i]);
},
//}
//column_resize:06042008{
/**
* @desc: enable/disable resizing for specified colums
* @param: list - list of true/false values, resizing enabled for all columns by default
* @type: public
* @topic: 0
*/
enableResizing:function(list){
this._drsclmn=list.split(",");
for (var i = 0; i < this._drsclmn.length; i++)this._drsclmn[i]=convertStringToBoolean(this._drsclmn[i]);
},
/**
* @desc: set minimum column width ( works only for manual resizing )
* @param: width - minimum column width, can be set for specified column, or as comma separated list for all columns
* @param: ind - column index
* @type: public
* @topic: 0
*/
setColumnMinWidth:function(width, ind){
if (arguments.length == 2){
if (!this._drsclmW)
this._drsclmW=new Array();
this._drsclmW[ind]=width;
} else
this._drsclmW=width.split(",");
},
//}
/**
* @desc: enable/disable unique id for cells (id will be automaticaly created using the following template: "c_[RowId]_[colIndex]")
* @param: mode - true/false - enable/disable
* @type: public
* @topic: 0
*/
enableCellIds:function(mode){
this._enbCid=convertStringToBoolean(mode);
},
//locked_row:11052006{
/**
* @desc: lock/unlock row for editing
* @param: rowId - id of row
* @param: mode - true/false - lock/unlock
* @type: public
* @topic: 0
*/
lockRow:function(rowId, mode){
var z = this.getRowById(rowId);
if (z){
z._locked=convertStringToBoolean(mode);
if ((this.cell)&&(this.cell.parentNode.idd == rowId))
this.editStop();
}
},
//}
/**
* @desc: get values of all cells in row
* @type: private
*/
_getRowArray:function(row){
var text = new Array();
for (var ii = 0; ii < row.childNodes.length; ii++){
var a = this.cells3(row, ii);
text[ii]=a.getValue();
}
return text;
},
//__pro_feature:21092006{
//data_format:12052006{
/**
* @desc: set mask for date formatting in cell
* @param: mask - date mask, d,m,y will mean day,month,year; for example "d/m/y" - 22/05/1985
* @type: public
* @edition: Professional
* @topic: 0
*/
setDateFormat:function(mask,incoming){
this._dtmask=mask;
this._dtmask_inc=incoming;
},
/**
* @desc: set mask for formatting numeric data ( works for [ed/ro]n excell only or oher cell types with suport for this method)
* @param: mask - numeric mask; for example 0,000.00 - 1,234.56
* @param: cInd - column index
* @param: p_sep - char used as decimalseparator ( point by default )
* @param: d_sep - char used as groups part separator ( comma by default )
* @type: public
* @edition: Professional
* @topic: 0
*/
setNumberFormat:function(mask, cInd, p_sep, d_sep){
var nmask = mask.replace(/[^0\,\.]*/g, "");
var pfix = nmask.indexOf(".");
if (pfix > -1)
pfix=nmask.length-pfix-1;
var dfix = nmask.indexOf(",");
if (dfix > -1)
dfix=nmask.length-pfix-2-dfix;
if (typeof p_sep != "string")
p_sep=this.i18n.decimal_separator;
if (typeof d_sep != "string")
d_sep=this.i18n.group_separator;
var pref = mask.split(nmask)[0];
var postf = mask.split(nmask)[1];
this._maskArr[cInd]=[
pfix,
dfix,
pref,
postf,
p_sep,
d_sep
];
},
/**
* @desc: convert formated value to original
* @type: private
*/
_aplNFb:function(data, ind){
var a = this._maskArr[ind];
if (!a)
return data;
var ndata = parseFloat(data.toString().replace(/[^0-9]*/g, ""));
if (data.toString().substr(0, 1) == "-")
ndata=ndata*-1;
if (a[0] > 0)
ndata=ndata / Math.pow(10, a[0]);
return ndata;
},
/**
* @desc: format data with mask
* @type: private
*/
_aplNF:function(data, ind){
var a = this._maskArr[ind];
if (!a)
return data;
var c = (parseFloat(data) < 0 ? "-" : "")+a[2];
data=Math.abs(Math.round(parseFloat(data)*Math.pow(10, a[0] > 0 ? a[0] : 0))).toString();
data=(data.length
< a[0]
? Math.pow(10, a[0]+1-data.length).toString().substr(1, a[0]+1)+data.toString()
: data).split("").reverse();
data[a[0]]=(data[a[0]]||"0")+a[4];
if (a[1] > 0)
for (var j = (a[0] > 0 ? 0 : 1)+a[0]+a[1]; j < data.length; j+=a[1])data[j]+=a[5];
return c+data.reverse().join("")+a[3];
},
//}
//}
//config_from_xml:20092006{
/**
* @desc: configure grid structure from XML
* @type: private
*/
_launchCommands:function(arr){
for (var i = 0; i < arr.length; i++){
var args = new Array();
for (var j = 0; j < arr[i].childNodes.length; j++)
if (arr[i].childNodes[j].nodeType == 1)
args[args.length]=arr[i].childNodes[j].firstChild.data;
this[arr[i].getAttribute("command")].apply(this, args);
}
},
/**
* @desc: configure grid structure from XML
* @type: private
*/
_parseHead:function(xmlDoc){
var hheadCol = this.xmlLoader.doXPath("./head", xmlDoc);
if (hheadCol.length){
var headCol = this.xmlLoader.doXPath("./column", hheadCol[0]);
var asettings = this.xmlLoader.doXPath("./settings", hheadCol[0]);
var awidthmet = "setInitWidths";
var split = false;
if (asettings[0]){
for (var s = 0; s < asettings[0].childNodes.length; s++)switch (asettings[0].childNodes[s].tagName){
case "colwidth":
if (asettings[0].childNodes[s].firstChild&&asettings[0].childNodes[s].firstChild.data == "%")
awidthmet="setInitWidthsP";
break;
case "splitat":
split=(asettings[0].childNodes[s].firstChild ? asettings[0].childNodes[s].firstChild.data : false);
break;
}
}
this._launchCommands(this.xmlLoader.doXPath("./beforeInit/call", hheadCol[0]));
if (headCol.length > 0){
if (this.hdr.rows.length > 0) this.clearAll(true); //drop existing grid here, to prevent loss of initialization parameters
var sets = [
[],
[],
[],
[],
[],
[],
[],
[],
[]
];
var attrs = ["", "width", "type", "align", "sort", "color", "format", "hidden", "id"];
var calls = ["", awidthmet, "setColTypes", "setColAlign", "setColSorting", "setColumnColor", "",
"", "setColumnIds"];
for (var i = 0; i < headCol.length; i++){
for (var j = 1; j < attrs.length; j++)sets[j].push(headCol[i].getAttribute(attrs[j]));
sets[0].push((headCol[i].firstChild
? headCol[i].firstChild.data
: "").replace(/^\s*((\s\S)*.+)\s*$/gi, "$1"));
};
this.setHeader(sets[0]);
for (var i = 0; i < calls.length; i++)
if (calls[i])
this[calls[i]](sets[i].join(this.delim))
for (var i = 0; i < headCol.length; i++){
if ((this.cellType[i].indexOf('co') == 0)||(this.cellType[i] == "clist")){
var optCol = this.xmlLoader.doXPath("./option", headCol[i]);
if (optCol.length){
var resAr = new Array();
if (this.cellType[i] == "clist"){
for (var j = 0;
j < optCol.length;
j++)resAr[resAr.length]=optCol[j].firstChild
? optCol[j].firstChild.data
: "";
this.registerCList(i, resAr);
} else {
var combo = this.getCombo(i);
for (var j = 0;
j < optCol.length;
j++)combo.put(optCol[j].getAttribute("value"),
optCol[j].firstChild
? optCol[j].firstChild.data
: "");
}
}
}
else if (sets[6][i])
if ((this.cellType[i].toLowerCase().indexOf("calendar")!=-1)||(this.fldSort[i] == "date"))
this.setDateFormat(sets[6][i]);
else
this.setNumberFormat(sets[6][i], i);
}
this.init();
var param=sets[7].join(this.delim);
//preserving state of hidden columns, if not specified directly
if (this.setColHidden && param.replace(/,/g,"")!="")
this.setColHidden(param);
if ((split)&&(this.splitAt))
this.splitAt(split);
}
this._launchCommands(this.xmlLoader.doXPath("./afterInit/call", hheadCol[0]));
}
//global(grid) user data
var gudCol = this.xmlLoader.doXPath("//rows/userdata", xmlDoc);
if (gudCol.length > 0){
if (!this.UserData["gridglobaluserdata"])
this.UserData["gridglobaluserdata"]=new Hashtable();
for (var j = 0; j < gudCol.length; j++){
var u_record = "";
for (var xj=0; xj < gudCol[j].childNodes.length; xj++)
u_record += gudCol[j].childNodes[xj].nodeValue;
this.UserData["gridglobaluserdata"].put(gudCol[j].getAttribute("name"),u_record);
}
}
},
//}
/**
* @desc: get list of Ids of all rows with checked exCell in specified column
* @type: public
* @param: col_ind - column index
* @topic: 5
*/
getCheckedRows:function(col_ind){
var d = new Array();
this.forEachRowA(function(id){
if (this.cells(id, col_ind).getValue() != 0)
d.push(id);
},true)
return d.join(",");
},
/**
* @desc: check all checkboxes in grid
* @type: public
* @param: col_ind - column index
* @topic: 5
*/
checkAll:function(){var mode=arguments.length?arguments[0]:1;
for (var cInd=0;cInd= this.grid._cCount)
return;
var ced = this.grid.cells3(r, c._cellIndex);
if (!ced || !ced.cell || !ced.cell._attrs) return; // fix for public release
if (el._title)
ced.cell.title="";
if (!ced.cell._attrs['title'])
el._title=true;
if (ced)
el.title=ced.cell._attrs['title']
||(ced.getTitle
? ced.getTitle()
: (ced.getValue()||"").toString().replace(/<[^>]*>/gi, ""));
return true;
},
//}
/**
* @desc: can be used for setting correction for cell padding, while calculation setSizes
* @type: private
*/
enableCellWidthCorrection:function(size){
if (_isFF)
this._wcorr=parseInt(size);
},
/**
* @desc: gets a list of all row ids in grid
* @param: separator - delimiter to use in list
* @returns: list of all row ids in grid
* @type: public
* @topic: 2,7
*/
getAllRowIds:function(separator){
var ar = [];
for (var i = 0; i < this.rowsBuffer.length; i++)
if (this.rowsBuffer[i])
ar.push(this.rowsBuffer[i].idd);
return ar.join(separator||this.delim)
},
getAllItemIds:function(){
return this.getAllRowIds();
},
//__pro_feature:21092006{
//colspan:20092006{
/**
* @desc: dynamicaly set colspan in row starting from specified column index
* @param: row_id - row id
* @param: col_id - index of column
* @param: colspan - size of colspan
* @type: public
* @edition: Professional
* @topic: 2,9
*/
setColspan:function(row_id, col_ind, colspan){
if (!this._ecspn)
return;
var r = this.getRowById(row_id);
if ((r._childIndexes)&&(r.childNodes[r._childIndexes[col_ind]])){
var j = r._childIndexes[col_ind];
var n = r.childNodes[j];
var m = n.colSpan;
n.colSpan=1;
if ((m)&&(m != 1))
for (var i = 1; i < m; i++){
var c = document.createElement("TD");
if (n.nextSibling)
r.insertBefore(c, n.nextSibling);
else
r.appendChild(c);
r._childIndexes[col_ind+i]=j+i;
c._cellIndex=col_ind+i;
c.style.textAlign=this.cellAlign[i];
c.style.verticalAlign=this.cellVAlign[i];
n=c;
this.cells3(r, col_ind+i).setValue("");
}
for (var z = col_ind*1+1*m; z < r._childIndexes.length; z++){
r._childIndexes[z]+=(m-1)*1;
}
}
if ((colspan)&&(colspan > 1)){
if (r._childIndexes)
var j = r._childIndexes[col_ind];
else {
var j = col_ind;
r._childIndexes=new Array();
for (var z = 0; z < r.childNodes.length; z++)r._childIndexes[z]=z;
}
r.childNodes[j].colSpan=colspan;
for (var z = 1; z < colspan; z++){
r._childIndexes[r.childNodes[j+1]._cellIndex]=j;
r.removeChild(r.childNodes[j+1]);
}
var c1 = r.childNodes[r._childIndexes[col_ind]]._cellIndex;
for (var z = c1*1+1*colspan; z < r._childIndexes.length; z++)r._childIndexes[z]-=(colspan-1);
}
},
//}
//}
/**
* @desc: prevent caching in IE by adding random values to URL string
* @param: mode - enable/disable random values in URLs ( disabled by default )
* @type: public
* @topic: 2,9
*/
preventIECaching:function(mode){
this.no_cashe=convertStringToBoolean(mode);
this.xmlLoader.rSeed=this.no_cashe;
},
enableColumnAutoSize:function(mode){
this._eCAS=convertStringToBoolean(mode);
},
/**
* @desc: called when header was dbllicked
* @type: private
* @topic: 1,2
*/
_onHeaderDblClick:function(e){
var that = this.grid;
var el = that.getFirstParentOfType(_isIE ? event.srcElement : e.target, "TD");
if (!that._eCAS)
return false;
that.adjustColumnSize(el._cellIndexS)
},
/**
* @desc: autosize column to max content size
* @param: cInd - index of column
* @type: public
*/
adjustColumnSize:function(cInd, complex){
if (this._hrrar && this._hrrar[cInd]) return;
this._notresize=true;
var m = 0;
this._setColumnSizeR(cInd, 20);
for (var j = 1; j < this.hdr.rows.length; j++){
var a = this.hdr.rows[j];
a=a.childNodes[(a._childIndexes) ? a._childIndexes[cInd] : cInd];
if ((a)&&((!a.colSpan)||(a.colSpan < 2)) && a._cellIndex==cInd){
if ((a.childNodes[0])&&(a.childNodes[0].className == "hdrcell"))
a=a.childNodes[0];
m=Math.max(m, ((_isFF||_isOpera) ? (a.textContent.length*this.fontWidth) : a.scrollWidth));
}
}
var l = this.obj.rows.length;
for (var i = 1; i < l; i++){
var z = this.obj.rows[i];
if (!this.rowsAr[z.idd]) continue;
if (z._childIndexes&&z._childIndexes[cInd] != cInd || !z.childNodes[cInd])
continue;
if (_isFF||_isOpera||complex)
z=z.childNodes[cInd].textContent.length*this.fontWidth;
else
z=z.childNodes[cInd].scrollWidth;
if (z > m)
m=z;
}
m+=20+(complex||0);
this._setColumnSizeR(cInd, m);
this._notresize=false;
this.setSizes();
},
//header_footer:06042008{
/**
* @desc: remove header line from grid (opposite to attachHeader)
* @param: index - index of row to be removed ( zero based )
* @param: hdr - header object (optional)
* @type: public
*/
detachHeader:function(index, hdr){
hdr=hdr||this.hdr;
var row = hdr.rows[index+1];
if (row)
row.parentNode.removeChild(row);
this.setSizes();
},
/**
* @desc: remove footer line from grid (opposite to attachFooter)
* @param: values - array of header titles
* @type: public
*/
detachFooter:function(index){
this.detachHeader(index, this.ftr);
},
/**
* @desc: attach additional line to header
* @param: values - array of header titles
* @param: style - array of styles, optional
* @param: _type - reserved
* @type: public
*/
attachHeader:function(values, style, _type){
if (typeof (values) == "string")
values=this._eSplit(values);
if (typeof (style) == "string")
style=style.split(this.delim);
_type=_type||"_aHead";
if (this.hdr.rows.length){
if (values)
this._createHRow([
values,
style
], this[(_type == "_aHead") ? "hdr" : "ftr"]);
else if (this[_type])
for (var i = 0; i < this[_type].length; i++)this.attachHeader.apply(this, this[_type][i]);
} else {
if (!this[_type])
this[_type]=new Array();
this[_type][this[_type].length]=[
values,
style,
_type
];
}
},
/**
* @desc:
* @type: private
*/
_createHRow:function(data, parent){
if (!parent){
if (this.entBox.style.position!="absolute")
this.entBox.style.position="relative";
var z = document.createElement("DIV");
z.className="c_ftr".substr(2);
this.entBox.appendChild(z);
var t = document.createElement("TABLE");
t.cellPadding=t.cellSpacing=0;
if (!_isIE){
t.width="100%";
t.style.paddingRight="20px";
}
t.style.marginRight="20px";
t.style.tableLayout="fixed";
z.appendChild(t);
t.appendChild(document.createElement("TBODY"));
this.ftr=parent=t;
var hdrRow = t.insertRow(0);
var thl = ((this.hdrLabels.length <= 1) ? data[0].length : this.hdrLabels.length);
for (var i = 0; i < thl; i++){
hdrRow.appendChild(document.createElement("TH"));
hdrRow.childNodes[i]._cellIndex=i;
}
if (_isIE && _isIE<8)
hdrRow.style.position="absolute";
else
hdrRow.style.height='auto';
}
var st1 = data[1];
var z = document.createElement("TR");
parent.rows[0].parentNode.appendChild(z);
for (var i = 0; i < data[0].length; i++){
if (data[0][i] == "#cspan"){
var pz = z.cells[z.cells.length-1];
pz.colSpan=(pz.colSpan||1)+1;
continue;
}
if ((data[0][i] == "#rspan")&&(parent.rows.length > 1)){
var pind = parent.rows.length-2;
var found = false;
var pz = null;
while (!found){
var pz = parent.rows[pind];
for (var j = 0; j < pz.cells.length; j++)
if (pz.cells[j]._cellIndex == i){
found=j+1;
break;
}
pind--;
}
pz=pz.cells[found-1];
pz.rowSpan=(pz.rowSpan||1)+1;
continue;
// data[0][i]="";
}
var w = document.createElement("TD");
w._cellIndex=w._cellIndexS=i;
if (this._hrrar && this._hrrar[i] && !_isIE)
w.style.display='none';
if (typeof data[0][i] == "object")
w.appendChild(data[0][i]);
else {
if (this.forceDivInHeader)
w.innerHTML="
"+(data[0][i]||" ")+"
";
else
w.innerHTML=(data[0][i]||" ");
if ((data[0][i]||"").indexOf("#") != -1){
var t = data[0][i].match(/(^|{)#([^}]+)(}|$)/);
if (t){
var tn = "_in_header_"+t[2];
if (this[tn])
this[tn]((this.forceDivInHeader ? w.firstChild : w), i, data[0][i].split(t[0]));
}
}
}
if (st1)
w.style.cssText=st1[i];
z.appendChild(w);
}
var self = parent;
if (_isKHTML){
if (parent._kTimer)
window.clearTimeout(parent._kTimer);
parent._kTimer=window.setTimeout(function(){
parent.rows[1].style.display='none';
window.setTimeout(function(){
parent.rows[1].style.display='';
}, 1);
}, 500);
}
},
//__pro_feature:21092006{
/**
* @desc: attach additional line to footer
* @param: values - array of header titles
* @param: style - array of styles, optional
* @edition: Professional
* @type: public
*/
attachFooter:function(values, style){
this.attachHeader(values, style, "_aFoot");
},
//}
//}
//__pro_feature:21092006{
//dyn_cell_types:04062008{
/**
* @desc: set excell type for cell in question
* @param: rowId - row ID
* @param: cellIndex - cell index
* @param: type - type of excell (code like "ed", "txt", "ch" etc.)
* @edition: Professional
* @type: public
*/
setCellExcellType:function(rowId, cellIndex, type){
this.changeCellType(this.getRowById(rowId), cellIndex, type);
},
/**
* @desc:
* @type: private
*/
changeCellType:function(r, ind, type){
type=type||this.cellType[ind];
var z = this.cells3(r, ind);
var v = z.getValue();
z.cell._cellType=type;
var z = this.cells3(r, ind);
z.setValue(v);
},
/**
* @desc: set excell type for all cells in specified row
* @param: rowId - row ID
* @param: type - type of excell
* @edition: Professional
* @type: public
*/
setRowExcellType:function(rowId, type){
var z = this.rowsAr[rowId];
for (var i = 0; i < z.childNodes.length; i++)this.changeCellType(z, i, type);
},
/**
* @desc: set excell type for all cells in specified column
* @param: colIndex - column index
* @param: type - type of excell
* @edition: Professional
* @type: public
*/
setColumnExcellType:function(colIndex, type){
for (var i = 0; i < this.rowsBuffer.length; i++)
if (this.rowsBuffer[i] && this.rowsBuffer[i].tagName=="TR")
this.changeCellType(this.rowsBuffer[i], colIndex, type);
if (this.cellType[colIndex]=="math")
this._strangeParams[i]=type;
else
this.cellType[colIndex]=type;
},
//}
//}
/**
* @desc: execute code for each row in a grid
* @param: custom_code - function which get row id as incomming argument
* @type: public
*/
forEachRow:function(custom_code){
for (var a in this.rowsAr)
if (this.rowsAr[a]&&this.rowsAr[a].idd)
custom_code.apply(this, [this.rowsAr[a].idd]);
},
forEachRowA:function(custom_code){
for (var a =0; a b.c ? 1 : -1);
});
for (var i = 0; i < max; i++)
if (!t[i+1]||( typeof t[i].c == "undefined"))
this._tabOrder[t[i].ind]=(t[0].ind+1)*-1;
else
this._tabOrder[t[i].ind]=t[i+1].ind;
},
i18n:{
loading: "Loading",
decimal_separator:".",
group_separator:","
},
//key_ctrl_shift
_key_events:{
k13_1_0: function(){
var rowInd = this.rowsCol._dhx_find(this.row)
this.selectCell(this.rowsCol[rowInd+1], this.cell._cellIndex, true);
},
k13_0_1: function(){
var rowInd = this.rowsCol._dhx_find(this.row)
this.selectCell(this.rowsCol[rowInd-1], this.cell._cellIndex, true);
},
k13_0_0: function(){
this.editStop();
this.callEvent("onEnter", [
(this.row ? this.row.idd : null),
(this.cell ? this.cell._cellIndex : null)
]);
this._still_active=true;
},
k9_0_0: function(){
this.editStop();
if (!this.callEvent("onTab",[true])) return true;
var z = this._getNextCell(null, 1);
if (z){
this.selectCell(z.parentNode, z._cellIndex, (this.row != z.parentNode), false, true);
this._still_active=true;
}
},
k9_0_1: function(){
this.editStop();
if (!this.callEvent("onTab",[false])) return false;
var z = this._getNextCell(null, -1);
if (z){
this.selectCell(z.parentNode, z._cellIndex, (this.row != z.parentNode), false, true);
this._still_active=true;
}
},
k113_0_0: function(){
if (this._f2kE)
this.editCell();
},
k32_0_0: function(){
var c = this.cells4(this.cell);
if (!c.changeState||(c.changeState() === false))
return false;
},
k27_0_0: function(){
this.editStop(true);
},
k33_0_0: function(){
if (this.pagingOn)
this.changePage(this.currentPage-1);
else
this.scrollPage(-1);
},
k34_0_0: function(){
if (this.pagingOn)
this.changePage(this.currentPage+1);
else
this.scrollPage(1);
},
k37_0_0: function(){
if (!this.editor&&this.isTreeGrid())
this.collapseKids(this.row)
else
return false;
},
k39_0_0: function(){
if (!this.editor&&this.isTreeGrid())
this.expandKids(this.row)
else
return false;
},
k40_0_0: function(){
var master = this._realfake?this._fake:this;
if (this.editor&&this.editor.combo)
this.editor.shiftNext();
else {
if (!this.row.idd) return;
var rowInd = Math.max((master._r_select||0),this.getRowIndex(this.row.idd))+1;
if (this.rowsBuffer[rowInd]){
master._r_select=null;
this.selectCell(rowInd, this.cell._cellIndex, true);
if (master.pagingOn) master.showRow(master.getRowId(rowInd));
} else {
if (!this.callEvent("onLastRow", [])) return false;
this._key_events.k34_0_0.apply(this, []);
if (this.pagingOn && this.rowsCol[rowInd])
this.selectCell(rowInd, 0, true);
}
}
this._still_active=true;
},
k38_0_0: function(){
var master = this._realfake?this._fake:this;
if (this.editor&&this.editor.combo)
this.editor.shiftPrev();
else {
if (!this.row.idd) return;
var rowInd = this.getRowIndex(this.row.idd)+1;
if (rowInd != -1 && (!this.pagingOn || (rowInd!=1))){
var nrow = this._nextRow(rowInd-1, -1);
this.selectCell(nrow, this.cell._cellIndex, true);
if (master.pagingOn && nrow) master.showRow(nrow.idd);
} else {
this._key_events.k33_0_0.apply(this, []);
/*
if (this.pagingOn && this.rowsCol[this.rowsBufferOutSize-1])
this.selectCell(this.rowsBufferOutSize-1, 0, true);
*/
}
}
this._still_active=true;
}
},
//(c)dhtmlx ltd. www.dhtmlx.com
_build_master_row:function(){
var t = document.createElement("DIV");
var html = ["
"];
for (var i = 0; i < this._cCount; i++)html.push("
");
html.push("
");
t.innerHTML=html.join("");
this._master_row=t.firstChild.rows[0];
},
_prepareRow:function(new_id){ /*TODO: hidden columns */
if (!this._master_row)
this._build_master_row();
var r = this._master_row.cloneNode(true);
for (var i = 0; i < r.childNodes.length; i++){
r.childNodes[i]._cellIndex=i;
if (this._enbCid) r.childNodes[i].id="c_"+new_id+"_"+i;
if (this.dragAndDropOff)
this.dragger.addDraggableItem(r.childNodes[i], this);
}
r.idd=new_id;
r.grid=this;
return r;
},
//non_xml_data:06042008{
_process_jsarray_row:function(r, data){
r._attrs={
};
for (var j = 0; j < r.childNodes.length; j++)r.childNodes[j]._attrs={
};
this._fillRow(r, (this._c_order ? this._swapColumns(data) : data));
return r;
},
_get_jsarray_data:function(data, ind){
return data[ind];
},
_process_json_row:function(r, data){
data = this._c_order ? this._swapColumns(data.data) : data.data;
return this._process_some_row(r, data);
},
_process_some_row:function(r,data){
r._attrs={};
for (var j = 0; j < r.childNodes.length; j++)
r.childNodes[j]._attrs={};
this._fillRow(r, data);
return r;
},
_get_json_data:function(data, ind){
return data.data[ind];
},
_process_js_row:function(r, data){
var arr = [];
for (var i=0; i= 0; i--){
var u_record = "";
for (var j=0; j < udCol[i].childNodes.length; j++)
u_record += udCol[i].childNodes[j].nodeValue;
this.setUserData(r.idd,udCol[i].getAttribute("name"), u_record);
}
}
//load cell data
for (var j = 0; j < cellsCol.length; j++){
var cellVal = cellsCol[this._c_order?this._c_order[j]:j];
if (!cellVal) continue;
var cind = r._childIndexes?r._childIndexes[j]:j;
var exc = cellVal.getAttribute("type");
if (r.childNodes[cind]){
if (exc)
r.childNodes[cind]._cellType=exc;
r.childNodes[cind]._attrs=this._xml_attrs(cellVal);
}
if (!cellVal.getAttribute("xmlcontent")){
if (cellVal.firstChild)
cellVal=cellVal.firstChild.data;
else
cellVal="";
}
strAr.push(cellVal);
}
for (j < cellsCol.length; j < r.childNodes.length; j++)r.childNodes[j]._attrs={
};
//treegrid
if (r.parentNode&&r.parentNode.tagName == "row")
r._attrs["parent"]=r.parentNode.getAttribute("idd");
//back to common code
this._fillRow(r, strAr);
return r;
},
_get_xml_data:function(data, ind){
data=data.firstChild;
while (true){
if (!data)
return "";
if (data.tagName == "cell")
ind--;
if (ind < 0)
break;
data=data.nextSibling;
}
return (data.firstChild ? data.firstChild.data : "");
},
//}
_fillRow:function(r, text){
if (this.editor)
this.editStop();
for (var i = 0; i < r.childNodes.length; i++){
if ((i < text.length)||(this.defVal[i])){
var ii=r.childNodes[i]._cellIndex;
var val = text[ii];
var aeditor = this.cells4(r.childNodes[i]);
if ((this.defVal[ii])&&((val == "")||( typeof (val) == "undefined")))
val=this.defVal[ii];
if (aeditor) aeditor.setValue(val)
} else {
r.childNodes[i].innerHTML=" ";
r.childNodes[i]._clearCell=true;
}
}
return r;
},
_postRowProcessing:function(r,donly){
if (r._attrs["class"])
r._css=r.className=r._attrs["class"];
if (r._attrs.locked)
r._locked=true;
if (r._attrs.bgColor)
r.bgColor=r._attrs.bgColor;
var cor=0;
for (var i = 0; i < r.childNodes.length; i++){
var c=r.childNodes[i];
var ii=c._cellIndex;
//style attribute
var s = c._attrs.style||r._attrs.style;
if (s)
c.style.cssText+=";"+s;
if (c._attrs["class"])
c.className=c._attrs["class"];
s=c._attrs.align||this.cellAlign[ii];
if (s)
c.align=s;
c.vAlign=c._attrs.valign||this.cellVAlign[ii];
var color = c._attrs.bgColor||this.columnColor[ii];
if (color)
c.bgColor=color;
if (c._attrs["colspan"] && !donly){
this.setColspan(r.idd, i+cor, c._attrs["colspan"]);
//i+=(c._attrs["colspan"]-1);
cor+=(c._attrs["colspan"]-1);
}
if (this._hrrar&&this._hrrar[ii]&&!donly){
c.style.display="none";
}
};
this.callEvent("onRowCreated", [
r.idd,
r,
null
]);
},
/**
* @desc: load data from external file ( xml, json, jsarray, csv )
* @param: url - url to external file
* @param: call - after loading callback function, optional, can be ommited
* @param: type - type of data (xml,csv,json,jsarray) , optional, xml by default
* @type: public
*/
load:function(url, call, type){
this.callEvent("onXLS", [this]);
if (arguments.length == 2 && typeof call != "function"){
type=call;
call=null;
}
type=type||"xml";
if (!this.xmlFileUrl)
this.xmlFileUrl=url;
this._data_type=type;
this.xmlLoader.onloadAction=function(that, b, c, d, xml){
if (!that.callEvent) return;
xml=that["_process_"+type](xml);
if (!that._contextCallTimer)
that.callEvent("onXLE", [that,0,0,xml]);
if (call){
call();
call=null;
}
}
this.xmlLoader.loadXML(url);
},
//__pro_feature:21092006{
loadXMLString:function(str, afterCall){
var t = new dtmlXMLLoaderObject(function(){
});
t.loadXMLString(str);
this.parse(t, afterCall, "xml")
},
//}
loadXML:function(url, afterCall){
this.load(url, afterCall, "xml")
},
/**
* @desc: load data from local datasource ( xml string, csv string, xml island, xml object, json objecs , javascript array )
* @param: data - string or object
* @param: type - data type (xml,json,jsarray,csv), optional, data threated as xml by default
* @type: public
*/
parse:function(data, call, type){
if (arguments.length == 2 && typeof call != "function"){
type=call;
call=null;
}
type=type||"xml";
this._data_type=type;
data=this["_process_"+type](data);
if (!this._contextCallTimer)
this.callEvent("onXLE", [this,0,0,data]);
if (call)
call();
},
xml:{
top: "rows",
row: "./row",
cell: "./cell",
s_row: "row",
s_cell: "cell",
row_attrs: [],
cell_attrs: []
},
csv:{
row: "\n",
cell: ","
},
_xml_attrs:function(node){
var data = {
};
if (node.attributes.length){
for (var i = 0; i < node.attributes.length; i++)data[node.attributes[i].name]=node.attributes[i].value;
}
return data;
},
//xml_data:06042008{
_process_xml:function(xml){
if (!xml.doXPath){
var t = new dtmlXMLLoaderObject(function(){});
if (typeof xml == "string")
t.loadXMLString(xml);
else {
if (xml.responseXML)
t.xmlDoc=xml;
else
t.xmlDoc={};
t.xmlDoc.responseXML=xml;
}
xml=t;
}
if (this._refresh_mode) return this._refreshFromXML(xml);
this._parsing=true;
var top = xml.getXMLTopNode(this.xml.top)
if (top.tagName!=this.xml.top) return;
//config_from_xml:20092006{
this._parseHead(top);
//}
var rows = xml.doXPath(this.xml.row, top)
var cr = parseInt(xml.doXPath("//"+this.xml.top)[0].getAttribute("pos")||0);
var total = parseInt(xml.doXPath("//"+this.xml.top)[0].getAttribute("total_count")||0);
var reset = false;
if (total && total!=this.rowsBuffer.length){
if (!this.rowsBuffer[total-1]){
if (this.rowsBuffer.length)
reset=true;
this.rowsBuffer[total-1]=null;
}
if (total 4)
type=window[type];
if (type == 'cus'){
var cstr=this._customSorts[col];
s[sort](function(a, b){
return cstr(arrTS[a.idd], arrTS[b.idd], order, a.idd, b.idd);
});
}
else if (typeof (type) == 'function'){
s[sort](function(a, b){
return type(arrTS[a.idd], arrTS[b.idd], order, a.idd, b.idd);
});
}
else
//}
//}
if (type == 'str'){
s[sort](function(a, b){
if (order == "asc")
return arrTS[a.idd] > arrTS[b.idd] ? 1 : -1
else
return arrTS[a.idd] < arrTS[b.idd] ? 1 : -1
});
}
else if (type == 'int'){
s[sort](function(a, b){
var aVal = parseFloat(arrTS[a.idd]);
aVal=isNaN(aVal) ? -99999999999999 : aVal;
var bVal = parseFloat(arrTS[b.idd]);
bVal=isNaN(bVal) ? -99999999999999 : bVal;
if (order == "asc")
return aVal-bVal;
else
return bVal-aVal;
});
}
else if (type == 'date'){
s[sort](function(a, b){
var aVal = Date.parse(arrTS[a.idd])||(Date.parse("01/01/1900"));
var bVal = Date.parse(arrTS[b.idd])||(Date.parse("01/01/1900"));
if (order == "asc")
return aVal-bVal
else
return bVal-aVal
});
}
},
/**
* @desc: inner sorting routine
* @type: private
* @topic: 7
*/
_sortRows:function(col, type, order, arrTS){
this._sortCore(col, type, order, arrTS, this.rowsBuffer);
this._reset_view();
this.callEvent("onGridReconstructed", []);
},
//}
_reset_view:function(skip){
if (!this.obj.rows[0]) return;
this.callEvent("onResetView",[]);
var tb = this.obj.rows[0].parentNode;
var tr = tb.removeChild(tb.childNodes[0], true)
if (_isKHTML) //Safari 2x
for (var i = tb.parentNode.childNodes.length-1; i >= 0; i--) { if (tb.parentNode.childNodes[i].tagName=="TR") tb.parentNode.removeChild(tb.parentNode.childNodes[i],true); }
else if (_isIE)
for (var i = tb.childNodes.length-1; i >= 0; i--) tb.childNodes[i].removeNode(true);
else
tb.innerHTML="";
tb.appendChild(tr)
this.rowsCol=dhtmlxArray();
if (this._sst)
this.enableStableSorting(true);
this._fillers=this.undefined;
if (!skip){
if (_isIE && this._srnd){
// var p=this._get_view_size;
// this._get_view_size=function(){ return 1; }
this.render_dataset();
// this._get_view_size=p;
}
else
this.render_dataset();
}
},
/**
* @desc: delete row from the grid
* @param: row_id - row ID
* @type: public
*/
deleteRow:function(row_id, node){
if (!node)
node=this.getRowById(row_id)
if (!node)
return;
this.editStop();
if (!this._realfake)
if (this.callEvent("onBeforeRowDeleted", [row_id]) == false)
return false;
var pid=0;
if (this.cellType._dhx_find("tree") != -1 && !this._realfake){
pid=this._h2.get[row_id].parent.id;
this._removeTrGrRow(node);
}
else {
if (node.parentNode)
node.parentNode.removeChild(node);
var ind = this.rowsCol._dhx_find(node);
if (ind != -1)
this.rowsCol._dhx_removeAt(ind);
for (var i = 0; i < this.rowsBuffer.length; i++)
if (this.rowsBuffer[i]&&this.rowsBuffer[i].idd == row_id){
this.rowsBuffer._dhx_removeAt(i);
ind=i;
break;
}
}
this.rowsAr[row_id]=null;
for (var i = 0; i < this.selectedRows.length; i++)
if (this.selectedRows[i].idd == row_id)
this.selectedRows._dhx_removeAt(i);
if (this._srnd){
for (var i = 0; i < this._fillers.length; i++){
var f = this._fillers[i]
if (!f) continue; //can be null
if (f[0] >= ind)
f[0]=f[0]-1;
else if (f[1] >= ind)
f[1]=f[1]-1;
};
this._update_srnd_view();
}
if (this.pagingOn)
this.changePage();
if (!this._realfake) this.callEvent("onAfterRowDeleted", [row_id,pid]);
this.callEvent("onGridReconstructed", []);
if (this._ahgr) this.setSizes();
return true;
},
_addRow:function(new_id, text, ind){
if (ind == -1|| typeof ind == "undefined")
ind=this.rowsBuffer.length;
if (typeof text == "string") text=text.split(this.delim);
var row = this._prepareRow(new_id);
row._attrs={
};
for (var j = 0; j < row.childNodes.length; j++)row.childNodes[j]._attrs={
};
this.rowsAr[row.idd]=row;
if (this._h2) this._h2.get[row.idd].buff=row; //treegrid specific
this._fillRow(row, text)
this._postRowProcessing(row)
if (this._skipInsert){
this._skipInsert=false;
return this.rowsAr[row.idd]=row;
}
if (this.pagingOn){
this.rowsBuffer._dhx_insertAt(ind,row);
this.rowsAr[row.idd]=row;
return row;
}
if (this._fillers){
this.rowsCol._dhx_insertAt(ind, null);
this.rowsBuffer._dhx_insertAt(ind,row);
if (this._fake) this._fake.rowsCol._dhx_insertAt(ind, null);
this.rowsAr[row.idd]=row;
var found = false;
for (var i = 0; i < this._fillers.length; i++){
var f = this._fillers[i];
if (f&&f[0] <= ind&&(f[0]+f[1]) >= ind){
f[1]=f[1]+1;
f[2].firstChild.style.height=parseInt(f[2].firstChild.style.height)+this._srdh+"px";
found=true;
if (this._fake) this._fake._fillers[i][1]++;
}
if (f&&f[0] > ind){
f[0]=f[0]+1
if (this._fake) this._fake._fillers[i][0]++;
}
}
if (!found)
this._fillers.push(this._add_filler(ind, 1, (ind == 0 ? {
parentNode: this.obj.rows[0].parentNode,
nextSibling: (this.rowsCol[1])
} : this.rowsCol[ind-1]), true));
return row;
}
this.rowsBuffer._dhx_insertAt(ind,row);
return this._insertRowAt(row, ind);
},
/**
* @desc: add row to the grid
* @param: new_id - row ID, must be unique
* @param: text - row values, may be a comma separated list or an array
* @param: ind - index of new row, optional, row added to the last position by default
* @type: public
*/
addRow:function(new_id, text, ind){
var r = this._addRow(new_id, text, ind);
if (!this.dragContext)
this.callEvent("onRowAdded", [new_id]);
if (this.pagingOn)
this.changePage(this.currentPage)
if (this._srnd)
this._update_srnd_view();
r._added=true;
if (this._ahgr)
this.setSizes();
this.callEvent("onGridReconstructed", []);
return r;
},
_insertRowAt:function(r, ind, skip){
this.rowsAr[r.idd]=r;
if (this._skipInsert){
this._skipInsert=false;
return r;
}
if ((ind < 0)||((!ind)&&(parseInt(ind) !== 0)))
ind=this.rowsCol.length;
else {
if (ind > this.rowsCol.length)
ind=this.rowsCol.length;
}
if (this._cssEven){
if ((this._cssSP ? this.getLevel(r.idd) : ind)%2 == 1)
r.className+=" "+this._cssUnEven+(this._cssSU ? (" "+this._cssUnEven+"_"+this.getLevel(r.idd)) : "");
else
r.className+=" "+this._cssEven+(this._cssSU ? (" "+this._cssEven+"_"+this.getLevel(r.idd)) : "");
}
/*
if (r._skipInsert) {
this.rowsAr[r.idd] = r;
return r;
}*/
if (!skip)
if ((ind == (this.obj.rows.length-1))||(!this.rowsCol[ind]))
if (_isKHTML)
this.obj.appendChild(r);
else {
this.obj.firstChild.appendChild(r);
}
else {
this.rowsCol[ind].parentNode.insertBefore(r, this.rowsCol[ind]);
}
this.rowsCol._dhx_insertAt(ind, r);
this.callEvent("onRowInserted",[r, ind]);
return r;
},
getRowById:function(id){
var row = this.rowsAr[id];
if (row){
if (row.tagName != "TR"){
for (var i = 0; i < this.rowsBuffer.length; i++)
if (this.rowsBuffer[i] && this.rowsBuffer[i].idd == id)
return this.render_row(i);
if (this._h2) return this.render_row(null,row.idd);
}
return row;
}
return null;
},
/**
* @desc: gets dhtmlXGridCellObject object (if no arguments then gets dhtmlXGridCellObject object of currently selected cell)
* @param: row_id - row id
* @param: col - column index
* @returns: dhtmlXGridCellObject object (see its methods below)
* @type: public
* @topic: 4
*/
cellById:function(row_id, col){
return this.cells(row_id, col);
},
/**
* @desc: gets dhtmlXGridCellObject object (if no arguments then gets dhtmlXGridCellObject object of currently selected cell)
* @param: row_id - row id
* @param: col - column index
* @returns: dhtmlXGridCellObject object (use it to get/set value to cell etc.)
* @type: public
* @topic: 4
*/
cells:function(row_id, col){
if (arguments.length == 0)
return this.cells4(this.cell);
else
var c = this.getRowById(row_id);
var cell = (c._childIndexes ? c.childNodes[c._childIndexes[col]] : c.childNodes[col]);
return this.cells4(cell);
},
/**
* @desc: gets dhtmlXGridCellObject object
* @param: row_index - row index
* @param: col - column index
* @returns: dhtmlXGridCellObject object (see its methods below)
* @type: public
* @topic: 4
*/
cellByIndex:function(row_index, col){
return this.cells2(row_index, col);
},
/**
* @desc: gets dhtmlXGridCellObject object
* @param: row_index - row index
* @param: col - column index
* @returns: dhtmlXGridCellObject object (see its methods below)
* @type: public
* @topic: 4
*/
cells2:function(row_index, col){
var c = this.render_row(row_index);
var cell = (c._childIndexes ? c.childNodes[c._childIndexes[col]] : c.childNodes[col]);
return this.cells4(cell);
},
/**
* @desc: gets exCell editor for row object and column id
* @type: private
* @topic: 4
*/
cells3:function(row, col){
var cell = (row._childIndexes ? row.childNodes[row._childIndexes[col]] : row.childNodes[col]);
return this.cells4(cell);
},
/**
* @desc: gets exCell editor for cell object
* @type: private
* @topic: 4
*/
cells4:function(cell){
var type = window["eXcell_"+(cell._cellType||this.cellType[cell._cellIndex])];
if (type)
return new type(cell);
},
cells5:function(cell, type){
var type = type||(cell._cellType||this.cellType[cell._cellIndex]);
if (!this._ecache[type]){
if (!window["eXcell_"+type])
var tex = eXcell_ro;
else
var tex = window["eXcell_"+type];
this._ecache[type]=new tex(cell);
}
this._ecache[type].cell=cell;
return this._ecache[type];
},
dma:function(mode){
if (!this._ecache)
this._ecache={
};
if (mode&&!this._dma){
this._dma=this.cells4;
this.cells4=this.cells5;
} else if (!mode&&this._dma){
this.cells4=this._dma;
this._dma=null;
}
},
/**
* @desc: returns count of row in grid ( in case of dynamic mode it will return expected count of rows )
* @type: public
* @returns: count of rows in grid
*/
getRowsNum:function(){
return this.rowsBuffer.length;
},
/**
* @desc: enables/disables mode when readonly cell is not available with tab
* @param: mode - (boolean) true/false
* @type: public
*/
enableEditTabOnly:function(mode){
if (arguments.length > 0)
this.smartTabOrder=convertStringToBoolean(mode);
else
this.smartTabOrder=true;
},
/**
* @desc: sets elements which get focus when tab is pressed in the last or first (tab+shift) cell
* @param: start - html object or its id - gets focus when tab+shift are pressed in the first cell
* @param: end - html object or its id - gets focus when tab is pressed in the last cell
* @type: public
*/
setExternalTabOrder:function(start, end){
var grid = this;
this.tabStart=( typeof (start) == "object") ? start : document.getElementById(start);
this.tabStart.onkeydown=function(e){
var ev = (e||window.event);
if (ev.keyCode == 9){
ev.cancelBubble=true;
grid.selectCell(0, 0, 0, 0, 1);
if (grid.smartTabOrder && grid.cells2(0, 0).isDisabled()){
grid._key_events["k9_0_0"].call(grid);
}
this.blur();
return false;
}
};
if(_isOpera) this.tabStart.onkeypress = this.tabStart.onkeydown;
this.tabEnd=( typeof (end) == "object") ? end : document.getElementById(end);
this.tabEnd.onkeydown=this.tabEnd.onkeypress=function(e){
var ev = (e||window.event);
if ((ev.keyCode == 9)&&ev.shiftKey){
ev.cancelBubble=true;
grid.selectCell((grid.getRowsNum()-1), (grid.getColumnCount()-1), 0, 0, 1);
if (grid.smartTabOrder && grid.cells2((grid.getRowsNum()-1), (grid.getColumnCount()-1)).isDisabled()){
grid._key_events["k9_0_1"].call(grid);
}
this.blur();
return false;
}
};
if(_isOpera) this.tabEnd.onkeypress = this.tabEnd.onkeydown;
},
/**
* @desc: returns unique ID
* @type: public
*/
uid:function(){
if (!this._ui_seed) this._ui_seed=(new Date()).valueOf();
return this._ui_seed++;
},
/**
* @desc: clears existing grid state and load new XML
* @type: public
*/
clearAndLoad:function(){
var t=this._pgn_skin; this._pgn_skin=null;
this.clearAll();
this._pgn_skin=t;
this.load.apply(this,arguments);
},
/**
* @desc: returns details about current grid state
* @type: public
*/
getStateOfView:function(){
if (this.pagingOn){
var start = (this.currentPage-1)*this.rowsBufferOutSize;
return [this.currentPage, start, Math.min(start+this.rowsBufferOutSize,this.rowsBuffer.length), this.rowsBuffer.length ];
}
return [
Math.floor(this.objBox.scrollTop/this._srdh),
Math.ceil(parseInt(this.objBox.offsetHeight)/this._srdh),
this.rowsBuffer.length
];
}
};
//grid
(function(){
//local helpers
function direct_set(name,value){ this[name]=value; }
function direct_call(name,value){ this[name].call(this,value); }
function joined_call(name,value){ this[name].call(this,value.join(this.delim)); }
function set_options(name,value){
for (var i=0; i < value.length; i++)
if (typeof value[i] == "object"){
var combo = this.getCombo(i);
for (var key in value[i])
combo.put(key, value[i][key]);
}
}
function header_set(name,value,obj){
//make a matrix
var rows = 1;
var header = [];
function add(i,j,value){
if (!header[j]) header[j]=[];
if (typeof value == "object") value.toString=function(){ return this.text; }
header[j][i]=value;
}
for (var i=0; i4?diffX-4:0) + 'px';
this._selectionObj.style.height = (diffY>4?diffY-4:0) + 'px';
/* AUTO SCROLL */
var BottomRightX = this.objBox.scrollLeft + this.objBox.clientWidth;
var BottomRightY = this.objBox.scrollTop + this.objBox.clientHeight;
var TopLeftX = this.objBox.scrollLeft;
var TopLeftY = this.objBox.scrollTop;
var nextCall=false;
if (this._blsTimer) window.clearTimeout(this._blsTimer);
if (X+20 >= BottomRightX) {
this.objBox.scrollLeft = this.objBox.scrollLeft+20;
nextCall=true;
} else if (X-20 < TopLeftX) {
this.objBox.scrollLeft = this.objBox.scrollLeft-20;
nextCall=true;
}
if (Y+20 >= BottomRightY && !this._realfake) {
this.objBox.scrollTop = this.objBox.scrollTop+20;
nextCall=true;
} else if (Y-20 < TopLeftY && !this._realfake) {
this.objBox.scrollTop = this.objBox.scrollTop-20;
nextCall=true;
}
this._selectionArea = this._RedrawSelectionPos(this._startSelectionCell, this._endSelectionCell);
if (nextCall){
var a=event.clientX;
var b=event.clientY;
this._blsTimer=window.setTimeout(function(){self._OnSelectionMove({clientX:a,clientY:b})},100);
}
}
dhtmlXGridObject.prototype._OnSelectionStop = function(event)
{
var self = this;
if (this._blsTimer) window.clearTimeout(this._blsTimer);
this.obj.onmousedown = function(e) {if (self._bs_mode) self._OnSelectionStart((e||event), this); return true;}
this.obj.onmousemove = this.obj.onmmold||null;
this._selectionObj.onmousemove = null;
document.body.onmouseup = this._oldDMP||null;
if ( parseInt( this._selectionObj.style.width ) < 2 && parseInt( this._selectionObj.style.height ) < 2) {
this._HideSelection();
} else {
var src = this.getFirstParentOfType(event.srcElement || event.target,"TD");
if ((!src) || (!src.parentNode.idd)){
src=this._endSelectionCell;
}
if (!src) return this._HideSelection();
while (src.tagName.toLowerCase() != 'td')
src = src.parentNode;
this._stopSelectionCell = src;
this._selectionArea = this._RedrawSelectionPos(this._startSelectionCell, this._stopSelectionCell);
this.callEvent("onBlockSelected",[]);
}
document.body.onselectstart = function(){};//avoid text select
}
dhtmlXGridObject.prototype._RedrawSelectionPos = function(LeftTop, RightBottom)
{
// td._cellIndex
//
// getRowIndex
var pos = {};
pos.LeftTopCol = LeftTop._cellIndex;
pos.LeftTopRow = this.getRowIndex( LeftTop.parentNode.idd );
pos.RightBottomCol = RightBottom._cellIndex;
pos.RightBottomRow = this.getRowIndex( RightBottom.parentNode.idd );
var LeftTop_width = LeftTop.offsetWidth;
var LeftTop_height = LeftTop.offsetHeight;
LeftTop = this.getPosition(LeftTop, this.obj);
var RightBottom_width = RightBottom.offsetWidth;
var RightBottom_height = RightBottom.offsetHeight;
RightBottom = this.getPosition(RightBottom, this.obj);
if (LeftTop[0] < RightBottom[0]) {
var Left = LeftTop[0];
var Right = RightBottom[0] + RightBottom_width;
} else {
var foo = pos.RightBottomCol;
pos.RightBottomCol = pos.LeftTopCol;
pos.LeftTopCol = foo;
var Left = RightBottom[0];
var Right = LeftTop[0] + LeftTop_width;
}
if (LeftTop[1] < RightBottom[1]) {
var Top = LeftTop[1];
var Bottom = RightBottom[1] + RightBottom_height;
} else {
var foo = pos.RightBottomRow;
pos.RightBottomRow = pos.LeftTopRow;
pos.LeftTopRow = foo;
var Top = RightBottom[1];
var Bottom = LeftTop[1] + LeftTop_height;
}
var Width = Right - Left;
var Height = Bottom - Top;
this._selectionObj.style.left = Left + 'px';
this._selectionObj.style.top = Top + 'px';
this._selectionObj.style.width = Width + 'px';
this._selectionObj.style.height = Height + 'px';
return pos;
}
dhtmlXGridObject.prototype._CreateSelection = function(x, y)
{
if (this._selectionObj == null) {
var div = document.createElement('div');
div.style.position = 'absolute';
div.style.display = 'none';
div.className = 'dhtmlxGrid_selection';
this._selectionObj = div;
this._selectionObj.onmousedown = function(e){
e=e||event;
if (e.button==2 || (_isMacOS&&e.ctrlKey))
return this.parentNode.grid.callEvent("onBlockRightClick", ["BLOCK",e]);
}
this._selectionObj.oncontextmenu=function(e){(e||event).cancelBubble=true;return false;}
this.objBox.appendChild(this._selectionObj);
}
//this._selectionObj.style.border = '1px solid #83abeb';
this._selectionObj.style.width = '0px';
this._selectionObj.style.height = '0px';
//this._selectionObj.style.border = '0px';
this._selectionObj.style.left = x + 'px';
this._selectionObj.style.top = y + 'px';
this._selectionObj.startX = x;
this._selectionObj.startY = y;
}
dhtmlXGridObject.prototype._ShowSelection = function()
{
if (this._selectionObj)
this._selectionObj.style.display = '';
}
dhtmlXGridObject.prototype._HideSelection = function()
{
if (this._selectionObj)
this._selectionObj.style.display = 'none';
this._selectionArea = null;
}
/**
* @desc: copy content of block selection into clipboard in csv format (delimiter as set for csv serialization)
* @type: public
* @topic: 0
*/
dhtmlXGridObject.prototype.copyBlockToClipboard = function()
{
if ( this._selectionArea != null ) {
var serialized = new Array();
if (this._mathSerialization)
this._agetm="getMathValue";
else if (this._strictText)
this._agetm="getTitle";
else this._agetm="getValue";
for (var i=this._selectionArea.LeftTopRow; i<=this._selectionArea.RightBottomRow; i++) {
var data = this._serializeRowToCVS(this.rowsBuffer[i], null, this._selectionArea.LeftTopCol, this._selectionArea.RightBottomCol+1);
if (!this._csvAID)
serialized[serialized.length] = data.substr( data.indexOf( this.csv.cell ) + 1 ); //remove row ID and add to array
else
serialized[serialized.length] = data;
}
serialized = serialized.join(this._CSVRowDelimiter);
this.toClipBoard(serialized);
}
}
/**
* @desc: paste content of clipboard into block selection of grid
* @type: public
* @topic: 0
*/
dhtmlXGridObject.prototype.pasteBlockFromClipboard = function()
{
var serialized = this.fromClipBoard();
if (this._selectionArea != null) {
var startRow = this._selectionArea.LeftTopRow;
var startCol = this._selectionArea.LeftTopCol;
} else if (this.cell != null && !this.editor) {
var startRow = this.getRowIndex( this.cell.parentNode.idd );
var startCol = this.cell._cellIndex;
} else {
return false;
}
serialized = this.csvParser.unblock(serialized, this.csv.cell, this.csv.row);
// if ((serialized.length >1)&&(serialized[serialized.length-1]==""))
// serialized.splice(serialized.length-1,1);
// if (serialized[serialized.length-1]=="") serialized.pop();
/* for (var i=0; i this._cCount)
endCol = this._cCount;
var k = 0;
for (var i=startRow; i"+grid._serialiseExportConfig(spans).replace(/^$/,"columns>");
for (var i=2; i < grid.hdr.rows.length; i++) {
var empty_cols = 0;
var row = grid.hdr.rows[i];
var cxml="";
for (var j=0; j < grid._cCount; j++) {
if ((grid._srClmn && !grid._srClmn[j]) || (grid._hrrar[j])) {
empty_cols++;
continue;
}
var s = spans[i][j];
var rspan = (( s[0] && s[0] > 1 ) ? ' colspan="'+s[0]+'" ' : "");
if (s[1] && s[1] > 1){
rspan+=' rowspan="'+s[1]+'" ';
empty_cols = -1;
}
var val = "";
for (var k=0; k";
};
if (empty_cols != grid._cCount)
xml+="\n"+cxml+"";
};
xml+="\n";
xml+=xml_footer();
return xml;
};
function xml_body() {
var xml =[];
if (rows)
for (var i=0; i"];
if (!grid.ftr) return "";
for (var i=1; i < grid.ftr.rows.length; i++) {
xml.push("");
var row = grid.ftr.rows[i];
for (var j=0; j < grid._cCount; j++){
if (grid._srClmn && !grid._srClmn[j]) continue;
if (grid._hrrar[j]) continue;
for (var k=0; k");
}
xml.push("");
};
xml.push("");
return xml.join("\n");
};
function get_style(node, style){
return (window.getComputedStyle?(window.getComputedStyle(node, null)[style]):(node.currentStyle?node.currentStyle[style]:null))||"";
};
function xml_row(ind){
if (!grid.rowsBuffer[ind]) return "";
var r = grid.render_row(ind);
if (r.style.display=="none") return "";
var xml = "";
for (var i=0; i < grid._cCount; i++) {
if (((!grid._srClmn)||(grid._srClmn[i]))&&(!grid._hrrar[i])){
var cell = grid.cells(r.idd, i);
if (full_color){
var text_color = get_style(cell.cell,"color");
var bg_color = get_style(cell.cell,"backgroundColor");
var bold = get_style(cell.cell, "font-weight") || get_style(cell.cell, "fontWeight");
var italic = get_style(cell.cell, "font-style") || get_style(cell.cell, "fontStyle");
var align = get_style(cell.cell, "text-align") || get_style(cell.cell, "textAlign");
var font = get_style(cell.cell, "font-family") || get_style(cell.cell, "fontFamily");
if (bg_color == "transparent" || bg_color == "rgba(0, 0, 0, 0)") bg_color = "rgb(255,255,255)";
xml+="";
} else
xml+="";
xml+="";
}
};
return xml+"";
}
function xml_end(){
var xml = "";
return xml;
}
if (grid._fake){
var st_hr = [].concat(grid._hrrar);
for (var i=0; i < grid._fake._cCount; i++)
grid._hrrar[i]=null;
}
var d=document.createElement("div");
d.style.display="none";
document.body.appendChild(d);
var uid = "form_"+grid.uid();
d.innerHTML = '';
document.getElementById(uid).firstChild.value = encodeURIComponent(xml_top(mode).replace("\u2013", "-") + xml_body() + xml_end());
document.getElementById(uid).submit();
d.parentNode.removeChild(d);
if (grid._fake)
grid._hrrar = st_hr;
grid = null;
if (save_sel) {
save_sel.el.parentNode.className += ' rowselected';
save_sel.el.className += ' cellselected';
};
save_sel = null;
};
dhtmlXGridObject.prototype._serialiseExportConfig=function(spans){
var out = "";
for (var i = 0; i < this.hdr.rows[0].cells.length; i++){
if (this._srClmn && !this._srClmn[i]) continue;
if (this._hrrar[i]) continue;
var sort = this.fldSort[i];
if (sort == "cus"){
sort = this._customSorts[i].toString();
sort=sort.replace(/function[\ ]*/,"").replace(/\([^\f]*/,"");
}
var s = spans[1][i];
var rpans = (( s[1] && s[1] > 1 ) ? ' rowspan="'+s[1]+'" ' : "")+(( s[0] && s[0] > 1 ) ? ' colspan="'+s[0]+'" ' : "");
out+="";
if (this._asCDATA)
out+="";
else
out+=this.getHeaderCol(i);
var z = this.getCombo(i);
if (z)
for (var j = 0; j < z.keys.length; j++)out+="";
out+="";
}
return out+="";
};
if (window.eXcell_sub_row_grid)
window.eXcell_sub_row_grid.prototype.getContent=function(){ return ""; };
dhtmlXGridObject.prototype.toExcel = function(url,mode,header,footer,rows) {
if (!document.getElementById('ifr')) {
var ifr = document.createElement('iframe');
ifr.style.display = 'none';
ifr.setAttribute('name', 'dhx_export_iframe');
ifr.setAttribute('src', '');
ifr.setAttribute('id', 'dhx_export_iframe');
document.body.appendChild(ifr);
}
var target = " target=\"dhx_export_iframe\"";
this.toPDF(url,mode,header,footer,rows,target);
}
/*
keymap like MS Excel offers
*/
dhtmlXGridObject.prototype._key_events={
k13_1_0:function(){
this.editStop();
},
k13_0_1:function(){
this.editStop();
this._key_events.k38_0_0.call(this);
},
k13_0_0:function(){
this.editStop();
this.callEvent("onEnter",[(this.row?this.row.idd:null),(this.cell?this.cell._cellIndex:null)]);
this._still_active=true;
this._key_events.k40_0_0.call(this);
},
k9_0_0:function(){
this.editStop();
if (!this.callEvent("onTab",[true])) return true;
if (this.cell && (this.cell._cellIndex+1)>=this._cCount) return;
var z=this._getNextCell(null,1);
if (z && this.row==z.parentNode){
this.selectCell(z.parentNode,z._cellIndex,true,true);
this._still_active=true;
}
},
k9_0_1:function(){
this.editStop();
if (!this.callEvent("onTab",[false])) return true;
if (this.cell && (this.cell._cellIndex==0)) return;
var z=this._getNextCell(null,-1);
if (z && this.row==z.parentNode) {
this.selectCell(z.parentNode,z._cellIndex,true,true);
this._still_active=true;
}
},
k113_0_0:function(){
if (this._f2kE) this.editCell();
},
k32_0_0:function(){
var c=this.cells4(this.cell);
if (!c.changeState || (c.changeState()===false)) return false;
},
k27_0_0:function(){
this.editStop(true);
this._still_active=true;
},
k33_0_0:function(){
if(this.pagingOn)
this.changePage(this.currentPage-1);
else this.scrollPage(-1);
},
k34_0_0:function(){
if(this.pagingOn)
this.changePage(this.currentPage+1);
else this.scrollPage(1);
},
k37_0_0:function(){
if (this.editor) return false;
if(this.isTreeGrid())
this.collapseKids(this.row)
else this._key_events.k9_0_1.call(this);
},
k39_0_0:function(){
if (this.editor) return false;
if(!this.editor && this.isTreeGrid())
this.expandKids(this.row)
else this._key_events.k9_0_0.call(this);
},
k37_1_0:function(){
if (this.editor) return false;
this.selectCell(this.row,0,true);
},
k39_1_0:function(){
if (this.editor) return false;
this.selectCell(this.row,this._cCount-1,true);
},
k38_1_0:function(){
if (this.editor || !this.rowsCol.length) return false;
this.selectCell(this.rowsCol[0],this.cell._cellIndex,true);
},
k40_1_0:function(){
if (this.editor || !this.rowsCol.length) return false;
this.selectCell(this.rowsCol[this.rowsCol.length-1],this.cell._cellIndex,true);
},
k38_0_1:function(){
if (this.editor || !this.rowsCol.length) return false;
var rowInd = this.row.rowIndex;
var nrow=this._nextRow(rowInd-1,-1);
if (!nrow || nrow._sRow || nrow._rLoad) return false;
this.selectCell(nrow,this.cell._cellIndex,true,true);
},
k40_0_1:function(){
if (this.editor || !this.rowsCol.length) return false;
var rowInd = this.row.rowIndex;
var nrow=this._nextRow(rowInd-1,1);
if (!nrow || nrow._sRow || nrow._rLoad) return false;
this.selectCell(nrow,this.cell._cellIndex,true,true);
},
k38_1_1:function(){
if (this.editor || !this.rowsCol.length) return false;
var rowInd = this.row.rowIndex;
for (var i = rowInd - 1; i >= 0; i--){
this.selectCell(this.rowsCol[i],this.cell._cellIndex,true,true);
}
},
k40_1_1:function(){
if (this.editor || !this.rowsCol.length) return false;
var rowInd = this.row.rowIndex;
for (var i = rowInd; i =40 && (ev.keyCode < 91 || (ev.keyCode >95 && ev.keyCode <111) || ev.keyCode > 187))
if (this.cell){
var c=this.cells4(this.cell);
if (c.isDisabled()) return false;
var t=c.getValue();
if (c.editable!==false) c.setValue("");
this.editCell();
if (this.editor) {
this.editor.val=t;
if (this.editor.obj && this.editor.obj.select)
this.editor.obj.select();
}
else c.setValue(t);
}
}
};
/**
* @desc: constructor, creates a new dhtmlxToolbar object
* @param: baseId - id of html element to which webmenu will attached
* @type: public
*/
function dhtmlXToolbarObject(baseId, skin) {
var main_self = this;
this.cont = (typeof(baseId)!="object")?document.getElementById(baseId):baseId;
while (this.cont.childNodes.length > 0) this.cont.removeChild(this.cont.childNodes[0]);
this.cont.dir = "ltr";
this.cont.innerHTML += ""+
"";
this.base = document.createElement("DIV");
this.base.className = "float_left";
this.cont.appendChild(this.base);
this.align = "left";
this.setAlign = function(align) {
this.align = (align=="right"?"right":"left");
this.base.className = (align=="right"?"float_right":"float_left");
if (this._spacer) this._spacer.className = "dhxtoolbar_spacer "+(align=="right"?" float_left":" float_right");
}
this._isIE6 = false;
if (_isIE) this._isIE6 = (window.XMLHttpRequest==null?true:false);
this._isIPad = (navigator.userAgent.search(/iPad/gi)>=0);
if (this._isIPad) {
this.cont.ontouchstart = function(e){
e = e||event;
e.returnValue = false;
e.cancelBubble = true;
return false;
}
}
this.iconSize = 18;
this.setIconSize = function(size) {
this.iconSize = ({18:true,24:true,32:true,48:true}[size]?size:18);
this.setSkin(this.skin, true);
this.callEvent("_onIconSizeChange",[this.iconSize]);
}
this.selectPolygonOffsetTop = 0;
this.selectPolygonOffsetLeft = 0;
this.setSkin = function(skin, onlyIcons) {
if (onlyIcons === true) {
// prevent of removing skin postfixes when attached to layout/acc/etc
this.cont.className = this.cont.className.replace(/dhx_toolbar_base_\d{1,}_/,"dhx_toolbar_base_"+this.iconSize+"_");
} else {
this.skin = skin;
if (this.skin == "dhx_skyblue") {
this.selectPolygonOffsetTop = 1;
}
if (this.skin == "dhx_web") {
this.selectPolygonOffsetTop = 1;
this.selectPolygonOffsetLeft = 1;
}
this.cont.className = "dhx_toolbar_base_"+this.iconSize+"_"+this.skin+(this.rtl?" rtl":"");
}
for (var a in this.objPull) {
var item = this.objPull[a];
if (item["type"] == "slider") {
item.pen._detectLimits();
item.pen._definePos();
item.label.className = "dhx_toolbar_slider_label_"+this.skin+(this.rtl?" rtl":"");
}
if (item["type"] == "buttonSelect") {
item.polygon.className = "dhx_toolbar_poly_"+this.iconSize+"_"+this.skin+(this.rtl?" rtl":"");
}
}
}
this.setSkin(skin==null?"dhx_skyblue":skin);
this.objPull = {};
this.anyUsed = "none";
/* images */
this.imagePath = "";
/**
* @desc: set path to used images
* @param: path - path to images on harddisk
* @type: public
*/
this.setIconsPath = function(path) { this.imagePath = path; }
/**
* @desc: alias of setIconsPath
* @type: public
*/
this.setIconPath = this.setIconsPath;
/* load */
this._doOnLoad = function() {}
/**
* @desc: loads data to object from xml file
* @param: xmlFile - file with dta to load
* @param: onLoadFunction - function to call after data will loaded
* @type: public
*/
this.loadXML = function(xmlFile, onLoadFunction) {
if (onLoadFunction != null) this._doOnLoad = function() { onLoadFunction(); }
this.callEvent("onXLS", []);
this._xmlLoader = new dtmlXMLLoaderObject(this._xmlParser, window);
this._xmlLoader.loadXML(xmlFile);
}
/**
* @desc: loads data to object from xml string
* @param: xmlString - xml string with data to load
* @param: onLoadFunction - function to call after data will loaded
* @type: public
*/
this.loadXMLString = function(xmlString, onLoadFunction) {
if (onLoadFunction != null) { this._doOnLoad = function() { onLoadFunction(); } }
this._xmlLoader = new dtmlXMLLoaderObject(this._xmlParser, window);
this._xmlLoader.loadXMLString(xmlString);
}
this._xmlParser = function() {
var root = this.getXMLTopNode("toolbar");
/*
common: id, type
---
separator: hidden, title
text: hidden, title, text
button: enabled, img, imgdis, hidden, action, title, text
buttonSelect: enabled, img, imgdis, hidden, action, title, openAll, renderSelect, text
input: hidden, width, title, value
buttonTwoState: enabled, img, imgdis, selected, action, title, text
slider: enabled, length, textMin, textMax, toolTip, valueMin, valueMax, valueNow
---
buttonSelect nested item: enabled, disabled, action, selected, img, text, itemText(nested), userdata(nested)
*/
var t = ["id", "type", "hidden", "title", "text", "enabled", "img", "imgdis", "action", "openAll", "renderSelect", "mode", "maxOpen", "width", "value", "selected", "length", "textMin", "textMax", "toolTip", "valueMin", "valueMax", "valueNow"];
var p = ["id", "type", "enabled", "disabled", "action", "selected", "img", "text"];
//
for (var q=0; q 0) obj.insertBefore(imgObj, obj.childNodes[0]); else obj.appendChild(imgObj);
return imgObj;
}
// set/clear item image/imagedis
this._setItemImage = function(item, url, dis) {
if (dis == true) item.imgEn = url; else item.imgDis = url;
if ((!item.state && dis == true) || (item.state && dis == false)) return;
var imgObj = this._getObj(item.obj, "img");
if (imgObj == null) imgObj = this._addImgObj(item.obj);
imgObj.src = this.imagePath+url;
}
this._clearItemImage = function(item, dis) {
if (dis == true) item.imgEn = ""; else item.imgDis = "";
if ((!item.state && dis == true) || (item.state && dis == false)) return;
var imgObj = this._getObj(item.obj, "img");
if (imgObj != null) imgObj.parentNode.removeChild(imgObj);
}
// set/get item text
this._setItemText = function(item, text) {
var txtObj = this._getObj(item.obj, "div");
if (text == null || text.length == 0) {
if (txtObj != null) txtObj.parentNode.removeChild(txtObj);
return;
}
if (txtObj == null) { txtObj = document.createElement("DIV"); item.obj.appendChild(txtObj); }
txtObj.innerHTML = text;
}
this._getItemText = function(item) {
var txtObj = this._getObj(item.obj, "div");
if (txtObj != null) return txtObj.innerHTML;
return "";
}
// enable/disable btn
this._enableItem = function(item) {
if (item.state) return;
item.state = true;
if (this.objPull[item.id]["type"] == "buttonTwoState" && this.objPull[item.id]["obj"]["pressed"] == true) {
item.obj.className = "dhx_toolbar_btn pres";
item.obj.renderAs = "dhx_toolbar_btn over";
} else {
item.obj.className = "dhx_toolbar_btn def";
item.obj.renderAs = item.obj.className;
}
if (item.arw) item.arw.className = String(item.obj.className).replace("btn","arw");
var imgObj = this._getObj(item.obj, "img");
if (item.imgEn != "") {
if (imgObj == null) imgObj = this._addImgObj(item.obj);
imgObj.src = this.imagePath+item.imgEn;
} else {
if (imgObj != null) imgObj.parentNode.removeChild(imgObj);
}
}
this._disableItem = function(item) {
if (!item.state) return;
item.state = false;
item.obj.className = "dhx_toolbar_btn "+(this.objPull[item.id]["type"]=="buttonTwoState"&&item.obj.pressed?"pres_":"")+"dis";
item.obj.renderAs = "dhx_toolbar_btn def";
if (item.arw) item.arw.className = String(item.obj.className).replace("btn","arw");
var imgObj = this._getObj(item.obj, "img");
if (item.imgDis != "") {
if (imgObj == null) imgObj = this._addImgObj(item.obj);
imgObj.src = this.imagePath+item.imgDis;
} else {
if (imgObj != null) imgObj.parentNode.removeChild(imgObj);
}
// if (this.objPull[item.id]["type"] == "buttonTwoState") this.objPull[item.id]["obj"]["pressed"] = false;
// hide opened polygon if any
if (item.polygon != null) {
if (item.polygon.style.display != "none") {
item.polygon.style.display = "none";
if (item.polygon._ie6cover) item.polygon._ie6cover.style.display = "none";
}
}
this.anyUsed = "none";
}
/**
* @desc: remove all existing items
* @type: public
*/
this.clearAll = function() {
for (var a in this.objPull) this._removeItem(String(a).replace(this.idPrefix,""));
}
//
this._isWebToolbar = true;
this._doOnClick = function(e) {
main_self.forEachItem(function(itemId){
if (main_self.objPull[main_self.idPrefix+itemId]["type"] == "buttonSelect") {
// hide any opened buttonSelect's polygons, clear selection if any
var item = main_self.objPull[main_self.idPrefix+itemId];
if (item.polygon.style.display != "none") {
item.obj.renderAs = "dhx_toolbar_btn def";
item.obj.className = item.obj.renderAs;
item.arw.className = String(item.obj.renderAs).replace("btn","arw");
main_self.anyUsed = "none";
item.polygon.style.display = "none";
if (item.polygon._ie6cover) item.polygon._ie6cover.style.display = "none";
}
}
});
}
if (this._isIPad) {
document.addEventListener("touchstart", this._doOnClick, false);
} else {
if (_isIE) document.body.attachEvent("onclick", this._doOnClick); else window.addEventListener("click", this._doOnClick, false);
}
//
return this;
}
dhtmlXToolbarObject.prototype.addSpacer = function(nextToId) {
var nti = this.idPrefix+nextToId;
if (this._spacer != null) {
// spacer already at specified position
if (this._spacer.idd == nextToId) return;
// if current spacer contain nextToId item
// move all items from first to nextToId to this.base
if (this._spacer == this.objPull[nti].obj.parentNode) {
var doMove = true;
while (doMove) {
var idd = this._spacer.childNodes[0].idd;
this.base.appendChild(this._spacer.childNodes[0]);
if (idd == nextToId || this._spacer.childNodes.length == 0) {
if (this.objPull[nti].arw != null) this.base.appendChild(this.objPull[nti].arw);
doMove = false;
}
}
this._spacer.idd = nextToId;
this._fixSpacer();
return;
}
// if this.base contain nextToId item, move (insertBefore[0])
if (this.base == this.objPull[nti].obj.parentNode) {
var doMove = true;
var chArw = (this.objPull[nti].arw!=null);
while (doMove) {
var q = this.base.childNodes.length-1;
if (chArw == true) if (this.base.childNodes[q] == this.objPull[nti].arw) doMove = false;
if (this.base.childNodes[q].idd == nextToId) doMove = false;
if (doMove) { if (this._spacer.childNodes.length > 0) this._spacer.insertBefore(this.base.childNodes[q], this._spacer.childNodes[0]); else this._spacer.appendChild(this.base.childNodes[q]); }
}
this._spacer.idd = nextToId;
this._fixSpacer();
return;
}
} else {
var np = null;
for (var q=0; q np+1) this._spacer.appendChild(this.base.childNodes[np+1]);
this.cont.appendChild(this._spacer);
this._fixSpacer();
}
}
}
dhtmlXToolbarObject.prototype.removeSpacer = function() {
if (!this._spacer) return;
while (this._spacer.childNodes.length > 0) this.base.appendChild(this._spacer.childNodes[0]);
this._spacer.parentNode.removeChild(this._spacer);
this._spacer = null;
}
dhtmlXToolbarObject.prototype._fixSpacer = function() {
// IE icons mixing fix
if (_isIE && this._spacer != null) {
this._spacer.style.borderLeft = "1px solid #a4bed4";
var k = this._spacer;
window.setTimeout(function(){k.style.borderLeft="0px solid #a4bed4";k=null;},1);
}
}
/**
* @desc: return item type by item id
* @param: itemId
* @type: public
*/
dhtmlXToolbarObject.prototype.getType = function(itemId) {
var parentId = this.getParentId(itemId);
if (parentId != null) {
var typeExt = null;
var itemData = this.objPull[this.idPrefix+parentId]._listOptions[itemId];
if (itemData != null) if (itemData.sep != null) typeExt = "buttonSelectSeparator"; else typeExt = "buttonSelectButton";
return typeExt;
} else {
if (this.objPull[this.idPrefix+itemId] == null) return null;
return this.objPull[this.idPrefix+itemId]["type"];
}
}
/**
* @desc: deprecated; return extended item type by item id (button select node)
* @param: itemId
* @type: public
*/
dhtmlXToolbarObject.prototype.getTypeExt = function(itemId) {
var type = this.getType(itemId);
if (type == "buttonSelectButton" || type == "buttonSelectSeparator") {
if (type == "buttonSelectButton") type = "button"; else type = "separator";
return type;
}
return null;
}
dhtmlXToolbarObject.prototype.inArray = function(array, value) {
for (var q=0; q 0) p.obj.removeChild(p.obj.childNodes[0]);
p.obj.parentNode.removeChild(p.obj);
p.obj = null;
p.id = null;
p.type = null;
p.state = null;
p.enableItem = null;
p.disableItem = null;
p.isEnabled = null;
p.setItemToolTipTemplate = null;
p.getItemToolTipTemplate = null;
p.setMaxValue = null;
p.setMinValue = null;
p.getMaxValue = null;
p.getMinValue = null;
p.setValue = null;
p.getValue = null;
p.showItem = null;
p.hideItem = null;
p.isVisible = null;
}
if (t == "separator") {
p.obj.onselectstart = null;
p.obj.idd = null;
p.obj.parentNode.removeChild(p.obj);
p.obj = null;
p.id = null;
p.type = null;
p.showItem = null;
p.hideItem = null;
p.isVisible = null;
}
if (t == "text") {
p.obj.onselectstart = null;
p.obj.idd = null;
p.obj.parentNode.removeChild(p.obj);
p.obj = null;
p.id = null;
p.type = null;
p.showItem = null;
p.hideItem = null;
p.isVisible = null;
p.setWidth = null;
p.setItemText = null;
p.getItemText = null;
}
t = null;
p = null;
this.objPull[this.idPrefix+itemId] = null;
delete this.objPull[this.idPrefix+itemId];
};
//tool_list:06062008{
(function(){
var list="addListOption,removeListOption,showListOption,hideListOption,isListOptionVisible,enableListOption,disableListOption,isListOptionEnabled,setListOptionPosition,getListOptionPosition,setListOptionText,getListOptionText,setListOptionToolTip,getListOptionToolTip,setListOptionImage,getListOptionImage,clearListOptionImage,forEachListOption,getAllListOptions,setListOptionSelected,getListOptionSelected".split(",")
var functor = function(name){
return function(parentId,a,b,c,d,e){
parentId = this.idPrefix+parentId;
if (this.objPull[parentId] == null) return;
if (this.objPull[parentId]["type"] != "buttonSelect") return;
return this.objPull[parentId][name].call(this.objPull[parentId],a,b,c,d,e);
}
}
for (var i=0; i":""), (data.text!=null?"