/** (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 = "" 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$/,"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+=""; } 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?"
"+data.text+"
":"")); var obj = this; this.obj.onselectstart = function(e) { e = e||event; e.returnValue = false; } this.obj.onmouseover = function() { this._doOnMouseOver(); } this.obj.onmouseout = function() { this._doOnMouseOut(); } this.obj._doOnMouseOver = function() { this.allowClick = true; if (obj.state == false) return; if (that.anyUsed != "none") return; this.className = "dhx_toolbar_btn over"; this.renderAs = this.className; } this.obj._doOnMouseOut = function() { this.allowClick = false; if (obj.state == false) return; if (that.anyUsed != "none") return; this.className = "dhx_toolbar_btn def"; this.renderAs = this.renderAs; } this.obj.onclick = function(e) { if (obj.state == false) return; if (this.allowClick == false) return; e = e||event; // event var id = this.idd.replace(that.idPrefix,""); if (this.extAction) try {window[this.extAction](id);} catch(e){}; if(that&&that.callEvent) that.callEvent("onClick", [id]); } this.obj[that._isIPad?"ontouchstart":"onmousedown"] = function(e) { if (obj.state == false) { e = e||event; e.returnValue = false; e.cancelBubble = true; return false; } if (that.anyUsed != "none") return; that.anyUsed = this.idd; this.className = "dhx_toolbar_btn pres"; this.pressed = true; this.onmouseover = function() { this._doOnMouseOver(); } this.onmouseout = function() { that.anyUsed = "none"; this._doOnMouseOut(); } return false; } this.obj[that._isIPad?"ontouchend":"onmouseup"] = function(e) { if (obj.state == false) return; if (that.anyUsed != "none") { if (that.anyUsed != this.idd) return; } var t = that.anyUsed; this._doOnMouseUp(); if (that._isIPad && t != "none") that.callEvent("onClick", [this.idd.replace(that.idPrefix,"")]); } if (that._isIPad) { this.obj.ontouchmove = function(e) { this._doOnMouseUp(); } } this.obj._doOnMouseUp = function() { that.anyUsed = "none"; this.className = this.renderAs; this.pressed = false; } this.obj._doOnMouseUpOnceAnywhere = function() { this._doOnMouseUp(); this.onmouseover = function() { this._doOnMouseOver(); } this.onmouseout = function() { this._doOnMouseOut(); } } // add object that.base.appendChild(this.obj); // // functions this.enableItem = function() { that._enableItem(this); } this.disableItem = function() { that._disableItem(this); } this.isEnabled = function() { return this.state; } this.showItem = function() { this.obj.style.display = ""; } this.hideItem = function() { this.obj.style.display = "none"; } this.isVisible = function() { return (this.obj.style.display == ""); } this.setItemText = function(text) { that._setItemText(this, text); } this.getItemText = function() { return that._getItemText(this); } this.setItemImage = function(url) { that._setItemImage(this, url, true); } this.clearItemImage = function() { that._clearItemImage(this, true); } this.setItemImageDis = function(url) { that._setItemImage(this, url, false); } this.clearItemImageDis = function() { that._clearItemImage(this, false); } this.setItemToolTip = function(tip) { this.obj.title = tip; } this.getItemToolTip = function() { return this.obj.title; } return this; } //tool_list:06062008{ /* **************************************************************************************************************************************************************** object: buttonSelect ***************************************************************************************************************************************************************** */ dhtmlXToolbarObject.prototype._buttonSelectObject = function(that, id, data) { this.id = that.idPrefix+id; this.state = (data.enabled!=null?(data.enabled=="true"?true:false):true); this.imgEn = (data.img||""); this.imgDis = (data.imgdis||""); this.img = (this.state?(this.imgEn!=""?this.imgEn:""):(this.imgDis!=""?this.imgDis:"")); this.mode = (data.mode||"button"); // button, select if (this.mode == "select") { this.openAll = true; this.renderSelect = false; if (!data.text||data.text.length==0) data.text = " " } else { this.openAll = (data.openAll!=null); this.renderSelect = (data.renderSelect!=null?(data.renderSelect=="false"||data.renderSelect=="disabled"?false:true):true); } this.maxOpen = (!isNaN(data.maxOpen?data.maxOpen:"")?data.maxOpen:null); this._maxOpenTest = function() { if (!isNaN(this.maxOpen)) { if (!that._sbw) { var t = document.createElement("DIV"); t.className = "dhxtoolbar_maxopen_test"; document.body.appendChild(t); var k = document.createElement("DIV"); k.className = "dhxtoolbar_maxopen_test2"; t.appendChild(k); that._sbw = t.offsetWidth-k.offsetWidth; t.removeChild(k); k = null; document.body.removeChild(t); t = null; } } } this._maxOpenTest(); // this.obj = document.createElement("DIV"); this.obj.allowClick = false; this.obj.extAction = (data.action||null); this.obj.className = "dhx_toolbar_btn "+(this.state?"def":"dis"); this.obj.style.display = (data.hidden!=null?"none":""); this.obj.renderAs = this.obj.className; this.obj.onselectstart = function(e) { e = e||event; e.returnValue = false; } this.obj.idd = String(id); this.obj.title = (data.title||""); this.obj.pressed = false; this.callEvent = false; this.obj.innerHTML = that._rtlParseBtn((this.img!=""?"":""),(data.text!=null?"
"+data.text+"
":"")); // add object that.base.appendChild(this.obj); this.arw = document.createElement("DIV"); this.arw.className = "dhx_toolbar_arw "+(this.state?"def":"dis");; this.arw.style.display = this.obj.style.display; this.arw.innerHTML = "
 
"; this.arw.title = this.obj.title; this.arw.onselectstart = function(e) { e = e||event; e.returnValue = false; } that.base.appendChild(this.arw); var self = this; this.obj.onmouseover = function(e) { e = e||event; if (that.anyUsed != "none") return; if (!self.state) return; self.obj.renderAs = "dhx_toolbar_btn over"; self.obj.className = self.obj.renderAs; self.arw.className = String(self.obj.renderAs).replace("btn","arw"); } this.obj.onmouseout = function() { self.obj.allowClick = false; if (that.anyUsed != "none") return; if (!self.state) return; self.obj.renderAs = "dhx_toolbar_btn def"; self.obj.className = self.obj.renderAs; self.arw.className = String(self.obj.renderAs).replace("btn","arw"); self.callEvent = false; } this.arw.onmouseover = this.obj.onmouseover; this.arw.onmouseout = this.obj.onmouseout; if (this.openAll == true) { } else { this.obj.onclick = function(e) { e = e||event; if (!self.obj.allowClick) return; if (!self.state) return; if (that.anyUsed != "none") return; // event var id = self.obj.idd.replace(that.idPrefix,""); if (self.obj.extAction) try {window[self.obj.extAction](id);} catch(e){}; that.callEvent("onClick", [id]); } this.obj[that._isIPad?"ontouchstart":"onmousedown"] = function(e) { e = e||event; if (that.anyUsed != "none") return; if (!self.state) return; self.obj.allowClick = true; self.obj.className = "dhx_toolbar_btn pres"; self.arw.className = "dhx_toolbar_arw pres"; self.callEvent = true; } this.obj[that._isIPad?"ontouchend":"onmouseup"] = function(e) { e = e||event; e.cancelBubble = true; if (that.anyUsed != "none") return; if (!self.state) return; self.obj.className = self.obj.renderAs; self.arw.className = String(self.obj.renderAs).replace("btn","arw"); if (that._isIPad && self.callEvent) { var id = self.obj.idd.replace(that.idPrefix,""); that.callEvent("onClick", [id]); } } } if (that._isIPad) { this.obj.ontouchmove = this.obj.onmouseout; } this.arw[that._isIPad?"ontouchstart":"onmousedown"] = function(e) { e = e||event; if (!self.state) return; if (that.anyUsed == self.obj.idd) { // hide self.obj.className = self.obj.renderAs; self.arw.className = String(self.obj.renderAs).replace("btn","arw"); that.anyUsed = "none"; self.polygon.style.display = "none"; if (self.polygon._ie6cover) self.polygon._ie6cover.style.display = "none"; } else { if (that.anyUsed != "none") { if (that.objPull[that.idPrefix+that.anyUsed]["type"] == "buttonSelect") { var item = that.objPull[that.idPrefix+that.anyUsed]; if (item.polygon.style.display != "none") { item.obj.renderAs = "dhx_toolbar_btn def"; item.obj.className = item.obj.renderAs; item.arw.className = String(self.obj.renderAs).replace("btn","arw"); item.polygon.style.display = "none"; if (item.polygon._ie6cover) item.polygon._ie6cover.style.display = "none"; } } } self.obj.className = "dhx_toolbar_btn over"; self.arw.className = "dhx_toolbar_arw pres"; that.anyUsed = self.obj.idd; // show self.polygon.style.top = "0px"; self.polygon.style.visibility = "hidden"; self.polygon.style.display = ""; // check maxOpen self._fixMaxOpenHeight(self.maxOpen||null); // detect overlay by Y axis that._autoDetectVisibleArea(); // calculate top position var newTop = getAbsoluteTop(self.obj)+self.obj.offsetHeight+that.selectPolygonOffsetTop; var newH = self.polygon.offsetHeight; if (newTop + newH > that.tY2) { // if maxOpen mode enabled, check if at bottom at least one item can be shown // and show it, if no space - show on top. in maxOpen mode not enabled, show at top var k0 = (self.maxOpen!=null?Math.floor((that.tY2-newTop)/22):0); // k0 = count of items that can be visible if (k0 >= 1) { self._fixMaxOpenHeight(k0); } else { newTop = getAbsoluteTop(self.obj)-newH-that.selectPolygonOffsetTop; if (newTop < 0) newTop = 0; } } self.polygon.style.top = newTop+"px"; // calculate left position if (that.rtl) { self.polygon.style.left = getAbsoluteLeft(self.obj)+self.obj.offsetWidth-self.polygon.offsetWidth+that.selectPolygonOffsetLeft+"px"; } else { self.polygon.style.left = getAbsoluteLeft(self.obj)+that.selectPolygonOffsetLeft+"px"; } self.polygon.style.visibility = "visible"; // show IE6 cover if needed if (self.polygon._ie6cover) { self.polygon._ie6cover.style.left = self.polygon.style.left; self.polygon._ie6cover.style.top = self.polygon.style.top; self.polygon._ie6cover.style.width = self.polygon.offsetWidth+"px"; self.polygon._ie6cover.style.height = self.polygon.offsetHeight+"px"; self.polygon._ie6cover.style.display = ""; } } return false; } this.arw.onclick = function(e) { e = e||event; e.cancelBubble = true; } this.arw[that._isIPad?"ontouchend":"onmouseup"] = function(e) { e = e||event; e.cancelBubble = true; } if (this.openAll === true) { this.obj.onclick = this.arw.onclick; this.obj.onmousedown = this.arw.onmousedown; this.obj.onmouseup = this.arw.onmouseup; if (that._isIPad) { this.obj.ontouchstart = this.arw.ontouchstart; this.obj.ontouchend = this.arw.ontouchend; } } this.obj.iddPrefix = that.idPrefix; this._listOptions = {}; this._fixMaxOpenHeight = function(maxOpen) { var h = "auto"; var h0 = false; if (maxOpen !== null) { var t = 0; for (var a in this._listOptions) t++; if (t > maxOpen) { this._ph = 22*maxOpen; h = this._ph+"px"; } else { h0 = true; } } this.polygon.style.width = "auto"; this.polygon.style.height = "auto"; if (!h0 && self.maxOpen != null) { this.polygon.style.width = this.p_tbl.offsetWidth+that._sbw+"px"; this.polygon.style.height = h; } } // inner objects: separator this._separatorButtonSelectObject = function(id, data, pos) { this.obj = {}; this.obj.tr = document.createElement("TR"); this.obj.tr.className = "tr_sep"; this.obj.tr.onselectstart = function(e) { e = e||event; e.returnValue = false; return false; } this.obj.td = document.createElement("TD"); this.obj.td.colSpan = "2"; this.obj.td.className = "td_btn_sep"; this.obj.td.onselectstart = function(e) { e = e||event; e.returnValue = false; return false; } if (isNaN(pos)) pos = self.p_tbody.childNodes.length+1; else if (pos < 1) pos = 1; if (pos > self.p_tbody.childNodes.length) self.p_tbody.appendChild(this.obj.tr); else self.p_tbody.insertBefore(this.obj.tr, self.p_tbody.childNodes[pos-1]); this.obj.tr.appendChild(this.obj.td); this.obj.sep = document.createElement("DIV"); this.obj.sep.className = "btn_sep"; this.obj.sep.onselectstart = function(e) { e = e||event; e.returnValue = false; return false; } this.obj.td.appendChild(this.obj.sep); self._listOptions[id] = this.obj; return this; } // inner objects: button this._buttonButtonSelectObject = function(id, data, pos) { this.obj = {}; this.obj.tr = document.createElement("TR"); this.obj.tr.en = (data.enabled=="false"?false:(data.disabled=="true"?false:true)); this.obj.tr.extAction = (data.action||null); this.obj.tr._selected = (data.selected!=null); this.obj.tr.className = "tr_btn"+(this.obj.tr.en?(this.obj.tr._selected&&self.renderSelect?" tr_btn_selected":""):" tr_btn_disabled"); this.obj.tr.onselectstart = function(e) { e = e||event; e.returnValue = false; return false; } this.obj.tr.idd = String(id); if (data.userdata) this.obj.userData = data.userdata; if (isNaN(pos)) pos = self.p_tbody.childNodes.length+1; else if (pos < 1) pos = 1; if (pos > self.p_tbody.childNodes.length) self.p_tbody.appendChild(this.obj.tr); else self.p_tbody.insertBefore(this.obj.tr, self.p_tbody.childNodes[pos-1]); this.obj.td_a = document.createElement("TD"); this.obj.td_a.className = "td_btn_img"; this.obj.td_a.onselectstart = function(e) { e = e||event; e.returnValue = false; return false; } this.obj.td_b = document.createElement("TD"); this.obj.td_b.className = "td_btn_txt"; this.obj.td_b.onselectstart = function(e) { e = e||event; e.returnValue = false; return false; } if (that.rtl) { this.obj.tr.appendChild(this.obj.td_b); this.obj.tr.appendChild(this.obj.td_a); } else { this.obj.tr.appendChild(this.obj.td_a); this.obj.tr.appendChild(this.obj.td_b); } // image if (data.img != null) { this.obj.td_a.innerHTML = ""; this.obj.tr._img = data.img; } // text var itemText = (data.text!=null?data.text:(data.itemText||"")); /* if (itemText == null) { var itm = data.getElementsByTagName("itemText"); itemText = (itm[0]!=null?itm[0].firstChild.nodeValue:""); } */ this.obj.td_b.innerHTML = "
"+itemText+"
"; this.obj.tr[that._isIPad?"ontouchstart":"onmouseover"] = function() { if (!this.en || (this._selected && self.renderSelect)) return; this.className = "tr_btn tr_btn_over"; } this.obj.tr.onmouseout = function() { if (!this.en) return; if (this._selected && self.renderSelect) { if (String(this.className).search("tr_btn_selected") == -1) this.className = "tr_btn tr_btn_selected"; } else { this.className = "tr_btn"; } } this.obj.tr[that._isIPad?"ontouchend":"onclick"] = function(e) { e = e||event; e.cancelBubble = true; if (!this.en) return; self.setListOptionSelected(this.idd.replace(that.idPrefix,"")); // self.obj.renderAs = "dhx_toolbar_btn def"; self.obj.className = self.obj.renderAs; self.arw.className = String(self.obj.renderAs).replace("btn","arw"); self.polygon.style.display = "none"; if (self.polygon._ie6cover) self.polygon._ie6cover.style.display = "none"; that.anyUsed = "none"; // event var id = this.idd.replace(that.idPrefix,""); if (this.extAction) try {window[this.extAction](id);} catch(e){}; that.callEvent("onClick", [id]); } self._listOptions[id] = this.obj; return this; } // add polygon this.polygon = document.createElement("DIV"); this.polygon.dir = "ltr"; this.polygon.style.display = "none"; this.polygon.style.zIndex = 101; this.polygon.className = "dhx_toolbar_poly_"+that.iconSize+"_"+that.skin+(that.rtl?" rtl":""); this.polygon.onselectstart = function(e) { e = e||event; e.returnValue = false; } this.polygon.style.overflowY = "auto"; if (that._isIPad) { this.polygon.ontouchstart = function(e){ e = e||event; e.returnValue = false; e.cancelBubble = true; return false; } } this.p_tbl = document.createElement("TABLE"); this.p_tbl.className = "buttons_cont"; this.p_tbl.cellSpacing = "0"; this.p_tbl.cellPadding = "0"; this.p_tbl.border = "0"; this.polygon.appendChild(this.p_tbl); this.p_tbody = document.createElement("TBODY"); this.p_tbl.appendChild(this.p_tbody); // if (data.items) { for (var q=0; q 0) item.td_a.removeChild(item.td_a.childNodes[0]); while (item.td_b.childNodes.length > 0) item.td_b.removeChild(item.td_b.childNodes[0]); item.tr.onselectstart = null; item.tr.onmouseover = null; item.tr.onmouseout = null; item.tr.onclick = null; while (item.tr.childNodes.length > 0) item.tr.removeChild(item.tr.childNodes[0]); item.tr.parentNode.removeChild(item.tr); item.td_a = null; item.td_b = null; item.tr = null; } else { // separator item.sep.onselectstart = null; item.td.onselectstart = null; item.tr.onselectstart = null; while (item.td.childNodes.length > 0) item.td.removeChild(item.td.childNodes[0]); while (item.tr.childNodes.length > 0) item.tr.removeChild(item.tr.childNodes[0]); item.tr.parentNode.removeChild(item.tr); item.sep = null; item.td = null; item.tr = null; } item = null; this._listOptions[id] = null; try { delete this._listOptions[id]; } catch(e) {} } // new engine this.showListOption = function(id) { if (!this._isListButton(id, true)) return; this._listOptions[id].tr.style.display = ""; } // new engine this.hideListOption = function(id) { if (!this._isListButton(id, true)) return; this._listOptions[id].tr.style.display = "none"; } // new engine this.isListOptionVisible = function(id) { if (!this._isListButton(id, true)) return; return (this._listOptions[id].tr.style.display != "none"); } // new engine this.enableListOption = function(id) { if (!this._isListButton(id)) return; this._listOptions[id].tr.en = true; this._listOptions[id].tr.className = "tr_btn"+(this._listOptions[id].tr._selected&&that.renderSelect?" tr_btn_selected":""); } // new engine this.disableListOption = function(id) { if (!this._isListButton(id)) return; this._listOptions[id].tr.en = false; this._listOptions[id].tr.className = "tr_btn tr_btn_disabled"; } // new engine this.isListOptionEnabled = function(id) { if (!this._isListButton(id)) return; return this._listOptions[id].tr.en; } // new engine this.setListOptionPosition = function(id, pos) { if (!this._listOptions[id] || this.getListOptionPosition(id) == pos || isNaN(pos)) return; if (pos < 1) pos = 1; var tr = this._listOptions[id].tr; this.p_tbody.removeChild(tr); if (pos > this.p_tbody.childNodes.length) this.p_tbody.appendChild(tr); else this.p_tbody.insertBefore(tr, this.p_tbody.childNodes[pos-1]); tr = null; } // new engine this.getListOptionPosition = function(id) { var pos = -1; if (!this._listOptions[id]) return pos; for (var q=0; q 0) { td.childNodes[0].src = that.imagePath+img; } else { var imgObj = document.createElement("IMG"); imgObj.className = "btn_sel_img"; imgObj.src = that.imagePath+img; td.appendChild(imgObj); } td = null; } // new engine this.getListOptionImage = function(id) { if (!this._isListButton(id)) return; var td = this._listOptions[id].tr.childNodes[(that.rtl?1:0)]; var src = null; if (td.childNodes.length > 0) src = td.childNodes[0].src; td = null; return src; } // new engine this.clearListOptionImage = function(id) { if (!this._isListButton(id)) return; var td = this._listOptions[id].tr.childNodes[(that.rtl?1:0)]; while (td.childNodes.length > 0) td.removeChild(td.childNodes[0]); td = null; } // new engine this.setListOptionText = function(id, text) { if (!this._isListButton(id)) return; this._listOptions[id].tr.childNodes[(that.rtl?0:1)].childNodes[0].innerHTML = text; } // new engine this.getListOptionText = function(id) { if (!this._isListButton(id)) return; return this._listOptions[id].tr.childNodes[(that.rtl?0:1)].childNodes[0].innerHTML; } // new engine this.setListOptionToolTip = function(id, tip) { if (!this._isListButton(id)) return; this._listOptions[id].tr.title = tip; } // new engine this.getListOptionToolTip = function(id) { if (!this._isListButton(id)) return; return this._listOptions[id].tr.title; } // works this.forEachListOption = function(handler) { for (var a in this._listOptions) handler(a); } // works, return array with ids this.getAllListOptions = function() { var listData = new Array(); for (var a in this._listOptions) listData[listData.length] = a; return listData; } // new engine this.setListOptionSelected = function(id) { for (var a in this._listOptions) { var item = this._listOptions[a]; if (item.td_a != null && item.td_b != null && item.tr.en) { if (a == id) { item.tr._selected = true; item.tr.className = "tr_btn"+(this.renderSelect?" tr_btn_selected":""); // if (this.mode == "select") { if (item.tr._img) this.setItemImage(item.tr._img); else this.clearItemImage(); this.setItemText(this.getListOptionText(id)); } } else { item.tr._selected = false; item.tr.className = "tr_btn"; } } item = null; } } // new engine this.getListOptionSelected = function() { var id = null; for (var a in this._listOptions) if (this._listOptions[a].tr._selected == true) id = a; return id; } // inner, return tru if list option is button and is exists this._isListButton = function(id, allowSeparator) { if (this._listOptions[id] == null) return false; if (!allowSeparator && this._listOptions[id].tr.className == "tr_sep") return false; return true; } this.setMaxOpen = function(r) { this._ph = null; if (typeof(r) == "number") { this.maxOpen = r; this._maxOpenTest(); return; } this.maxOpen = null; } if (data.width) this.setWidth(data.width); if (this.mode == "select" && typeof(data.selected) != "undefined") this.setListOptionSelected(data.selected); // return this; } //} //tool_input:06062008{ /***************************************************************************************************************************************************************** object: buttonInput ***************************************************************************************************************************************************************** */ dhtmlXToolbarObject.prototype._buttonInputObject = function(that, id, data) { // this.id = that.idPrefix+id; this.obj = document.createElement("DIV"); this.obj.className = "dhx_toolbar_btn def"; this.obj.style.display = (data.hidden!=null?"none":""); this.obj.idd = String(id); this.obj.w = (data.width!=null?data.width:100); this.obj.title = (data.title!=null?data.title:""); // this.obj.innerHTML = ""; var th = that; var self = this; this.obj.childNodes[0].onkeydown = function(e) { e = e||event; if (e.keyCode == 13) { th.callEvent("onEnter", [self.obj.idd, this.value]); } } // add that.base.appendChild(this.obj); // this.enableItem = function() { this.obj.childNodes[0].disabled = false; } this.disableItem = function() { this.obj.childNodes[0].disabled = true; } this.isEnabled = function() { return (!this.obj.childNodes[0].disabled); } this.showItem = function() { this.obj.style.display = ""; } this.hideItem = function() { this.obj.style.display = "none"; } this.isVisible = function() { return (this.obj.style.display != "none"); } this.setValue = function(value) { this.obj.childNodes[0].value = value; } this.getValue = function() { return this.obj.childNodes[0].value; } this.setWidth = function(width) { this.obj.w = width; this.obj.childNodes[0].style.width = this.obj.w+"px"; } this.getWidth = function() { return this.obj.w; } this.setItemToolTip = function(tip) { this.obj.title = tip; } this.getItemToolTip = function() { return this.obj.title; } // return this; } //} //tool_2state:06062008{ /***************************************************************************************************************************************************************** object: buttonTwoState ***************************************************************************************************************************************************************** */ dhtmlXToolbarObject.prototype._buttonTwoStateObject = function(that, id, data) { this.id = that.idPrefix+id; this.state = (data.enabled!=null?false:true); this.imgEn = (data.img!=null?data.img:""); this.imgDis = (data.imgdis!=null?data.imgdis:""); this.img = (this.state?(this.imgEn!=""?this.imgEn:""):(this.imgDis!=""?this.imgDis:"")); // this.obj = document.createElement("DIV"); this.obj.pressed = (data.selected!=null); this.obj.extAction = (data.action||null); this.obj.className = "dhx_toolbar_btn "+(this.obj.pressed?"pres"+(this.state?"":"_dis"):(this.state?"def":"dis")); this.obj.style.display = (data.hidden!=null?"none":""); this.obj.renderAs = this.obj.className; this.obj.idd = String(id); this.obj.title = (data.title||""); if (this.obj.pressed) { this.obj.renderAs = "dhx_toolbar_btn over"; } this.obj.innerHTML = that._rtlParseBtn((this.img!=""?"":""),(data.text!=null?"
"+data.text+"
":"")); // add object that.base.appendChild(this.obj); var obj = this; this.obj.onselectstart = function(e) { e = e||event; e.returnValue = false; } this.obj.onmouseover = function() { this._doOnMouseOver(); } this.obj.onmouseout = function() { this._doOnMouseOut(); } this.obj._doOnMouseOver = function() { if (obj.state == false) return; if (that.anyUsed != "none") return; if (this.pressed) { this.renderAs = "dhx_toolbar_btn over"; return; } this.className = "dhx_toolbar_btn over"; this.renderAs = this.className; } this.obj._doOnMouseOut = function() { if (obj.state == false) return; if (that.anyUsed != "none") return; if (this.pressed) { this.renderAs = "dhx_toolbar_btn def"; return; } this.className = "dhx_toolbar_btn def"; this.renderAs = this.className; } this.obj[that._isIPad?"ontouchstart":"onmousedown"] = function(e) { if (that.checkEvent("onBeforeStateChange")) if (!that.callEvent("onBeforeStateChange", [this.idd.replace(that.idPrefix, ""), this.pressed])) return; // if (obj.state == false) return; if (that.anyUsed != "none") return; this.pressed = !this.pressed; this.className = (this.pressed?"dhx_toolbar_btn pres":this.renderAs); // event var id = this.idd.replace(that.idPrefix, ""); if (this.extAction) try {window[this.extAction](id, this.pressed);} catch(e){}; that.callEvent("onStateChange", [id, this.pressed]); //this._doOnMouseOut(); return false; } // functions this.setItemState = function(state, callEvent) { if (this.obj.pressed != state) { if (state == true) { this.obj.pressed = true; this.obj.className = "dhx_toolbar_btn pres"+(this.state?"":"_dis"); this.obj.renderAs = "dhx_toolbar_btn over"; } else { this.obj.pressed = false; this.obj.className = "dhx_toolbar_btn "+(this.state?"def":"dis"); this.obj.renderAs = this.obj.className; } if (callEvent == true) { var id = this.obj.idd.replace(that.idPrefix, ""); if (this.obj.extAction) try {window[this.obj.extAction](id, this.obj.pressed);} catch(e){}; that.callEvent("onStateChange", [id, this.obj.pressed]); } } } this.getItemState = function() { return this.obj.pressed; } this.enableItem = function() { that._enableItem(this); } this.disableItem = function() { that._disableItem(this); } this.isEnabled = function() { return this.state; } this.showItem = function() { this.obj.style.display = ""; } this.hideItem = function() { this.obj.style.display = "none"; } this.isVisible = function() { return (this.obj.style.display == ""); } this.setItemText = function(text) { that._setItemText(this, text); } this.getItemText = function() { return that._getItemText(this); } this.setItemImage = function(url) { that._setItemImage(this, url, true); } this.clearItemImage = function() { that._clearItemImage(this, true); } this.setItemImageDis = function(url) { that._setItemImage(this, url, false); } this.clearItemImageDis = function() { that._clearItemImage(this, false); } this.setItemToolTip = function(tip) { this.obj.title = tip; } this.getItemToolTip = function() { return this.obj.title; } // return this; } //} //tool_slider:06062008{ /***************************************************************************************************************************************************************** object: slider ***************************************************************************************************************************************************************** */ dhtmlXToolbarObject.prototype._sliderObject = function(that, id, data) { this.id = that.idPrefix+id; this.state = (data.enabled!=null?(data.enabled=="true"?true:false):true); this.obj = document.createElement("DIV"); this.obj.className = "dhx_toolbar_btn "+(this.state?"def":"dis"); this.obj.style.display = (data.hidden!=null?"none":""); this.obj.onselectstart = function(e) { e = e||event; e.returnValue = false; } this.obj.idd = String(id); this.obj.len = (data.length!=null?Number(data.length):50); // this.obj.innerHTML = "
"+(data.textMin||"")+"
"+ "
"+ "
"+ "
"+ "
"+(data.textMax||"")+"
"; // add object that.base.appendChild(this.obj); var self = this; this.pen = document.createElement("DIV"); this.pen.className = "sl_pen"; this.obj.appendChild(this.pen); var pen = this.pen; this.label = document.createElement("DIV"); this.label.dir = "ltr"; this.label.className = "dhx_toolbar_slider_label_"+that.skin+(that.rtl?"_rtl":""); this.label.style.display = "none"; this.label.tip = (data.toolTip||"%v"); document.body.appendChild(this.label); var label = this.label; // mix-max value this.pen.valueMin = (data.valueMin!=null?Number(data.valueMin):0); this.pen.valueMax = (data.valueMax!=null?Number(data.valueMax):100); if (this.pen.valueMin > this.pen.valueMax) this.pen.valueMin = this.pen.valueMax; // init value this.pen.valueNow = (data.valueNow!=null?Number(data.valueNow):this.pen.valueMax); if (this.pen.valueNow > this.pen.valueMax) this.pen.valueNow = this.pen.valueMax; if (this.pen.valueNow < this.pen.valueMin) this.pen.valueNow = this.pen.valueMin; // min/max x coordinate this.pen._detectLimits = function() { this.minX = self.obj.childNodes[1].offsetLeft-4; this.maxX = self.obj.childNodes[3].offsetLeft-this.offsetWidth+1; } this.pen._detectLimits(); // position this.pen._definePos = function() { this.nowX = Math.round((this.valueNow-this.valueMin)*(this.maxX-this.minX)/(this.valueMax-this.valueMin)+this.minX); this.style.left = this.nowX+"px"; this.newNowX = this.nowX; } this.pen._definePos(); this.pen.initXY = 0; this.pen.allowMove = false; this.pen[that._isIPad?"ontouchstart":"onmousedown"] = function(e) { if (self.state == false) return; e = e||event; this.initXY = (that._isIPad?e.touches[0].clientX:e.clientX); //e.clientX; this.newValueNow = this.valueNow; this.allowMove = true; this.className = "sl_pen over"; if (label.tip != "") { label.style.visibility = "hidden"; label.style.display = ""; label.innerHTML = label.tip.replace("%v", this.valueNow); label.style.left = Math.round(getAbsoluteLeft(this)+this.offsetWidth/2-label.offsetWidth/2)+"px"; label.style.top = getAbsoluteTop(this)-label.offsetHeight-3+"px"; label.style.visibility = ""; } } this.pen._doOnMouseMoveStart = function(e) { // optimized for destructor e=e||event; if (!pen.allowMove) return; var ecx = (that._isIPad?e.touches[0].clientX:e.clientX); var ofst = ecx - pen.initXY; // mouse goes out to left/right from pen if (ecx < getAbsoluteLeft(pen)+Math.round(pen.offsetWidth/2) && pen.nowX == pen.minX) return; if (ecx > getAbsoluteLeft(pen)+Math.round(pen.offsetWidth/2) && pen.nowX == pen.maxX) return; pen.newNowX = pen.nowX + ofst; if (pen.newNowX < pen.minX) pen.newNowX = pen.minX; if (pen.newNowX > pen.maxX) pen.newNowX = pen.maxX; pen.nowX = pen.newNowX; pen.style.left = pen.nowX+"px"; pen.initXY = ecx; pen.newValueNow = Math.round((pen.valueMax-pen.valueMin)*(pen.newNowX-pen.minX)/(pen.maxX-pen.minX)+pen.valueMin); if (label.tip != "") { label.innerHTML = label.tip.replace(/%v/gi, pen.newValueNow); label.style.left = Math.round(getAbsoluteLeft(pen)+pen.offsetWidth/2-label.offsetWidth/2)+"px"; label.style.top = getAbsoluteTop(pen)-label.offsetHeight-3+"px"; } e.cancelBubble = true; e.returnValue = false; return false; } this.pen._doOnMouseMoveEnd = function() { if (!pen.allowMove) return; pen.className = "sl_pen"; pen.allowMove = false; pen.nowX = pen.newNowX; pen.valueNow = pen.newValueNow; if (label.tip != "") label.style.display = "none"; that.callEvent("onValueChange", [self.obj.idd.replace(that.idPrefix, ""), pen.valueNow]); } if (that._isIPad) { document.addEventListener("touchmove", pen._doOnMouseMoveStart, false); document.addEventListener("touchend", pen._doOnMouseMoveEnd, false); } else { if (_isIE) { document.body.attachEvent("onmousemove", pen._doOnMouseMoveStart); document.body.attachEvent("onmouseup", pen._doOnMouseMoveEnd); } else { window.addEventListener("mousemove", pen._doOnMouseMoveStart, false); window.addEventListener("mouseup", pen._doOnMouseMoveEnd, false); } } // functions this.enableItem = function() { if (this.state) return; this.state = true; this.obj.className = "dhx_toolbar_btn def"; } this.disableItem = function() { if (!this.state) return; this.state = false; this.obj.className = "dhx_toolbar_btn dis"; } this.isEnabled = function() { return this.state; } this.showItem = function() { this.obj.style.display = ""; } this.hideItem = function() { this.obj.style.display = "none"; } this.isVisible = function() { return (this.obj.style.display == ""); } this.setValue = function(value, callEvent) { value = Number(value); if (value < this.pen.valueMin) value = this.pen.valueMin; if (value > this.pen.valueMax) value = this.pen.valueMax; this.pen.valueNow = value; this.pen._definePos(); if (callEvent == true) that.callEvent("onValueChange", [this.obj.idd.replace(that.idPrefix, ""), this.pen.valueNow]); } this.getValue = function() { return this.pen.valueNow; } this.setMinValue = function(value, label) { value = Number(value); if (value > this.pen.valueMax) return; this.obj.childNodes[0].innerHTML = label; this.obj.childNodes[0].style.display = (label.length>0?"":"none"); this.pen.valueMin = value; if (this.pen.valueNow < this.pen.valueMin) this.pen.valueNow = this.pen.valueMin; this.pen._detectLimits(); this.pen._definePos(); } this.setMaxValue = function(value, label) { value = Number(value); if (value < this.pen.valueMin) return; this.obj.childNodes[4].innerHTML = label; this.obj.childNodes[4].style.display = (label.length>0?"":"none"); this.pen.valueMax = value; if (this.pen.valueNow > this.pen.valueMax) this.pen.valueNow = this.pen.valueMax; this.pen._detectLimits(); this.pen._definePos(); } this.getMinValue = function() { var label = this.obj.childNodes[0].innerHTML; var value = this.pen.valueMin; return new Array(value, label); } this.getMaxValue = function() { var label = this.obj.childNodes[4].innerHTML; var value = this.pen.valueMax; return new Array(value, label); } this.setItemToolTipTemplate = function(template) { this.label.tip = template; } this.getItemToolTipTemplate = function() { return this.label.tip; } // return this; } //} dhtmlXToolbarObject.prototype.unload = function() { if (this._isIPad) { document.removeEventListener("touchstart", this._doOnClick, false); } else { if (_isIE) document.body.detachEvent("onclick", this._doOnClick); else window.removeEventListener("click", this._doOnClick, false); } this._doOnClick = null; this.clearAll(); this.objPull = null; if (this._xmlLoader) { this._xmlLoader.destructor(); this._xmlLoader = null; } while (this.base.childNodes.length > 0) this.base.removeChild(this.base.childNodes[0]); this.cont.removeChild(this.base); this.base = null; while (this.cont.childNodes.length > 0) this.cont.removeChild(this.cont.childNodes[0]); this.cont.className = ""; this.cont = null; this.detachAllEvents(); this.tX1 = null; this.tX2 = null; this.tY1 = null; this.tY2 = null; this._isIE6 = null; this._isWebToolbar = null; this.align = null; this.anyUsed = null; this.idPrefix = null; this.imagePath = null; this.rootTypes = null; this.selectPolygonOffsetLeft = null; this.selectPolygonOffsetTop = null; this.skin = null; this._rtl = null; this._rtlParseBtn = null; this.setRTL = null; this._sbw = null; this._getObj = null; this._addImgObj = null; this._setItemImage = null; this._clearItemImage = null; this._setItemText = null; this._getItemText = null; this._enableItem = null; this._disableItem = null; this._xmlParser = null; this._doOnLoad = null; this._addItemToStorage = null; this._genStr = null; this._addItem = null; this._getPosition = null; this._setPosition = null; this._getIdByPosition = null; this._separatorObject = null; this._textObject = null; this._buttonObject = null; this._buttonSelectObject = null; this._buttonInputObject = null; this._buttonTwoStateObject = null; this._sliderObject = null; this._autoDetectVisibleArea = null; this._removeItem = null; // this._parseXMLUserData = null; this.setAlign = null; this.setSkin = null; this.setIconsPath = null; this.setIconPath = null; this.loadXML = null; this.loadXMLString = null; this.attachEvent = null; this.callEvent = null; this.checkEvent = null; this.eventCatcher = null; this.detachEvent = null; this.detachAllEvents = null; this.clearAll = null; this.addSpacer = null; this.removeSpacer = null; this.getType = null; this.getTypeExt = null; this.inArray = null; this.getParentId = null; this.addButton = null; this.addText = null; this.addButtonSelect = null; this.addButtonTwoState = null; this.addSeparator = null; this.addSlider = null; this.addInput = null; this.forEachItem = null; this.showItem = null; this.hideItem = null; this.isVisible = null; this.enableItem = null; this.disableItem = null; this.isEnabled = null; this.setItemText = null; this.getItemText = null; this.setItemToolTip = null; this.getItemToolTip = null; this.setItemImage = null; this.setItemImageDis = null; this.clearItemImage = null; this.clearItemImageDis = null; this.setItemState = null; this.getItemState = null; this.setItemToolTipTemplate = null; this.getItemToolTipTemplate = null; this.setValue = null; this.getValue = null; this.setMinValue = null; this.getMinValue = null; this.setMaxValue = null; this.getMaxValue = null; this.setWidth = null; this.getWidth = null; this.getPosition = null; this.setPosition = null; this.removeItem = null; this.addListOption = null; this.removeListOption = null; this.showListOption = null; this.hideListOption = null; this.isListOptionVisible = null; this.enableListOption = null; this.disableListOption = null; this.isListOptionEnabled = null; this.setListOptionPosition = null; this.getListOptionPosition = null; this.setListOptionText = null; this.getListOptionText = null; this.setListOptionToolTip = null; this.getListOptionToolTip = null; this.setListOptionImage = null; this.getListOptionImage = null; this.clearListOptionImage = null; this.forEachListOption = null; this.getAllListOptions = null; this.setListOptionSelected = null; this.getListOptionSelected = null; this.unload = null; this.setUserData = null; this.getUserData = null; this.setMaxOpen = null; this.items = null; }; dhtmlXToolbarObject.prototype._autoDetectVisibleArea = function() { this.tX1 = document.body.scrollLeft; this.tX2 = this.tX1+(window.innerWidth||document.body.clientWidth); this.tY1 = Math.max((_isIE?document.documentElement:document.getElementsByTagName("html")[0]).scrollTop, document.body.scrollTop); this.tY2 = this.tY1+(_isIE?Math.max(document.documentElement.clientHeight||0,document.documentElement.offsetHeight||0,document.body.clientHeight||0):window.innerHeight); }; // user data start dhtmlXToolbarObject.prototype.setUserData = function(id, name, value) { if (this.objPull[this.idPrefix+id] == null) return; var item = this.objPull[this.idPrefix+id]; if (item.userData == null) item.userData = {}; item.userData[name] = value; }; dhtmlXToolbarObject.prototype.getUserData = function(id, name) { if (this.objPull[this.idPrefix+id] == null) return null; if (this.objPull[this.idPrefix+id].userData == null) return null; if (this.objPull[this.idPrefix+id].userData[name] == null) return null; return this.objPull[this.idPrefix+id].userData[name]; }; // userdata for listed options dhtmlXToolbarObject.prototype._isListOptionExists = function(listId, optionId) { if (this.objPull[this.idPrefix+listId] == null) return false; var item = this.objPull[this.idPrefix+listId]; if (item.type != "buttonSelect") return false; if (item._listOptions[optionId] == null) return false; return true; }; dhtmlXToolbarObject.prototype.setListOptionUserData = function(listId, optionId, name, value) { // is exists? if (!this._isListOptionExists(listId, optionId)) return; // set userdata var opt = this.objPull[this.idPrefix+listId]._listOptions[optionId]; if (opt.userData == null) opt.userData = {}; opt.userData[name] = value; }; dhtmlXToolbarObject.prototype.getListOptionUserData = function(listId, optionId, name) { // is exists? if (!this._isListOptionExists(listId, optionId)) return null; // get userdata var opt = this.objPull[this.idPrefix+listId]._listOptions[optionId]; if (!opt.userData) return null; return (opt.userData[name]?opt.userData[name]:null); }; // user data end //toolbar (function(){ dhtmlx.extend_api("dhtmlXToolbarObject",{ _init:function(obj){ return [obj.parent, obj.skin]; }, icon_path:"setIconsPath", xml:"loadXML", items:"items", align:"setAlign", rtl:"setRTL", skin:"setSkin" },{ items:function(arr){ for (var i=0; i < arr.length; i++) { var item = arr[i]; if (item.type == "button") this.addButton(item.id, null, item.text, item.img, item.img_disabled); if (item.type == "separator") this.addSeparator(item.id, null); if (item.type == "text") this.addText(item.id, null, item.text); if (item.type == "buttonSelect") this.addButtonSelect(item.id, null, item.text, item.options, item.img, item.img_disabled, item.renderSelect, item.openAll, item.maxOpen); if (item.type == "buttonTwoState") this.addButtonTwoState(item.id, null, item.text, item.img, item.img_disabled); if (item.type == "buttonInput") this.addInput(item.id, null, item.text); if (item.type == "slider") this.addSlider(item.id, null, item.length, item.value_min, item.value_max, item.value_now, item.text_min, item.text_max, item.tip_template); // if (item.width) this.setWidth(item.id, item.width); if (item.disabled) this.disableItem(item.id); if (item.tooltip) this.setItemToolTip(item.id, item.tooltip); if (item.pressed === true) this.setItemState(item.id, true); } } }); })(); /** * @desc: a constructor, creates a new dhtmlxMenu object, baseId defines a base object for the top menu level * @param: baseId - id of the html element to which a menu will be attached, in case of a contextual menu - if specified, will used as a contextual zone * @type: public */ function dhtmlXMenuObject(baseId, skin) { var main_self = this; this.addBaseIdAsContextZone = null; this.isDhtmlxMenuObject = true; // skin settings this.skin = (skin!=null?skin:"dhx_skyblue"); this.imagePath = ""; // iframe this._isIE6 = false; if (_isIE) this._isIE6 = (window.XMLHttpRequest==null?true:false); if (baseId == null) { this.base = document.body; } else { var baseObj = (typeof(baseId)=="string"?document.getElementById(baseId):baseId); if (baseObj != null) { this.base = baseObj; if(!this.base.id) this.base.id = (new Date()).valueOf(); while (this.base.childNodes.length > 0) { this.base.removeChild(this.base.childNodes[0]); } this.base.className += " dhtmlxMenu_"+this.skin+"_Middle dir_left"; this.base._autoSkinUpdate = true; // preserv default oncontextmenu for future restorin in case of context menu if (this.base.oncontextmenu) this.base._oldContextMenuHandler = this.base.oncontextmenu; // this.addBaseIdAsContextZone = this.base.id; this.base.onselectstart = function(e) { e = e || event; e.returnValue = false; return false; } this.base.oncontextmenu = function(e) { e = e || event;e.returnValue = false; return false; } } else { this.base = document.body; } } // this.topId = topId; this.topId = "dhxWebMenuTopId"; // if (!this.extendedModule) { // add notify for menu var t = function(){alert(this.i18n.dhxmenuextalert);}; var extMethods = new Array("setItemEnabled", "setItemDisabled", "isItemEnabled", "_changeItemState", "getItemText", "setItemText", "loadFromHTML", "hideItem", "showItem", "isItemHidden", "_changeItemVisible", "setUserData", "getUserData", "setOpenMode", "setWebModeTimeout", "enableDynamicLoading", "_updateLoaderIcon", "getItemImage", "setItemImage", "clearItemImage", "setAutoShowMode", "setAutoHideMode", "setContextMenuHideAllMode", "getContextMenuHideAllMode", "setVisibleArea", "setTooltip", "getTooltip", "setHotKey", "getHotKey", "setItemSelected", "setTopText", "setRTL", "setAlign", "setHref", "clearHref", "getCircuit", "_clearAllSelectedSubItemsInPolygon", "_checkArrowsState", "_addUpArrow", "_addDownArrow", "_removeUpArrow", "_removeDownArrow", "_isArrowExists", "_doScrollUp", "_doScrollDown", "_countPolygonItems", "setOverflowHeight", "_getRadioImgObj", "_setRadioState", "_radioOnClickHandler", "getRadioChecked", "setRadioChecked", "addRadioButton", "_getCheckboxState", "_setCheckboxState", "_readLevel", "_updateCheckboxImage", "_checkboxOnClickHandler", "setCheckboxState", "getCheckboxState", "addCheckbox", "serialize"); for (var q=0; q