dhtmlx = function (obj) {
    for (var a in obj) dhtmlx[a] = obj[a];
    return dhtmlx
};
dhtmlx.extend_api = function (name, map, ext) {
    var t = window[name];
    if (!t) return;
    window[name] = function (obj) {
        if (obj && typeof obj == "object" && !obj.tagName) {
            var that = t.apply(this, (map._init ? map._init(obj) : arguments));
            for (var a in dhtmlx) if (map[a]) this[map[a]](dhtmlx[a]);
            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)
    }
};

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.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;
                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
};
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)) {
        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")
};
dtmlXMLLoaderObject.prototype.loadXMLString = function (xmlString) {
    {
        try {
            var parser = new DOMParser();
            this.xmlDoc = parser.parseFromString(xmlString, "text/xml")
        } catch (e) {
            this.xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
            this.xmlDoc.async = this.async;
            this.xmlDoc["loadXM" + "L"](xmlString)
        }
    };
    this.onloadAction(this.mainObject, null, null, null, this);
    if (this.waitCall) {
        this.waitCall();
        this.waitCall = null
    }
};
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 {
        if (document.implementation && document.implementation.createDocument) {
            this.xmlDoc = document.implementation.createDocument("", "", null);
            this.xmlDoc.onload = new this.waitLoadFunction(this);
            this.xmlDoc.load(filePath);
            return
        } 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))()
};
dtmlXMLLoaderObject.prototype.destructor = function () {
    this.onloadAction = null;
    this.mainObject = null;
    this.xmlDoc = null;
    return null
};
dtmlXMLLoaderObject.prototype.xmlNodeToJSON = function (node) {
    var t = {};
    for (var i = 0; i < node.attributes.length; i++) t[node.attributes[i].name] = node.attributes[i].value;
    t["_tagvalue"] = node.firstChild ? node.firstChild.nodeValue : "";
    for (var i = 0; i < node.childNodes.length; i++) {
        var name = node.childNodes[i].tagName;
        if (name) {
            if (!t[name]) t[name] = [];
            t[name].push(this.xmlNodeToJSON(node.childNodes[i]))
        }
    };
    return t
};

function callerFunction(funcObject, dhtmlObject) {
    this.handler = function (e) {
        if (!e) e = window.event;
        funcObject(e, dhtmlObject);
        return true
    };
    return this.handler
};

function getAbsoluteLeft(htmlObject) {
    return getOffset(htmlObject).left
};

function getAbsoluteTop(htmlObject) {
    return getOffset(htmlObject).top
};

function getOffsetSum(elem) {
    var top = 0,
        left = 0;
    while (elem) {
        top = top + parseInt(elem.offsetTop);
        left = left + parseInt(elem.offsetLeft);
        elem = elem.offsetParent
    };
    return {
        top: top,
        left: left
    }
};

function getOffsetRect(elem) {
    var box = elem.getBoundingClientRect();
    var body = document.body;
    var docElem = document.documentElement;
    var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop;
    var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft;
    var clientTop = docElem.clientTop || body.clientTop || 0;
    var clientLeft = docElem.clientLeft || body.clientLeft || 0;
    var top = box.top + scrollTop - clientTop;
    var left = box.left + scrollLeft - clientLeft;
    return {
        top: Math.round(top),
        left: Math.round(left)
    }
};

function getOffset(elem) {
    if (elem.getBoundingClientRect && !_isChrome) {
        return getOffsetRect(elem)
    } else {
        return getOffsetSum(elem)
    }
};

function convertStringToBoolean(inputString) {
    if (typeof(inputString) == "string") inputString = inputString.toLowerCase();
    switch (inputString) {
    case "1":
    case "true":
    case "yes":
    case "y":
    case 1:
    case true:
        return true;
        break;
    default:
        return false
    }
};

function getUrlSymbol(str) {
    if (str.indexOf("?") != -1) return "&"
    else return "?"
};

function dhtmlDragAndDropObject() {
    if (window.dhtmlDragAndDrop) return window.dhtmlDragAndDrop;
    this.lastLanding = 0;
    this.dragNode = 0;
    this.dragStartNode = 0;
    this.dragStartObject = 0;
    this.tempDOMU = null;
    this.tempDOMM = null;
    this.waitDrag = 0;
    window.dhtmlDragAndDrop = this;
    return this
};
dhtmlDragAndDropObject.prototype.removeDraggableItem = function (htmlNode) {
    htmlNode.onmousedown = null;
    htmlNode.dragStarter = null;
    htmlNode.dragLanding = null
};
dhtmlDragAndDropObject.prototype.addDraggableItem = function (htmlNode, dhtmlObject) {
    htmlNode.onmousedown = this.preCreateDragCopy;
    htmlNode.dragStarter = dhtmlObject;
    this.addDragLanding(htmlNode, dhtmlObject)
};
dhtmlDragAndDropObject.prototype.addDragLanding = function (htmlNode, dhtmlObject) {
    htmlNode.dragLanding = dhtmlObject
};
dhtmlDragAndDropObject.prototype.preCreateDragCopy = function (e) {
    if ((e || event) && (e || event).button == 2) return;
    if (window.dhtmlDragAndDrop.waitDrag) {
        window.dhtmlDragAndDrop.waitDrag = 0;
        document.body.onmouseup = window.dhtmlDragAndDrop.tempDOMU;
        document.body.onmousemove = window.dhtmlDragAndDrop.tempDOMM;
        return false
    };
    window.dhtmlDragAndDrop.waitDrag = 1;
    window.dhtmlDragAndDrop.tempDOMU = document.body.onmouseup;
    window.dhtmlDragAndDrop.tempDOMM = document.body.onmousemove;
    window.dhtmlDragAndDrop.dragStartNode = this;
    window.dhtmlDragAndDrop.dragStartObject = this.dragStarter;
    document.body.onmouseup = window.dhtmlDragAndDrop.preCreateDragCopy;
    document.body.onmousemove = window.dhtmlDragAndDrop.callDrag;
    window.dhtmlDragAndDrop.downtime = new Date().valueOf();
    if ((e) && (e.preventDefault)) {
        e.preventDefault();
        return false
    };
    return false
};
dhtmlDragAndDropObject.prototype.callDrag = function (e) {
    if (!e) e = window.event;
    dragger = window.dhtmlDragAndDrop;
    if ((new Date()).valueOf() - dragger.downtime < 100) return;
    if ((e.button == 0) && (_isIE)) return dragger.stopDrag();
    if (!dragger.dragNode && dragger.waitDrag) {
        dragger.dragNode = dragger.dragStartObject._createDragNode(dragger.dragStartNode, e);
        if (!dragger.dragNode) return dragger.stopDrag();
        dragger.dragNode.onselectstart = function () {
            return false
        };
        dragger.gldragNode = dragger.dragNode;
        document.body.appendChild(dragger.dragNode);
        document.body.onmouseup = dragger.stopDrag;
        dragger.waitDrag = 0;
        dragger.dragNode.pWindow = window;
        dragger.initFrameRoute()
    };
    if (dragger.dragNode.parentNode != window.document.body) {
        var grd = dragger.gldragNode;
        if (dragger.gldragNode.old) grd = dragger.gldragNode.old;
        grd.parentNode.removeChild(grd);
        var oldBody = dragger.dragNode.pWindow;
        if (_isIE) {
            var div = document.createElement("Div");
            div.innerHTML = dragger.dragNode.outerHTML;
            dragger.dragNode = div.childNodes[0]
        } else dragger.dragNode = dragger.dragNode.cloneNode(true);
        dragger.dragNode.pWindow = window;
        dragger.gldragNode.old = dragger.dragNode;
        document.body.appendChild(dragger.dragNode);
        oldBody.dhtmlDragAndDrop.dragNode = dragger.dragNode
    };
    dragger.dragNode.style.left = e.clientX + 15 + (dragger.fx ? dragger.fx * (-1) : 0) + (document.body.scrollLeft || document.documentElement.scrollLeft) + "px";
    dragger.dragNode.style.top = e.clientY + 3 + (dragger.fy ? dragger.fy * (-1) : 0) + (document.body.scrollTop || document.documentElement.scrollTop) + "px";
    if (!e.srcElement) var z = e.target;
    else z = e.srcElement;
    dragger.checkLanding(z, e)
};
dhtmlDragAndDropObject.prototype.calculateFramePosition = function (n) {
    if (window.name) {
        var el = parent.frames[window.name].frameElement.offsetParent;
        var fx = 0;
        var fy = 0;
        while (el) {
            fx += el.offsetLeft;
            fy += el.offsetTop;
            el = el.offsetParent
        };
        if ((parent.dhtmlDragAndDrop)) {
            var ls = parent.dhtmlDragAndDrop.calculateFramePosition(1);
            fx += ls.split('_')[0] * 1;
            fy += ls.split('_')[1] * 1
        };
        if (n) return fx + "_" + fy;
        else this.fx = fx;
        this.fy = fy
    };
    return "0_0"
};
dhtmlDragAndDropObject.prototype.checkLanding = function (htmlObject, e) {
    if ((htmlObject) && (htmlObject.dragLanding)) {
        if (this.lastLanding) this.lastLanding.dragLanding._dragOut(this.lastLanding);
        this.lastLanding = htmlObject;
        this.lastLanding = this.lastLanding.dragLanding._dragIn(this.lastLanding, this.dragStartNode, e.clientX, e.clientY, e);
        this.lastLanding_scr = (_isIE ? e.srcElement : e.target)
    } else {
        if ((htmlObject) && (htmlObject.tagName != "BODY")) this.checkLanding(htmlObject.parentNode, e);
        else {
            if (this.lastLanding) this.lastLanding.dragLanding._dragOut(this.lastLanding, e.clientX, e.clientY, e);
            this.lastLanding = 0;
            if (this._onNotFound) this._onNotFound()
        }
    }
};
dhtmlDragAndDropObject.prototype.stopDrag = function (e, mode) {
    dragger = window.dhtmlDragAndDrop;
    if (!mode) {
        dragger.stopFrameRoute();
        var temp = dragger.lastLanding;
        dragger.lastLanding = null;
        if (temp) temp.dragLanding._drag(dragger.dragStartNode, dragger.dragStartObject, temp, (_isIE ? event.srcElement : e.target))
    };
    dragger.lastLanding = null;
    if ((dragger.dragNode) && (dragger.dragNode.parentNode == document.body)) dragger.dragNode.parentNode.removeChild(dragger.dragNode);
    dragger.dragNode = 0;
    dragger.gldragNode = 0;
    dragger.fx = 0;
    dragger.fy = 0;
    dragger.dragStartNode = 0;
    dragger.dragStartObject = 0;
    document.body.onmouseup = dragger.tempDOMU;
    document.body.onmousemove = dragger.tempDOMM;
    dragger.tempDOMU = null;
    dragger.tempDOMM = null;
    dragger.waitDrag = 0
};
dhtmlDragAndDropObject.prototype.stopFrameRoute = function (win) {
    if (win) window.dhtmlDragAndDrop.stopDrag(1, 1);
    for (var i = 0; i < window.frames.length; i++) {
        try {
            if ((window.frames[i] != win) && (window.frames[i].dhtmlDragAndDrop)) window.frames[i].dhtmlDragAndDrop.stopFrameRoute(window)
        } catch (e) {}
    };
    try {
        if ((parent.dhtmlDragAndDrop) && (parent != window) && (parent != win)) parent.dhtmlDragAndDrop.stopFrameRoute(window)
    } catch (e) {}
};
dhtmlDragAndDropObject.prototype.initFrameRoute = function (win, mode) {
    if (win) {
        window.dhtmlDragAndDrop.preCreateDragCopy();
        window.dhtmlDragAndDrop.dragStartNode = win.dhtmlDragAndDrop.dragStartNode;
        window.dhtmlDragAndDrop.dragStartObject = win.dhtmlDragAndDrop.dragStartObject;
        window.dhtmlDragAndDrop.dragNode = win.dhtmlDragAndDrop.dragNode;
        window.dhtmlDragAndDrop.gldragNode = win.dhtmlDragAndDrop.dragNode;
        window.document.body.onmouseup = window.dhtmlDragAndDrop.stopDrag;
        window.waitDrag = 0;
        if (((!_isIE) && (mode)) && ((!_isFF) || (_FFrv < 1.8))) window.dhtmlDragAndDrop.calculateFramePosition()
    };
    try {
        if ((parent.dhtmlDragAndDrop) && (parent != window) && (parent != win)) parent.dhtmlDragAndDrop.initFrameRoute(window)
    } catch (e) {};
    for (var i = 0; i < window.frames.length; i++) {
        try {
            if ((window.frames[i] != win) && (window.frames[i].dhtmlDragAndDrop)) window.frames[i].dhtmlDragAndDrop.initFrameRoute(window, ((!win || mode) ? 1 : 0))
        } catch (e) {}
    }
};
var _isFF = false;
var _isIE = false;
var _isOpera = false;
var _isKHTML = false;
var _isMacOS = false;
var _isChrome = false;
if (navigator.userAgent.indexOf('Macintosh') != -1) _isMacOS = true;
if (navigator.userAgent.toLowerCase().indexOf('chrome') > -1) _isChrome = true;
if ((navigator.userAgent.indexOf('Safari') != -1) || (navigator.userAgent.indexOf('Konqueror') != -1)) {
    var _KHTMLrv = parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf('Safari') + 7, 5));
    if (_KHTMLrv > 525) {
        _isFF = true;
        var _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
} else {
    _isFF = true;
    var _FFrv = parseFloat(navigator.userAgent.split("rv:")[1])
};
dtmlXMLLoaderObject.prototype.doXPath = function (xpathExp, docObj, namespace, result_type) {
    if (_isKHTML || (!_isIE && !window.XPathResult)) return this.doXPathOpera(xpathExp, docObj);
    if (_isIE) {
        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 {
        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();
dtmlXMLLoaderObject.prototype.doXPathOpera = function (xpathExp, docObj) {
    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)
};
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


    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
};
dhtmlxEventable = function (obj) {
    obj.dhx_SeverCatcherPath = "";
    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))
    };
    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(':');
            this[list[0]].removeEvent(list[1])
        }
    }
};

function dhtmlXAccordionItem() {};

function dhtmlXAccordion(baseId, skin) {
    if (!dhtmlXContainer) {
        alert("dhtmlxcontainer.js is missed on the page");
        return
    };
    var that = this;
    this.skin = (skin != null ? skin : "dhx_skyblue");
    if (baseId == document.body) {
        this._isAccFS = true;
        document.body.className += " dhxacc_fullscreened";
        var contObj = document.createElement("DIV");
        contObj.className = "dhxcont_global_layout_area";
        baseId.appendChild(contObj);
        this.cont = new dhtmlXContainer(baseId);
        this.cont.setContent(contObj);
        baseId.adjustContent(baseId, 0);
        this.base = document.createElement("DIV");
        this.base.className = "dhx_acc_base_" + this.skin;
        this.base.style.overflow = "hidden";
        this.base.style.position = "absolute";
        this._adjustToFullScreen = function () {
            this.base.style.left = "2px";
            this.base.style.top = "2px";
            this.base.style.width = parseInt(contObj.childNodes[0].style.width) - 4 + "px";
            this.base.style.height = parseInt(contObj.childNodes[0].style.height) - 4 + "px"
        };
        this._adjustToFullScreen();
        contObj.childNodes[0].appendChild(this.base);
        this._resizeTM = null;
        this._resizeTMTime = 400;
        this._doOnResize = function () {
            window.clearTimeout(that._resizeTM);
            that._resizeTM = window.setTimeout(function () {
                that._adjustAccordion()
            }, that._resizeTMTime)
        };
        this._adjustAccordion = function () {
            document.body.adjustContent(document.body, 0);
            this._adjustToFullScreen();
            this.setSizes()
        };
        dhtmlxEvent(window, "resize", this._doOnResize)
    } else {
        this.base = (typeof(baseId) == "string" ? document.getElementById(baseId) : baseId);
        this.base.className = "dhx_acc_base_" + this.skin
    };
    this.w = this.base.offsetWidth;
    this.h = this.base.offsetHeight;
    this.skinParams = {
        "standard": {
            "cell_height": 26,
            "cell_space": 1,
            "content_offset": 1
        },
        "dhx_blue": {
            "cell_height": 24,
            "cell_space": 1,
            "content_offset": 1
        },
        "dhx_skyblue": {
            "cell_height": 27,
            "cell_space": -1,
            "content_offset": -1
        },
        "dhx_black": {
            "cell_height": 24,
            "cell_space": 1,
            "content_offset": 1
        },
        "aqua_dark": {
            "cell_height": 22,
            "cell_space": 1,
            "content_offset": 1
        },
        "aqua_orange": {
            "cell_height": 22,
            "cell_space": 1,
            "content_offset": 1
        },
        "aqua_sky": {
            "cell_height": 22,
            "cell_space": 1,
            "content_offset": 1
        },
        "clear_blue": {
            "cell_height": 24,
            "cell_space": 1,
            "content_offset": 1
        },
        "clear_green": {
            "cell_height": 24,
            "cell_space": 1,
            "content_offset": 1
        },
        "clear_silver": {
            "cell_height": 24,
            "cell_space": 1,
            "content_offset": 1
        },
        "modern_black": {
            "cell_height": 29,
            "cell_space": 1,
            "content_offset": 1
        },
        "modern_blue": {
            "cell_height": 29,
            "cell_space": 1,
            "content_offset": 1
        },
        "modern_red": {
            "cell_height": 29,
            "cell_space": 1,
            "content_offset": 1
        }
    };
    this.sk = this.skinParams[this.skin];
    this.setSkinParameters = function (cellSpace, contentOffset) {
        if (!isNaN(cellSpace)) this.sk["cell_space"] = cellSpace;
        if (!isNaN(contentOffset)) this.sk["content_offset"] = contentOffset;
        this._reopenItem()
    };
    this.setSkin = function (skin) {
        if (!this.skinParams[skin]) return;
        this.skin = skin;
        this.sk = this.skinParams[this.skin];
        this.base.className = "dhx_acc_base_" + this.skin + (this._r ? " dhx_acc_rtl" : "");
        for (var a in this.idPull) this.idPull[a].skin = this.skin;
        this._reopenItem()
    };
    this.idPull = {};
    this.opened = null;
    this.cells = function (itemId) {
        if (this.idPull[itemId] == null) {
            return null
        };
        return this.idPull[itemId]
    };
    this.itemH = 90;
    this.multiMode = false;
    this.enableMultiMode = function () {
        var totalItems = 0;
        for (var a in this.idPull) totalItems++;
        if (totalItems == 0) {
            if (!this.userOffset) this.skinParams["dhx_skyblue"]["cell_space"] = 3;
            this.multiMode = true
        }
    };
    this.userOffset = false;
    this.setOffset = function (cellOffset, contentOffset) {
        this.userOffset = true;
        if (!isNaN(cellOffset)) this.skinParams[this.skin]["cell_space"] = cellOffset;
        if (!isNaN(contentOffset)) this.skinParams[this.skin]["content_offset"] = contentOffset;
        this.setSizes()
    };
    this.imagePath = "";
    this.setIconsPath = function (path) {
        this.imagePath = path
    };
    this.addItem = function (itemId, itemText) {
        var item = document.createElement("DIV");
        item.className = "dhx_acc_item";
        item.dir = "ltr";
        item._isAcc = true;
        item.skin = this.skin;
        this.base.appendChild(item);
        if (this.multiMode) item.h = this.itemH;
        var label = document.createElement("DIV");
        label._idd = itemId;
        label.className = "dhx_acc_item_label";
        label.innerHTML = "<span>" + itemText + "</span><div class='dhx_acc_item_label_btmbrd'>&nbsp;</div>" + "<div class='dhx_acc_item_arrow'></div>" + "<div class='dhx_acc_hdr_line_l'></div>" + "<div class='dhx_acc_hdr_line_r'></div>";
        label.onselectstart = function (e) {
            e = e || event;
            e.returnValue = false
        };
        label.onclick = function () {
            if (!that.multiMode && that.idPull[this._idd]._isActive) return;
            if (that.multiMode) {
                if (that.idPull[this._idd]._isActive) {
                    if (that.checkEvent("onBeforeActive")) {
                        if (that.callEvent("onBeforeActive", [this._idd, "close"])) that.closeItem(this._idd, "dhx_accord_outer_event")
                    } else {
                        that.closeItem(this._idd, "dhx_accord_outer_event")
                    }
                } else {
                    if (that.checkEvent("onBeforeActive")) {
                        if (that.callEvent("onBeforeActive", [this._idd, "open"])) that.openItem(this._idd, "dhx_accord_outer_event")
                    } else {
                        that.openItem(this._idd, "dhx_accord_outer_event")
                    }
                };
                return
            };
            if (that.checkEvent("onBeforeActive")) {
                if (that.callEvent("onBeforeActive", [this._idd, "open"])) that.openItem(this._idd, "dhx_accord_outer_event")
            } else {
                that.openItem(this._idd, "dhx_accord_outer_event")
            }
        };
        label.onmouseover = function () {
            this.className = "dhx_acc_item_label dhx_acc_item_lavel_hover"
        };
        label.onmouseout = function () {
            this.className = "dhx_acc_item_label"
        };
        item.appendChild(label);
        var contObj = document.createElement("DIV");
        contObj.className = "dhxcont_global_content_area";
        item.appendChild(contObj);
        var cont = new dhtmlXContainer(item);
        cont.setContent(contObj);
        item.adjustContent(item, this.sk["cell_height"] + this.sk["content_offset"]);
        item._id = itemId;
        this.idPull[itemId] = item;
        item.getId = function () {
            return this._id
        };
        item.setText = function (text) {
            that.setText(this._id, text)
        };
        item.getText = function () {
            return that.getText(this._id)
        };
        item.open = function () {
            that.openItem(this._id)
        };
        item.isOpened = function () {
            return that.isActive(this._id)
        };
        item.close = function () {
            that.closeItem(this._id)
        };
        item.setIcon = function (icon) {
            that.setIcon(this._id, icon)
        };
        item.clearIcon = function () {
            that.clearIcon(this._id)
        };
        item.dock = function () {
            that.dockItem(this._id)
        };
        item.undock = function () {
            that.undockItem(this._id)
        };
        item.show = function () {
            that.showItem(this._id)
        };
        item.hide = function () {
            that.hideItem(this._id)
        };
        item.setHeight = function (height) {
            that.setItemHeight(this._id, height)
        };
        item.moveOnTop = function () {
            that.moveOnTop(this._id)
        };
        item._doOnAttachMenu = function () {
            that._reopenItem()
        };
        item._doOnAttachToolbar = function () {
            that._reopenItem()
        };
        item._doOnAttachStatusBar = function () {
            that._reopenItem()
        };
        this.openItem(itemId);
        return item
    };
    this.openItem = function (itemId, callEvent, reOpenItem) {
        if (this._openBuzy) return;
        if (this._enableOpenEffect && !reOpenItem) {
            if (this.multiMode && this.idPull[itemId]._isActive) return;
            this._openWithEffect(itemId, null, null, null, null, callEvent);
            return
        };
        if (this.multiMode) {
            for (var a in this.idPull) {
                if (this.idPull[a]._isActive || a == itemId) {
                    this.idPull[a].style.height = this.idPull[a].h + "px";
                    this.idPull[a].childNodes[1].style.display = "";
                    this.idPull[a].adjustContent(this.idPull[a], this.sk["cell_height"] + this.sk["content_offset"], null, null, (this.idPull[a] == this._lastVisible() ? 0 : this.sk["cell_space"]));
                    this.idPull[a].updateNestedObjects();
                    this.idPull[a]._isActive = true;
                    this._updateArrows();
                    if (callEvent == "dhx_accord_outer_event" && a == itemId) this.callEvent("onActive", [itemId, true])
                }
            };
            return
        };
        if (itemId) {
            if (this.idPull[itemId]._isActive && !reOpenItem) return
        };
        var h = 0;
        for (var a in this.idPull) {
            this.idPull[a].style.height = this.sk["cell_height"] + (this.idPull[a] != this._lastVisible() && a != itemId ? this.sk["cell_space"] : 0) + "px";
            if (a != itemId) {
                this.idPull[a].childNodes[1].style.display = "none";
                this.idPull[a]._isActive = false;
                h += this.idPull[a].offsetHeight
            }
        };
        h = this.base.offsetHeight - h;
        if (itemId) {
            this.idPull[itemId].style.height = h + "px";
            this.idPull[itemId].childNodes[1].style.display = "";
            this.idPull[itemId].adjustContent(this.idPull[itemId], this.sk["cell_height"] + this.sk["content_offset"], null, null, (this.idPull[itemId] == this._lastVisible() ? 0 : this.sk["cell_space"]));
            this.idPull[itemId].updateNestedObjects();
            this.idPull[itemId]._isActive = true;
            if (callEvent == "dhx_accord_outer_event") this.callEvent("onActive", [itemId, true])
        };
        this._updateArrows();
        return
    };
    this._lastVisible = function () {
        var item = null;
        for (var q = this.base.childNodes.length - 1; q >= 0; q--) if (!this.base.childNodes[q]._isHidden && !item) item = this.base.childNodes[q];
        return item
    };
    this.closeItem = function (itemId, callEvent) {
        if (this.idPull[itemId] == null) return;
        if (!this.idPull[itemId]._isActive) return;
        if (this._openBuzy) return;
        if (this._enableOpenEffect) {
            this._openWithEffect(this.multiMode ? itemId : null, null, null, null, null, callEvent);
            return
        };
        this.idPull[itemId].style.height = this.sk["cell_height"] + (this.idPull[itemId] != this._lastVisible() ? this.sk["cell_space"] : 0) + "px";
        this.idPull[itemId].childNodes[1].style.display = "none";
        this.idPull[itemId]._isActive = false;
        if (callEvent == "dhx_accord_outer_event") this.callEvent("onActive", [itemId, false]);
        this._updateArrows()
    };
    this._updateArrows = function () {
        for (var a in this.idPull) {
            var label = this.idPull[a].childNodes[0];
            var arrow = null;
            for (var q = 0; q < label.childNodes.length; q++) {
                if (String(label.childNodes[q].className).search("dhx_acc_item_arrow") != -1) arrow = label.childNodes[q]
            };
            if (arrow != null) {
                arrow.className = "dhx_acc_item_arrow " + (this.idPull[a]._isActive ? "item_opened" : "item_closed");
                arrow = null
            }
        }
    };
    this.setText = function (itemId, itemText, moveLabel) {
        if (that.idPull[itemId] == null) return;
        var label = that.idPull[itemId].childNodes[0];
        var tObj = null;
        for (var q = 0; q < label.childNodes.length; q++) {
            if (label.childNodes[q].tagName != null) {
                if (String(label.childNodes[q].tagName).toLowerCase() == "span") tObj = label.childNodes[q]
            }
        };
        if (!isNaN(moveLabel)) {
            tObj.style.paddingLeft = moveLabel + "px";
            tObj.style.paddingRight = moveLabel + "px"
        } else {
            tObj.innerHTML = itemText
        }
    };
    this.getText = function (itemId) {
        if (that.idPull[itemId] == null) return;
        var label = that.idPull[itemId].childNodes[0];
        var tObj = null;
        for (var q = 0; q < label.childNodes.length; q++) {
            if (label.childNodes[q].tagName != null) {
                if (String(label.childNodes[q].tagName).toLowerCase() == "span") tObj = label.childNodes[q]
            }
        };
        return tObj.innerHTML
    };
    this._initWindows = function (id) {
        if (!window.dhtmlXWindows) return;
        if (!this.dhxWins) {
            this.dhxWins = new dhtmlXWindows();
            this.dhxWins.setSkin(this.skin);
            this.dhxWins.setImagePath(this.imagePath);
            this.dhxWinsIdPrefix = "";
            if (!id) return
        };
        var idd = this.dhxWinsIdPrefix + id;
        if (!this.dhxWins.window(idd)) {
            var self = this;
            var w1 = this.dhxWins.createWindow(idd, 20, 20, 320, 200);
            w1.setText(this.getText(id));
            w1.button("close").hide();
            w1.attachEvent("onClose", function (win) {
                win.hide()
            });
            w1.addUserButton("dock", 99, "Dock", "dock");
            w1.button("dock").attachEvent("onClick", function (win) {
                self.cells(id).dock()
            })
        } else {
            this.dhxWins.window(idd).show()
        }
    };
    this.dockWindow = function (itemId) {
        if (!this.idPull[itemId]._isUnDocked) return;
        if (!this.dhxWins) return;
        if (!this.dhxWins.window(this.dhxWinsIdPrefix + itemId)) return;
        this.dhxWins.window(this.dhxWinsIdPrefix + itemId).moveContentTo(this.idPull[itemId]);
        this.dhxWins.window(this.dhxWinsIdPrefix + itemId).close();
        this.idPull[itemId]._isUnDocked = false;
        this.showItem(itemId);
        this.callEvent("onDock", [itemId])
    };
    this.undockWindow = function (itemId) {
        if (this.idPull[itemId]._isUnDocked) return;
        this._initWindows(itemId);
        this.idPull[itemId].moveContentTo(this.dhxWins.window(this.dhxWinsIdPrefix + itemId));
        this.idPull[itemId]._isUnDocked = true;
        this.hideItem(itemId);
        this.callEvent("onUnDock", [itemId])
    };
    this.setSizes = function () {
        this._reopenItem()
    };
    this.showItem = function (itemId) {
        if (this.idPull[itemId] == null) return;
        if (!this.idPull[itemId]._isHidden) return;
        if (this.idPull[itemId]._isUnDocked) {
            this.dockItem(itemId);
            return
        };
        this.idPull[itemId].className = "dhx_acc_item";
        this.idPull[itemId]._isHidden = false;
        this._reopenItem()
    };
    this.hideItem = function (itemId) {
        if (this.idPull[itemId] == null) return;
        if (this.idPull[itemId]._isHidden) return;
        this.closeItem(itemId);
        this.idPull[itemId].className = "dhx_acc_item_hidden";
        this.idPull[itemId]._isHidden = true;
        this._reopenItem()
    };
    this._reopenItem = function () {
        var toOpen = null;
        for (var a in this.idPull) if (this.idPull[a]._isActive && !this.idPull[a]._isHidden) toOpen = a;
        this.openItem(toOpen, null, true)
    };
    this.forEachItem = function (handler) {
        for (var a in this.idPull) handler(this.idPull[a])
    };
    this._enableOpenEffect = false;
    this._openStep = 10;
    this._openStepIncrement = 5;
    this._openStepTimeout = 10;
    this._openBuzy = false;
    this.setEffect = function (state) {
        this._enableOpenEffect = (state == true ? true : false)
    };
    this._openWithEffect = function (toOpen, toClose, minH, maxH, step, callEvent) {
        if (this.multiMode) {
            if (!step) {
                this._openBuzy = true;
                step = this._openStep;
                if (this.idPull[toOpen]._isActive) {
                    toClose = toOpen;
                    toOpen = null;
                    minH = this.sk["cell_height"] + (this.idPull[toClose] != this._lastVisible() ? this.sk["cell_space"] : 0);
                    this.idPull[toClose].childNodes[1].style.display = ""
                } else {
                    maxH = this.idPull[toOpen].h;
                    this.idPull[toOpen].childNodes[1].style.display = ""
                }
            };
            var stopOpen = false;
            if (toOpen) {
                var newH = parseInt(this.idPull[toOpen].style.height) + step;
                if (newH > maxH) {
                    newH = maxH;
                    stopOpen = true
                };
                this.idPull[toOpen].style.height = newH + "px"
            };
            if (toClose) {
                var newH = parseInt(this.idPull[toClose].style.height) - step;
                if (newH < minH) {
                    newH = minH;
                    stopOpen = true
                };
                this.idPull[toClose].style.height = newH + "px"
            };
            step += this._openStepIncrement;
            if (stopOpen) {
                if (toOpen) {
                    this.idPull[toOpen].adjustContent(this.idPull[toOpen], this.sk["cell_height"] + this.sk["content_offset"], null, null, (this.idPull[toOpen] == this._lastVisible() ? 0 : this.sk["cell_space"]));
                    this.idPull[toOpen].updateNestedObjects();
                    this.idPull[toOpen]._isActive = true
                };
                if (toClose) {
                    this.idPull[toClose].childNodes[1].style.display = "none";
                    this.idPull[toClose]._isActive = false
                };
                this._updateArrows();
                this._openBuzy = false;
                if (toOpen && callEvent == "dhx_accord_outer_event") this.callEvent("onActive", [toOpen, true]);
                if (toClose && callEvent == "dhx_accord_outer_event") this.callEvent("onActive", [toClose, false])
            } else {
                var that = this;
                window.setTimeout(function () {
                    that._openWithEffect(toOpen, toClose, minH, maxH, step, callEvent)
                }, this._openStepTimeout)
            };
            return
        };
        if (!step) {
            this._openBuzy = true;
            step = this._openStep;
            if (toOpen) this.idPull[toOpen].childNodes[1].style.display = ""
        };
        if (!toClose || !minH || !maxH) {
            minH = 0;
            maxH = 0;
            for (var a in this.idPull) {
                var th = this.sk["cell_height"] + (this.idPull[a] != this._lastVisible() && a != toOpen ? this.sk["cell_space"] : 0);
                if (this.idPull[a]._isActive && toOpen != a) {
                    toClose = a;
                    minH = th
                };
                if (a != toOpen) maxH += th
            };
            maxH = this.base.offsetHeight - maxH
        };
        var stopOpen = false;
        if (toOpen) {
            var ha = parseInt(this.idPull[toOpen].style.height) + step;
            if (ha > maxH) stopOpen = true
        };
        if (toClose) {
            var hb = parseInt(this.idPull[toClose].style.height) - step;
            if (hb < minH) stopOpen = true
        };
        step += this._openStepIncrement;
        if (stopOpen) {
            ha = maxH;
            hb = minH
        };
        if (toClose) this.idPull[toClose].style.height = hb + "px";
        if (toOpen) this.idPull[toOpen].style.height = ha + "px";
        if (stopOpen) {
            if (toClose) {
                this.idPull[toClose].childNodes[1].style.display = "none";
                this.idPull[toClose]._isActive = false
            };
            if (toOpen) {
                this.idPull[toOpen].adjustContent(this.idPull[toOpen], this.sk["cell_height"] + this.sk["content_offset"], null, null, (this.idPull[toOpen] == this._lastVisible() ? 0 : this.sk["cell_space"]));
                this.idPull[toOpen].updateNestedObjects();
                this.idPull[toOpen]._isActive = true
            };
            this._updateArrows();
            this._openBuzy = false;
            if (callEvent == "dhx_accord_outer_event" && toOpen) this.callEvent("onActive", [toOpen, true])
        } else {
            var that = this;
            window.setTimeout(function () {
                that._openWithEffect(toOpen, toClose, minH, maxH, step, callEvent)
            }, this._openStepTimeout)
        }
    };
    this.setActive = function (itemId) {
        this.openItem(itemId)
    };
    this.isActive = function (itemId) {
        return (this.idPull[itemId]._isActive === true ? true : false)
    };
    this.dockItem = function (itemId) {
        this.dockWindow(itemId)
    };
    this.undockItem = function (itemId) {
        this.undockWindow(itemId)
    };
    this.setItemHeight = function (itemId, height) {
        if (!this.multiMode) return;
        if (isNaN(height)) return;
        this.idPull[itemId].h = height;
        this._reopenItem()
    };
    this.setIcon = function (itemId, icon) {
        if (this.idPull[itemId] == null) return;
        var label = this.idPull[itemId].childNodes[0];
        var iconObj = null;
        for (var q = 0; q < label.childNodes.length; q++) {
            if (label.childNodes[q].className == "dhx_acc_item_icon") iconObj = label.childNodes[q]
        };
        if (iconObj == null) {
            iconObj = document.createElement("IMG");
            iconObj.className = "dhx_acc_item_icon";
            label.insertBefore(iconObj, label.childNodes[0]);
            this.setText(itemId, null, 20)
        };
        iconObj.src = this.imagePath + icon
    };
    this.clearIcon = function (itemId) {
        if (this.idPull[itemId] == null) return;
        var label = this.idPull[itemId].childNodes[0];
        var iconObj = null;
        for (var q = 0; q < label.childNodes.length; q++) {
            if (label.childNodes[q].className == "dhx_acc_item_icon") iconObj = label.childNodes[q]
        };
        if (iconObj != null) {
            label.removeChild(iconObj);
            iconObj = null;
            this.setText(itemId, null, 0)
        }
    };
    this.moveOnTop = function (itemId) {
        if (!this.idPull[itemId]) return;
        if (this.base.childNodes.length <= 1) return;
        this.base.insertBefore(this.idPull[itemId], this.base.childNodes[0])
        this.setSizes()
    };
    this.removeItem = function (itemId) {
        var item = this.idPull[itemId];
        var label = item.childNodes[0];
        label.onclick = null;
        label.onmouseover = null;
        label.onmouseout = null;
        label.onselectstart = null;
        label._idd = null;
        label.className = "";
        while (label.childNodes.length > 0) label.removeChild(label.childNodes[0]);
        if (label.parentNode) label.parentNode.removeChild(label);
        label = null;
        item._dhxContDestruct();
        while (item.childNodes.length > 0) item.removeChild(item.childNodes[0]);
        item._dhxContDestruct = null;
        item._doOnAttachMenu = null;
        item._doOnAttachToolbar = null;
        item._doOnAttachStatusBar = null;
        item.clearIcon = null;
        item.close = null;
        item.dock = null;
        item.getId = null;
        item.getText = null;
        item.hide = null;
        item.isOpened = null;
        item.open = null;
        item.setHeight = null;
        item.setIcon = null;
        item.setText = null;
        item.show = null;
        item.undock = null;
        if (item.parentNode) item.parentNode.removeChild(item);
        item = null;
        this.idPull[itemId] = null;
        try {
            delete this.idPull[itemId]
        } catch (e) {}
    };
    this.unload = function () {
        for (var a in this.skinParams) {
            this.skinParams[a] = null;
            try {
                delete this.skinParams[a]
            } catch (e) {}
        };
        this.skinParams = null;
        for (var a in this.idPull) this.removeItem(a);
        this.idPull = null;
        this.sk = null;
        this._initWindows = null;
        this._lastVisible = null;
        this._reopenItem = null;
        this._updateArrows = null;
        this.addItem = null;
        this.attachEvent = null;
        this.callEvent = null;
        this.cells = null;
        this.checkEvent = null;
        this.clearIcon = null;
        this.closeItem = null;
        this.detachEvent = null;
        this.dockItem = null;
        this.dockWindow = null;
        this.enableMultiMode = null;
        this.eventCatcher = null;
        this.forEachItem = null;
        this.getText = null;
        this.h = null;
        this.hideItem = null;
        this.imagePath = null;
        this.isActive = null;
        this.itemH = null;
        this.multiMode = null;
        this.openItem = null;
        this.removeItem = null;
        this.setActive = null;
        this.setEffect = null;
        this.setIcon = null;
        this.setIconsPath = null;
        this.setItemHeight = null;
        this.setOffset = null;
        this.setSizes = null;
        this.setSkin = null;
        this.setSkinParameters = null;
        this.setText = null;
        this.showItem = null;
        this.skin = null;
        this.w = null;
        this.undockItem = null;
        this.undockWindow = null;
        this.undockWindowunload = null;
        this.unload = null;
        this.userOffset = null;
        if (this._isAccFS == true) {
            if (_isIE) {
                window.detachEvent("onresize", this._doOnResize)
            } else {
                window.removeEventListener("resize", this._doOnResize, false)
            };
            this._isAccFS = null;
            this._doOnResize = null;
            this._adjustAccordion = null;
            this._adjustToFullScreen = null;
            this._resizeTM = null;
            this._resizeTMTime = null;
            document.body.className = String(document.body.className).replace("dhxacc_fullscreened", "");
            this.cont.obj._dhxContDestruct();
            if (this.cont.dhxcont.parentNode) this.cont.dhxcont.parentNode.removeChild(this.cont.dhxcont);
            this.cont.dhxcont = null;
            this.cont.setContent = null;
            this.cont = null
        };
        if (this.dhxWins) {
            this.dhxWins.unload();
            this.dhxWins = null
        };
        this.base.className = "";
        this.base = null;
        for (var a in this) try {
            delete this[a]
        } catch (e) {}
    };
    this._initWindows();
    dhtmlxEventable(this);
    return this
};
(function () {
    dhtmlx.extend_api("dhtmlXAccordion", {
        _init: function (obj) {
            return [obj.parent, obj.skin]
        },
        icon_path: "setIconsPath",
        items: "_items",
        effect: "setEffect",
        multi_mode: "enableMultiMode"
    }, {
        _items: function (arr) {
            var toOpen = [];
            var toClose = [];
            for (var i = 0; i < arr.length; i++) {
                var item = arr[i];
                this.addItem(item.id, item.text);
                if (item.img) this.cells(item.id).setIcon(item.img);
                if (item.height) this.cells(item.id).setHeight(item.height);
                if (item.open === true) toOpen[toOpen.length] = item.id;
                if (item.open === false) toClose[toClose.length] = item.id
            };
            for (var q = 0; q < toOpen.length; q++) this.cells(toOpen[q]).open();
            for (var q = 0; q < toClose.length; q++) this.cells(toClose[q]).close()
        }
    })
})();

function dhtmlXContainer(obj) {
    var that = this;
    this.obj = obj;
    this.dhxcont = null;
    this.setContent = function (data) {
        this.dhxcont = data;
        this.dhxcont.innerHTML = "<div id='dhxMainCont' style='position: relative;left: 0px;top: 0px;overflow: hidden;'></div>" + "<div id='dhxContBlocker' class='dhxcont_content_blocker' style='display: none;'></div>";
        this.dhxcont.mainCont = this.dhxcont.childNodes[0];
        this.obj.dhxcont = this.dhxcont
    };
    this.obj._genStr = function (w) {
        var s = "";
        var z = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        for (var q = 0; q < w; q++) {
            s = s + z.charAt(Math.round(Math.random() * z.length))
        };
        return s
    };
    this.obj.setMinContentSize = function (w, h) {
        this._minDataSizeW = w;
        this._minDataSizeH = h
    };
    this.obj.moveContentTo = function (cont) {
        var pref = null;
        if (this.grid) pref = "grid";
        if (this.tree) pref = "tree";
        if (this.tabbar) pref = "tabbar";
        if (this.folders) pref = "folders";
        if (this.layout) pref = "layout";
        if (pref != null) {
            if (pref == "layout" && this._isCell && cont._isWindow) {
                var aDim = this.layout._defineWindowMinDimension(this, true);
                var bDim = cont.getDimension();
                cont.setDimension((aDim[1] > bDim[0] ? aDim[1] : null), (aDim[2] > bDim[1] ? aDim[2] : null))
            };
            if (pref == "tabbar" && cont._isCell) cont.hideHeader();
            cont.attachObject(this[pref + "Id"]);
            cont[pref] = this[pref];
            cont[pref + "Id"] = this[pref + "Id"];
            cont[pref + "Obj"] = this[pref + "Obj"];
            if (pref == "layout") {
                cont.layout._baseWFix = -2;
                cont.layout._baseHFix = -2;
                if (cont._isWindow) cont.attachEvent("_onBeforeTryResize", cont.layout._defineWindowMinDimension)
            };
            this[pref] = null;
            this[pref + "Id"] = null;
            this[pref + "Obj"] = null;
            if (pref == "tabbar" && this._isCell) this.showHeader()
        };
        if (this.menu != null) {
            cont.dhxcont.insertBefore(document.getElementById(this.menuId), cont.dhxcont.childNodes[0]);
            cont.menu = this.menu;
            cont.menuId = this.menuId;
            cont.menuHeight = this.menuHeight;
            this.menu = null;
            this.menuId = null;
            this.menuHeight = null;
            if (this._doOnAttachMenu) this._doOnAttachMenu("unload");
            if (cont._doOnAttachMenu) cont._doOnAttachMenu("move")
        };
        if (this.toolbar != null) {
            cont.dhxcont.insertBefore(document.getElementById(this.toolbarId), cont.dhxcont.childNodes[(cont.menu != null ? 1 : 0)]);
            cont.toolbar = this.toolbar;
            cont.toolbarId = this.toolbarId;
            cont.toolbarHeight = this.toolbarHeight;
            this.toolbar = null;
            this.toolbarId = null;
            this.toolbarHeight = null;
            if (this._doOnAttachToolbar) this._doOnAttachToolbar("unload");
            if (cont._doOnAttachToolbar) cont._doOnAttachToolbar("move")
        };
        if (this.sb != null) {
            cont.dhxcont.insertBefore(document.getElementById(this.sbId), cont.dhxcont.childNodes[cont.dhxcont.childNodes.length - 1]);
            cont.sb = this.sb;
            cont.sbId = this.sbId;
            cont.sbHeight = this.sbHeight;
            this.sb = null;
            this.sbId = null;
            this.sbHeight = null;
            if (this._doOnAttachToolbar) this._doOnAttachToolbar("unload");
            if (cont._doOnAttachToolbar) cont._doOnAttachToolbar("move")
        };
        var objA = this.dhxcont.childNodes[0];
        var objB = cont.dhxcont.childNodes[0];
        while (objA.childNodes.length > 0) objB.appendChild(objA.childNodes[0]);
        cont.updateNestedObjects()
    };
    this.obj.adjustContent = function (parentObj, offsetTop, marginTop, notCalcWidth, offsetBottom) {
        this.dhxcont.style.left = (this._offsetLeft || 0) + "px";
        this.dhxcont.style.top = (this._offsetTop || 0) + offsetTop + "px";
        var cw = parentObj.clientWidth + (this._offsetWidth || 0);
        if (notCalcWidth !== true) this.dhxcont.style.width = Math.max(0, cw) + "px";
        if (notCalcWidth !== true) if (this.dhxcont.offsetWidth > cw) this.dhxcont.style.width = Math.max(0, cw * 2 - this.dhxcont.offsetWidth) + "px";
        var ch = parentObj.clientHeight + (this._offsetHeight || 0);
        this.dhxcont.style.height = Math.max(0, ch - offsetTop) + (marginTop != null ? marginTop : 0) + "px";
        if (this.dhxcont.offsetHeight > ch - offsetTop) this.dhxcont.style.height = Math.max(0, (ch - offsetTop) * 2 - this.dhxcont.offsetHeight) + "px";
        if (offsetBottom) if (!isNaN(offsetBottom)) this.dhxcont.style.height = Math.max(0, parseInt(this.dhxcont.style.height) - offsetBottom) + "px";
        if (this._minDataSizeH != null) {
            if (parseInt(this.dhxcont.style.height) < this._minDataSizeH) this.dhxcont.style.height = this._minDataSizeH + "px"
        };
        if (this._minDataSizeW != null) {
            if (parseInt(this.dhxcont.style.width) < this._minDataSizeW) this.dhxcont.style.width = this._minDataSizeW + "px"
        };
        if (notCalcWidth !== true) {
            this.dhxcont.mainCont.style.width = this.dhxcont.clientWidth + "px";
            if (this.dhxcont.mainCont.offsetWidth > this.dhxcont.clientWidth) this.dhxcont.mainCont.style.width = Math.max(0, this.dhxcont.clientWidth * 2 - this.dhxcont.mainCont.offsetWidth) + "px"
        };
        var menuOffset = (this.menu != null ? (!this.menuHidden ? this.menuHeight : 0) : 0);
        var toolbarOffset = (this.toolbar != null ? (!this.toolbarHidden ? this.toolbarHeight : 0) : 0);
        var statusOffset = (this.sb != null ? (!this.sbHidden ? this.sbHeight : 0) : 0);
        this.dhxcont.mainCont.style.height = this.dhxcont.clientHeight + "px";
        if (this.dhxcont.mainCont.offsetHeight > this.dhxcont.clientHeight) this.dhxcont.mainCont.style.height = Math.max(0, this.dhxcont.clientHeight * 2 - this.dhxcont.mainCont.offsetHeight) + "px";
        this.dhxcont.mainCont.style.height = Math.max(0, parseInt(this.dhxcont.mainCont.style.height) - menuOffset - toolbarOffset - statusOffset) + "px"
    };
    this.obj.coverBlocker = function () {
        return this.dhxcont.childNodes[this.dhxcont.childNodes.length - 1]
    };
    this.obj.showCoverBlocker = function () {
        this.coverBlocker().style.display = ""
    };
    this.obj.hideCoverBlocker = function () {
        this.coverBlocker().style.display = "none"
    };
    this.obj.updateNestedObjects = function () {
        if (this.grid) {
            this.grid.setSizes()
        };
        if (this.tabbar) {
            this.tabbar.adjustOuterSize()
        };
        if (this.folders) {
            this.folders.setSizes()
        };
        if (this.editor) {
            if (!_isIE) this.editor._prepareContent(true);
            this.editor.setSizes()
        };
        if (this.layout) {
            this.layoutObj.style.width = this.dhxcont.mainCont.style.width;
            this.layoutObj.style.height = this.dhxcont.mainCont.style.height;
            if (this._isAcc && this.skin == "dhx_skyblue") {
                this.layoutObj.style.width = parseInt(this.dhxcont.mainCont.style.width) + 2 + "px";
                this.layoutObj.style.height = parseInt(this.dhxcont.mainCont.style.height) + 2 + "px"
            };
            this.layout.setSizes()
        };
        if (this.accordion != null) {
            this.accordionObj.style.width = parseInt(this.dhxcont.mainCont.style.width) + 2 + "px";
            this.accordionObj.style.height = parseInt(this.dhxcont.mainCont.style.height) + 2 + "px";
            this.accordion.setSizes()
        };
        if (this.dockedCell) {
            this.dockedCell.updateNestedObjects()
        }
    };
    this.obj.attachStatusBar = function () {
        var sbObj = document.createElement("DIV");
        if (this._isCell) {
            sbObj.className = "dhxcont_sb_container_layoutcell"
        } else {
            sbObj.className = "dhxcont_sb_container"
        };
        sbObj.id = "sbobj_" + this._genStr(12);
        sbObj.innerHTML = "<div class='dhxcont_statusbar'></div>";
        this.dhxcont.insertBefore(sbObj, this.dhxcont.childNodes[this.dhxcont.childNodes.length - 1]);
        sbObj.setText = function (text) {
            this.childNodes[0].innerHTML = text
        };
        sbObj.getText = function () {
            return this.childNodes[0].innerHTML
        };
        sbObj.onselectstart = function (e) {
            e = e || event;
            e.returnValue = false;
            return false
        };
        this.sb = sbObj;
        this.sbHeight = sbObj.offsetHeight;
        this.sbId = sbObj.id;
        if (this._doOnAttachStatusBar) this._doOnAttachStatusBar("init");
        this.adjust();
        return this.sb
    };
    this.obj.detachStatusBar = function () {
        if (!this.sb) return;
        this.sb.setText = null;
        this.sb.getText = null;
        this.sb.onselectstart = null;
        this.sb.parentNode.removeChild(this.sb);
        this.sb = null;
        this.sbHeight = null;
        this.sbId = null;
        if (this._doOnAttachStatusBar) this._doOnAttachStatusBar("unload")
    };
    this.obj.attachMenu = function () {
        var menuObj = document.createElement("DIV");
        menuObj.style.position = "relative";
        menuObj.style.overflow = "hidden";
        menuObj.id = "dhxmenu_" + this._genStr(12);
        this.dhxcont.insertBefore(menuObj, this.dhxcont.childNodes[0]);
        this.menu = new dhtmlXMenuObject(menuObj.id, this.skin);
        this.menuHeight = menuObj.offsetHeight;
        this.menuId = menuObj.id;
        if (this._doOnAttachMenu) this._doOnAttachMenu("init");
        this.adjust();
        return this.menu
    };
    this.obj.detachMenu = function () {
        if (!this.menu) return;
        var menuObj = document.getElementById(this.menuId);
        this.menu.unload();
        this.menu = null;
        this.menuId = null;
        this.menuHeight = null;
        menuObj.parentNode.removeChild(menuObj);
        menuObj = null;
        if (this._doOnAttachMenu) this._doOnAttachMenu("unload")
    };
    this.obj.attachToolbar = function () {
        var toolbarObj = document.createElement("DIV");
        toolbarObj.style.position = "relative";
        toolbarObj.style.overflow = "hidden";
        toolbarObj.id = "dhxtoolbar_" + this._genStr(12);
        this.dhxcont.insertBefore(toolbarObj, this.dhxcont.childNodes[(this.menu != null ? 1 : 0)]);
        this.toolbar = new dhtmlXToolbarObject(toolbarObj.id, this.skin);
        this.toolbarHeight = toolbarObj.offsetHeight + (this._isLayout && this.skin == "dhx_skyblue" ? 2 : 0);
        this.toolbarId = toolbarObj.id;
        if (this._doOnAttachToolbar) this._doOnAttachToolbar("init");
        this.adjust();
        return this.toolbar
    };
    this.obj.detachToolbar = function () {
        if (!this.toolbar) return;
        var toolbarObj = document.getElementById(this.toolbarId);
        this.toolbar.unload();
        this.toolbar = null;
        this.toolbarId = null;
        this.toolbarHeight = null;
        toolbarObj.parentNode.removeChild(toolbarObj);
        toolbarObj = null;
        if (this._doOnAttachToolbar) this._doOnAttachToolbar("unload")
    };
    this.obj.attachGrid = function () {
        if (this._isWindow && this.skin == "dhx_skyblue") {
            this.dhxcont.mainCont.style.border = "#a4bed4 1px solid";
            this._redraw()
        };
        var obj = document.createElement("DIV");
        obj.id = "dhxGridObj_" + this._genStr(12);
        obj.style.width = "100%";
        obj.style.height = "100%";
        obj.cmp = "grid";
        document.body.appendChild(obj);
        this.attachObject(obj.id);
        this.grid = new dhtmlXGridObject(obj.id);
        this.grid.setSkin(this.skin);
        this.grid.entBox.style.border = "0px solid white";
        this.grid._sizeFix = 0;
        this.gridId = obj.id;
        this.gridObj = obj;
        return this.grid
    };
    this.obj.attachScheduler = function (day, mode) {
        var obj = document.createElement("DIV");
        obj.innerHTML = '<div id="scheduler_here" class="dhx_cal_container" style="width:100%;height:100%;"><div class="dhx_cal_navline"><div class="dhx_cal_prev_button">&nbsp;</div><div class="dhx_cal_next_button">&nbsp;</div><div class="dhx_cal_today_button"></div><div class="dhx_cal_date"></div><div class="dhx_cal_tab" name="day_tab" style="right:204px;"></div><div class="dhx_cal_tab" name="week_tab" style="right:140px;"></div><div class="dhx_cal_tab" name="month_tab" style="right:76px;"></div></div><div class="dhx_cal_header"></div><div class="dhx_cal_data"></div></div>';
        document.body.appendChild(obj.firstChild);
        this.attachObject("scheduler_here");
        this.grid = scheduler;
        scheduler.setSizes = scheduler.update_view;
        scheduler.destructor = function () {};
        scheduler.init("scheduler_here", day, mode);
        return this.grid
    };
    this.obj.attachTree = function (rootId) {
        if (this._isWindow && this.skin == "dhx_skyblue") {
            this.dhxcont.mainCont.style.border = "#a4bed4 1px solid";
            this._redraw()
        };
        var obj = document.createElement("DIV");
        obj.id = "dhxTreeObj_" + this._genStr(12);
        obj.style.width = "100%";
        obj.style.height = "100%";
        obj.cmp = "tree";
        document.body.appendChild(obj);
        this.attachObject(obj.id);
        this.tree = new dhtmlXTreeObject(obj.id, "100%", "100%", (rootId || 0));
        this.tree.setSkin(this.skin);
        this.tree.allTree.childNodes[0].style.marginTop = "2px";
        this.tree.allTree.childNodes[0].style.marginBottom = "2px";
        this.treeId = obj.id;
        this.treeObj = obj;
        return this.tree
    };
    this.obj.attachTabbar = function (mode) {
        if (this._isWindow && this.skin == "dhx_skyblue") {
            this.dhxcont.style.border = "none";
            this.setDimension(this.w, this.h)
        };
        var obj = document.createElement("DIV");
        obj.id = "dhxTabbarObj_" + this._genStr(12);
        obj.style.width = "100%";
        obj.style.height = "100%";
        obj.style.overflow = "hidden";
        obj.cmp = "tabbar";
        document.body.appendChild(obj);
        this.attachObject(obj.id);
        if (this.className == "dhtmlxLayoutSinglePoly") {
            this.hideHeader()
        };
        this.tabbar = new dhtmlXTabBar(obj.id, mode || "top", 20);
        if (!this._isWindow) this.tabbar._s.expand = true;
        this.tabbar.setSkin(this.skin);
        this.tabbar.adjustOuterSize();
        this.tabbarId = obj.id;
        this.tabbarObj = obj;
        return this.tabbar
    };
    this.obj.attachFolders = function () {
        if (this._isWindow && this.skin == "dhx_skyblue") {
            this.dhxcont.mainCont.style.border = "#a4bed4 1px solid";
            this._redraw()
        };
        var obj = document.createElement("DIV");
        obj.id = "dhxFoldersObj_" + this._genStr(12);
        obj.style.width = "100%";
        obj.style.height = "100%";
        obj.style.overflow = "hidden";
        obj.cmp = "folders";
        document.body.appendChild(obj);
        this.attachObject(obj.id);
        this.folders = new dhtmlxFolders(obj.id);
        this.folders.setSizes();
        this.foldersId = obj.id;
        this.foldersObj = obj;
        return this.folders
    };
    this.obj.attachAccordion = function () {
        if (this._isWindow && this.skin == "dhx_skyblue") {
            this.dhxcont.mainCont.style.border = "#a4bed4 1px solid";
            this._redraw()
        };
        var obj = document.createElement("DIV");
        obj.id = "dhxAccordionObj_" + this._genStr(12);
        obj.style.left = "-1px";
        obj.style.top = "-1px";
        obj.style.width = parseInt(this.dhxcont.mainCont.style.width) + 2 + "px";
        obj.style.height = parseInt(this.dhxcont.mainCont.style.height) + 2 + "px";
        obj.style.position = "relative";
        obj.cmp = "accordion";
        document.body.appendChild(obj);
        this.attachObject(obj.id);
        this.accordion = new dhtmlXAccordion(obj.id, this.skin);
        this.accordion.setSizes();
        this.accordionId = obj.id;
        this.accordionObj = obj;
        return this.accordion
    };
    this.obj.attachLayout = function (view, skin) {
        if (this._isCell && this.skin == "dhx_skyblue") {
            this.hideHeader();
            this.dhxcont.style.border = "0px solid white";
            this.adjustContent(this.childNodes[0], 0)
        };
        var obj = document.createElement("DIV");
        obj.id = "dhxLayoutObj_" + this._genStr(12);
        obj.style.overflow = "hidden";
        obj.style.position = "absolute";
        obj.style.left = "0px";
        obj.style.top = "0px";
        obj.style.width = parseInt(this.dhxcont.mainCont.style.width) + "px";
        obj.style.height = parseInt(this.dhxcont.mainCont.style.height) + "px";
        if (this._isAcc && this.skin == "dhx_skyblue") {
            obj.style.left = "-1px";
            obj.style.top = "-1px";
            obj.style.width = parseInt(this.dhxcont.mainCont.style.width) + 2 + "px";
            obj.style.height = parseInt(this.dhxcont.mainCont.style.height) + 2 + "px"
        };
        obj.dhxContExists = true;
        obj.cmp = "layout";
        document.body.appendChild(obj);
        this.attachObject(obj.id);
        this.layout = new dhtmlXLayoutObject(obj, view, this.skin);
        if (this._isWindow) this.attachEvent("_onBeforeTryResize", this.layout._defineWindowMinDimension);
        this.layoutId = obj.id;
        this.layoutObj = obj;
        return this.layout
    };
    this.obj.attachEditor = function (skin) {
        if (this._isWindow && this.skin == "dhx_skyblue") {
            this.dhxcont.mainCont.style.border = "#a4bed4 1px solid";
            this._redraw()
        };
        var obj = document.createElement("DIV");
        obj.id = "dhxEditorObj_" + this._genStr(12);
        obj.style.position = "relative";
        obj.style.display = "none";
        obj.style.overflow = "hidden";
        obj.style.width = "100%";
        obj.style.height = "100%";
        obj.cmp = "editor";
        document.body.appendChild(obj);
        this.attachObject(obj.id);
        this.editor = new dhtmlXEditor(obj.id, this.skin);
        this.editorId = obj.id;
        this.editorObj = obj;
        return this.editor
    };
    this.obj.attachObject = function (obj, autoSize) {
        if (typeof(obj) == "string") obj = document.getElementById(obj);
        if (autoSize) {
            obj.style.visibility = "hidden";
            obj.style.display = "";
            var objW = obj.offsetWidth;
            var objH = obj.offsetHeight
        };
        this._attachContent("obj", obj);
        if (autoSize && this._isWindow) {
            obj.style.visibility = "visible";
            this._adjustToContent(objW, objH)
        }
    };
    this.obj.detachObject = function (remove) {
        var pref = null;
        if (this.tree) pref = "tree";
        if (this.grid) pref = "grid";
        if (this.layout) pref = "layout";
        if (this.tabbar) pref = "tabbar";
        if (this.accordion) pref = "accordion";
        if (this.folders) pref = "folders";
        if (pref != null) {
            var objHandler = null;
            var objLink = null;
            if (remove == true) {
                if (this[pref].unload) this[pref].unload();
                if (this[pref].destructor) this[pref].destructor();
                while (this[pref + "Obj"].childNodes.length > 0) this[pref + "Obj"].removeChild(this[pref + "Obj"].childNodes[0])
            } else {
                document.body.appendChild(this[pref + "Obj"]);
                this[pref + "Obj"].style.display = "none";
                objHandler = this[pref];
                objLink = this[pref + "Obj"]
            };
            this[pref] = null;
            this[pref + "Id"] = null;
            this[pref + "Obj"] = null;
            return new Array(objHandler, objLink)
        };
        var objA = this.dhxcont.childNodes[0];
        while (objA.childNodes.length > 0) {
            if (remove == true) {
                objA.removeChild(objA.childNodes[0])
            } else {
                var obj = objA.childNodes[0];
                document.body.appendChild(obj);
                obj.style.display = "none"
            }
        }
    };
    this.obj.appendObject = function (obj) {
        if (typeof(obj) == "string") {
            obj = document.getElementById(obj)
        };
        this._attachContent("obj", obj, true)
    };
    this.obj.attachHTMLString = function (str) {
        this._attachContent("str", str);
        var z = str.match(/<script[^>]*>[^\f]*?<\/script>/g) || [];
        for (var i = 0; i < z.length; i++) {
            var s = z[i].replace(/<([\/]{0,1})script[^>]*>/g, "")
            if (window.execScript) window.execScript(s);
            else window.eval(s)
        }
    };
    this.obj.attachURL = function (url, ajax) {
        this._attachContent((ajax == true ? "urlajax" : "url"), url, false)
    };
    this.obj.adjust = function () {
        if (this.skin == "dhx_skyblue") {
            if (this.menu) {
                if (this._isWindow || this._isLayout) {
                    this.menu._topLevelOffsetLeft = 0;
                    document.getElementById(this.menuId).style.height = "26px";
                    this.menuHeight = document.getElementById(this.menuId).offsetHeight;
                    if (this._doOnAttachMenu) this._doOnAttachMenu("show")
                };
                if (this._isCell) {
                    document.getElementById(this.menuId).className += " in_layoutcell";
                    this.menuHeight = 25
                };
                if (this._isAcc) {
                    document.getElementById(this.menuId).className += " in_acccell";
                    this.menuHeight = 25
                };
                if (this._doOnAttachMenu) this._doOnAttachMenu("adjust")
            };
            if (this.toolbar) {
                if (this._isWindow || this._isLayout) {
                    document.getElementById(this.toolbarId).style.height = "29px";
                    this.toolbarHeight = document.getElementById(this.toolbarId).offsetHeight;
                    if (this._doOnAttachToolbar) this._doOnAttachToolbar("show")
                };
                if (this._isCell) {
                    document.getElementById(this.toolbarId).className += " in_layoutcell"
                };
                if (this._isAcc) {
                    document.getElementById(this.toolbarId).className += " in_acccell"
                }
            }
        }
    };
    this.obj._attachContent = function (type, obj, append) {
        if (append !== true) {
            while (that.dhxcont.mainCont.childNodes.length > 0) {
                that.dhxcont.mainCont.removeChild(that.dhxcont.mainCont.childNodes[0])
            }
        };
        if (type == "url") {
            if (this._isWindow && obj.cmp == null && this.skin == "dhx_skyblue") {
                this.dhxcont.mainCont.style.border = "#a4bed4 1px solid";
                this._redraw()
            };
            var fr = document.createElement("IFRAME");
            fr.frameBorder = 0;
            fr.border = 0;
            fr.style.width = "100%";
            fr.style.height = "100%";
            fr.setAttribute("src", "javascript:false;");
            that.dhxcont.mainCont.appendChild(fr);
            fr.src = obj;
            this._frame = fr;
            if (this._doOnAttachURL) this._doOnAttachURL(true)
        } else if (type == "urlajax") {
            if (this._isWindow && obj.cmp == null && this.skin == "dhx_skyblue") {
                this.dhxcont.mainCont.style.border = "#a4bed4 1px solid";
                this.dhxcont.mainCont.style.backgroundColor = "#FFFFFF";
                this._redraw()
            };
            var t = this;
            var xmlParser = function () {
                t.attachHTMLString(this.xmlDoc.responseText, this);
                if (t._doOnAttachURL) t._doOnAttachURL(false);
                this.destructor()
            };
            var xmlLoader = new dtmlXMLLoaderObject(xmlParser, window);
            xmlLoader.dhxWindowObject = this;
            xmlLoader.loadXML(obj)
        } else if (type == "obj") {
            if (this._isWindow && obj.cmp == null && this.skin == "dhx_skyblue") {
                this.dhxcont.mainCont.style.border = "#a4bed4 1px solid";
                this.dhxcont.mainCont.style.backgroundColor = "#FFFFFF";
                this._redraw()
            };
            that.dhxcont._frame = null;
            that.dhxcont.mainCont.appendChild(obj);
            that.dhxcont.mainCont.style.overflow = (append === true ? "auto" : "hidden");
            obj.style.display = ""
        } else if (type == "str") {
            if (this._isWindow && obj.cmp == null && this.skin == "dhx_skyblue") {
                this.dhxcont.mainCont.style.border = "#a4bed4 1px solid";
                this.dhxcont.mainCont.style.backgroundColor = "#FFFFFF";
                this._redraw()
            };
            that.dhxcont._frame = null;
            that.dhxcont.mainCont.innerHTML = obj
        }
    };
    this.obj.showMenu = function () {
        if (!(this.menu && this.menuId)) return;
        if (document.getElementById(this.menuId).style.display != "none") return;
        this.menuHidden = false;
        if (this._doOnAttachMenu) this._doOnAttachMenu("show");
        document.getElementById(this.menuId).style.display = ""
    };
    this.obj.hideMenu = function () {
        if (!(this.menu && this.menuId)) return;
        if (document.getElementById(this.menuId).style.display == "none") return;
        document.getElementById(this.menuId).style.display = "none";
        this.menuHidden = true;
        if (this._doOnAttachMenu) this._doOnAttachMenu("hide")
    };
    this.obj.showToolbar = function () {
        if (!(this.toolbar && this.toolbarId)) return;
        if (document.getElementById(this.toolbarId).style.display != "none") return;
        this.toolbarHidden = false;
        if (this._doOnAttachToolbar) this._doOnAttachToolbar("show");
        document.getElementById(this.toolbarId).style.display = ""
    };
    this.obj.hideToolbar = function () {
        if (!(this.toolbar && this.toolbarId)) return;
        if (document.getElementById(this.toolbarId).style.display == "none") return;
        this.toolbarHidden = true;
        document.getElementById(this.toolbarId).style.display = "none";
        if (this._doOnAttachToolbar) this._doOnAttachToolbar("hide")
    };
    this.obj.showStatusBar = function () {
        if (!(this.sb && this.sbId)) return;
        if (document.getElementById(this.sbId).style.display != "none") return;
        this.sbHidden = false;
        if (this._doOnAttachStatusBar) this._doOnAttachStatusBar("show");
        document.getElementById(this.sbId).style.display = ""
    };
    this.obj.hideStatusBar = function () {
        if (!(this.sb && this.sbId)) return;
        if (document.getElementById(this.sbId).style.display == "none") return;
        this.sbHidden = true;
        document.getElementById(this.sbId).style.display = "none";
        if (this._doOnAttachStatusBar) this._doOnAttachStatusBar("hide")
    };
    this.obj._dhxContDestruct = function () {
        this.detachMenu();
        this.detachToolbar();
        this.detachStatusBar();
        this.detachObject(true);
        if (this.layout) this.layout.unlaod();
        if (this.accordion) this.accordion.unlaod();
        if (this.grid) this.grid.destructor();
        if (this.tree) this.tree.destructor();
        if (this.tabbar) this.tabbar.destructor();
        this.layout = null;
        this.accordion = null;
        this.grid = null;
        this.tree = null;
        this.tabbar = null;
        this.adjust = null;
        this._genStr = null;
        this.setMinContentSize = null;
        this.moveContentTo = null;
        this.adjustContent = null;
        this.coverBlocker = null;
        this.showCoverBlocker = null;
        this.hideCoverBlocker = null;
        this.updateNestedObjects = null;
        this.attachStatusBar = null;
        this.detachStatusBar = null;
        this.attachMenu = null;
        this.detachMenu = null;
        this.attachToolbar = null;
        this.detachToolbar = null;
        this.attachGrid = this.attachTree = this.attachTabbar = this.attachFolders = this.attachAccordion = this.attachLayout = this.attachEditor = this.attachObject = this.detachObject = this.appendObject = this.attachHTMLString = this.attachURL = this._attachContent = this.attachScheduler = null;
        this.showMenu = null;
        this.hideMenu = null;
        this.showToolbar = null;
        this.hideToolbar = null;
        this.showStatusBar = null;
        this.hideStatusBar = null;
        while (this.dhxcont.mainCont.childNodes.length > 0) this.dhxcont.mainCont.removeChild(this.dhxcont.mainCont.childNodes[0]);
        this.dhxcont.mainCont.innerHTML = "";
        this.dhxcont.mainCont = null;
        try {
            delete this.dhxcont["mainCont"]
        } catch (e) {};
        while (this.dhxcont.childNodes.length > 0) this.dhxcont.removeChild(this.dhxcont.childNodes[0]);
        this.dhxcont.innerHTML = "";
        this.dhxcont = null;
        try {
            delete this["dhxcont"]
        } catch (e) {}
    }
};

function dhtmlxDblCalendarObject(contId, isAutoDraw, options) {
    this.scriptName = 'dhtmlxcalendar.js';
    this.entObj = document.createElement("DIV");
    this.winHeader = null
    this.style = "dhtmlxdblcalendar";
    this.uid = 'sc&dblCal' + Math.round(1000000 * Math.random());
    this.numLoaded = 2;
    this.options = {
        isWinHeader: false,
        headerText: 'dhtmlxDblCalendarObject',
        headerButtons: '',



        isWinDrag: false,
        msgClose: "Close",
        msgMinimize: "Minimize",
        msgToday: "Today",
        msgClear: "Clear"
    };
    if (options) for (x in options) this.options[x] = options[x];
    this.entBox = document.createElement("TABLE");
    this.entBox.cellPadding = "0px";
    this.entBox.cellSpacing = "0px";
    this.entBox.className = this.style;
    this.entObj.appendChild(this.entBox);
    var entRow = this.entBox.insertRow(0);
    var calLeft = entRow.insertCell(0);
    calLeft.style.paddingRight = '2px';
    var calRight = entRow.insertCell(1);
    this.leftCalendar = new dhtmlxCalendarObject(calLeft, false, this.options);
    this.leftCalendar._dblC = this;
    this.leftCalendar.setOnClickHandler(this.doOnCLeftClick);
    this.rightCalendar = new dhtmlxCalendarObject(calRight, false, this.options);
    this.rightCalendar._dblC = this;
    this.rightCalendar.setOnClickHandler(this.doOnCRightClick);
    this.doOnClick = null;
    this.onLanguageLoaded = null;
    this.getPosition = this.leftCalendar.getPosition;
    this.startDrag = this.leftCalendar.startDrag;
    this.stopDrag = this.leftCalendar.stopDrag;
    this.onDrag = this.leftCalendar.onDrag;
    this.drawHeader = this.leftCalendar.drawHeader;
    dhtmlxEventable(this);
    var self = this;
    if (typeof(contId) != 'string') this.con = contId;
    else this.con = document.getElementById(contId);
    if (isAutoDraw) this.draw()
};
dhtmlXDblCalendarObject = dhtmlxDblCalendarObject;
dhtmlxDblCalendarObject.prototype.setHeader = function (isVisible, isDrag, btnsOpt) {
    this.leftCalendar.options.isWinHeader = this.options.isWinHeader = isVisible;
    this.leftCalendar.options.isWinDrag = this.options.isWinDrag = isDrag;
    if (btnsOpt) this.options.headerButtons = this.leftCalendar.options.headerButtons = btnsOpt;
    if (this.isAutoDraw) this.drawHeader()
};
dhtmlxDblCalendarObject.prototype.setYearsRange = function (minYear, maxYear) {
    var cs = [this.leftCalendar, this.rightCalendar];
    for (var ind = 0; ind < cs.length; ind++) {
        cs[ind].options.yearsRange = [parseInt(minYear), parseInt(maxYear)];
        cs[ind].allYears = [];
        for (var i = minYear; i <= maxYear; i++) cs[ind].allYears.push(i)
    }
};
dhtmlxDblCalendarObject.prototype.show = function () {
    this.parent.style.display = 'block'
};
dhtmlxDblCalendarObject.prototype.hide = function () {
    this.parent.style.display = 'none'
};
dhtmlxDblCalendarObject.prototype.createStructure = function () {
    if (this.options.isWinHeader) {
        var headerRow = this.entBox.insertRow(0).insertCell(0);
        headerRow.colSpan = 2;
        headerRow.align = 'right';
        this.winHeader = document.createElement('DIV');
        headerRow.appendChild(this.winHeader)
    };
    this.setParent(this.con)
};
dhtmlxDblCalendarObject.prototype.draw = function () {
    if (!this.parent) this.createStructure();
    this.drawHeader();
    this.leftCalendar.draw();
    this.rightCalendar.draw();
    this.isAutoDraw = true
};
dhtmlxDblCalendarObject.prototype.loadUserLanguage = function (lang, userCBfunction) {
    this.numLoaded = 0;
    if (userCBfunction) this.onLanguageLoaded = userCBfunction;
    this.leftCalendar.loadUserLanguage(lang, this.languageLoaded);
    this.rightCalendar.loadUserLanguage(lang, this.languageLoaded)
};
dhtmlxDblCalendarObject.prototype.languageLoaded = function (status) {
    var self = this._dblC;
    self.numLoaded++;
    if (self.numLoaded == 2) {
        for (param in this.options) self.options[param] = this.options[param];
        if (this.isAutoDraw) self.drawHeader();
        if (self.onLanguageLoaded) self.onLanguageLoaded(status)
    }
};
dhtmlxDblCalendarObject.prototype.setParent = function (newParent) {
    if (newParent) {
        this.parent = newParent;
        this.parent.style.display = 'block';
        this.parent.appendChild(this.entObj)
    }
};
dhtmlxDblCalendarObject.prototype.setOnClickHandler = function (func) {
    this.doOnClick = func
};
dhtmlxDblCalendarObject.prototype.doOnCLeftClick = function (date) {
    date = new Date(date)
    this._dblC.rightCalendar.setSensitive(date, null);
    if (this._dblC.doOnClick) this._dblC.doOnClick(date, this, "left");
    return true
};
dhtmlxDblCalendarObject.prototype.doOnCRightClick = function (date) {
    this._dblC.leftCalendar.setSensitive(null, date);
    if (this._dblC.doOnClick) this._dblC.doOnClick(date, this, "right");
    return true
};
dhtmlxDblCalendarObject.prototype.setSensitive = function () {
    this.rightCalendar.setSensitive(null, this.leftCalendar.date[0]);
    this.leftCalendar.setSensitive(this.rightCalendar.date[0], null)
};
dhtmlxDblCalendarObject.prototype.minimize = function () {
    if (!this.winHeader) return;
    var tr = this.winHeader.parentNode.parentNode.nextSibling;
    tr.parentNode.parentNode.style.width = parseInt(tr.parentNode.parentNode.offsetWidth) + 'px';
    if (tr) tr.style.display = (tr.style.display == 'none') ? 'block' : 'none'
};
dhtmlxDblCalendarObject.prototype.setDate = function (dateFrom, dateTo) {
    this.leftCalendar.setDate(dateFrom);
    this.rightCalendar.setDate(dateTo);
    this.leftCalendar.setSensitive(null, this.rightCalendar.date[0]);
    this.rightCalendar.setSensitive(this.leftCalendar.date[0], null)
};
dhtmlxDblCalendarObject.prototype.setDateFormat = function (format) {
    this.leftCalendar.setDateFormat(format);
    this.rightCalendar.setDateFormat(format)
};
dhtmlxDblCalendarObject.prototype.isVisible = function () {
    return (this.parent.style.display == 'block' ? true : false)
};
dhtmlxDblCalendarObject.prototype.setHolidays = function (dates) {
    this.leftCalendar.setHolidays(dates);
    this.rightCalendar.setHolidays(dates)
};

function dhtmlxCalendarObject(base, isAutoDraw, options) {
    if (typeof(base) == "object" && base.parent) {
        options = {};
        for (i in base) options[i] = base[i]
    };
    this.isAutoDraw = base.autoDraw || isAutoDraw || false;
    this.contId = base.parent || base;
    this.scriptName = 'dhtmlxcalendar.js';
    this.date = [this.cutTime(new Date())];
    this.selDate = [this.cutTime(new Date())];
    this.curDate = this.cutTime(new Date());
    this.entObj = document.createElement("DIV");
    this.monthPan = document.createElement("TABLE");
    this.dlabelPan = document.createElement("TABLE");
    this.daysPan = document.createElement("TABLE");
    this.parent = null;
    this.style = "dhtmlxcalendar";
    this.skinName = dhtmlx.skin || "";
    this.doOnClick = null;
    this.sensitiveFrom = null;
    this.sensitiveTo = null;
    this.insensitiveDates = null;
    this.activeCell = null;
    this.hotCell = null;
    this.winHeader = null
    this.onLanguageLoaded = null;
    this.dragging = false;
    this.minimized = false;
    this.uid = 'sc&Cal' + Math.round(1000000 * Math.random());
    this.holidays = null;
    this.time = false;
    this.daysCells = {};
    this.weekCells = {};
    this.con = [];
    this.conInd = [];
    this.activeCon = null;
    this.activeConInd = 0;
    this.userPosition = false;
    this.useIframe = true;
    this._c = this;
    dhtmlxEventable(this);
    this.options = {
        btnPrev: "&laquo;",
        btnBgPrev: null,
        btnNext: "&raquo;",
        btnBgNext: null,
        yearsRange: [1900, 2100],

        isMonthEditable: false,
        isYearEditable: false,

        isWinHeader: false,
        headerText: 'Calendar header',
        headerButtons: 'TMX',


        isWinDrag: true
    };
    defLeng = {
        langname: 'en-us',
        dateformat: '%Y-%m-%d',
        monthesFNames: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
        monthesSNames: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
        daysFNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
        daysSNames: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
        weekend: [0, 6],
        weekstart: 0,
        msgClose: "Close",
        msgMinimize: "Minimize",
        msgToday: "Today",
        msgClear: "Clear"
    };
    if (!window.dhtmlxCalendarLangModules) window.dhtmlxCalendarLangModules = {};
    window.dhtmlxCalendarLangModules['en-us'] = defLeng;
    if (window.dhtmlxCalendarObjects) window.dhtmlxCalendarObjects.push(this);
    else window.dhtmlxCalendarObjects = [this];
    dhtmlxEvent(document.body, "click", function (ev) {
        for (cal in window.dhtmlxCalendarObjects) {
            if (!isNaN(cal)) {
                var wCal = window.dhtmlxCalendarObjects[cal];
                if (wCal.con[0].nodeName == 'INPUT') wCal.hide()
            }
        }
    });
    for (lg in defLeng) this.options[lg] = defLeng[lg];
    if (options) for (param in options) this.options[param] = options[param];
    this.loadUserLanguage();
    if (options) for (param in options) this.options[param] = options[param];
    this.allYears = Array();
    with(this.options)
    for (var i = yearsRange[0]; i <= yearsRange[1]; i++) this.allYears.push(i);
    if (isAutoDraw !== false) this.draw(options);
    return this
};
dhtmlXCalendarObject = dhtmlxCalendarObject;
dhtmlxCalendarObject.prototype = {
    createStructure: function () {
        var self = this;
        if (!this.entObj.className) this.setSkin(this.skinName);
        this.entObj.style.position = "relative";
        if (this.options.isWinHeader) {
            this.winHeader = document.createElement('DIV');
            this.entObj.appendChild(this.winHeader)
        };
        this.entBox = document.createElement("TABLE");
        this.entBox.className = "entbox";
        with(this.entBox) {
            cellPadding = "0px";
            cellSpacing = "0px";
            width = '100%'
        };
        this.entObj.appendChild(this.entBox);
        var monthBox = this.entBox.insertRow(0).insertCell(0);
        with(this.monthPan) {
            cellPadding = "0px";
            cellSpacing = "0px";
            width = '100%';
            align = 'center'
        };
        this.monthPan.className = "dxcalmonth";
        monthBox.appendChild(this.monthPan);
        var dlabelBox = this.entBox.insertRow(1).insertCell(0);
        dlabelBox.appendChild(this.dlabelPan);
        with(this.dlabelPan) {
            cellPadding = "0px";
            cellSpacing = "0px";
            width = '100%';
            align = 'center'
        };
        this.dlabelPan.className = "dxcaldlabel";
        var daysBox = this.entBox.insertRow(2).insertCell(0);
        daysBox.appendChild(this.daysPan);
        with(this.daysPan) {
            cellPadding = "1px";
            cellSpacing = "0px";
            width = '100%';
            align = 'center'
        };
        if (_isIE || _isKHTML) this.daysPan.className = "dxcaldays_ie";
        else this.daysPan.className = "dxcaldays";
        this.daysPan.onmousemove = function (e) {
            self.doHotKeys(e)
        };
        this.daysPan.onmouseout = function () {
            self.endHotKeys()
        };
        if (typeof(this.contId) != 'string') {
            if (!this.contId.nodeName) {
                for (var i = 0; i < this.contId.length; i++) {
                    this.con[i] = document.getElementById(this.contId[i]);
                    this.selDate[i] = this.cutTime(new Date());
                    this.conInd[this.contId[i]] = i
                }
            } else {
                this.con[0] = this.contId;
                this.conInd[this.contId.id] = 0
            }
        } else {
            this.con[0] = document.getElementById(this.contId);
            this.conInd[this.contId] = 0
        };
        this.activeCon = this.con[0];
        if (this.con[0].nodeName == 'INPUT') {
            var div = document.createElement('DIV');
            with(div.style) {
                position = 'absolute';
                display = 'none';
                zIndex = 101
            };
            this.setParent(div);
            document.body.appendChild(div);
            conOnclick = function (e) {
                if (self.isVisible()) self.hide()
                else {
                    self.activeCon = this;
                    if (this.value) {
                        if (self.time) {
                            var val = this.value.split(" ");
                            self.setFormatedTime(null, val[1]);
                            self.setDate(self.getFormatedDate(val[0]))
                        } else self.setDate(self.getFormatedDate(this.value))
                    };
                    self.show(this.id);
                    self.draw()
                };
                if (this.id != self.activeCon.id) {
                    self.show(this.id);
                    self.draw()
                };
                (e || event).cancelBubble = true
            };
            this.doOnClick = function (date) {
                self.hide();
                self.activeCon.focus();
                return true
            };
            conOnkeydown = function (e) {
                if ((e || window.event).keyCode == 27) self.hide();
                else if ((e || window.event).keyCode == 13) self.show()
            };
            for (i in this.con) {
                this.con[i].onclick = conOnclick;
                this.con[i].onkeydown = conOnkeydown
            }
        } else this.setParent(this.con[0]);
        if (_isIE && this.useIframe) {
            if (this.parent.style.zIndex == 0) {
                this.parent.style.zIndex = 100
            };
            if (this.ifr == undefined && this._dblC == undefined) {
                this.ifr = document.createElement("IFRAME");
                this.ifr.src = "javascript:false;"
                this.ifr.style.position = "absolute";
                this.ifr.style.zIndex = 1;
                this.ifr.frameBorder = "no";
                this.ifr.style.top = getAbsoluteTop(this.entObj) + 'px';
                this.ifr.scrolling = 'no';
                this.ifr.style.display = this.parent.style.display;
                this.ifr.className = this.style + (this.skinName ? '_' : "") + this.skinName + "_ifr";
                this.parent.appendChild(this.ifr)
            }
        };
        this.entObj.onclick = function (e) {
            e = e || event;
            if (e.stopPropagation) e.stopPropagation();
            else e.cancelBubble = true
        };
        if (!this.entObj.className) this.setSkin(this.skinName)
    },


    drawHeader: function () {
        if (this._dblC || !this.options.isWinHeader || !this.winHeader) return
        var self = this;
        while (this.winHeader.hasChildNodes())
        this.winHeader.removeChild(this.winHeader.firstChild);
        this.winHeader.className = 'winHeader';
        this.winHeader.onselectstart = function () {
            return false
        };
        this.headerLabel = document.createElement('div');
        this.headerLabel.className = 'winTitle';
        this.headerLabel.appendChild(document.createTextNode(this.options.headerText));
        this.headerLabel.setAttribute('title', this.options.headerText);
        this.winHeader.appendChild(this.headerLabel);
        if (this.options.isWinDrag) {
            this.winHeader.onmousedown = function (e) {
                self.startDrag(e)
            }
        };
        if (this.options.headerButtons.indexOf('X') >= 0) {
            var btnClose = document.createElement('DIV');
            btnClose.className = 'btn_close';
            btnClose.setAttribute('title', this.options.msgClose);
            btnClose.onmousedown = function (e) {
                (e || event).cancelBubble = true
            };
            btnClose.onclick = function (e) {
                (e || event).cancelBubble = true;
                self.hide()
            };
            this.winHeader.appendChild(btnClose)
        };
        if (this.options.headerButtons.indexOf('M') >= 0) {
            var btnMin = document.createElement('DIV');
            btnMin.className = 'btn_mini';
            btnMin.setAttribute('title', this.options.msgMinimize);
            btnMin.onmousedown = function (e) {
                (e || event).cancelBubble = true
            };
            btnMin.onclick = function (e) {
                this.className = this.className == 'btn_mini' ? 'btn_maxi' : 'btn_mini';
                (e || event).cancelBubble = true;
                self.minimize()
            };
            this.winHeader.appendChild(btnMin)
        };
        if (this.options.headerButtons.indexOf('C') >= 0) {
            var btnClear = document.createElement('DIV');
            btnClear.className = 'btn_clear';
            btnClear.setAttribute('title', this.options.msgClear);
            btnClear.onmousedown = function (e) {
                (e || event).cancelBubble = true
            };
            btnClear.onclick = function (e) {
                (e || event).cancelBubble = true;
                self.activeCon.value = "";
                self.hide()
            };
            this.winHeader.appendChild(btnClear)
        };
        if (this.options.headerButtons.indexOf('T') >= 0) {
            var btnToday = document.createElement('DIV');
            btnToday.className = 'btn_today';
            btnToday.setAttribute('title', this.options.msgToday);
            btnToday.onmousedown = function (e) {
                (e || event).cancelBubble = true
            };
            btnToday.onclick = function (e) {
                (e || event).cancelBubble = true;
                self.setDate(new Date())
            };
            this.winHeader.appendChild(btnToday)
        }
    },


    drawMonth: function () {
        var self = this;
        if (this.monthPan.hasChildNodes()) this.monthPan.removeChild(this.monthPan.firstChild);
        var row = this.monthPan.insertRow(0);
        var cArLeft = row.insertCell(0);
        var cContent = row.insertCell(1);
        var cArRight = row.insertCell(2);
        cArLeft.align = "left";
        cArLeft.className = 'month_btn_left';
        var btnLabel = document.createElement("div");
        btnLabel.innerHTML = " ";
        cArLeft.appendChild(btnLabel);
        cArLeft.onclick = function () {
            self.prevMonth()
        };
        cArLeft.onselectstart = function () {
            return false
        };
        cArRight.align = "right";
        cArRight.className = 'month_btn_right';
        var btnLabel = document.createElement("div");
        btnLabel.innerHTML = " ";
        cArRight.appendChild(btnLabel);
        cArRight.onclick = function () {
            self.nextMonth()
        };
        cArRight.onselectstart = function () {
            return false
        };
        cContent.align = 'center';
        var mHeader = document.createElement("TABLE");
        with(mHeader) {
            cellPadding = "0px";
            cellSpacing = "0px";
            align = "center"
        };
        var mRow = mHeader.insertRow(0);
        var cMonth = mRow.insertCell(0);
        var cComma = mRow.insertCell(1);
        var cYear = mRow.insertCell(2);
        cContent.appendChild(mHeader);
        var date = this.date[0];
        this.planeMonth = document.createElement('DIV');
        this.planeMonth._c = this;
        this.planeMonth.appendChild(document.createTextNode(this.options.monthesFNames[date.getMonth()]));
        this.planeMonth.className = 'planeMonth';
        cMonth.appendChild(this.planeMonth);
        if (this.options.isMonthEditable) {
            this.planeMonth.style.cursor = 'pointer';
            this.editorMonth = new dhtmlxRichSelector({
                nodeBefore: this.planeMonth,
                valueList: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
                titleList: this.options.monthesFNames,
                activeValue: this.options.monthesFNames[date.getMonth()],
                onSelect: this.onMonthSelect,
                isAllowUserValue: false
            });
            this.editorMonth._c = this
        };
        cComma.appendChild(document.createTextNode(","));
        cComma.className = 'comma';
        this.planeYear = document.createElement('DIV');
        this.planeYear._c = this;
        this.planeYear.appendChild(document.createTextNode(date.getFullYear()));
        this.planeYear.className = 'planeYear';
        cYear.appendChild(this.planeYear);
        if (this.options.isYearEditable) {
            this.planeYear.style.cursor = 'pointer';
            this.editorYear = new dhtmlxRichSelector({
                nodeBefore: this.planeYear,
                valueList: this.allYears,
                titleList: this.allYears,
                activeValue: date.getFullYear(),
                onSelect: this.onYearSelect,
                isOrderedList: true,
                isNumbersList: true,
                isAllowUserValue: true
            });
            this.editorYear._c = this
        }
    },


    drawDayLabels: function () {
        var self = this;
        if (!this.dlabelPan.hasChildNodes()) {
            var row = this.dlabelPan.insertRow(-1);
            row.className = "daynames";
            for (var i = 0; i < 7; i++) {
                (this.weekCells[i] = row.insertCell(i)).appendChild(document.createTextNode(this.getDayName(i)))
            }
        } else {
            for (var i = 0; i < 7; i++) this.weekCells[i].childNodes[0].nodeValue = this.getDayName(i)
        }
    },


    drawDays: function () {
        var self = this;
        var row = {},
            cell;
        if (!this.daysPan.hasChildNodes()) {
            for (var weekNumber = 0; weekNumber < 6; weekNumber++) {
                row = this.daysPan.insertRow(-1);
                this.daysCells[weekNumber] = {};
                for (var i = 0; i < 7; i++) {
                    (this.daysCells[weekNumber][i] = row.insertCell(-1)).appendChild(document.createTextNode(""))
                }
            }
        };
        var date = this.date[0],
            tempDate = new Date(date);
        var selectedDate = this.selDate[this.activeConInd].toDateString();
        tempDate.setDate(1);
        var day1 = (tempDate.getDay() - this.options.weekstart) % 7;
        if (day1 <= 0) day1 += 7;
        tempDate.setDate(-day1);
        tempDate.setDate(tempDate.getDate() + 1);
        if (tempDate.getDate() < tempDate.getDay()) tempDate.setMonth(tempDate.getMonth() - 1);
        var curDay = null;
        for (var weekNumber = 0; weekNumber < 6; weekNumber++) {
            for (var i = 0; i < 7; i++) {
                if (curDay == tempDate.getDate()) tempDate.setDate(tempDate.getDate() + 1);
                curDay = tempDate.getDate();
                cell = this.daysCells[weekNumber][i];
                cell.setAttribute('id', this.uid + tempDate.getFullYear() + tempDate.getMonth() + tempDate.getDate());
                cell.childNodes[0].nodeValue = tempDate.getDate();
                cell.thisdate = tempDate.toString();
                cell.className = "thismonth";
                cell.onclick = null;
                if (tempDate.getMonth() != date.getMonth()) cell.className = "othermonth";
                if (this.insensitiveDates) {
                    var c = false;
                    for (var j = 0; j < this.insensitiveDates.length; j++) {
                        var s = /\.|\-/.exec(this.insensitiveDates[j])
                        if (s) var f = (this.insensitiveDates[j].split(s).length == 2 ? '%m' + s + '%d' : '%Y' + s + '%m' + s + '%d');
                        if (s && this.getFormatedDate(f, tempDate) == this.insensitiveDates[j] || tempDate.getDay() == this.insensitiveDates[j]) {
                            this.addClass(cell, "insensitive");
                            tempDate.setDate(tempDate.getDate() + 1);
                            c = true;
                            break
                        }
                    };
                    if (c) continue
                };
                if (this.sensitiveFrom && this.sensitiveFrom instanceof Array) {
                    var c = true;
                    for (var j = 0; j < this.sensitiveFrom.length; j++) {
                        var s = /\.|\-/.exec(this.sensitiveFrom[j]);
                        var f = (this.sensitiveFrom[j].split(s).length == 2 ? '%m' + s + '%d' : '%Y' + s + '%m' + s + '%d');
                        if (this.getFormatedDate(f, tempDate) == this.sensitiveFrom[j]) c = false
                    };
                    if (c) {
                        this.addClass(cell, "insensitive");
                        tempDate.setDate(tempDate.getDate() + 1);
                        continue
                    }
                };
                if ((this.sensitiveFrom && (tempDate.valueOf() < this.sensitiveFrom.valueOf())) || (this.sensitiveTo && (tempDate.valueOf() > this.sensitiveTo.valueOf()))) {
                    this.addClass(cell, "insensitive");
                    tempDate.setDate(tempDate.getDate() + 1);
                    continue
                };
                if (this.isWeekend(i) && tempDate.getMonth() == date.getMonth()) cell.className = "weekend";
                if (tempDate.toDateString() == this.curDate.toDateString()) this.addClass(cell, "current");
                if (tempDate.toDateString() == selectedDate) {
                    this.activeCell = cell;
                    this.addClass(cell, "selected")
                };
                if (this.holidays) for (var j = 0; j < this.holidays.length; j++) {
                    var s = /\.|\-/.exec(this.holidays[j]);
                    var f = (this.holidays[j].split(s).length == 2 ? '%m' + s + '%d' : '%Y' + s + '%m' + s + '%d');
                    if (this.getFormatedDate(f, tempDate) == this.holidays[j]) this.addClass(cell, "holiday")
                };
                cell.onclick = function () {
                    var date = this.thisdate;
                    self.setDate(date);
                    if (!self.doOnClick || self.doOnClick(date)) {
                        self.callEvent("onClick", [date])
                    }
                };
                tempDate.setDate(tempDate.getDate() + 1)
            }
        }
    },


    draw: function () {
        if (!this.parent) this.createStructure();
        var self = this;
        if (this.loadingLanguage) {
            setTimeout(function () {
                self.draw();
                return
            }, 20);
            return
        };
        if (this.winHeader && !this.winHeader.hasChildNodes()) this.drawHeader();
        this.drawMonth();
        this.drawDayLabels();
        this.drawDays();
        this.isAutoDraw = true
    },


    loadUserLanguage: function (language, userCBfunction) {
        if (userCBfunction) this.onLanguageLoaded = userCBfunction;
        if (!language) {
            language = "en-us"
        };
        this.loadingLanguage = language;
        if (!language) {
            this.loadUserLanguageCallback(false);
            return
        };
        if (language == this.options.langname) {
            this.loadUserLanguageCallback(true);
            return
        };
        var __lm = window.dhtmlxCalendarLangModules;
        if (__lm[language]) {
            for (lg in __lm[language]) this.options[lg] = __lm[language][lg];
            this.loadUserLanguageCallback(true);
            return
        };
        var src, path = null;
        var scripts = document.getElementsByTagName('SCRIPT');
        for (var i = 0; i < scripts.length; i++) if (src = scripts[i].getAttribute('src')) if (src.indexOf(this.scriptName) >= 0) {
            path = src.substr(0, src.indexOf(this.scriptName));
            break
        };
        if (path === null) {
            this.loadUserLanguageCallback(false);
            return
        };
        this.options.langname = language;
        var langPath = path + 'lang/' + language + '.js';
        for (var i = 0; i < scripts.length; i++) if (src = scripts[i].getAttribute('src')) if (src == langPath) return;
        var script = document.createElement('SCRIPT');
        script.setAttribute('language', "Java-Script");
        script.setAttribute('type', "text/javascript");
        script.setAttribute('src', langPath);
        document.body.appendChild(script)
    },

    loadUserLanguageCallback: function (status) {
        this.loadingLanguage = null;
        if (this.isAutoDraw) this.draw();
        if (this.onLanguageLoaded && (typeof(this.onLanguageLoaded) == 'function')) this.onLanguageLoaded(status)
    },

    loadLanguageModule: function (langModule) {
        var __c = window.dhtmlxCalendarObjects;
        for (var i = 0; i < __c.length; i++) {
            if (__c[i].loadingLanguage == langModule.langname) {
                for (lg in langModule) __c[i].options[lg] = langModule[lg];
                __c[i].loadUserLanguageCallback(true)
            }
        };
        window.dhtmlxCalendarLangModules[langModule.langname] = langModule
    },



    show: function (conId) {
        this.activeCon = this.con[this._activeConInd(conId)];
        this.parent.style.display = '';
        this.parent.style.visibility = 'hidden';
        if (this.activeCon.nodeName == 'INPUT' && !this.userPosition) {
            if (typeof window.innerWidth == 'number') {
                docWidth = window.innerWidth;
                docHeight = window.innerHeight
            } else {
                docWidth = document.body.offsetWidth;
                docHeight = document.body.offsetHeight
            };
            var aLeft = getAbsoluteLeft(this.activeCon);
            var aTop = getAbsoluteTop(this.activeCon);
            if (aTop + this.parent.offsetHeight > docHeight && this.parent.offsetHeight < aTop) this.parent.style.top = aTop - this.parent.offsetHeight + this.activeCon.offsetHeight + 'px';
            else this.parent.style.top = aTop + 'px';
            if (aLeft + this.parent.offsetWidth + this.activeCon.offsetWidth > docWidth) this.parent.style.left = aLeft + 'px';
            else this.parent.style.left = aLeft + this.activeCon.offsetWidth + 'px'
        };
        if (this.ifr != undefined) {
            this.ifr.style.top = this.entObj.offsetTop + 'px';
            this.ifr.style.left = this.entObj.offsetLeft + 'px';
            this.ifr.style.display = 'block'
        };
        if (this.time && !this.minimized) {
            this.tp.setPosition(getAbsoluteLeft(this.parent) + 30, getAbsoluteTop(this.parent) + 147);
            this.tp.show()
        };
        this.parent.style.visibility = 'visible';
        return this
    },


    hide: function () {
        this.parent.style.display = 'none';
        if (this.ifr != undefined) this.ifr.style.display = 'none';
        if (this.time) this.tp.hide();
        return this
    },


    setDateFormat: function (format) {
        this.options.dateformat = format
    },




    cutTime: function (date) {
        date = new Date(date);
        var ndate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 1, 1);
        return ndate
    },



    setParent: function (newParent) {
        if (newParent) {
            this.parent = newParent;
            this.parent.appendChild(this.entObj)
        }
    },

    setDate: function (date, conId) {
        tmpDate = date;
        conId = this._activeConInd(conId);
        this.activeCon = this.con[conId];
        if (typeof date != "Object") date = this.setFormatedDate(null, tmpDate);
        if (isNaN(date) || date == null) date = new Date(tmpDate);
        if (!isNaN(date)) {
            this.date[conId] = new Date(this.cutTime(date));
            this.selDate[conId] = new Date(this.cutTime(date))
        };
        if (this.isAutoDraw) {
            this.draw()
        };
        if (this.activeCon.nodeName == 'INPUT') this.activeCon.value = this.getFormatedDate(this.options.dateformat, date) + (this.time ? " " + this.getFormatedTime() : "")
    },

    addClass: function (obj, styleName) {
        obj.className += ' ' + styleName
    },


    resetClass: function (obj) {
        obj.className = obj.className.toString().split(' ')[0]
    },

    resetHotClass: function (obj) {
        obj.className = obj.className.toString().replace(/hover/, '')
    },


    setSkin: function (newSkin) {
        this.skinName = newSkin;
        var mode = "";
        mode = (this.minimized ? "_mini" : (this.time ? "_long" : (this.options.isWinHeader ? "_maxi" : "")));
        this.entObj.className = this.style + (newSkin ? '_' + newSkin : '');
        if (mode) this.entObj.className += " " + this.entObj.className + mode;
        if (this.ifr != undefined) {
            this.ifr.className = this.style + (newSkin ? '_' + newSkin : '') + mode + "_ifr"
        };
        if (this.time)(this.isVisible() && !this.minimized) ? this.tp.show() : this.tp.hide()
    },


    getDate: function (conId) {
        return this.selDate[this._activeConInd(conId)].toString()
    },



    nextMonth: function () {
        var date = this.date[0],
            month;
        date.setDate(1);
        date.setMonth(month = date.getMonth() + 1);
        this.callEvent("onChangeMonth", [(month + 1 > 12 ? 1 : month + 1), month || 12]);
        if (this.isAutoDraw) this.draw()
    },


    prevMonth: function () {
        var date = this.date[0],
            month;
        date.setDate(1);
        date.setMonth(month = date.getMonth() - 1);
        this.callEvent("onChangeMonth", [month + 1 || 12, month + 2 > 12 ? 1 : (month + 2 || 12)]);
        if (this.isAutoDraw) this.draw()
    },

    setOnClickHandler: function (func) {
        this.attachEvent("onClick", func)
    },



    getFormatedDate: function (dateformat, date, conInd) {
        if (!dateformat) dateformat = this.options.dateformat
        if (!date) date = this.selDate[this._activeConInd(conInd)];
        date = new Date(date);
        var out = '';
        var plain = true;
        for (var i = 0; i < dateformat.length; i++) {
            var replStr = dateformat.substr(i, 1);
            if (plain) {
                if (replStr == '%') {
                    plain = false;
                    continue
                };
                out += replStr
            } else {
                switch (replStr) {
                case 'e':
                    replStr = date.getDate();
                    break;
                case 'd':
                    replStr = date.getDate();
                    if (replStr.toString().length == 1) replStr = '0' + replStr;
                    break;
                case 'j':
                    var x = new Date(date.getFullYear(), 0, 0, 0, 0, 0, 0);
                    replStr = Math.ceil((date.valueOf() - x.valueOf()) / 1000 / 60 / 60 / 24 - 1);
                    while (replStr.toString().length < 3)
                    replStr = '0' + replStr;
                    break;
                case 'a':
                    replStr = this.options.daysSNames[date.getDay()];
                    break;
                case 'W':
                    replStr = this.options.daysFNames[date.getDay()];
                    break;
                case 'c':
                    replStr = 1 + date.getMonth();
                    break;
                case 'm':
                    replStr = 1 + date.getMonth();
                    if (replStr.toString().length == 1) replStr = '0' + replStr;
                    break;
                case 'b':
                    replStr = this.options.monthesSNames[date.getMonth()];
                    break;
                case 'M':
                    replStr = this.options.monthesFNames[date.getMonth()];
                    break;
                case 'y':
                    replStr = date.getFullYear();
                    replStr = replStr.toString().substr(2);
                    break;
                case 'Y':
                    replStr = date.getFullYear()
                };
                out += replStr;
                plain = true
            }
        };
        return out
    },




    setFormatedDate: function (dateformatarg, date, conInd, skip) {
        if (!date || !(typeof date == 'string')) return date;
        if (self.time) {
            self.time.setFormatedTIme(null, date.split(" ")[1]);
            date = date.split(" ")[0]
        };
        if (!dateformatarg) dateformatarg = this.options.dateformat;

        function parseMonth(val) {
            var tmpAr = new Array(this.options.monthesSNames, this.options.monthesFNames);
            for (var j = 0; j < tmpAr.length; j++) {
                for (var i = 0; i < tmpAr[j].length; i++) if (tmpAr[j][i].indexOf(val) == 0) return i
            };
            return -1
        };
        var outputDate = new Date(2008, 0, 1);
        var j = 0;
        for (var i = 0; i < dateformatarg.length; i++) {
            var _char = dateformatarg.charAt(i);
            if (_char == "%") {
                var _cd = dateformatarg.charAt(i + 1);
                var _nextpc = dateformatarg.indexOf("%", i + 1);
                var _nextDelim = dateformatarg.substr(i + 2, _nextpc - i - 1 - 1);
                var _nDelimInDatePos = date.indexOf(_nextDelim, j);
                if (_nextDelim == "") _nDelimInDatePos = date.length
                if (_nDelimInDatePos == -1) return null;
                var value = date.substr(j, _nDelimInDatePos - j);
                if (_cd != 'M' && _cd != 'b') value = parseFloat(value);
                j = _nDelimInDatePos + _nextDelim.length
                switch (_cd) {
                case 'd':
                case 'e':
                    outputDate.setDate(parseFloat(value));
                    break;
                case "c":
                case "m":
                    outputDate.setMonth(parseFloat(value) - 1);
                    break;
                case "M":
                    var val = parseMonth.call(this, value);
                    if (val != -1) outputDate.setMonth(parseFloat(val));
                    else return null;
                    break;
                case "b":
                    var val = parseMonth.call(this, value);
                    if (val != -1) outputDate.setMonth(parseFloat(val));
                    else return null;
                    break;
                case 'Y':
                    outputDate.setFullYear(parseFloat(value));
                    break;
                case 'y':
                    var year = parseFloat(value);
                    outputDate.setFullYear(((year > 20) ? 1900 : 2000) + year);
                    break
                }
            }
        };
        if (isNaN(outputDate)) outputDate = new Date(this.selDate[this._activeConInd]);
        if (skip) return outputDate;
        this.setDate(outputDate, conInd);
        return this.selDate[this.activeConInd]
    },


    isWeekend: function (k) {
        var q = k + this.options.weekstart;
        if (q > 6) q -= 7;
        for (var i = 0; i < this.options.weekend.length; i++) if (this.options.weekend[i] == q) return true;
        return false
    },


    getDayName: function (k) {
        var q = k + this.options.weekstart;
        if (q > 6) q = q - 7;
        return this.options.daysSNames[q]
    },


    isVisible: function () {
        return this.parent.style.display != 'none'
    },
    doHotKeys: function (e) {
        e = e || event;
        var cell = e.target || e.srcElement;
        if (cell.className.toString().indexOf('insensitive') >= 0) {
            this.endHotKeys()
        } else {
            if (this.hotCell) this.resetHotClass(this.hotCell);
            this.addClass(cell, 'hover');
            this.hotCell = cell
        }
    },

    endHotKeys: function () {
        if (this.hotCell) {
            this.resetHotClass(this.hotCell);
            this.hotCell = null
        }
    },
    _activeConInd: function (ind) {
        if (!this.parent) this.createStructure();
        return (this.activeConInd = (this.conInd[ind] == 0 ? '0' : this.conInd[ind]) || (ind == 0 ? '0' : ind) || this.conInd[this.activeCon.id] || 0)
    }
};

function dhtmlxRichSelector(parametres) {
    for (x in parametres) this[x] = parametres[x];
    this.initValue = this.activeValue;
    if (!this.selectorSize) this.selectorSize = 7;
    var self = this;
    this.blurTimer = null;
    this.nodeBefore.onclick = function () {
        self.show()
    };
    this.editor = document.createElement('TEXTAREA');
    this.editor.value = this.activeValue;
    this.editor._s = this;
    this.editor.className = 'dhtmlxRichSelector';
    this.editor.onfocus = this.onFocus;
    this.editor.onblur = this.onBlur;
    this.selector = document.createElement('SELECT');
    this.selector.size = this.selectorSize;
    this.selector.className = 'dhtmlxRichSelector';
    if (this.valueList) for (var i = 0; i < this.valueList.length; i++) this.selector.options[i] = new Option(this.titleList[i], this.valueList[i], false, false);
    this.selector._s = this;
    this.selector.onfocus = this.onFocus;
    this.selector.onblur = this.onBlur;
    this.selector.onclick = function () {
        window.t = self;
        self.onSelect(self.selector.value);
        clearTimeout(self.blurTimer)
    };
    this.selector.getIndexByValue = function (Value, isFull) {
        var Select = this;
        Value = Value.toString().toUpperCase();
        if (!isFull) isFull = false;
        for (var i = 0; i < Select.length; i++) {
            var i_value = Select[i].text.toUpperCase();
            if (isFull) {
                if (i_value == Value) return i
            } else {
                if (i_value.indexOf(Value) == 0) return i
            }
        };
        if (Select._s.isOrderedList) {
            if (Select._s.isNumbersList) if (isNaN(Value)) return -1;
            i_value = Select[0].text.substring(0, Value.length).toUpperCase();
            if (i_value > Value) return 0;
            i_value = Select[Select.length - 1].text.substring(0, Value.length);
            if (i_value < Value) return Select.length - 1
        };
        return -1
    };
    this.con = document.createElement('DIV')
    this.con.className = 'dhtmlxRichSelector';
    with(this.con.style) {
        width = 'auto';
        display = 'none'
    };
    this.con.appendChild(this.editor);
    this.con.appendChild(this.selector);
    this.nodeBefore.parentNode.insertBefore(this.con, this.nodeBefore);
    return this
};
dhtmlxRichSelector.prototype.show = function () {
    this.con.style.display = 'block';
    with(this.selector.style) {
        marginTop = parseInt(this.nodeBefore.offsetHeight) + 'px';
        width = 'auto'
    };
    with(this.editor.style) {
        width = parseInt(this.nodeBefore.offsetWidth) + 15 + 'px';
        height = parseInt(this.nodeBefore.offsetHeight) + 'px'
    };
    this.selector.selectedIndex = this.selector.getIndexByValue(this.activeValue);
    this.editor.focus()
};
dhtmlxRichSelector.prototype.hide = function () {
    this.con.style.display = 'none'
};
dhtmlxRichSelector.prototype.onBlur = function () {
    var self = this._s;
    self.blurTimer = setTimeout(function () {
        if (self.isAllowUserValue) {
            if (self.onSelect(self.editor.value)) self.activeValue = self.editor.value
        } else {
            if (self.onSelect(self.selector.value)) self.activeValue = self.selector.value
        }
    }, 10)
};
dhtmlxRichSelector.prototype.onFocus = function () {
    var self = this._s;
    if (self.blurTimer) {
        clearTimeout(self.blurTimer);
        self.blurTimer = null
    };
    if (this === this._s.selector) self.editor.focus()
};
dhtmlxCalendarObject.prototype.setHeader = function (isVisible, isDrag, btnsOpt) {
    with(this.options) {
        isWinHeader = isVisible;
        isWinDrag = isDrag;
        if (btnsOpt) headerButtons = btnsOpt
    };
    this.setSkin(this.skinName)
};
dhtmlxCalendarObject.prototype.setYearsRange = function (minYear, maxYear) {
    this.options.yearsRange = [parseInt(minYear), parseInt(maxYear)];
    this.allYears = [];
    for (var i = minYear; i <= maxYear; i++) this.allYears.push(i)
};
dhtmlxCalendarObject.prototype.startDrag = function (e) {
    e = e || event;
    if ((e.button === 0) || (e.button === 1)) {
        if (this.dragging) {
            this.stopDrag(e)
        };
        this.drag_mx = e.clientX;
        this.drag_my = e.clientY;
        this.drag_spos = this.getPosition(this.parent);
        document.body.appendChild(this.parent);
        with(this.parent.style) {
            left = this.drag_spos[0] + 'px';
            top = this.drag_spos[1] + 'px';
            margin = '0px';
            position = 'absolute'
        };
        if (this.ifr) {
            this.ifr.style.top = '0px';
            this.ifr.style.left = '0px'
        };
        this.bu_onmousemove = document.body.onmousemove;
        var self = this;
        document.body.onmousemove = function (e) {
            self.onDrag(e)
        };
        this.bu_onmouseup = document.body.onmouseup;
        document.body.onmouseup = function (e) {
            self.stopDrag(e)
        };
        this.dragging = true
    }
};
dhtmlxCalendarObject.prototype.onDrag = function (e) {
    e = e || event;
    if ((e.button === 0) || (e.button === 1)) {
        var delta_x = this.drag_mx - e.clientX;
        var delta_y = this.drag_my - e.clientY;
        this.parent.style.left = this.drag_spos[0] - delta_x + 'px';
        this.parent.style.top = this.drag_spos[1] - delta_y + 'px';
        if (this.time) {
            this.tp.setPosition(getAbsoluteLeft(this.parent) + 30, getAbsoluteTop(this.parent) + 160)
        };
        if (this.ifr != undefined) {
            this.ifr.style.left = 0;
            this.ifr.style.top = 0
        }
    } else {
        this.stopDrag(e)
    }
};
dhtmlxCalendarObject.prototype.stopDrag = function (e) {
    e = e || event;
    document.body.onmouseup = (this.bu_onmouseup === window.undefined) ? null : this.bu_onmouseup;
    document.body.onmousemove = (this.bu_onmousemove === window.undefined) ? null : this.bu_onmousemove;
    this.dragging = false
};
dhtmlxCalendarObject.prototype.minimize = function () {
    if (!this.winHeader) return;
    this.minimized = !this.minimized;
    this.entBox.style.display = (!this.minimized) ? '' : 'none';
    this.setSkin(this.skinName)
};
dhtmlxCalendarObject.prototype.onYearSelect = function (value) {
    if (!isNaN(value)) {
        this._c.date[this._c._activeConInd()].setFullYear(
        Math.min(
        Math.max(
        value, this._c.allYears[0]), this._c.allYears.slice(-1)))
    };
    this._c.draw();
    return (!isNaN(value))
};
dhtmlxCalendarObject.prototype.onMonthSelect = function (value) {
    this._c.date[this._c._activeConInd()].setMonth(value);
    this._c.draw();
    return true
};
dhtmlxCalendarObject.prototype.setPosition = function (argA, argB, argC) {
    if (typeof(argA) == 'object') {
        var posAr = this.getPosition(argA)
        var left = posAr[0] + argA.offsetWidth + (argC || 0);
        var top = posAr[1] + (argB || 0)
    };
    this.parent.style.position = "absolute";
    this.parent.style.top = (top || argA) + "px";
    this.parent.style.left = (left || argB) + "px";
    if (this.ifr != undefined) {
        this.ifr.style.left = '0px';
        this.ifr.style.top = '0px'
    };
    if (this.time) this.tp.setPosition(getAbsoluteLeft(this.parent) + 30, getAbsoluteTop(this.parent) + 160)
};
dhtmlxCalendarObject.prototype.close = function (func) {
    this.hide()
};
dhtmlxCalendarObject.prototype.getPosition = function (oNode, pNode) {
    if (!pNode) var pNode = document.body
    var oCurrentNode = oNode;
    var iLeft = 0;
    var iTop = 0;
    while ((oCurrentNode) && (oCurrentNode != pNode)) {
        iLeft += oCurrentNode.offsetLeft - oCurrentNode.scrollLeft;
        iTop += oCurrentNode.offsetTop - oCurrentNode.scrollTop;
        oCurrentNode = oCurrentNode.offsetParent
    };
    if (pNode == document.body) {
        if (_isIE) {
            if (document.documentElement.scrollTop) iTop += document.documentElement.scrollTop;
            if (document.documentElement.scrollLeft) iLeft += document.documentElement.scrollLeft
        } else if (!_isFF) {
            iLeft += document.body.offsetLeft;
            iTop += document.body.offsetTop
        }
    };
    return new Array(iLeft, iTop)
};
dhtmlxCalendarObject.prototype.setSensitive = function (fromDate, toDate) {
    if (fromDate) if (fromDate instanceof Date) {
        this.sensitiveFrom = this.cutTime(fromDate)
    } else {
        this.sensitiveFrom = fromDate.toString().split(',')
    };
    if (toDate) this.sensitiveTo = this.cutTime(toDate);
    if (this.isAutoDraw) this.draw()
};
dhtmlxCalendarObject.prototype.setHolidays = function (dates) {
    this.holidays = dates.toString().split(",");
    if (this.isAutoDraw) this.draw()
};
dhtmlxCalendarObject.prototype.onChangeMonth = function (func) {
    this.attachEvent("onChangeMonth", func)
};
dhtmlxCalendarObject.prototype.setInsensitiveDates = function (dates) {
    this.insensitiveDates = dates.toString().split(",");
    if (this.isAutoDraw) this.draw()
};
dhtmlxCalendarObject.prototype.enableTime = function (mode) {
    if (this.time = mode) {
        this.tp = new dhtmlXTimePicker();
        this.tp.setPosition(getAbsoluteLeft(this.parent) + 30, getAbsoluteTop(this.parent) + 160);
        for (m in dhtmlXTimePicker.prototype)(function (m) {
            if (!dhtmlxCalendarObject.prototype[m]) dhtmlxCalendarObject.prototype[m] = function () {
                return this.tp[m].apply(this.tp, arguments)
            }
        })(m)
    } else {
        this.tp.entBox.parentNode.removeChild(this.tp.entBox);
        this.tp = null
    };
    this.setSkin(this.skinName)
};
dhtmlxCalendarObject.prototype.setHeaderText = function (text) {
    this.options.headerText = text;
    if (this.headerLabel) {
        this.headerLabel.childNodes[0].nodeValue = text;
        this.headerLabel.setAttribute('title', text)
    }
};
dhtmlxCalendarObject.prototype.disableIESelectFix = function (mode) {
    this.useIframe = !mode;
    if (this.ifr != undefined) {
        this.ifr.parentNode.removeChild(this.ifr);
        this.ifr = null
    }
};
(function () {
    dhtmlx.extend_api("dhtmlxCalendarObject", {
        _init: function (obj) {
            return [obj.parent, obj.draw]
        }
    }, {});
    dhtmlx.extend_api("dhtmlxDblCalendarObject", {
        _init: function (obj) {
            return [obj.parent, obj.draw]
        }
    }, {})
})();

function dhtmlXColorPickerInput(container) {
    if (typeof(container) != "object") container = document.getElementById(container);
    var n = container;
    var cb = n.getAttribute("colorbox");
    var cc = n.getAttribute("customcolors");
    var cs = n.getAttribute("selectonclick");
    var cv = n.getAttribute("fullview");
    var sc = n.getAttribute("selectedcolor");
    var k = n;
    if (cb) {
        var d = document.createElement("DIV");
        d.style.width = n.offsetWidth + "px";
        d.style.height = n.offsetHeight + "px";
        n.style.width = n.offsetWidth - n.offsetHeight - 2;
        n.parentNode.insertBefore(d, n);
        d.style.position = "relative";
        k = document.createElement("DIV");
        d.appendChild(k);
        d.appendChild(n);
        k.className = "cs_colorBox";
        n.className += " cs_colorInput";
        k.style.width = k.style.height = (n.offsetHeight - (document.all ? 0 : 2)) + "px";
        n.style.left = n.offsetHeight + 2 + "px"
    };
    var z2 = new dhtmlXColorPicker(null, cs, cc, true, cv);
    if (sc) z2.setColor(sc);
    z2.linkToObjects = [k, n, n];
    return z2
};

function dhtmlXColorPicker(container, isClickOnly, customColors, hide, fullview) {
    if (document.all) try {
        document.execCommand("BackgroundImageCache", false, true)
    } catch (e) {};
    this._cc = customColors;
    if (!container) {
        container = document.createElement("DIV");
        container.style.position = "absolute";
        document.body.appendChild(container);
        container._dhx_remove = true
    };
    if (typeof(container) != "object") this.container = document.getElementById(container);
    else this.container = container;
    dhtmlxEventable(this);
    this.skinName = dhtmlx.skin || '';
    this.ready = false;
    this.hideOnInit = hide || false;
    this.linkToObjects = [];
    this.imgURL = dhtmlx.image_path || window.dhx_globalImgPath || "";
    this.hideSelfOnSelect = true;
    this.hex = "000000";
    this.h = 100;
    this.s = 0.9;
    this.v = 0.1;
    this.r = 0;
    this.g = 0;
    this.b = 0;
    this.old_hue = 0;
    this.old_sat = 0;
    this.fullview = fullview || false;
    this.customColorsCount = (!this.fullview ? 10 : 8);
    this.language = null;
    this.elements = new Array();
    this.customColors = new Array();
    this.restoreFrom = null;
    if (!this.fullview) {
        this.colorSelectH = 119;
        this.colorSelectW = 209
    } else {
        this.colorSelectH = 255;
        this.colorSelectW = 255
    };
    this.isClickOnly = isClickOnly || false;
    if (window.cs_dechex == null) {
        var hexDigit = new Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f');
        window.cs_dechex = new Array();
        for (var i = 0; i < 256; i++) {
            var retval = hexDigit[i >> 4].toString() + hexDigit[i & 15].toString();
            if (retval.length < 2) retval = '0' + retval;
            window.cs_dechex[i] = retval
        }
    };
    defLeng = {
        langname: 'en-us',
        labelHue: "Hue",
        labelSat: "Sat",
        labelLum: "Lum",
        labelRed: "Red",
        labelGreen: "Green",
        labelBlue: "Blue",
        btnAddColor: "Add to Custom Colors",
        btnSelect: "Select",
        btnCancel: "Cancel"
    };
    if (window.dhtmlxColorPickerObjects) window.dhtmlxColorPickerObjects[window.dhtmlxColorPickerObjects.length] = this;
    else window.dhtmlxColorPickerObjects = [this];
    if (!window.dhtmlxColorPickerLangModules) window.dhtmlxColorPickerLangModules = {};
    window.dhtmlxColorPickerLangModules['en-us'] = defLeng;
    return this
};
dhtmlXColorPicker.prototype.generate = function () {
    X = (document.compatMode != "BackCompat" ? "X" : "");
    if (!this.fullview) {
        var html = "<div class='dhtmlxcolorpicker" + (this.skinName != '' ? '_' + this.skinName : '') + "' csid='cs_Content' style='display:none;'>";
        if ((document.all) && ((this.container.style.position == "absolute"))) html += "<iframe src='" + (this.imgURL || "") + "blank.html' frameBorder='0' style='position:absolute;top:0px;left:0px;width:252px;height:" + (this._cc ? 300 : 244) + "px;z-index:-1;'></iframe>";
        html += "<table cellpadding='0' cellspacing='0'>";
        html += "<tr><td style='width:2px;height:2px;background:url(" + (this.imgURL || "") + "left_top.gif);'></td><td style='height:2px;background:url(" + (this.imgURL || "") + "top.gif);'></td><td style='width:2px;height:2px;background:url(" + (this.imgURL || "") + "right_top.gif);'></td></tr>";
        html += "<tr><td style='width:2px;background:url(" + (this.imgURL || "") + "left.gif);'></td><td style='width:" + (document.all ? 247 : 243) + "px;height:" + (this._cc ? 281 : 240) + "px;'>";
        html += "<table class='cs_ContentTable' csid='cs_ContentTable' cellpadding='0px' cellspacing='0px'>";
        html += "<tr>";
        html += "<td><div class='cs_SelectorDiv_Mini' csid='cs_SelectorDiv'><div class='cs_SelectorVer' csid='cs_SelectorVer' style='left:100px;top:0px;'></div><div class='cs_SelectorHor' csid='cs_SelectorHor' style='left:0px;top:100px;'></div></div></td>";
        html += "<td><div class='cs_LumSelect_Mini' csid='cs_LumSelect'><div csid='cs_LumSelectArrow'></div><div class='cs_LumSelectLine' csid='cs_LumSelectLine' style='left:0px;top:0px;'></div></div></td>";
        html += "</tr>";
        html += "<tr><td style='padding-top:10px;' colspan='2'>";
        html += "<table class='cs_ColorArea_Mini' cellpadding='0px' cellspacing='0px'>";
        html += "<tr><td rowspan='2' valign='top' style='text-align:left;'><div class='cs_EndColor_Mini' csid='cs_EndColor' ></div></td><td>" + this.language.labelHue + ":</td><td><input tabindex='1' class='cs_Input_Mini" + X + "' csid='cs_InputHue' value='' /></td><td>" + this.language.labelRed + ":</td><td><input tabindex='4' class='cs_Input_Mini" + X + "' csid='cs_InputRed' value='' /></td></tr>";
        html += "<tr><td>" + this.language.labelSat + ":</td><td><input tabindex='2' class='cs_Input_Mini" + X + "' csid='cs_InputSat' value='' /></td><td>" + this.language.labelGreen + ":</td><td><input tabindex='4' class='cs_Input_Mini" + X + "' csid='cs_InputGreen' value='' /></td></tr>";
        html += "<tr><td style='vertical-align:top;width:80px;text-align:left;'># <input csid='cs_Hex' class='cs_Hex_Mini" + X + "'></td><td>" + this.language.labelLum + ":</td><td><input tabindex='2' class='cs_Input_Mini" + X + "' csid='cs_InputLum' value='' /></td><td>" + this.language.labelBlue + ":</td><td><input tabindex='4' class='cs_Input_Mini" + X + "' csid='cs_InputBlue' value='' /></td></tr>";
        if (this._cc) {
            html += "<tr><td colspan='6'><input tabindex='7' class='cs_CustomColorAdd_Mini' csid='cs_CustomColorAdd' type='button' value='" + this.language.btnAddColor + "'></td></tr>";
            html += "<tr><td colspan='6'><div class='cs_CustomColors_Mini' csid='cs_CustomColors'></div></td></tr>"
        };
        html += "</table>";
        html += "</td></tr>";
        html += "</table>";
        html += "<table class='cs_ButtonsPanel' cellpadding='0' cellspacing='0' style='width:100%;'><tr><td style='width:100%;'><input tabindex='9' class='cs_ButtonCancel' csid='cs_ButtonCancel' type='button' value='" + this.language.btnCancel + "' /><input tabindex='8' class='cs_ButtonOk' csid='cs_ButtonOk' type='button' value='" + this.language.btnSelect + "' /></td></tr></table>";
        html += "</td><td style='width:2px;background:url(" + (this.imgURL || "") + "right.gif);'></td></tr>";
        html += "<tr><td style='width:2px;height:2px;background:url(" + (this.imgURL || "") + "left_bottom.gif);'></td><td style='height:2px;background:url(" + (this.imgURL || "") + "bottom.gif);'></td><td style='width:2px;height:2px;background:url(" + (this.imgURL || "") + "right_bottom.gif);'></td></tr>";
        html += "</table>";
        html += "</div>"
    } else {
        var html = "<div class='dhtmlxcolorpicker" + (this.skinName != '' ? '_' + this.skinName : '') + "' csid='cs_Content' style='display:none;'>";
        if ((document.all) && ((this.container.style.position == "absolute"))) html += "<iframe src='" + (this.imgURL || "") + "blank.html' style='position:absolute;top:0px;left:0px;width:320px;height:" + (this._cc ? 454 : 407) + "px;z-index:-1;'></iframe>";
        html += "<table cellpadding='0' cellspacing='0'>";
        html += "<tr><td style='width:2px;height:2px;background:url(" + (this.imgURL || "") + "left_top.gif);'></td><td style='height:2px;background:url(" + (this.imgURL || "") + "top.gif);'></td><td style='width:2px;height:2px;background:url(" + (this.imgURL || "") + "right_top.gif);'></td></tr>";
        html += "<tr><td style='width:2px;background:url(" + (this.imgURL || "") + "left.gif);'></td><td style='width:316px;height:" + (this._cc ? 446 : 392) + "px;background:#E6E5E5;'>";
        html += "<table class='cs_ContentTable' csid='cs_ContentTable' cellpadding='0px' cellspacing='0px'>";
        html += "<tr>";
        html += "<td><div class='cs_SelectorDiv' csid='cs_SelectorDiv'><div class='cs_SelectorVer' csid='cs_SelectorVer' style='left:100px;top:0px;'></div><div class='cs_SelectorHor' csid='cs_SelectorHor' style='left:0px;top:100px;'></div></div></td>";
        html += "<td><div class='cs_LumSelect' csid='cs_LumSelect'><div class='cs_LumSelectArrow' csid='cs_LumSelectArrow' style='left:16px;top:124px;'></div><div class='cs_LumSelectLine' csid='cs_LumSelectLine' style='left:0px;top:0px;'></div></div></td>";
        html += "</tr>";
        html += "<tr><td style='padding-top:10px;' colspan='2'>";
        html += "<table class='cs_ColorArea' cellpadding='0px' cellspacing='0px'>";
        html += "<tr><td rowspan='3'><div class='cs_EndColor' csid='cs_EndColor'></div></td><td valign='top' style='text-align:center;width:80px;'># <input csid='cs_Hex' class='cs_Hex'></td><td>" + this.language.labelHue + ":</td><td><input tabindex='1' class='cs_Input' csid='cs_InputHue' value='' /></td><td>" + this.language.labelRed + ":</td><td><input tabindex='4' class='cs_Input' csid='cs_InputRed' value='' /></td></tr>";
        html += "<tr><td></td><td>" + this.language.labelSat + ":</td><td><input tabindex='2' class='cs_Input' csid='cs_InputSat' value='' /></td><td>" + this.language.labelGreen + ":</td><td><input tabindex='4' class='cs_Input' csid='cs_InputGreen' value='' /></td></tr>";
        html += "<tr><td></td><td>" + this.language.labelLum + ":</td><td><input tabindex='2' class='cs_Input' csid='cs_InputLum' value='' /></td><td>" + this.language.labelBlue + ":</td><td><input tabindex='4' class='cs_Input' csid='cs_InputBlue' value='' /></td></tr>";
        if (this._cc) {
            html += "<tr><td>";
            html += "<div class='cs_CustomColors' csid='cs_CustomColors'></div>";
            html += "</td><td></td><td colspan='4' valign='top'><input tabindex='7' class='cs_CustomColorAdd' csid='cs_CustomColorAdd' type='button' value='" + this.language.btnAddColor + "'></td></tr>"
        };
        html += "</table>";
        html += "</td></tr>";
        html += "</table>";
        html += "<table cellpadding='0' cellspacing='0' style='width:100%;'><tr><td style='height:49px;background:url(" + (this.imgURL || "") + "buttons_panel.gif);'><input tabindex='9' class='cs_ButtonCancel' csid='cs_ButtonCancel' type='button' value='" + this.language.btnCancel + "' /><input tabindex='8' class='cs_ButtonOk' csid='cs_ButtonOk' type='button' value='" + this.language.btnSelect + "' /></td></tr></table>";
        html += "</td><td style='width:2px;background:url(" + (this.imgURL || "") + "right.gif);'></td></tr>";
        html += "<tr><td style='width:2px;height:2px;background:url(" + (this.imgURL || "") + "left_bottom.gif);'></td><td style='height:2px;background:url(" + (this.imgURL || "") + "bottom.gif);'></td><td style='width:2px;height:2px;background:url(" + (this.imgURL || "") + "right_bottom.gif);'></td></tr>";
        html += "</table>";
        html += "</div>"
    };
    if (!this.fullview) this.container.style.width = "252px";
    else this.container.style.width = "320px";
    this.container.innerHTML = html;
    this._initCsIdElement();
    if (!this.fullview) this.elements['cs_SelectorDiv'].style.backgroundImage = 'url(' + (this.imgURL || "") + 'colormini.png)';
    else this.elements['cs_SelectorDiv'].style.backgroundImage = 'url(' + (this.imgURL || "") + 'color.png)';
    this.elements['cs_SelectorDiv'].z = this;
    this.elements['cs_LumSelect'].z = this;
    this.elements['cs_LumSelectArrow'].z = this;
    this.z = this;
    this._drawLum();
    this._colorizeLum(this.old_hue, this.old_sat);
    this._initEvents();
    if (this._cc) this._initCustomColors();
    this.ColorNum = 0;
    this.restoreFromHSV();
    this._drawValues()
};
dhtmlXColorPicker.prototype._initCsIdElement = function (obj) {
    if (obj == null) obj = this.container;
    var childs = obj.childNodes;
    var l = childs.length;
    for (var i = 0; i < l; i++) {
        if (childs[i].nodeType == 1) {
            var attr = childs[i].getAttribute('csid');
            if (attr !== null) {
                this.elements[attr] = childs[i]
            };
            if (childs[i].childNodes.length > 0) {
                this._initCsIdElement(childs[i])
            }
        }
    }
};
dhtmlXColorPicker.prototype._initEvents = function () {
    this.elements['cs_SelectorDiv'].onmousedown = this._startMoveColor;
    this.elements['cs_SelectorDiv'].ondblclick = this.clickOk;
    this.elements['cs_LumSelect'].onmousedown = this._startMoveLum;
    this.elements['cs_LumSelect'].ondblclick = this.clickOk;
    this.elements['cs_LumSelectArrow'].onmousedown = this._startMoveLum;
    if (this._cc) {
        this.elements['cs_CustomColorAdd'].z = this;
        this.elements['cs_CustomColorAdd'].onclick = this.addCustomColor;
        this.elements['cs_CustomColorAdd'].onmouseover = this.hoverButton;
        this.elements['cs_CustomColorAdd'].onmouseout = this.normalButton
    };
    var inputs = new Array('cs_InputHue', 'cs_InputRed', 'cs_InputSat', 'cs_InputGreen', 'cs_InputLum', 'cs_InputBlue');
    for (var i = 0; i < inputs.length; i++) {
        this.elements[inputs[i]].z = this;
        this.elements[inputs[i]].onchange = i % 2 ? this._changeValueRGB : this._changeValueHSV
    };
    this.elements['cs_Hex'].z = this;
    this.elements['cs_Hex'].onchange = this._changeValueHEX;
    this.elements['cs_ButtonOk'].z = this;
    this.elements['cs_ButtonOk'].onclick = this.clickOk;
    this.elements['cs_ButtonOk'].onmouseover = this.hoverButton;
    this.elements['cs_ButtonOk'].onmouseout = this.normalButton;
    this.elements['cs_ButtonCancel'].z = this;
    this.elements['cs_ButtonCancel'].onclick = this.clickCancel;
    this.elements['cs_ButtonCancel'].onmouseover = this.hoverButton;
    this.elements['cs_ButtonCancel'].onmouseout = this.normalButton
};
dhtmlXColorPicker.prototype.resetHandlers = function (ev) {};
dhtmlXColorPicker.prototype.clickOk = function (ev) {
    var z = this.z;
    var t = z.getSelectedColor();
    z.callEvent("onSelect", [t[0]]);
    if (z.hideSelfOnSelect) z.hide()
};
dhtmlXColorPicker.prototype.clickCancel = function (ev) {
    var z = this.z;
    z.callEvent("onCancel", []);
    if (this.z.hideSelfOnSelect) this.z.hide()
};
dhtmlXColorPicker.prototype._setCrossPos = function (ev) {
    var z = this.z;
    var offset = z._getOffset(this.elements['cs_SelectorDiv']);
    var y = ev.clientY - offset[0];
    if (y < 0) y = 0;
    else if (y > this.colorSelectH) y = this.colorSelectH;
    var x = ev.clientX - offset[1];
    if (x < 0) x = 0;
    else if (x > this.colorSelectW) x = this.colorSelectW;
    z.elements['cs_SelectorVer'].style.left = x + 'px';
    z.elements['cs_SelectorHor'].style.top = y + 'px';
    var H = x == this.colorSelectW ? 0 : 360 * x / this.colorSelectW;
    var S = 1 - y / this.colorSelectH;
    return [H, S]
};
dhtmlXColorPicker.prototype._getScrollers = function () {
    return ([(document.body.scrollLeft || document.documentElement.scrollLeft), (document.body.scrollTop || document.documentElement.scrollTop)])
};
dhtmlXColorPicker.prototype._setLumPos = function (ev) {
    var z = this.z;
    var offset = z._getOffset(z.elements['cs_LumSelect']);
    var y = ev.clientY - offset[0] - 4;
    if (y < -3) y = -3;
    if (y > this.colorSelectH - 4) y = this.colorSelectH - 4;
    z.elements['cs_LumSelectArrow'].style.top = y + 'px';
    z.elements['cs_LumSelectLine'].style.top = y + 4 + 'px';
    var V = (y + 3) / this.colorSelectH;
    return V
};
dhtmlXColorPicker.prototype._startMoveColor = function (ev) {
    var z = this.z;
    if (ev == null) ev = event;
    z.elements['cs_SelectorDiv'].onmousedown = null;
    z.b_move = document.body.onmousemove;
    z.b_up = document.body.onmouseup;
    var self = z;
    document.body.onmousemove = function (e) {
        if (e == null) e = event;
        self._mouseMoveColor(e)
    };
    document.body.onmouseup = function (e) {
        if (e == null) e = event;
        self._stopMoveColor(e);
        self = null
    };
    z.elements['cs_SelectorDiv'].onmousemove = z._mouseMoveColor;
    z.elements['cs_SelectorDiv'].onmouseup = z._stopMoveColor;
    var HS = z._setCrossPos(ev);
    z.h = HS[0];
    z.s = HS[1];
    var col = z._calculateColor();
    z._colorizeLum(col[0], col[1])
};
dhtmlXColorPicker.prototype._mouseMoveColor = function (ev) {
    var z = this.z;
    if (ev == null) ev = event;
    var HS = z._setCrossPos(ev);
    if (z.isClickOnly) return;
    z.h = HS[0];
    z.s = HS[1];
    var col = z._calculateColor();
    z._colorizeLum(col[0], col[1])
};
dhtmlXColorPicker.prototype._stopMoveColor = function (ev) {
    var z = this.z;
    if (ev == null) ev = event;
    z.elements['cs_SelectorDiv'].onmousedown = z._startMoveColor;
    z.elements['cs_SelectorDiv'].onmousemove = null;
    z.elements['cs_SelectorDiv'].onmouseup = null;
    document.body.onmousemove = z.b_move;
    document.body.onmouseup = z.b_up;
    var HS = z._setCrossPos(ev);
    z.h = HS[0];
    z.s = HS[1];
    var col = z._calculateColor();
    z._colorizeLum(col[0], col[1])
};
dhtmlXColorPicker.prototype._startMoveLum = function (ev) {
    var z = this.z;
    if (ev == null) ev = event;
    z.elements['cs_LumSelect'].onmousedown = null;
    z.elements['cs_LumSelectArrow'].onmousedown = null;
    z.elements['cs_LumSelect'].onmousemove = z._mouseMoveLum;
    z.elements['cs_LumSelect'].onmouseup = z._stopMoveLum;
    z.b_move = document.body.onmousemove;
    z.b_up = document.body.onmouseup;
    z.b_selstart = document.body.onselectstart;
    var self = z;
    document.body.onmousemove = function (e) {
        if (e == null) e = event;
        self._mouseMoveLum(e)
    };
    document.body.onmouseup = function (e) {
        if (e == null) e = event;
        self._stopMoveLum(e);
        self = null
    };
    document.body.onselectstart = function () {
        return false
    };
    z.v = z._setLumPos(ev);
    z._calculateColor()
};
dhtmlXColorPicker.prototype._mouseMoveLum = function (ev) {
    var z = this.z;
    if (ev == null) ev = event;
    z.v = z._setLumPos(ev);
    if (z.isClickOnly) return;
    z._calculateColor()
};
dhtmlXColorPicker.prototype._stopMoveLum = function (ev) {
    var z = this.z;
    if (ev == null) ev = event;
    z.elements['cs_LumSelect'].onmousedown = z._startMoveLum;
    z.elements['cs_LumSelectArrow'].onmousedown = z._startMoveLum;
    z.elements['cs_LumSelect'].onmousemove = null;
    z.elements['cs_LumSelect'].onmouseup = null;
    z.v = z._setLumPos(ev);
    z._calculateColor();
    document.body.onmousemove = z.b_move;
    document.body.onmouseup = z.b_up;
    document.body.onselectstart = z.b_selstart
};
dhtmlXColorPicker.prototype._getOffset = function (node) {
    var top = this._getOffsetTop(node);
    var left = this._getOffsetLeft(node);
    var mod = this._getScrollers();
    return [top - mod[1], left - mod[0]]
};
dhtmlXColorPicker.prototype._getOffsetTop = function (node) {
    var offset = 0;
    if (node.offsetParent) offset += node.offsetTop + this._getOffsetTop(node.offsetParent);
    return offset
};
dhtmlXColorPicker.prototype._getOffsetLeft = function (node) {
    var offset = 0;
    if (node.offsetParent) offset += node.offsetLeft + this._getOffsetLeft(node.offsetParent);
    return offset
};
dhtmlXColorPicker.prototype._calculateColor = function () {
    if (this.restoreFrom == 'RGB') {
        var rgb = [this.r, this.g, this.b]
    } else {
        var rgb = this._hsv2rgb(this.h, this.s, 1 - this.v);
        this.r = rgb[0];
        this.g = rgb[1];
        this.b = rgb[2]
    };
    this.hex = this._getColorHEX(rgb);
    this.elements['cs_EndColor'].style.backgroundColor = '#' + this.hex;
    this._drawValues();
    this.restoreFrom = null;
    return [this.h, this.s, 1 - this.v]
};
dhtmlXColorPicker.prototype._drawValues = function () {
    this.elements['cs_Hex'].value = this.hex;
    this.elements['cs_InputHue'].value = Math.floor(this.h);
    this.elements['cs_InputSat'].value = Math.floor(this.s * 100);
    this.elements['cs_InputLum'].value = Math.floor((1 - this.v) * 100);
    this.elements['cs_InputRed'].value = Math.floor(this.r);
    this.elements['cs_InputGreen'].value = Math.floor(this.g);
    this.elements['cs_InputBlue'].value = Math.floor(this.b)
};
dhtmlXColorPicker.prototype.saveColor = function (rgb, num) {
    var date = new Date();
    var datevalue = date.valueOf() + 2678400000;
    date = new Date(datevalue);
    var str = 'color_' + num + '=' + rgb + ';expires=' + date.toGMTString();
    document.cookie = str
};
dhtmlXColorPicker.prototype.restoreColor = function (num) {
    var rgb = false;
    var name = 'color_' + num;
    if (document.cookie.length > 0) {
        var pos = document.cookie.indexOf(name + '=');
        if (pos != -1) {
            var pos2 = document.cookie.indexOf(';', pos);
            if (pos2 == -1) pos2 = document.cookie.length;
            var pos3 = document.cookie.indexOf('=', pos) + 1;
            var rgb = document.cookie.substr(pos3, pos2 - pos3)
        }
    };
    return rgb
};
dhtmlXColorPicker.prototype._hsv2rgb = function (h, s, v) {
    Hi = Math.floor((h / 60)) % 6;
    f = h / 60 - Hi;
    p = v * (1 - s);
    q = v * (1 - f * s);
    t = v * (1 - (1 - f) * s);
    var r = 0;
    var g = 0;
    var b = 0;
    switch (Hi) {
    case 0:
        r = v;
        g = t;
        b = p;
        break;
    case 1:
        r = q;
        g = v;
        b = p;
        break;
    case 2:
        r = p;
        g = v;
        b = t;
        break;
    case 3:
        r = p;
        g = q;
        b = v;
        break;
    case 4:
        r = t;
        g = p;
        b = v;
        break;
    case 5:
        r = v;
        g = p;
        b = q;
        break
    };
    r = Math.floor(r * 255);
    g = Math.floor(g * 255);
    b = Math.floor(b * 255);
    return [r, g, b]
};
dhtmlXColorPicker.prototype._rgb2hsv = function (r, g, b) {
    R = r / 255;
    G = g / 255;
    B = b / 255;
    var MAX = Math.max(R, G, B);
    var MIN = Math.min(R, G, B);
    var V = MAX;
    var S = MAX == 0 ? 0 : (1 - MIN / MAX);
    var H = 0;
    if (MAX == MIN) {
        H = 0
    } else if (MAX == R && G >= B) {
        H = 60 * (G - B) / (MAX - MIN) + 0
    } else if (MAX == R && G < B) {
        H = 60 * (G - B) / (MAX - MIN) + 360
    } else if (MAX == G) {
        H = 60 * (B - R) / (MAX - MIN) + 120
    } else if (MAX == B) {
        H = 60 * (R - G) / (MAX - MIN) + 240
    };
    return [H, S, V]
};
dhtmlXColorPicker.prototype._drawLum = function () {
    var color = this.colorSelectH;
    var lumElemCount = (!this.fullview ? 30 : 64);
    var colorInc = (!this.fullview ? 8 : 4);
    for (var i = 0; i < lumElemCount; i++) {
        var d = document.createElement('div');
        var c = this._dec2hex(color);
        d.style.backgroundColor = '#' + c + c + c;
        d.className = 'cs_LumElement';
        color -= colorInc;
        this.elements['cs_LumSelect'].appendChild(d)
    }
};
dhtmlXColorPicker.prototype._colorizeLum = function (hue, sat) {
    this.old_hue = hue;
    this.old_sat = sat;
    var lum = 255;
    var colorInc = (!this.fullview ? 8 : 4);
    var l = this.elements['cs_LumSelect'].childNodes.length;
    for (var i = 2; i < l; i++) {
        var v = (lum > 255) ? 1 : (lum / 255);
        var rgb = this._hsv2rgb(hue, sat, v);
        var rgb = '#' + this._getColorHEX(rgb);
        this.elements['cs_LumSelect'].childNodes[i].style.backgroundColor = rgb;
        lum -= colorInc
    };
    this.callEvent("onChange", [this.getSelectedColor()])
};
dhtmlXColorPicker.prototype._dec2hex = function (dec) {
    return window.cs_dechex[dec] || '00'
};
dhtmlXColorPicker.prototype._hex2dec = function (hex) {
    return parseInt(hex, 16)
};
dhtmlXColorPicker.prototype._initCustomColors = function () {
    var colors = this.elements['cs_CustomColors'];
    for (var i = 0; i < this.customColorsCount; i++) {
        var d = document.createElement('div');
        d.className = (this.fullview ? 'cs_CustomColor' : 'cs_CustomColor_Mini');
        d.color_num = i;
        if (document.all) {
            if (navigator.appName == 'Opera') {
                if (!this.fullview) {
                    d.style.width = '18px';
                    d.style.height = '18px'
                } else {
                    d.style.width = '14px';
                    d.style.height = '14px'
                }
            } else if (!this.fullview) {
                if (document.compatMode != "BackCompat") d.style.width = '18px';
                else d.style.width = '20px';
                d.style.height = '20px'
            } else {
                d.style.width = '16px';
                d.style.height = '16px'
            }
        };
        d.z = this;
        d.onclick = this._selectCustomColor;
        d.ondblclick = this.clickOk;
        var color = this.restoreColor(i) || '0,0,0';
        d.color = color;
        var rgb = color.split(',');
        d.style.backgroundColor = '#' + this._getColorHEX(rgb);
        this.customColors.push(d);
        colors.appendChild(d)
    }
};
dhtmlXColorPicker.prototype._reinitCustomColors = function () {
    var colors = this.elements['cs_CustomColors'];
    for (var i = 0; i < this.customColorsCount; i++) {
        var d = this.customColors[i];
        var color = this.restoreColor(i) || '0,0,0';
        d.color = color;
        var rgb = color.split(',');
        d.style.backgroundColor = '#' + this._getColorHEX(rgb);
        this.customColors[i] = d
    }
};
dhtmlXColorPicker.prototype._getColorHEX = function (rgb) {
    var r = this._dec2hex(rgb[0]);
    var g = this._dec2hex(rgb[1]);
    var b = this._dec2hex(rgb[2]);
    return (r + g + b)
};
dhtmlXColorPicker.prototype._selectCustomColor = function (ev) {
    if (ev == null) ev = event;
    var z = this.z;
    if (!this.selected) {
        for (var i = 0; i < z.customColors.length; i++) z.customColors[i].style.border = '1px solid gray';
        this.style.border = '1px dashed black';
        this.selected = true;
        if (z.selectedColor != null) {
            z.customColors[z.selectedColor].style.border = '1px solid gray';
            z.customColors[z.selectedColor].selected = false
        }
    };
    z.selectedColor = this.color_num;
    z.ColorNum = this.color_num;
    var color = this.color.split(',');
    z.r = color[0];
    z.g = color[1];
    z.b = color[2];
    z.restoreFromRGB()
};
dhtmlXColorPicker.prototype.addCustomColor = function () {
    var z = this.z;
    if (z.selectedColor != null) {
        var d = z.customColors[z.selectedColor];
        var n = z.selectedColor;
        d.style.border = '1px solid gray';
        z.selectedColor = null
    } else {
        var d = z.customColors[z.ColorNum];
        var n = z.ColorNum;
        d.style.border = '1px solid gray'
    };
    var rgb = z.r + ',' + z.g + ',' + z.b;
    z.saveColor(rgb, n);
    d.color = rgb;
    z.ColorNum = z.ColorNum == 9 ? 0 : z.ColorNum + 1;
    z.customColors[z.ColorNum].style.border = '1px dashed red';
    d.style.backgroundColor = z.elements['cs_EndColor'].style.backgroundColor
};
dhtmlXColorPicker.prototype.restoreFromRGB = function () {
    this.restoreFrom = 'RGB';
    var HSV = this._rgb2hsv(this.r, this.g, this.b);
    this.h = HSV[0];
    this.s = HSV[1];
    this.v = 1 - HSV[2];
    if (this.ready) this.redraw()
};
dhtmlXColorPicker.prototype.restoreFromHSV = function () {
    this.restoreFrom = 'HSV';
    var RGB = this._hsv2rgb(this.h, this.s, this.v);
    this.r = RGB[0];
    this.g = RGB[1];
    this.b = RGB[2];
    this.redraw()
};
dhtmlXColorPicker.prototype.restoreFromHEX = function () {
    this.r = this._hex2dec(this.hex.substr(0, 2));
    this.g = this._hex2dec(this.hex.substr(2, 2));
    this.b = this._hex2dec(this.hex.substr(4, 2));
    this.restoreFromRGB()
};
dhtmlXColorPicker.prototype.redraw = function () {
    var x = this.colorSelectW * this.h / 360;
    var y = (1 - this.s) * this.colorSelectH;
    var top = (this.v) * this.colorSelectH;
    this.elements['cs_SelectorHor'].style.top = y + "px";
    this.elements['cs_SelectorVer'].style.left = x + "px";
    this.elements['cs_LumSelectArrow'].style.top = top - 3 + "px";
    this.elements['cs_LumSelectLine'].style.top = top + 1 + "px";
    var col = this._calculateColor();
    this._colorizeLum(col[0], col[1])
};
dhtmlXColorPicker.prototype._changeValueHSV = function () {
    var z = this.z;
    var H = parseInt(z.elements['cs_InputHue'].value) || 0;
    var S = parseInt(z.elements['cs_InputSat'].value) || 0;
    var V = parseInt(z.elements['cs_InputLum'].value) || 0;
    if (H < 0 || H > 359) H = 0;
    if (S < 0 || S > 100) S = 0;
    if (V < 0 || V > 100) V = 0;
    z.elements['cs_InputHue'].value = H;
    z.elements['cs_InputSat'].value = S;
    z.elements['cs_InputLum'].value = V;
    z.h = H;
    z.s = S / 100;
    z.v = 1 - V / 100;
    z.restoreFromHSV()
};
dhtmlXColorPicker.prototype._changeValueRGB = function () {
    var z = this.z;
    var R = parseInt(z.elements['cs_InputRed'].value) || 0;
    var G = parseInt(z.elements['cs_InputGreen'].value) || 0;
    var B = parseInt(z.elements['cs_InputBlue'].value) || 0;
    if (R < 0 || R > 255) R = 0;
    if (G < 0 || G > 255) G = 0;
    if (B < 0 || B > 255) B = 0;
    z.elements['cs_InputRed'].value = R;
    z.elements['cs_InputGreen'].value = G;
    z.elements['cs_InputBlue'].value = B;
    z.r = R;
    z.g = G;
    z.b = B;
    z.restoreFromRGB()
};
dhtmlXColorPicker.prototype._changeValueHEX = function () {
    var z = this.z;
    var hex = (z.elements['cs_Hex'].value) || 000000;
    hex = hex.replace(/[^a-fA-F0-9]/gi, "0");
    if (hex.length > 6) hex = hex.substr(0, 6)
    else while (hex.length < 6) hex += '0';
    z.elements['cs_Hex'].value = hex;
    z.hex = hex;
    z.restoreFromHEX()
};
dhtmlXColorPicker.prototype.setCustomColors = function (colors) {
    colors = colors.split(",");
    for (var i = 0; i < colors.length; i++) {
        var rgb = colors[i];
        if (rgb.substr(0, 1) == '#') {
            rgb = rgb.substr(1)
        };
        var R = this._hex2dec(rgb.substr(0, 2));
        var G = this._hex2dec(rgb.substr(2, 2));
        var B = this._hex2dec(rgb.substr(4, 2));
        rgb = R + ',' + G + ',' + B;
        this.saveColor(rgb, i)
    }
};
dhtmlXColorPicker.prototype.setColor = function (rgb) {
    if (typeof(rgb) != 'string') {
        var R = rgb[0];
        var G = rgb[1];
        var B = rgb[2]
    } else if (rgb.indexOf('rgb') != -1) {
        var rgbArr = rgb.substr(rgb.indexOf("(") + 1, rgb.lastIndexOf(")") - rgb.indexOf("(") - 1).split(",");
        var R = rgbArr[0];
        var G = rgbArr[1];
        var B = rgbArr[2]
    } else {
        if (rgb.substr(0, 1) == '#') {
            rgb = rgb.substr(1)
        };
        var R = this._hex2dec(rgb.substr(0, 2));
        var G = this._hex2dec(rgb.substr(2, 2));
        var B = this._hex2dec(rgb.substr(4, 2))
    };
    R = parseInt(R) || 0;
    G = parseInt(G) || 0;
    B = parseInt(B) || 0;
    if (R < 0 || R > 255) R = 0;
    if (G < 0 || G > 255) G = 0;
    if (B < 0 || B > 255) B = 0;
    this.r = R;
    this.g = G;
    this.b = B;
    this.restoreFromRGB()
};
dhtmlXColorPicker.prototype.close = function () {
    this.elements['cs_SelectorDiv'].z = null;
    this.elements['cs_LumSelect'].z = null;
    this.elements['cs_LumSelectArrow'].z = null;
    this.elements['cs_ButtonOk'].z = null;
    this.elements['cs_ButtonCancel'].z = null;
    if (this.cc) this.elements['cs_CustomColorAdd'].z = null;
    this.container.innerHTML = "";
    if (this.container._dhx_remove) this.container.parentNode.removeChild(this.container)
};
dhtmlXColorPicker.prototype.show = function () {
    this.callEvent("onShow", []);
    if (this.container.innerHTML == "") return;
    this.elements['cs_Content'].style.display = '';
    this.elements['cs_InputHue'].focus()
};
dhtmlXColorPicker.prototype.setPosition = function (x, y) {
    this.container.style.position = 'absolute';
    this.container.style.top = (y > 0 ? y : 10) + "px";
    this.container.style.left = x + "px"
};
dhtmlXColorPicker.prototype.hide = function () {
    this.resetHandlers();
    if (this.elements['cs_Content']) this.elements['cs_Content'].style.display = 'none'
};
dhtmlXColorPicker.prototype.setOnSelectHandler = function (func) {
    this.attachEvent("onSelect", func)
};
dhtmlXColorPicker.prototype.setOnCancelHandler = function (func) {
    this.attachEvent("onCancel", func)
};
dhtmlXColorPicker.prototype.getSelectedColor = function () {
    var rgb_dec = new Array(this.r, this.g, this.b);
    var rgb_hex = this._dec2hex(this.r) + this._dec2hex(this.g) + this._dec2hex(this.b);
    var hsl = new Array(this.h, this.s, this.v);
    return ["#" + rgb_hex, rgb_dec, hsl]
};
dhtmlXColorPicker.prototype.linkTo = function (obj1, obj2, obj3) {
    if (typeof(obj1) != "object") obj1 = document.getElementById(obj1);
    if (typeof(obj2) != "object") obj2 = document.getElementById(obj2);
    if (typeof(obj3) != "object") obj3 = document.getElementById(obj3);
    this.linkToObjects = arguments;
    var self = this;
    obj2.onclick = function () {
        var z = self._getOffset(obj1);
        var s = self._getScrollers();
        var x = z[1] + s[0];
        var y = z[0] + s[1];
        self.setPosition(x + obj1.offsetWidth, y);
        self.isVisible() ? self.hide() : self.show()
    };
    this.setOnSelectHandler(function (color) {
        obj1.style.backgroundColor = color;
        if (obj3) obj3.value = color
    });
    this.close = this.hide;
    this.hide()
};
dhtmlXColorPicker.prototype.hideOnSelect = function (value) {
    this.hideSelfOnSelect = value
};
dhtmlXColorPicker.prototype.setImagePath = function (path) {
    this.imgURL = path
};
dhtmlXColorPicker.prototype.init = function () {
    if (!this.language) this.loadUserLanguage("en-us");
    this.generate();
    this.ready = true;
    if (this._cc) this._reinitCustomColors();
    if (this.linkToObjects.length > 0) this.linkTo(this.linkToObjects[0], this.linkToObjects[1], this.linkToObjects[2]);
    if (!this.hideOnInit) this.show()
};
dhtmlXColorPicker.prototype.loadUserLanguage = function (lang) {
    if (!window.dhtmlxColorPickerLangModules[lang]) return;
    this.language = window.dhtmlxColorPickerLangModules[lang];
    if (this.ready) {
        this.generate();
        this.show()
    }
};
dhtmlXColorPicker.prototype.setSkin = function (skin) {
    this.skinName = skin;
    if (this.elements['cs_Content']) this.elements['cs_Content'].className = 'dhtmlxcolorpicker' + (skin ? '_' + skin : skin)
};
dhtmlXColorPicker.prototype.isVisible = function () {
    return !(this.elements['cs_Content'].style.display == 'none')
};
dhtmlXColorPicker.prototype.hoverButton = function () {
    this.className += '_Hover'
};
dhtmlXColorPicker.prototype.normalButton = function () {
    this.className = this.className.substr(0, this.className.length - 6)
};
(function () {
    dhtmlx.extend_api("dhtmlXColorPicker", {
        _init: function (obj) {
            return [obj.parent, obj.click, obj.colors, obj.hide, obj.full]
        },
        show: "showA",
        link: "linkTo",
        image_path: "setImagePath",
        color: "setColor"
    }, {
        showA: function () {
            this.init();
            this.show()
        }
    })
})();

function dhtmlXComboFromSelect(parent, size) {
    if (typeof(parent) == "string") parent = document.getElementById(parent);
    size = size || parent.getAttribute("width") || (window.getComputedStyle ? window.getComputedStyle(parent, null)["width"] : (parent.currentStyle ? parent.currentStyle["width"] : 0));
    if ((!size) || (size == "auto")) size = parent.offsetWidth || 100;
    var z = document.createElement("SPAN");
    if (parent.style.direction == "rtl") z.style.direction = "rtl";
    parent.parentNode.insertBefore(z, parent);
    parent.style.display = 'none';
    var s_type = parent.getAttribute('opt_type');
    var w = new dhtmlXCombo(z, parent.name, size, s_type, parent.tabIndex);
    var x = new Array();
    var sel = 0;
    for (var i = 0; i < parent.options.length; i++) {
        if (parent.options[i].selected) sel = i;
        var label = parent.options[i].innerHTML;
        var val = parent.options[i].getAttribute("value");
        if ((typeof(val) == "undefined") || (val === null)) val = label;
        x[i] = {
            value: val,
            text: label,
            img_src: parent.options[i].getAttribute("img_src")
        }
    };
    w.addOption(x);
    parent.parentNode.removeChild(parent);
    w.selectOption(sel, null, true);
    if (parent.onchange) w.attachEvent("onChange", parent.onchange);
    return w
};
var dhtmlXCombo_optionTypes = [];

function dhtmlXCombo(parent, name, width, optionType, tabIndex) {
    if (typeof(parent) == "string") parent = document.getElementById(parent);
    this.dhx_Event();
    this.optionType = (optionType != window.undefined && dhtmlXCombo_optionTypes[optionType]) ? optionType : 'default';
    this._optionObject = dhtmlXCombo_optionTypes[this.optionType];
    this._disabled = false;
    if (parent.style.direction == "rtl") this.rtl = true;
    else this.rtl = false;
    if (!window.dhx_glbSelectAr) {
        window.dhx_glbSelectAr = new Array();
        window.dhx_openedSelect = null;
        window.dhx_SelectId = 1;
        dhtmlxEvent(document.body, "click", this.closeAll);
        dhtmlxEvent(document.body, "keydown", function (e) {
            try {
                if ((e || event).keyCode == 9) window.dhx_glbSelectAr[0].closeAll()
            } catch (e) {};
            return true
        })
    };
    if (parent.tagName == "SELECT") return dhtmlXComboFromSelect(parent);
    else this._createSelf(parent, name, width, tabIndex);
    dhx_glbSelectAr.push(this)
};
dhtmlXCombo.prototype.setSize = function (new_size) {
    this.DOMlist.style.width = new_size + "px";
    if (this.DOMlistF) this.DOMlistF.style.width = new_size + "px";
    this.DOMelem.style.width = new_size + "px";
    this.DOMelem_input.style.width = Math.max(0, (new_size - 19)) + 'px'
};
dhtmlXCombo.prototype.enableFilteringMode = function (mode, url, cache, autosubload) {
    this._filter = convertStringToBoolean(mode);
    if (url) {
        this._xml = url;
        this._autoxml = convertStringToBoolean(autosubload)
    };
    if (convertStringToBoolean(cache)) this._xmlCache = []
};
dhtmlXCombo.prototype.setFilteringParam = function (name, value) {
    if (!this._prs) this._prs = [];
    this._prs.push([name, value])
};
dhtmlXCombo.prototype.disable = function (mode) {
    var z = convertStringToBoolean(mode);
    if (this._disabled == z) return;
    this.DOMelem_input.disabled = z;
    this._disabled = z
};
dhtmlXCombo.prototype.readonly = function (mode, autosearch) {
    this.DOMelem_input.readOnly = mode ? true : false;
    if (autosearch === false || mode === false) {
        this.DOMelem.onkeyup = function (ev) {}
    } else {
        var that = this;
        this.DOMelem.onkeyup = function (ev) {
            ev = ev || window.event;
            if (ev.keyCode != 9) ev.cancelBubble = true;
            if ((ev.keyCode >= 48 && ev.keyCode <= 57) || (ev.keyCode >= 65 && ev.keyCode <= 90)) {
                for (var i = 0; i < that.optionsArr.length; i++) {
                    var text = that.optionsArr[i].text;
                    if (text.toString().toUpperCase().indexOf(String.fromCharCode(ev.keyCode)) == 0) {
                        that.selectOption(i);
                        break
                    }
                };
                ev.cancelBubble = true
            }
        }
    }
};
dhtmlXCombo.prototype.getOption = function (value) {
    for (var i = 0; i < this.optionsArr.length; i++) if (this.optionsArr[i].value == value) return this.optionsArr[i];
    return null
};
dhtmlXCombo.prototype.getOptionByLabel = function (value) {
    for (var i = 0; i < this.optionsArr.length; i++) if (this.optionsArr[i].text == value || this.optionsArr[i]._ctext == value) return this.optionsArr[i];
    return null
};
dhtmlXCombo.prototype.getOptionByIndex = function (ind) {
    return this.optionsArr[ind]
};
dhtmlXCombo.prototype.clearAll = function (all) {
    if (all) this.setComboText("");
    this.optionsArr = new Array();
    this.redrawOptions();
    if (all) this._confirmSelection()
};
dhtmlXCombo.prototype.deleteOption = function (value) {
    var ind = this.getIndexByValue(value);
    if (ind < 0) return;
    if (this.optionsArr[ind] == this._selOption) this._selOption = null;
    this.optionsArr.splice(ind, 1);
    this.redrawOptions()
};
dhtmlXCombo.prototype.render = function (mode) {
    this._skiprender = (!convertStringToBoolean(mode));
    this.redrawOptions()
};
dhtmlXCombo.prototype.updateOption = function (oldvalue, avalue, atext, acss) {
    var dOpt = this.getOption(oldvalue);
    if (typeof(avalue) != "object") avalue = {
        text: atext,
        value: avalue,
        css: acss
    };
    dOpt.setValue(avalue);
    this.redrawOptions()
};
dhtmlXCombo.prototype.addOption = function (options) {
    if (!arguments[0].length || typeof(arguments[0]) != "object") args = [arguments];
    else args = options;
    this.render(false);
    for (var i = 0; i < args.length; i++) {
        var attr = args[i];
        if (attr.length) {
            attr.value = attr[0] || "";
            attr.text = attr[1] || "";
            attr.css = attr[2] || ""
        };
        this._addOption(attr)
    };
    this.render(true)
};
dhtmlXCombo.prototype._addOption = function (attr) {
    dOpt = new this._optionObject();
    this.optionsArr.push(dOpt);
    dOpt.setValue.apply(dOpt, [attr]);
    this.redrawOptions()
};
dhtmlXCombo.prototype.getIndexByValue = function (val) {
    for (var i = 0; i < this.optionsArr.length; i++) if (this.optionsArr[i].value == val) return i;
    return -1
};
dhtmlXCombo.prototype.getSelectedValue = function () {
    return (this._selOption ? this._selOption.value : null)
};
dhtmlXCombo.prototype.getComboText = function () {
    return this.DOMelem_input.value
};
dhtmlXCombo.prototype.setComboText = function (text) {
    this.DOMelem_input.value = text
};
dhtmlXCombo.prototype.setComboValue = function (text) {
    this.setComboText(text);
    for (var i = 0; i < this.optionsArr.length; i++) if (this.optionsArr[i].data()[0] == text) return this.selectOption(i, null, true);
    this.DOMelem_hidden_input.value = text
};
dhtmlXCombo.prototype.getActualValue = function () {
    return this.DOMelem_hidden_input.value
};
dhtmlXCombo.prototype.getSelectedText = function () {
    return (this._selOption ? this._selOption.text : "")
};
dhtmlXCombo.prototype.getSelectedIndex = function () {
    for (var i = 0; i < this.optionsArr.length; i++) if (this.optionsArr[i] == this._selOption) return i;
    return -1
};
dhtmlXCombo.prototype.setName = function (name) {
    this.DOMelem_hidden_input.name = name;
    this.DOMelem_hidden_input2 = name.replace(/(\]?)$/, "_new_value$1");
    this.name = name
};
dhtmlXCombo.prototype.show = function (mode) {
    if (convertStringToBoolean(mode)) this.DOMelem.style.display = "";
    else this.DOMelem.style.display = "none"
};
dhtmlXCombo.prototype.destructor = function () {
    var _sID = this._inID;
    this.DOMParent.removeChild(this.DOMelem);
    this.DOMlist.parentNode.removeChild(this.DOMlist);
    var s = dhx_glbSelectAr;
    this.DOMParent = this.DOMlist = this.DOMelem = 0;
    this.DOMlist.combo = this.DOMelem.combo = 0;
    for (var i = 0; i < s.length; i++) {
        if (s[i]._inID == _sID) {
            s[i] = null;
            s.splice(i, 1);
            return
        }
    }
};
dhtmlXCombo.prototype._createSelf = function (selParent, name, width, tab) {
    if (width.toString().indexOf("%") != -1) {
        var self = this;
        var resWidht = parseInt(width) / 100;
        window.setInterval(function () {
            if (!selParent.parentNode) return;
            var ts = selParent.parentNode.offsetWidth * resWidht - 2;
            if (ts < 0) return;
            if (ts == self._lastTs) return;
            self.setSize(self._lastTs = ts)
        }, 500);
        var width = parseInt(selParent.offsetWidth)
    };
    var width = parseInt(width || 100);
    this.ListPosition = "Bottom";
    this.DOMParent = selParent;
    this._inID = null;
    this.name = name;
    this._selOption = null;
    this.optionsArr = Array();
    var opt = new this._optionObject();
    opt.DrawHeader(this, name, width, tab);
    this.DOMlist = document.createElement("DIV");
    this.DOMlist.className = 'dhx_combo_list' + (this.rtl ? "_rtl" : "") + ' ' + (dhtmlx.skin ? dhtmlx.skin + "_list" : "");
    this.DOMlist.style.width = width - (_isIE ? 0 : 0) + "px";
    if (_isOpera || _isKHTML) this.DOMlist.style.overflow = "auto";
    this.DOMlist.style.display = "none";
    document.body.insertBefore(this.DOMlist, document.body.firstChild);
    if (_isIE) {
        this.DOMlistF = document.createElement("IFRAME");
        this.DOMlistF.style.border = "0px";
        this.DOMlistF.className = 'dhx_combo_list';
        this.DOMlistF.style.width = width - (_isIE ? 0 : 0) + "px";
        this.DOMlistF.style.display = "none";
        this.DOMlistF.src = "javascript:false;";
        document.body.insertBefore(this.DOMlistF, document.body.firstChild)
    };
    this.DOMlist.combo = this.DOMelem.combo = this;
    this.DOMelem_input.onkeydown = this._onKey;
    this.DOMelem_input.onkeypress = this._onKeyF;
    this.DOMelem_input.onblur = this._onBlur;
    this.DOMelem.onclick = this._toggleSelect;
    this.DOMlist.onclick = this._selectOption;
    this.DOMlist.onmousedown = function () {
        this._skipBlur = true
    };
    this.DOMlist.onkeydown = function (e) {
        this.combo.DOMelem_input.focus();
        (e || event).cancelBubble = true;
        this.combo.DOMelem_input.onkeydown(e)
    };
    this.DOMlist.onmouseover = this._listOver
};
dhtmlXCombo.prototype._listOver = function (e) {
    e = e || event;
    e.cancelBubble = true;
    var node = (_isIE ? event.srcElement : e.target);
    var that = this.combo;
    if (node.parentNode == that.DOMlist) {
        if (that._selOption) that._selOption.deselect();
        if (that._tempSel) that._tempSel.deselect();
        var i = 0;
        for (i; i < that.DOMlist.childNodes.length; i++) {
            if (that.DOMlist.childNodes[i] == node) break
        };
        var z = that.optionsArr[i];
        that._tempSel = z;
        that._tempSel.select();
        if ((that._autoxml) && ((i + 1) == that._lastLength)) {
            that._fetchOptions(i + 1, that._lasttext || "")
        }
    }
};
dhtmlXCombo.prototype._positList = function () {
    var pos = this.getPosition(this.DOMelem);
    if (this.ListPosition == 'Bottom') {
        this.DOMlist.style.top = pos[1] + this.DOMelem.offsetHeight - 1 + "px";
        this.DOMlist.style.left = pos[0] + "px"
    } else if (this.ListPosition == 'Top') {
        this.DOMlist.style.top = pos[1] - this.DOMlist.offsetHeight + "px";
        this.DOMlist.style.left = pos[0] + "px"
    } else {
        this.DOMlist.style.top = pos[1] + "px";
        this.DOMlist.style.left = pos[0] + this.DOMelem.offsetWidth + "px"
    }
};
dhtmlXCombo.prototype.getPosition = function (oNode, pNode) {
    if (_isChrome) {
        if (!pNode) var pNode = document.body

        var oCurrentNode = oNode;
        var iLeft = 0;
        var iTop = 0;
        while ((oCurrentNode) && (oCurrentNode != pNode)) {
            iLeft += oCurrentNode.offsetLeft - oCurrentNode.scrollLeft;
            iTop += oCurrentNode.offsetTop - oCurrentNode.scrollTop;
            oCurrentNode = oCurrentNode.offsetParent
        };
        if (pNode == document.body) {
            if (_isIE && _isIE < 8) {
                if (document.documentElement.scrollTop) iTop += document.documentElement.scrollTop;
                if (document.documentElement.scrollLeft) iLeft += document.documentElement.scrollLeft
            } else if (!_isFF) {
                iLeft += document.body.offsetLeft;
                iTop += document.body.offsetTop
            }
        };
        return new Array(iLeft, iTop)
    };
    var pos = getOffset(oNode);
    return [pos.left, pos.top]
};
dhtmlXCombo.prototype._correctSelection = function () {
    if (this.getComboText() != "") for (var i = 0; i < this.optionsArr.length; i++) if (!this.optionsArr[i].isHidden()) {
        return this.selectOption(i, true, false)
    };
    this.unSelectOption()
};
dhtmlXCombo.prototype.selectNext = function (step) {
    var z = this.getSelectedIndex() + step;
    while (this.optionsArr[z]) {
        if (!this.optionsArr[z].isHidden()) return this.selectOption(z, false, false);
        z += step
    }
};
dhtmlXCombo.prototype._onKeyF = function (e) {
    var that = this.parentNode.combo;
    var ev = e || event;
    ev.cancelBubble = true;
    if (ev.keyCode == "13" || ev.keyCode == "9") {
        that._confirmSelection();
        that.closeAll()
    } else if (ev.keyCode == "27") {
        that._resetSelection();
        that.closeAll()
    } else that._activeMode = true;
    if (ev.keyCode == "13" || ev.keyCode == "27") {
        that.callEvent("onKeyPressed", [ev.keyCode])
        return false
    };
    return true
};
dhtmlXCombo.prototype._onKey = function (e) {
    var that = this.parentNode.combo;
    (e || event).cancelBubble = true;
    var ev = (e || event).keyCode;
    if (ev > 15 && ev < 19) return true;
    if (ev == 27) return;
    if ((that.DOMlist.style.display != "block") && (ev != "13") && (ev != "9") && ((!that._filter) || (that._filterAny))) that.DOMelem.onclick(e || event);
    if ((ev != "13") && (ev != "9")) {
        window.setTimeout(function () {
            that._onKeyB(ev)
        }, 1);
        if (ev == "40" || ev == "38") return false
    } else if (ev == 9) {
        that.closeAll();
        (e || event).cancelBubble = false
    }
};
dhtmlXCombo.prototype._onKeyB = function (ev) {
    if (ev == "40") {
        var z = this.selectNext(1)
    } else if (ev == "38") {
        this.selectNext(-1)
    } else {
        this.callEvent("onKeyPressed", [ev])
        if (this._filter) return this.filterSelf((ev == 8) || (ev == 46));
        for (var i = 0; i < this.optionsArr.length; i++) if (this.optionsArr[i].data()[1] == this.DOMelem_input.value) {
            this.selectOption(i, false, false);
            return false
        };
        this.unSelectOption()
    };
    return true
};
dhtmlXCombo.prototype._onBlur = function () {
    var self = this.parentNode._self;
    window.setTimeout(function () {
        if (self.DOMlist._skipBlur) return !(self.DOMlist._skipBlur = false);
        self._confirmSelection();
        self.callEvent("onBlur", [])
    }, 100)

};
dhtmlXCombo.prototype.redrawOptions = function () {
    if (this._skiprender) return;
    for (var i = this.DOMlist.childNodes.length - 1; i >= 0; i--) this.DOMlist.removeChild(this.DOMlist.childNodes[i]);
    for (var i = 0; i < this.optionsArr.length; i++) this.DOMlist.appendChild(this.optionsArr[i].render())
};
dhtmlXCombo.prototype.loadXML = function (url, afterCall) {
    this._load = true;
    this.callEvent("onXLS", []);
    if (this._prs) for (var i = 0; i < this._prs.length; i++) url += [getUrlSymbol(url), escape(this._prs[i][0]), "=", escape(this._prs[i][1])].join("");
    if ((this._xmlCache) && (this._xmlCache[url])) {
        this._fillFromXML(this, null, null, null, this._xmlCache[url]);
        if (afterCall) afterCall()
    } else {
        var xml = (new dtmlXMLLoaderObject(this._fillFromXML, this, true, true));
        if (afterCall) xml.waitCall = afterCall;
        xml._cPath = url;
        xml.loadXML(url)
    }
};
dhtmlXCombo.prototype.loadXMLString = function (astring) {
    var xml = (new dtmlXMLLoaderObject(this._fillFromXML, this, true, true));
    xml.loadXMLString(astring)
};
dhtmlXCombo.prototype._fillFromXML = function (obj, b, c, d, xml) {
    if (obj._xmlCache) obj._xmlCache[xml._cPath] = xml;
    var toptag = xml.getXMLTopNode("complete");
    if (toptag.tagName != "complete") return;
    var top = xml.doXPath("//complete");
    var options = xml.doXPath("//option");
    var add = false;
    obj.render(false);
    if ((!top[0]) || (!top[0].getAttribute("add"))) {
        obj.clearAll();
        obj._lastLength = options.length;
        if (obj._xml) {
            if ((!options) || (!options.length)) obj.closeAll();
            else {
                if (obj._activeMode) {
                    obj._positList();
                    obj.DOMlist.style.display = "block";
                    if (_isIE) obj._IEFix(true)
                }
            }
        }
    } else {
        obj._lastLength += options.length;
        add = true
    };
    for (var i = 0; i < options.length; i++) {
        var attr = new Object();
        attr.text = options[i].firstChild ? options[i].firstChild.nodeValue : "";
        for (var j = 0; j < options[i].attributes.length; j++) {
            var a = options[i].attributes[j];
            if (a) attr[a.nodeName] = a.nodeValue
        };
        obj._addOption(attr)
    };
    obj.render(add != true || ( !! options.length));
    if ((obj._load) && (obj._load !== true)) obj.loadXML(obj._load);
    else {
        obj._load = false;
        if ((!obj._lkmode) && (!obj._filter)) obj._correctSelection()
    };
    var selected = xml.doXPath("//option[@selected]");
    if (selected.length) obj.selectOption(obj.getIndexByValue(selected[0].getAttribute("value")), false, true);
    obj.callEvent("onXLE", [])
};
dhtmlXCombo.prototype.unSelectOption = function () {
    if (this._selOption) this._selOption.deselect();
    if (this._tempSel) this._tempSel.deselect();
    this._tempSel = this._selOption = null
};
dhtmlXCombo.prototype._confirmSelection = function (data, status) {
    if (arguments.length == 0) {
        var z = this.getOptionByLabel(this.DOMelem_input.value);
        data = z ? z.value : this.DOMelem_input.value;
        status = (z == null);
        if (data == this.getActualValue()) return
    };
    this.DOMelem_hidden_input.value = data;
    this.DOMelem_hidden_input2.value = (status ? "true" : "false");
    this.callEvent("onChange", []);
    this._activeMode = false
};
dhtmlXCombo.prototype._resetSelection = function (data, status) {
    var z = this.getOption(this.DOMelem_hidden_input.value);
    this.setComboValue(z ? z.data()[0] : this.DOMelem_hidden_input.value)
    this.setComboText(z ? z.data()[1] : this.DOMelem_hidden_input.value)
};
dhtmlXCombo.prototype.selectOption = function (ind, filter, conf) {
    if (arguments.length < 3) conf = true;
    this.unSelectOption();
    var z = this.optionsArr[ind];
    if (!z) return;
    this._selOption = z;
    this._selOption.select();
    var corr = this._selOption.content.offsetTop + this._selOption.content.offsetHeight - this.DOMlist.scrollTop - this.DOMlist.offsetHeight;
    if (corr > 0) this.DOMlist.scrollTop += corr;
    corr = this.DOMlist.scrollTop - this._selOption.content.offsetTop;
    if (corr > 0) this.DOMlist.scrollTop -= corr;
    var data = this._selOption.data();
    if (conf) {
        this.setComboText(data[1]);
        this._confirmSelection(data[0], false)
    };
    if ((this._autoxml) && ((ind + 1) == this._lastLength)) this._fetchOptions(ind + 1, this._lasttext || "");
    if (filter) {
        var text = this.getComboText();
        if (text != data[1]) {
            this.setComboText(data[1]);
            dhtmlXRange(this.DOMelem_input, text.length + 1, data[1].length)
        }
    } else this.setComboText(data[1]);
    this._selOption.RedrawHeader(this);
    this.callEvent("onSelectionChange", [])
};
dhtmlXCombo.prototype._selectOption = function (e) {
    (e || event).cancelBubble = true;
    var node = (_isIE ? event.srcElement : e.target);
    var that = this.combo;
    while (!node._self) {
        node = node.parentNode;
        if (!node) return
    };
    var i = 0;
    for (i; i < that.DOMlist.childNodes.length; i++) {
        if (that.DOMlist.childNodes[i] == node) break
    };
    that.selectOption(i, false, true);
    that.closeAll();
    that.callEvent("onBlur", [])
    that._activeMode = false
};
dhtmlXCombo.prototype.openSelect = function () {
    if (this._disabled) return;
    this.closeAll();
    this._positList();
    this.DOMlist.style.display = "block";
    this.callEvent("onOpen", []);
    if (this._tempSel) this._tempSel.deselect();
    if (this._selOption) this._selOption.select();
    if (this._selOption) {
        var corr = this._selOption.content.offsetTop + this._selOption.content.offsetHeight - this.DOMlist.scrollTop - this.DOMlist.offsetHeight;
        if (corr > 0) this.DOMlist.scrollTop += corr;
        corr = this.DOMlist.scrollTop - this._selOption.content.offsetTop;
        if (corr > 0) this.DOMlist.scrollTop -= corr
    };
    if (_isIE) this._IEFix(true);
    this.DOMelem_input.focus();
    if (this._filter) this.filterSelf()
};
dhtmlXCombo.prototype._toggleSelect = function (e) {
    var that = this.combo;
    if (that.DOMlist.style.display == "block") {
        that.closeAll()
    } else {
        that.openSelect()
    };
    (e || event).cancelBubble = true
};
dhtmlXCombo.prototype._fetchOptions = function (ind, text) {
    if (text == "") {
        this.closeAll();
        return this.clearAll()
    };
    var url = this._xml + ((this._xml.indexOf("?") != -1) ? "&" : "?") + "pos=" + ind + "&mask=" + encodeURIComponent(text);
    this._lasttext = text;
    if (this._load) this._load = url;
    else {
        if (!this.callEvent("onDynXLS", [text, ind])) return;
        this.loadXML(url)
    }
};
dhtmlXCombo.prototype.filterSelf = function (mode) {
    var text = this.getComboText();
    if (this._xml) {
        this._lkmode = mode;
        return this._fetchOptions(0, text)
    };
    try {
        var filter = new RegExp("^" + text, "i")
    } catch (e) {
        var filter = new RegExp("^" + text.replace(/([\[\]\{\}\(\)\+\*\\])/g, "\\$1"))
    };
    this.filterAny = false;
    for (var i = 0; i < this.optionsArr.length; i++) {
        var z = filter.test(this.optionsArr[i].text);
        this.filterAny |= z;
        this.optionsArr[i].hide(!z)
    };
    if (!this.filterAny) {
        this.closeAll();
        this._activeMode = true
    } else {
        if (this.DOMlist.style.display != "block") this.openSelect();
        if (_isIE) this._IEFix(true)
    };
    if (!mode) this._correctSelection();
    else this.unSelectOption()
};
dhtmlXCombo.prototype._IEFix = function (mode) {
    this.DOMlistF.style.display = (mode ? "block" : "none");
    this.DOMlistF.style.top = this.DOMlist.style.top;
    this.DOMlistF.style.left = this.DOMlist.style.left
};
dhtmlXCombo.prototype.closeAll = function () {
    if (window.dhx_glbSelectAr) for (var i = 0; i < dhx_glbSelectAr.length; i++) {
        if (dhx_glbSelectAr[i].DOMlist.style.display == "block") {
            dhx_glbSelectAr[i].DOMlist.style.display = "none";
            if (_isIE) dhx_glbSelectAr[i]._IEFix(false)
        };
        dhx_glbSelectAr[i]._activeMode = false
    }
};

function dhtmlXRange(InputId, Start, End) {
    var Input = typeof(InputId) == 'object' ? InputId : document.getElementById(InputId);
    try {
        Input.focus()
    } catch (e) {};
    var Length = Input.value.length;
    Start--;
    if (Start < 0 || Start > End || Start > Length) Start = 0;
    if (End > Length) End = Length;
    if (Start == End) return;
    if (Input.setSelectionRange) {
        Input.setSelectionRange(Start, End)
    } else if (Input.createTextRange) {
        var range = Input.createTextRange();
        range.moveStart('character', Start);
        range.moveEnd('character', End - Length);
        range.select()
    }
};
dhtmlXCombo_defaultOption = function () {
    this.init()
};
dhtmlXCombo_defaultOption.prototype.init = function () {
    this.value = null;
    this.text = "";
    this.selected = false;
    this.css = ""
};
dhtmlXCombo_defaultOption.prototype.select = function () {
    if (this.content) {
        this.content.className = "dhx_selected_option" + (dhtmlx.skin ? " combo_" + dhtmlx.skin + "_sel" : "")
    }
};
dhtmlXCombo_defaultOption.prototype.hide = function (mode) {
    this.render().style.display = mode ? "none" : ""
};
dhtmlXCombo_defaultOption.prototype.isHidden = function () {
    return (this.render().style.display == "none")
};
dhtmlXCombo_defaultOption.prototype.deselect = function () {
    if (this.content) this.render();
    this.content.className = ""
};
dhtmlXCombo_defaultOption.prototype.setValue = function (attr) {
    this.value = attr.value || "";
    this.text = attr.text || "";
    this.css = attr.css || "";
    this.content = null
};
dhtmlXCombo_defaultOption.prototype.render = function () {
    if (!this.content) {
        this.content = document.createElement("DIV");
        this.content._self = this;
        this.content.style.cssText = 'width:100%;overflow:hidden;' + this.css;
        if (_isOpera || _isKHTML) this.content.style.padding = "2px 0px 2px 0px";
        this.content.innerHTML = this.text;
        this._ctext = _isIE ? this.content.innerText : this.content.textContent
    };
    return this.content
};
dhtmlXCombo_defaultOption.prototype.data = function () {
    if (this.content) return [this.value, this._ctext ? this._ctext : this.text]
};
dhtmlXCombo_defaultOption.prototype.DrawHeader = function (self, name, width, tab) {
    var z = document.createElement("DIV");
    z.style.width = width + "px";
    z.className = 'dhx_combo_box ' + (dhtmlx.skin || "");
    z._self = self;
    self.DOMelem = z;
    this._DrawHeaderInput(self, name, width, tab);
    this._DrawHeaderButton(self, name, width);
    self.DOMParent.appendChild(self.DOMelem)
};
dhtmlXCombo_defaultOption.prototype._DrawHeaderInput = function (self, name, width, tab) {
    if (self.rtl && _isIE) {
        var z = document.createElement('textarea');
        z.style.overflow = "hidden";
        z.style.whiteSpace = "nowrap"
    } else {
        var z = document.createElement('input');
        z.setAttribute("autocomplete", "off");
        z.type = 'text'
    };
    z.className = 'dhx_combo_input';
    if (self.rtl) {
        z.style.left = "18px";
        z.style.direction = "rtl";
        z.style.unicodeBidi = "bidi-override"
    };
    if (tab) z.tabIndex = tab;
    z.style.width = (width - 19) + 'px';
    self.DOMelem.appendChild(z);
    self.DOMelem_input = z;
    z = document.createElement('input');
    z.type = 'hidden';
    z.name = name;
    self.DOMelem.appendChild(z);
    self.DOMelem_hidden_input = z;
    z = document.createElement('input');
    z.type = 'hidden';
    z.name = (name || "").replace(/(\]?)$/, "_new_value$1");
    z.value = "true";
    self.DOMelem.appendChild(z);
    self.DOMelem_hidden_input2 = z
};
dhtmlXCombo_defaultOption.prototype._DrawHeaderButton = function (self, name, width) {
    var z = document.createElement('img');
    z.className = (self.rtl) ? 'dhx_combo_img_rtl' : 'dhx_combo_img';
    if (dhtmlx.image_path) dhx_globalImgPath = dhtmlx.image_path;
    z.src = (window.dhx_globalImgPath ? dhx_globalImgPath : "") + 'combo_select' + (dhtmlx.skin ? "_" + dhtmlx.skin : "") + '.gif';
    self.DOMelem.appendChild(z);
    self.DOMelem_button = z
};
dhtmlXCombo_defaultOption.prototype.RedrawHeader = function (self) {};
dhtmlXCombo_optionTypes['default'] = dhtmlXCombo_defaultOption;
dhtmlXCombo.prototype.dhx_Event = function () {
    this.dhx_SeverCatcherPath = "";
    this.attachEvent = function (original, catcher, CallObj) {
        CallObj = CallObj || this;
        original = 'ev_' + original;
        if ((!this[original]) || (!this[original].addEvent)) {
            var z = new this.eventCatcher(CallObj);
            z.addEvent(this[original]);
            this[original] = z
        };
        return (original + ':' + this[original].addEvent(catcher))
    };
    this.callEvent = function (name, arg0) {
        if (this["ev_" + name]) return this["ev_" + name].apply(this, arg0);
        return true
    };
    this.checkEvent = function (name) {
        if (this["ev_" + name]) return true;
        return false
    };
    this.eventCatcher = function (obj) {
        var dhx_catch = new Array();
        var m_obj = obj;
        var func_server = function (catcher, rpc) {
            catcher = catcher.split(":");
            var postVar = "";
            var postVar2 = "";
            var target = catcher[1];
            if (catcher[1] == "rpc") {
                postVar = '<?xml version="1.0"?><methodCall><methodName>' + catcher[2] + '</methodName><params>';
                postVar2 = "</params></methodCall>";
                target = rpc
            };
            var z = function () {};
            return z
        };
        var z = function () {
            if (dhx_catch) var res = true;
            for (var i = 0; i < dhx_catch.length; i++) {
                if (dhx_catch[i] != null) {
                    var zr = dhx_catch[i].apply(m_obj, arguments);
                    res = res && zr
                }
            };
            return res
        };
        z.addEvent = function (ev) {
            if (typeof(ev) != "function") if (ev && ev.indexOf && ev.indexOf("server:") == 0) ev = new func_server(ev, m_obj.rpcServer);
            else ev = eval(ev);
            if (ev) return dhx_catch.push(ev) - 1;
            return false
        };
        z.removeEvent = function (id) {
            dhx_catch[id] = null
        };
        return z
    };
    this.detachEvent = function (id) {
        if (id != false) {
            var list = id.split(':');
            this[list[0]].removeEvent(list[1])
        }
    }
};
(function () {
    dhtmlx.extend_api("dhtmlXCombo", {
        _init: function (obj) {
            if (obj.image_path) dhx_globalImgPath = obj.image_path;
            return [obj.parent, obj.name, (obj.width || "100%"), obj.type, obj.index]
        },
        filter: "filter_command",
        auto_height: "enableOptionAutoHeight",
        auto_position: "enableOptionAutoPositioning",
        auto_width: "enableOptionAutoWidth",
        xml: "loadXML",
        readonly: "readonly",
        items: "addOption"
    }, {
        filter_command: function (data) {
            if (typeof data == "string") this.enableFilteringMode(true, data);
            else this.enableFilteringMode(data)
        }
    })
})();
dhtmlXCombo_imageOption = function () {
    this.init()
};
dhtmlXCombo_imageOption.prototype = new dhtmlXCombo_defaultOption;
dhtmlXCombo_imageOption.prototype.setValue = function (attr) {
    this.value = attr.value || "";
    this.text = attr.text || "";
    this.css = attr.css || "";
    this.img_src = attr.img_src || this.getDefImage()
};
dhtmlXCombo_imageOption.prototype.render = function () {
    if (!this.content) {
        this.content = document.createElement("DIV");
        this.content._self = this;
        this.content.style.cssText = 'width:100%;overflow:hidden;' + this.css;
        var html = '';
        if (this.img_src != '') html += '<img style="float:left;" src="' + this.img_src + '" />';
        html += '<div style="float:left">' + this.text + '</div>';
        this.content.innerHTML = html
    };
    return this.content
};
dhtmlXCombo_imageOption.prototype.data = function () {
    return [this.value, this.text, this.img_src]
};
dhtmlXCombo_imageOption.prototype.DrawHeader = function (self, name, width) {
    var z = document.createElement("DIV");
    z.style.width = width + "px";
    z.className = 'dhx_combo_box';
    z._self = self;
    self.DOMelem = z;
    this._DrawHeaderImage(self, name, width);
    this._DrawHeaderInput(self, name, width - 23);
    this._DrawHeaderButton(self, name, width);
    self.DOMParent.appendChild(self.DOMelem)
};
dhtmlXCombo_imageOption.prototype._DrawHeaderImage = function (self, name, width) {
    var z = document.createElement('img');
    z.className = (self.rtl) ? 'dhx_combo_option_img_rtl' : 'dhx_combo_option_img';
    z.style.visibility = 'hidden';
    self.DOMelem.appendChild(z);
    self.DOMelem_image = z
};
dhtmlXCombo_imageOption.prototype.RedrawHeader = function (self) {
    self.DOMelem_image.style.visibility = 'visible';
    self.DOMelem_image.src = this.img_src
};
dhtmlXCombo_imageOption.prototype.getDefImage = function (self) {
    return ""
};
dhtmlXCombo.prototype.setDefaultImage = function (url) {
    dhtmlXCombo_imageOption.prototype.getDefImage = function () {
        return url
    }
};
dhtmlXCombo_optionTypes['image'] = dhtmlXCombo_imageOption;
dhtmlXCombo_checkboxOption = function () {
    this.init()
};
dhtmlXCombo_checkboxOption.prototype = new dhtmlXCombo_defaultOption;
dhtmlXCombo_checkboxOption.prototype.setValue = function (attr) {
    this.value = attr.value || "";
    this.text = attr.text || "";
    this.css = attr.css || "";
    this.checked = attr.checked || 0
};
dhtmlXCombo_checkboxOption.prototype.render = function () {
    if (!this.content) {
        this.content = document.createElement("DIV");
        this.content._self = this;
        this.content.style.cssText = 'width:100%;overflow:hidden;' + this.css;
        var html = '';
        if (this.checked) html += '<input style="float:left;" type="checkbox" checked />';
        else html += '<input style="float:left;" type="checkbox" />';
        html += '<div style="float:left">' + this.text + '</div>';
        this.content.innerHTML = html;
        this.content.firstChild.onclick = function (e) {
            this.parentNode.parentNode.combo.DOMelem_input.focus();
            (e || event).cancelBubble = true;
            if (!this.parentNode.parentNode.combo.callEvent("onCheck", [this.parentNode._self.value, this.checked])) {
                this.checked = !this.checked;
                return false
            }
        }
    };
    return this.content
};
dhtmlXCombo_checkboxOption.prototype.data = function () {
    return [this.value, this.text, this.render().firstChild.checked]
};
dhtmlXCombo_checkboxOption.prototype.DrawHeader = function (self, name, width) {
    self.DOMelem = document.createElement("DIV");
    self.DOMelem.style.width = width + "px";
    self.DOMelem.className = 'dhx_combo_box';
    self.DOMelem._self = self;
    this._DrawHeaderCheckbox(self, name, width);
    this._DrawHeaderInput(self, name, width - 18);
    this._DrawHeaderButton(self, name, width);
    self.DOMParent.appendChild(self.DOMelem)
};
dhtmlXCombo_checkboxOption.prototype._DrawHeaderCheckbox = function (self, name, width) {
    var z = document.createElement('input');
    z.type = 'checkbox';
    z.className = (self.rtl) ? 'dhx_combo_option_img_rtl' : 'dhx_combo_option_img';
    z.style.visibility = 'hidden';
    z.onclick = function (e) {
        (e || event).cancelBubble = true
    };
    self.DOMelem.appendChild(z);
    self.DOMelem_checkbox = z
};
dhtmlXCombo_checkboxOption.prototype.RedrawHeader = function (self) {
    self.DOMelem_checkbox.style.visibility = '';
    self.DOMelem_checkbox.checked = this.content.firstChild.checked
};
dhtmlXCombo_optionTypes['checkbox'] = dhtmlXCombo_checkboxOption;
dhtmlXCombo.prototype.getChecked = function () {
    var res = [];
    for (var i = 0; i < this.optionsArr.length; i++) if (this.optionsArr[i].data()[2]) res.push(this.optionsArr[i].value)
    return res
};
dhtmlXCombo.prototype.setChecked = function (index, mode) {
    this.optionsArr[index].content.firstChild.checked = (!(mode === false))
};
dhtmlXCombo.prototype.setCheckedByValue = function (value, mode) {
    return this.setChecked(this.getIndexByValue(value), mode)
};
dhtmlXCombo.prototype.enableOptionAutoPositioning = function (fl) {
    if (!this.ListAutoPosit) this.ListAutoPosit = 1;
    this.attachEvent("onOpen", function () {
        this._setOptionAutoPositioning(fl)
    })
    this.attachEvent("onXLE", function () {
        this._setOptionAutoPositioning(fl)
    })

};
dhtmlXCombo.prototype._setOptionAutoPositioning = function (fl) {
    if ((typeof(fl) != "undefined") && (!convertStringToBoolean(fl))) {
        this.ListPosition = "Bottom";
        this.ListAutoPosit = 0;
        return true
    };
    var pos = this.getPosition(this.DOMelem);
    var bottom = this._getClientHeight() - pos[1] - this.DOMelem.offsetHeight;
    var height = (this.autoHeight) ? (this.DOMlist.scrollHeight) : parseInt(this.DOMlist.offsetHeight);
    if ((bottom < height) && (pos[1] > height)) {
        this.ListPosition = "Top"
    } else this.ListPosition = "Bottom";
    this._positList()
};
dhtmlXCombo.prototype._getClientHeight = function () {
    return ((document.compatMode == 'CSS1Compat') && (!window.opera)) ? document.documentElement.clientHeight : document.body.clientHeight
};
dhtmlXCombo.prototype.setOptionWidth = function (width) {
    if (arguments.length > 0) {
        this.DOMlist.style.width = width + "px";
        if (this.DOMlistF) this.DOMlistF.style.width = width + "px"
    }
};
dhtmlXCombo.prototype.setOptionHeight = function (height) {
    if (arguments.length > 0) {
        if (_isIE) this.DOMlist.style.height = this.DOMlistF.style.height = height + "px";
        else this.DOMlist.style.height = height + "px";
        this._positList()
    }
};
dhtmlXCombo.prototype.enableOptionAutoWidth = function (fl) {
    if (!this._listWidthConf) this._listWidthConf = parseInt(this.DOMlist.style.width);
    if (arguments.length == 0) {
        var fl = 1
    };
    if (convertStringToBoolean(fl)) {
        this.autoOptionWidth = 1;
        this.awOnOpen = this.attachEvent("onOpen", function () {
            this._setOptionAutoWidth()
        });
        this.awOnXLE = this.attachEvent("onXLE", function () {
            this._setOptionAutoWidth()
        })
    } else {
        if (typeof(this.awOnOpen) != "undefined") {
            this.autoOptionWidth = 0;
            this.detachEvent(this.awOnOpen);
            this.detachEvent(this.awOnXLE);
            this.setOptionWidth(this._listWidthConf)
        }
    }
};
dhtmlXCombo.prototype._setOptionAutoWidth = function () {
    this.setOptionWidth(1);
    var x = this.DOMlist.offsetWidth;
    for (var i = 0; i < this.optionsArr.length; i++) {
        var optWidth = (_isFF) ? (this.DOMlist.childNodes[i].scrollWidth - 2) : this.DOMlist.childNodes[i].scrollWidth;
        if (optWidth > x) {
            x = this.DOMlist.childNodes[i].scrollWidth
        }
    };
    this.setOptionWidth(x)
};
dhtmlXCombo.prototype.enableOptionAutoHeight = function (fl, maxHeight) {
    if (!this._listHeightConf) this._listHeightConf = (this.DOMlist.style.height == "") ? 100 : parseInt(this.DOMlist.style.height);
    if (arguments.length == 0) var fl = 1;
    this.autoHeight = convertStringToBoolean(fl);
    if (this.autoHeight) {
        this.ahOnOpen = this.attachEvent("onOpen", function () {
            this._setOptionAutoHeight(fl, maxHeight);
            if (_isIE) this._setOptionAutoHeight(fl, maxHeight)
        })
        if (!this.awOnOpen) this.ahOnXLE = this.attachEvent("onXLE", function () {
            var that = this;
            window.setTimeout(function () {
                that.callEvent("onOpen", [])
            }, 1)
        })
    } else {
        if (typeof(this.ahOnOpen) != "undefined") {
            this.detachEvent(this.ahOnOpen);
            this.detachEvent(this.ahOnXLE);
            this.setOptionHeight(this._listHeightConf)
        }
    }
};
dhtmlXCombo.prototype._setOptionAutoHeight = function (fl, maxHeight) {
    if (convertStringToBoolean(fl)) {
        this.setOptionHeight(1);
        var height = 0;
        if (this.optionsArr.length > 0) {
            if (this.DOMlist.scrollHeight > this.DOMlist.offsetHeight) {
                height = this.DOMlist.scrollHeight + 2
            } else height = this.DOMlist.offsetHeight;
            if ((arguments.length > 1) && (maxHeight)) {
                var maxHeight = parseInt(maxHeight);
                height = (height > maxHeight) ? maxHeight : height
            };
            this.setOptionHeight(height)
        }
    }
};
dhtmlXCombo.prototype.attachChildCombo = function (_chcombo, xml) {
    if (!this._child_combos) {
        this._child_combos = []
    };
    this._has_childen = 1;
    this._child_combos[this._child_combos.length] = _chcombo;
    _chcombo.show(0);
    var that = this;
    var _arg_length = arguments.length;
    this.attachEvent("onChange", function () {
        for (var i = 0; i < that._child_combos.length; i++) {
            if (that._child_combos[i] == _chcombo) {
                _chcombo.show(1);
                _chcombo.callEvent("onMasterChange", [that.getActualValue(), that])
            }
        };
        if (that.getActualValue() == "") {
            that.showSubCombo(that, 0);
            return
        };
        if (_chcombo._xml) {
            if (_arg_length == 1) xml = _chcombo._xml;
            _chcombo._xml = that.deleteParentVariable(xml);
            _chcombo._xml += ((_chcombo._xml.indexOf("?") != -1) ? "&" : "?") + "parent=" + that.getActualValue()
        } else {
            if (xml) {
                _chcombo.clearAll(true);
                _chcombo.loadXML(xml + ((xml.indexOf("?") != -1) ? "&" : "?") + "parent=" + that.getActualValue())
            }
        }
    })
};
dhtmlXCombo.prototype.setAutoSubCombo = function (xml, name) {
    if (arguments.length == 1) name = "subcombo";
    if (!this._parentCombo) {
        var z = new dhtmlXCombo(this.DOMParent, name, this.DOMelem.style.width)
        z._parentCombo = this
    } else {
        var z = new dhtmlXCombo(this._parentCombo.DOMParent, name, this._parentCombo.DOMelem.style.width)
        z._parentCombo = this._parentCombo
    };
    if (this._filter) z._filter = 1;
    if (this._xml) {
        if (arguments.length > 0) z._xml = xml;
        else z._xml = this._xml;
        xml = z._xml;
        z._autoxml = this._autoxml;
        if (this._xmlCache) z._xmlCache = []
    };
    this.attachChildCombo(z, xml)
    return z
};
dhtmlXCombo.prototype.detachChildCombo = function (_chcombo) {
    for (var i = 0; i < this._child_combos.length; i++) {
        this._child_combos[i] == _chcombo;
        this._child_combos.splice(i, 1)
    };
    _chcombo.show(1)
};
dhtmlXCombo.prototype.showSubCombo = function (combo, state) {
    if (combo._child_combos) {
        for (var i = 0; i < combo._child_combos.length; i++) {
            combo._child_combos[i].show(state);
            combo.showSubCombo(combo._child_combos[i], 0)
        }
    }
};
dhtmlXCombo.prototype.deleteParentVariable = function (str) {
    str = str.replace(/parent\=[^&]*/g, "").replace(/\?\&/, "?");
    return str
};

function dataProcessor(serverProcessorURL) {
    this.serverProcessor = serverProcessorURL;
    this.action_param = "!nativeeditor_status";
    this.obj = null;
    this.updatedRows = [];
    this.autoUpdate = true;
    this.updateMode = "cell";
    this._tMode = "GET";
    this.post_delim = "_";
    this._waitMode = 0;
    this._in_progress = {};
    this._invalid = {};
    this.mandatoryFields = [];
    this.messages = [];
    this.styles = {
        updated: "font-weight:bold;",
        inserted: "font-weight:bold;",
        deleted: "text-decoration : line-through;",
        invalid: "background-color:FFE0E0;",
        invalid_cell: "border-bottom:2px solid red;",
        error: "color:red;",
        clear: "font-weight:normal;text-decoration:none;"
    };
    this.enableUTFencoding(true);
    dhtmlxEventable(this);
    return this
};
dataProcessor.prototype = {
    setTransactionMode: function (mode, total) {
        this._tMode = mode;
        this._tSend = total
    },
    escape: function (data) {
        if (this._utf) return encodeURIComponent(data);
        else return escape(data)
    },

    enableUTFencoding: function (mode) {
        this._utf = convertStringToBoolean(mode)
    },

    setDataColumns: function (val) {
        this._columns = (typeof val == "string") ? val.split(",") : val
    },

    getSyncState: function () {
        return !this.updatedRows.length
    },

    enableDataNames: function (mode) {
        this._endnm = convertStringToBoolean(mode)
    },

    enablePartialDataSend: function (mode) {
        this._changed = convertStringToBoolean(mode)
    },

    setUpdateMode: function (mode, dnd) {
        this.autoUpdate = (mode == "cell");
        this.updateMode = mode;
        this.dnd = dnd
    },

    setUpdated: function (rowId, state, mode) {
        var ind = this.findRow(rowId);
        mode = mode || "updated";
        var existing = this.obj.getUserData(rowId, this.action_param);
        if (existing && mode == "updated") mode = existing;
        if (state) {
            this.set_invalid(rowId, false);
            this.updatedRows[ind] = rowId;
            this.obj.setUserData(rowId, this.action_param, mode)
        } else {
            if (!this.is_invalid(rowId)) {
                this.updatedRows.splice(ind, 1);
                this.obj.setUserData(rowId, this.action_param, "")
            }
        };
        if (!state) this._clearUpdateFlag(rowId);
        this.markRow(rowId, state, mode);
        if (state && this.autoUpdate) this.sendData(rowId)
    },
    _clearUpdateFlag: function (rowId) {
        if (this.obj.mytype != "tree") {
            var row = this.obj.getRowById(rowId);
            if (row) for (var j = 0; j < this.obj._cCount; j++) this.obj.cells(rowId, j).cell.wasChanged = false
        }
    },
    markRow: function (id, state, mode) {
        var str = "";
        var invalid = this.is_invalid(id)
        if (invalid) {
            str = this.styles[invalid]
            state = true
        };
        if (this.callEvent("onRowMark", [id, state, mode, invalid])) {
            str = this.styles[state ? mode : "clear"] + str;
            this.obj[this._methods[0]](id, str);
            if (invalid && invalid.details) {
                str += this.styles[invalid + "_cell"];
                for (var i = 0; i < invalid.details.length; i++) if (invalid.details[i]) this.obj[this._methods[1]](id, i, str)
            }
        }
    },
    getState: function (id) {
        return this.obj.getUserData(id, this.action_param)
    },
    is_invalid: function (id) {
        return this._invalid[id]
    },
    set_invalid: function (id, mode, details) {
        if (details) mode = {
            value: mode,
            details: details,
            toString: function () {
                return this.value.toString()
            }
        };
        this._invalid[id] = mode
    },

    checkBeforeUpdate: function (rowId) {
        var valid = true;
        var c_invalid = [];
        for (var i = 0; i < this.obj._cCount; i++) if (this.mandatoryFields[i]) {
            var res = this.mandatoryFields[i].call(this.obj, this.obj.cells(rowId, i).getValue(), rowId, i);
            if (typeof res == "string") {
                this.messages.push(res);
                valid = false
            } else {
                valid &= res;
                c_invalid[i] = !res
            }
        };
        if (!valid) {
            this.set_invalid(rowId, "invalid", c_invalid);
            this.setUpdated(rowId, false)
        };
        return valid
    },

    sendData: function (rowId) {
        if (this._waitMode && (this.obj.mytype == "tree" || this.obj._h2)) return;
        if (this.obj.editStop) this.obj.editStop();
        if (this.obj.linked_form) this.obj.linked_form.update();
        if (typeof rowId == "undefined" || this._tSend) return this.sendAllData();
        if (this._in_progress[rowId]) return false;
        this.messages = [];
        if (!this.checkBeforeUpdate(rowId) && this.callEvent("onValidatationError", [rowId, this.messages])) return false;
        this._beforeSendData(this._getRowData(rowId), rowId)
    },
    _beforeSendData: function (data, rowId) {
        if (!this.callEvent("onBeforeUpdate", [rowId, this.getState(rowId)])) return false;
        this._sendData(data, rowId)
    },
    _sendData: function (a1, rowId) {
        if (!a1) return;
        if (rowId) this._in_progress[rowId] = (new Date()).valueOf();
        if (!this.callEvent("onBeforeDataSending", rowId ? [rowId, this.getState(rowId)] : [])) return false;
        var a2 = new dtmlXMLLoaderObject(this.afterUpdate, this, true);
        var a3 = this.serverProcessor;
        if (this._tMode != "POST") a2.loadXML(a3 + ((a3.indexOf("?") != -1) ? "&" : "?") + a1);
        else a2.loadXML(a3, true, a1);
        this._waitMode++
    },
    sendAllData: function () {
        if (!this.updatedRows.length) return;
        this.messages = [];
        var valid = true;
        for (var i = 0; i < this.updatedRows.length; i++) valid &= this.checkBeforeUpdate(this.updatedRows[i]);
        if (!valid && !this.callEvent("onValidatationError", ["", this.messages])) return false;
        if (this._tSend) this._sendData(this._getAllData());
        else for (var i = 0; i < this.updatedRows.length; i++) if (!this._in_progress[this.updatedRows[i]]) {
            if (this.is_invalid(this.updatedRows[i])) continue;
            this._beforeSendData(this._getRowData(this.updatedRows[i]), this.updatedRows[i]);
            if (this._waitMode && (this.obj.mytype == "tree" || this.obj._h2)) return
        }
    },








    _getAllData: function (rowId) {
        var out = new Array();
        var rs = new Array();
        for (var i = 0; i < this.updatedRows.length; i++) {
            var id = this.updatedRows[i];
            if (this._in_progress[id] || this.is_invalid(id)) continue;
            if (!this.callEvent("onBeforeUpdate", [id, this.getState(id)])) continue;
            out[out.length] = this._getRowData(id, id + this.post_delim);
            rs[rs.length] = id;
            this._in_progress[id] = (new Date()).valueOf()
        };
        if (out.length) out[out.length] = "ids=" + rs.join(",");
        return out.join("&")
    },
    _getRowData: function (rowId, pref) {
        pref = (pref || "");
        if (this.obj.mytype == "tree") {
            var z = this.obj._globalIdStorageFind(rowId);
            var z2 = z.parentObject;
            var i = 0;
            for (i = 0; i < z2.childsCount; i++) if (z2.childNodes[i] == z) break;
            var str = pref + "tr_id=" + this.escape(z.id);
            str += "&" + pref + "tr_pid=" + this.escape(z2.id);
            str += "&" + pref + "tr_order=" + i;
            str += "&" + pref + "tr_text=" + this.escape(z.span.innerHTML);
            z2 = (z._userdatalist || "").split(",");
            for (i = 0; i < z2.length; i++) str += "&" + pref + this.escape(z2[i]) + "=" + this.escape(z.userData["t_" + z2[i]])
        } else {
            var str = pref + "gr_id=" + this.escape(rowId);
            if (this.obj.isTreeGrid()) str += "&" + pref + "gr_pid=" + this.escape(this.obj.getParentId(rowId));
            var r = this.obj.getRowById(rowId);
            for (var i = 0; i < this.obj._cCount; i++) {
                if (this.obj._c_order) var i_c = this.obj._c_order[i];
                else var i_c = i;
                var c = this.obj.cells(r.idd, i);
                if (this._changed && !c.wasChanged()) continue;
                if (this._endnm) str += "&" + pref + this.obj.getColumnId(i) + "=" + this.escape(c.getValue());
                else str += "&" + pref + "c" + i_c + "=" + this.escape(c.getValue())
            };
            var data = this.obj.UserData[rowId];
            if (data) {
                for (var j = 0; j < data.keys.length; j++) if (data.keys[j].indexOf("__") != 0) str += "&" + pref + data.keys[j] + "=" + this.escape(data.values[j])
            };
            var data = this.obj.UserData["gridglobaluserdata"];
            if (data) {
                for (var j = 0; j < data.keys.length; j++) str += "&" + pref + data.keys[j] + "=" + this.escape(data.values[j])
            }
        };
        if (this.obj.linked_form) str += this.obj.linked_form.get_serialized(rowId, pref);
        return str
    },









    setVerificator: function (ind, verifFunction) {
        this.mandatoryFields[ind] = verifFunction || (function (value) {
            return (value != "")
        })
    },

    clearVerificator: function (ind) {
        this.mandatoryFields[ind] = false
    },





    findRow: function (pattern) {
        var i = 0;
        for (i = 0; i < this.updatedRows.length; i++) if (pattern == this.updatedRows[i]) break;
        return i
    },












    defineAction: function (name, handler) {
        if (!this._uActions) this._uActions = [];
        this._uActions[name] = handler
    },





    afterUpdateCallback: function (sid, tid, action, btag) {
        delete this._in_progress[sid];
        var correct = (action != "error" && action != "invalid");
        if (!correct) this.set_invalid(sid, action);
        if ((this._uActions) && (this._uActions[action]) && (!this._uActions[action](btag))) return;
        this.setUpdated(sid, false);
        var soid = sid;
        switch (action) {
        case "inserted":
        case "insert":
            if (tid != sid) {
                this.obj[this._methods[2]](sid, tid);
                sid = tid
            };
            break;
        case "delete":
        case "deleted":
            this.obj.setUserData(sid, this.action_param, "true_deleted");
            this.obj[this._methods[3]](sid);
            return this.callEvent("onAfterUpdate", [sid, action, tid, btag])
            break
        };
        if (correct) this.obj.setUserData(sid, this.action_param, '');
        this.callEvent("onAfterUpdate", [sid, action, tid, btag])
    },


    afterUpdate: function (that, b, c, d, xml) {
        xml.getXMLTopNode("data");
        if (!xml.xmlDoc.responseXML) return;
        var atag = xml.doXPath("//data/action");
        for (var i = 0; i < atag.length; i++) {
            var btag = atag[i];
            var action = btag.getAttribute("type");
            var sid = btag.getAttribute("sid");
            var tid = btag.getAttribute("tid");
            that.afterUpdateCallback(sid, tid, action, btag)
        };
        if (that._waitMode) that._waitMode--;
        if ((that.obj.mytype == "tree" || that.obj._h2) && that.updatedRows.length) that.sendData();
        that.callEvent("onAfterUpdateFinish", []);
        if (!that.updatedRows.length) that.callEvent("onFullSync", [])
    },






    init: function (anObj) {
        this.obj = anObj;
        if (this.obj._dp_init) return this.obj._dp_init(this);
        var self = this;
        if (this.obj.mytype == "tree") {
            this._methods = ["setItemStyle", "", "changeItemId", "deleteItem"];
            this.obj.attachEvent("onEdit", function (state, id) {
                if (state == 3) self.setUpdated(id, true)
                return true
            });
            this.obj.attachEvent("onDrop", function (id, id_2, id_3, tree_1, tree_2) {
                if (tree_1 == tree_2) self.setUpdated(id, true)
            });
            this.obj._onrdlh = function (rowId) {
                var z = self.getState(rowId);
                if (z == "inserted") {
                    self.set_invalid(rowId, false);
                    self.setUpdated(rowId, false);
                    return true
                };
                if (z == "true_deleted") {
                    self.setUpdated(rowId, false);
                    return true
                };
                self.setUpdated(rowId, true, "deleted")
                return false
            };
            this.obj._onradh = function (rowId) {
                self.setUpdated(rowId, true, "inserted")
            }
        } else {
            this._methods = ["setRowTextStyle", "setCellTextStyle", "changeRowId", "deleteRow"];
            this.obj.attachEvent("onEditCell", function (state, id, index) {
                if (self._columns && !self._columns[index]) return true;
                var cell = self.obj.cells(id, index)
                if (state == 1) {
                    if (cell.isCheckbox()) {
                        self.setUpdated(id, true)
                    }
                } else if (state == 2) {
                    if (cell.wasChanged()) {
                        self.setUpdated(id, true)
                    }
                };
                return true
            })
            this.obj.attachEvent("onRowPaste", function (id) {
                self.setUpdated(id, true)
            })
            this.obj.attachEvent("onRowIdChange", function (id, newid) {
                var ind = self.findRow(id);
                if (ind < self.updatedRows.length) self.updatedRows[ind] = newid
            })
            this.obj.attachEvent("onSelectStateChanged", function (rowId) {
                if (self.updateMode == "row") self.sendData();
                return true
            });
            this.obj.attachEvent("onEnter", function (rowId, celInd) {
                if (self.updateMode == "row") self.sendData();
                return true
            });
            this.obj.attachEvent("onBeforeRowDeleted", function (rowId) {
                if (this.dragContext && self.dnd) {
                    window.setTimeout(function () {
                        self.setUpdated(rowId, true)
                    }, 1)
                    return true
                };
                var z = self.getState(rowId);
                if (this._h2) {
                    this._h2.forEachChild(rowId, function (el) {
                        self.setUpdated(el.id, false);
                        self.markRow(el.id, true, "deleted")
                    }, this)
                };
                if (z == "inserted") {
                    self.set_invalid(rowId, false);
                    self.setUpdated(rowId, false);
                    return true
                };
                if (z == "deleted") return false;
                if (z == "true_deleted") {
                    self.setUpdated(rowId, false);
                    return true
                };
                self.setUpdated(rowId, true, "deleted");
                return false
            });
            this.obj.attachEvent("onRowAdded", function (rowId) {
                if (this.dragContext && self.dnd) return true;
                self.setUpdated(rowId, true, "inserted")
                return true
            });
            this.obj.on_form_update = function (id) {
                self.setUpdated(id, true);
                return true
            }
        }
    },


    link_form: function (obj) {
        obj.on_update = this.obj.on_form_update
    },
    setOnAfterUpdate: function (ev) {
        this.attachEvent("onAfterUpdate", ev)
    },
    enableDebug: function (mode) {},
    setOnBeforeUpdateHandler: function (func) {
        this.attachEvent("onBeforeDataSending", func)
    }
};

function dhtmlXEditor(base, skin) {
    var that = this;
    this.skin = (skin || dhtmlx.skin || "dhx_skyblue");
    this.iconsPath = dhtmlx.image_path || "../../codebase/imgs/";
    if (typeof(base) == "string") base = document.getElementById(base);
    this.base = base;
    while (this.base.childNodes.length > 0) this.base.removeChild(this.base.childNodes[0]);
    this._isToolbar = (this.initDhtmlxToolbar != null && window.dhtmlXToolbarObject != null ? true : false);
    if (!this._isToolbar) {
        this.tbData = "<div class='dhxeditor_" + this.skin + "_btns'>" + "<a href='javascript:void(0);' onclick='return false;' nomousedown='return false;'><div cmd='applyBold' class='dhxeditor_" + this.skin + "_tbbtn btn_bold'></div></a>" + "<a href='javascript:void(0);' onclick='return false;' nomousedown='return false;'><div cmd='applyItalic' class='dhxeditor_" + this.skin + "_tbbtn btn_italic'></div></a>" + "<a href='javascript:void(0);' onclick='return false;' nomousedown='return false;'><div cmd='applyUnderscore' class='dhxeditor_" + this.skin + "_tbbtn btn_underline'></div></a>" + "<a href='javascript:void(0);' onclick='return false;' nomousedown='return false;'><div cmd='clearFormatting' class='dhxeditor_" + this.skin + "_tbbtn btn_clearformat'></div></a>" + "<div class='verline_l'></div><div class='verline_r'></div>" + "</div>"
    } else {
        this.tbData = ""
    };
    var pos = (_isIE ? this.base.currentStyle["position"] : window.getComputedStyle(this.base, null).getPropertyValue("position"));
    if (!(pos == "relative" || pos == "absolute")) this.base.style.position = "relative";
    this.base.innerHTML = this.tbData + "<div style='position:absolute;width: 100%;overflow: hidden;'></div>";
    var dhxCont = new dhtmlXContainerLite(this.base);
    dhxCont.setContent(this.base.childNodes[(this._isToolbar ? 0 : 1)]);
    var ofs = (this._isToolbar ? 0 : this.base.childNodes[0].offsetHeight);
    this.base.adjustContent(this.base, ofs);
    this.editor = document.createElement("IFRAME");
    this.editor.className = "dhxeditor_mainiframe_" + this.skin;
    this.editor.frameBorder = 0;
    if (_isOpera) this.editor.scrolling = "yes";
    this.base.attachObject(this.editor);
    this.edWin = this.editor.contentWindow;
    this.edDoc = this.edWin.document;
    this._prepareContent = function (saveContent) {
        var storedContent = "";
        if (saveContent === true && this.getContent != null) storedContent = this.getContent();
        var content = this.edDoc;
        content.open("text/html", "replace");
        if (_isOpera) {
            content.write("<html><head><style> html, body {overflow:auto;padding:0px;padding-left:1px !important;height:100%;margin:0px;font-family:Tahoma;font-size:10pt;background-color:#ffffff};</style></head><body contenteditable='true'></body></html>")
        } else {
            if (window._KHTMLrv) {
                content.write("<html><head><style> html {overflow-x: auto;overflow-y: auto};body {overflow: auto;overflow-y: scroll};html,body {padding:0px;padding-left:1px !important;height:100%;margin:0px;font-family:Tahoma;font-size:10pt;background-color:#ffffff};</style></head><body contenteditable='true'></body></html>")
            } else {
                content.write("<html><head><style> html,body {overflow-x: auto;overflow-y: scroll;padding:0px;padding-left:1px !important;height:100%;margin:0px;font-family:Tahoma;font-size:10pt;background-color:#ffffff};</style></head><body contenteditable='true'></body></html>")
            }
        };
        content.close();
        this.edDoc.designMode = 'On';
        if (_isFF) try {
            this.edDoc.execCommand("useCSS", false, true)
        } catch (e) {};
        if (saveContent === true && this.setContent != null) this.setContent(storedContent)
    };
    this._prepareContent();
    this.setIconsPath = function () {};
    this.init = function () {};
    this.setSizes = function () {
        var ofs = (this._isToolbar ? 0 : this.base.childNodes[0].offsetHeight);
        this.base.adjustContent(this.base, ofs)
    };
    this._resizeTM = null;
    this._resizeTMTime = 100;
    this._doOnResize = function () {
        window.clearTimeout(that._resizeTM);
        that._resizeTM = window.setTimeout(function () {
            if (that.setSizes) that.setSizes()
        }, that._resizeTMTime)
    };
    this._doOnUnload = function () {
        window.detachEvent("onresize", this._doOnResize);
        window.removeEventListener("resize", this._doOnResize, false)
    };
    dhtmlxEvent(window, "resize", this._doOnResize);
    this.base.childNodes[0].onselectstart = function (e) {
        e = e || event;
        e.cancelBubble = true;
        e.returnValue = false;
        if (e.preventDefault) e.preventDefault();
        return false
    };
    for (var q = 0; q < this.base.childNodes[0].childNodes.length - 2; q++) {
        this.base.childNodes[0].childNodes[q].childNodes[0].onmousedown = function (e) {
            that[this.getAttribute("cmd")]();
            return false
        };
        this.base.childNodes[0].childNodes[q].childNodes[0].onclick = function (e) {
            return false
        }
    };
    this.runCommand = function (name, param) {
        if (arguments.length < 2) param = null;
        if (_isIE) this.edWin.focus();
        this.edDoc.execCommand(name, false, param);
        if (_isIE) {
            this.edWin.focus();
            var self = this;
            window.setTimeout(function () {
                self.edWin.focus()
            }, 1)
        }
    };
    this.applyBold = function () {
        this.runCommand("Bold")
    };
    this.applyItalic = function () {
        this.runCommand("Italic")
    };
    this.applyUnderscore = function () {
        this.runCommand("Underline")
    };
    this.clearFormatting = function () {
        this.runCommand("RemoveFormat")
    };
    if (this._isToolbar) this.initDhtmlxToolbar();
    dhtmlxEventable(this);
    dhtmlxEvent(this.edDoc, "click", function (e) {
        var ev = e || window.event;
        var el = ev.target || ev.srcElement;
        that.showInfo(el)
    });
    if (_isOpera) {
        dhtmlxEvent(this.edDoc, "mousedown", function (e) {
            var ev = e || window.event;
            var el = ev.target || ev.srcElement;
            that.showInfo(el)
        })
    };
    dhtmlxEvent(this.edDoc, "keyup", function (e) {
        var ev = e || window.event;
        var key = ev.keyCode;
        var el = ev.target || ev.srcElement;
        if ((key == 37) || (key == 38) || (key == 39) || (key == 40) || (key == 13)) that.showInfo(el)
    });
    var that = this;
    this.attachEvent("onFocusChanged", function (state) {
        if (that._doOnFocusChanged) that._doOnFocusChanged(state)
    });
    this.showInfo = function (el) {
        var el = (this.getSelectionBounds().end) ? this.getSelectionBounds().end : el;
        if (!el) return
        try {
            if (this.edWin.getComputedStyle) {
                var st = this.edWin.getComputedStyle(el, null);
                var fw = ((st.getPropertyValue("font-weight") == 401) ? 700 : st.getPropertyValue("font-weight"));
                this.style = {
                    fontStyle: st.getPropertyValue("font-style"),
                    fontSize: st.getPropertyValue("font-size"),
                    textDecoration: st.getPropertyValue("text-decoration"),
                    fontWeight: fw,
                    fontFamily: st.getPropertyValue("font-family"),
                    textAlign: st.getPropertyValue("text-align")
                };
                if (window._KHTMLrv) {
                    this.style.fontStyle = st.getPropertyValue("font-style");
                    this.style.vAlign = st.getPropertyValue("vertical-align");
                    this.style.del = this.isStyleProperty(el, "span", "textDecoration", "line-through");
                    this.style.u = this.isStyleProperty(el, "span", "textDecoration", "underline")
                }
            } else {
                var st = el.currentStyle;
                this.style = {
                    fontStyle: st.fontStyle,
                    fontSize: st.fontSize,
                    textDecoration: st.textDecoration,
                    fontWeight: st.fontWeight,
                    fontFamily: st.fontFamily,
                    textAlign: st.textAlign
                }
            };
            this.setStyleProperty(el, "h1");
            this.setStyleProperty(el, "h2");
            this.setStyleProperty(el, "h3");
            this.setStyleProperty(el, "h4");
            if (!window._KHTMLrv) {
                this.setStyleProperty(el, "del");
                this.setStyleProperty(el, "sub");
                this.setStyleProperty(el, "sup");
                this.setStyleProperty(el, "u")
            };
            this.callEvent("onFocusChanged", [this.style, st])
        } catch (e) {
            return null
        }
    };
    this.getSelectionBounds = function () {
        var range, root, start, end;
        if (this.edWin.getSelection) {
            var selection = this.edWin.getSelection();
            range = selection.getRangeAt(selection.rangeCount - 1);
            start = range.startContainer;
            end = range.endContainer;
            root = range.commonAncestorContainer;
            if (start.nodeName == "#text") root = root.parentNode;
            if (start.nodeName == "#text") start = start.parentNode;
            if (start.nodeName.toLowerCase() == "body") start = start.firstChild;
            if (end.nodeName == "#text") end = end.parentNode;
            if (end.nodeName.toLowerCase() == "body") end = end.lastChild;
            if (start == end) root = start;
            return {
                root: root,
                start: start,
                end: end
            }
        } else if (this.edWin.document.selection) {
            range = this.edDoc.selection.createRange()
            if (!range.duplicate) return null;
            root = range.parentElement();
            var r1 = range.duplicate();
            var r2 = range.duplicate();
            r1.collapse(true);
            r2.moveToElementText(r1.parentElement());
            r2.setEndPoint("EndToStart", r1);
            start = r1.parentElement();
            r1 = range.duplicate();
            r2 = range.duplicate();
            r2.collapse(false);
            r1.moveToElementText(r2.parentElement());
            r1.setEndPoint("StartToEnd", r2);
            end = r2.parentElement();
            if (start.nodeName.toLowerCase() == "body") start = start.firstChild;
            if (end.nodeName.toLowerCase() == "body") end = end.lastChild;
            if (start == end) root = start;
            return {
                root: root,
                start: start,
                end: end
            }
        };
        return null
    };
    this.getContent = function () {
        if (!this.edDoc.body) return "";
        else {
            if (_isFF) {
                return this.edDoc.body.innerHTML.replace(/<br>$/, "")
            };
            return this.edDoc.body.innerHTML
        }
    };
    this.setContent = function (str) {
        if (this.edDoc.body) {
            this.edDoc.body.innerHTML = str;
            this.callEvent("onContentSet", []);
            if (_isFF) {
                this.runCommand('InsertHTML', ' ')
            }
        } else {
            var that = this;
            dhtmlxEvent(this.edWin, "load", function (e) {
                that.setContent(str)
            })
        }
    };
    this.setContentHTML = function (url) {
        (new dtmlXMLLoaderObject(this._ajaxOnLoad, this, false, true)).loadXML(url)
    };
    this._ajaxOnLoad = function (obj, a, b, c, loader) {
        if (loader.xmlDoc.responseText) obj.setContent(loader.xmlDoc.responseText)
    }
};

function dhtmlXContainerLite(obj) {
    var that = this;
    this.obj = obj;
    this.dhxcont = null;
    this.setContent = function (data) {
        this.dhxcont = data;
        this.dhxcont.innerHTML = "<div id='dhxMainCont' style='position: relative;left: 0px;top: 0px;overflow: hidden;'></div>" + "<div id='dhxContBlocker' class='dhxcont_content_blocker' style='display: none;'></div>";
        this.dhxcont.mainCont = this.dhxcont.childNodes[0];
        this.obj.dhxcont = this.dhxcont
    };
    this.obj._genStr = function (w) {
        var s = "";
        var z = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        for (var q = 0; q < w; q++) {
            s = s + z.charAt(Math.round(Math.random() * z.length))
        };
        return s
    };
    this.obj.adjustContent = function (parentObj, offsetTop, marginTop, notCalcWidth, offsetBottom) {
        this.dhxcont.style.left = (this._offsetLeft || 0) + "px";
        this.dhxcont.style.top = (this._offsetTop || 0) + offsetTop + "px";
        var cw = parentObj.clientWidth + (this._offsetWidth || 0);
        if (notCalcWidth !== true) this.dhxcont.style.width = Math.max(0, cw) + "px";
        if (notCalcWidth !== true) if (this.dhxcont.offsetWidth > cw) this.dhxcont.style.width = Math.max(0, cw * 2 - this.dhxcont.offsetWidth) + "px";
        var ch = parentObj.clientHeight + (this._offsetHeight || 0);
        this.dhxcont.style.height = Math.max(0, ch - offsetTop) + (marginTop != null ? marginTop : 0) + "px";
        if (this.dhxcont.offsetHeight > ch - offsetTop) this.dhxcont.style.height = Math.max(0, (ch - offsetTop) * 2 - this.dhxcont.offsetHeight) + "px";
        if (offsetBottom) if (!isNaN(offsetBottom)) this.dhxcont.style.height = Math.max(0, parseInt(this.dhxcont.style.height) - offsetBottom) + "px";
        if (this._minDataSizeH != null) {
            if (parseInt(this.dhxcont.style.height) < this._minDataSizeH) this.dhxcont.style.height = this._minDataSizeH + "px"
        };
        if (this._minDataSizeW != null) {
            if (parseInt(this.dhxcont.style.width) < this._minDataSizeW) this.dhxcont.style.width = this._minDataSizeW + "px"
        };
        if (notCalcWidth !== true) {
            this.dhxcont.mainCont.style.width = this.dhxcont.clientWidth + "px";
            if (this.dhxcont.mainCont.offsetWidth > this.dhxcont.clientWidth) this.dhxcont.mainCont.style.width = Math.max(0, this.dhxcont.clientWidth * 2 - this.dhxcont.mainCont.offsetWidth) + "px"
        };
        var menuOffset = (this.menu != null ? (!this.menuHidden ? this.menuHeight : 0) : 0);
        var toolbarOffset = (this.toolbar != null ? (!this.toolbarHidden ? this.toolbarHeight : 0) : 0);
        var statusOffset = (this.sb != null ? (!this.sbHidden ? this.sbHeight : 0) : 0);
        this.dhxcont.mainCont.style.height = this.dhxcont.clientHeight + "px";
        if (this.dhxcont.mainCont.offsetHeight > this.dhxcont.clientHeight) this.dhxcont.mainCont.style.height = Math.max(0, this.dhxcont.clientHeight * 2 - this.dhxcont.mainCont.offsetHeight) + "px";
        this.dhxcont.mainCont.style.height = Math.max(0, parseInt(this.dhxcont.mainCont.style.height) - menuOffset - toolbarOffset - statusOffset) + "px"
    };
    this.obj.attachToolbar = function () {
        var toolbarObj = document.createElement("DIV");
        toolbarObj.style.position = "relative";
        toolbarObj.style.overflow = "hidden";
        toolbarObj.id = "dhxtoolbar_" + this._genStr(12);
        this.dhxcont.insertBefore(toolbarObj, this.dhxcont.childNodes[(this.menu != null ? 1 : 0)]);
        this.toolbar = new dhtmlXToolbarObject(toolbarObj.id, this.skin);
        this.toolbarHeight = toolbarObj.offsetHeight + (this._isLayout && this.skin == "dhx_skyblue" ? 2 : 0);
        this.toolbarId = toolbarObj.id;
        if (this._doOnAttachToolbar) this._doOnAttachToolbar("init");
        this.adjust();
        return this.toolbar
    };
    this.obj.attachObject = function (obj, autoSize) {
        if (typeof(obj) == "string") obj = document.getElementById(obj);
        if (autoSize) {
            obj.style.visibility = "hidden";
            obj.style.display = "";
            var objW = obj.offsetWidth;
            var objH = obj.offsetHeight
        };
        this._attachContent("obj", obj);
        if (autoSize && this._isWindow) {
            obj.style.visibility = "visible";
            this._adjustToContent(objW, objH)
        }
    };
    this.obj.adjust = function () {
        if (this.skin == "dhx_skyblue") {
            if (this.toolbar) {
                if (this._isWindow || this._isLayout) {
                    document.getElementById(this.toolbarId).style.height = "29px";
                    this.toolbarHeight = document.getElementById(this.toolbarId).offsetHeight;
                    if (this._doOnAttachToolbar) this._doOnAttachToolbar("show")
                };
                if (this._isCell) {
                    document.getElementById(this.toolbarId).className += " in_layoutcell"
                };
                if (this._isAcc) {
                    document.getElementById(this.toolbarId).className += " in_acccell"
                }
            }
        }
    };
    this.obj._attachContent = function (type, obj, append) {
        while (that.dhxcont.mainCont.childNodes.length > 0) {
            that.dhxcont.mainCont.removeChild(that.dhxcont.mainCont.childNodes[0])
        };
        if (type == "obj") {
            if (this._isWindow && obj.cmp == null && this.skin == "dhx_skyblue") {
                this.dhxcont.mainCont.style.border = "#a4bed4 1px solid";
                this.dhxcont.mainCont.style.backgroundColor = "#FFFFFF";
                this._redraw()
            };
            that.dhxcont._frame = null;
            that.dhxcont.mainCont.appendChild(obj);
            that.dhxcont.mainCont.style.overflow = (append === true ? "auto" : "hidden");
            obj.style.display = ""
        }
    };
    this.obj._dhxContDestruct = function () {
        this._genStr = null;
        this.moveContentTo = null;
        this.adjustContent = null;
        this.attachToolbar = null;
        while (this.dhxcont.mainCont.childNodes.length > 0) this.dhxcont.mainCont.removeChild(this.dhxcont.mainCont.childNodes[0]);
        this.dhxcont.mainCont.innerHTML = "";
        this.dhxcont.mainCont = null;
        try {
            delete this.dhxcont["mainCont"]
        } catch (e) {};
        while (this.dhxcont.childNodes.length > 0) this.dhxcont.removeChild(this.dhxcont.childNodes[0]);
        this.dhxcont.innerHTML = "";
        this.dhxcont = null;
        try {
            delete this["dhxcont"]
        } catch (e) {}
    }
};
(function () {
    dhtmlx.extend_api("dhtmlXEditor", {
        _init: function (obj) {
            return [obj.parent, obj.skin]
        },
        content: "setContent"
    }, {})
})();

function dhtmlxFolders(parent) {
    if (typeof(parent) != "object") parent = document.getElementById(parent);
    this.parent = parent;
    this.imgSrc = window.dhx_globalImgPath || "";
    this.XMLLoader = null;
    this._item_type = "xml_generic";
    this._userdataCol = new Array();
    this.cont = document.createElement("DIV");
    this.parent.appendChild(this.cont);
    this.cont.className = "dhx_folders_area";
    if (_isIE) this.cont.className += " dhx_isIE6";
    var self = this;
    this.clickTime = 0;
    this.clickedID = null;
    this.cont.onclick = function (e) {
        self.clickedID = self._trackParent(e || event);
        var retValue = self._onclickHandler(e || event);
        return true
    };
    this.cont.onselectstart = this.stopEvent;
    if (_isMacOS) this.cont.oncontextmenu = function (e) {
        return self._onmupHandler(e || event, "context")
    };
    this.cont.onmousedown = function (e) {
        return self._onmdownHandler(e || event)
    };
    this.cont.onmouseup = function (e) {
        var clickTime = (new Date()).valueOf();
        if (clickTime - self.clickTime < 200) {
            var retValue = self._ondblclickHandler(e || event, self.clickedID)
        };
        self.clickTime = clickTime;
        return self._onmupHandler(e || event)
    };
    this.cont.onmousemove = function (e) {
        return self._onmmoveHandler(e || event)
    };
    this.cont.ondragstart = function () {
        return false
    };
    this.onKeyHandler = function (e) {
        return self._onKeyPressed(e || event)
    };
    dhtmlxEventable(this);
    this.paging = false;
    this.page = 1;
    this.itemsPerPage = 0;
    this.requestServerForPage = false;
    this.globalPage = 1;
    this.globalPageSize = 0;
    this.totalItems = null;
    this.pagerContainer = null;
    this._filtersAr = new Array();
    this._set = {
        editable: false,
        selectable: 1
    };
    this.clearAll();
    return this
};
dhtmlxFolders.prototype.config = function (data) {
    for (a in data) this._set[a] = data[a]
};
dhtmlxFolders.prototype._xml = {
    itemTag: "item",
    url: ""
};
dhtmlxFolders.prototype.enableEditMode = function (state) {
    this._set.editable = state
};
dhtmlxFolders.prototype.setImagePath = function (newPath) {
    this.imgSrc = newPath
};
dhtmlxFolders.prototype.setItemTagName = function (newTagName) {
    this._xml.itemTag = newTagName
};
dhtmlxFolders.prototype._types = {
    ficon: ["dhtmlxFoldersXMLBasedGeneric", "xml-xsl", "ficon", "ficon.xsl", "cells"],
    ftable: ["dhtmlxFoldersXMLBasedGeneric", "xml-xsl", "ftable", "ftable.xsl", "lines"],
    fthumbs: ["dhtmlxFoldersXMLBasedGeneric", "xml-xsl", "fthumbs", "fthumbs.xsl", "cells"],
    ftiles: ["dhtmlxFoldersXMLBasedGeneric", "xml-xsl", "ftiles", "ftiles.xsl", "cells"],
    xml_generic: ["dhtmlxFoldersXMLBasedGeneric", "xml-xsl", "generic", "", "cells"],
    js_generic: ["dhtmlxFoldersJSBasedGeneric", "script", "generic"]
};
dhtmlxFolders.prototype._getCurrentPlacementType = function () {
    return this._types[this._item_type][4] || "cells"
};
dhtmlxFolders.prototype.setCSSBaseName = function (cssBaseName) {
    if (!cssBaseName) cssBaseName = this._item_type;
    this._cssBaseName = cssBaseName
};
dhtmlxFolders.prototype.getCSSBaseName = function () {
    if (!this._cssBaseName) {
        return this._item_type
    } else {
        return this._cssBaseName
    }
};
dhtmlxFolders.prototype._ordIns = function (ind, z) {
    if (ind != this._orderCol.length) this._orderCol = this._orderCol.slice(0, ind).concat([0]).concat(this._orderCol.slice(ind, this._orderCol.length));
    this._orderCol[ind] = z
};
dhtmlxFolders.prototype._ordDel = function (pos) {
    this._orderCol.splice(pos, 1)
};
dhtmlxFolders.prototype._ordMov = function (s, e, m) {
    var tz = this._orderCol[e];
    var sz = this._orderCol[s];
    if (s < e) this._orderCol = this._orderCol.slice(0, s).concat(this._orderCol.slice(s + 1, e)).concat(m == "next" ? [tz, sz] : [sz, tz]).concat(this._orderCol.slice(e + 1, this._orderCol.length));
    else this._orderCol = this._orderCol.slice(0, e).concat(m == "next" ? [tz, sz] : [sz, tz]).concat(this._orderCol.slice(e + 1, s)).concat(this._orderCol.slice(s + 1, this._orderCol.length))
};
dhtmlxFolders.prototype.moveItem = function (sid, mode, tid, sObj, tObj) {
    if (sid == tid) return;
    sObj = sObj || this;
    tObj = tObj || this;
    var sz = sObj._idpullCol[sid].item;
    var tz = tObj._idpullCol[tid].item;
    sz.parentNode.removeChild(sz);
    this.matchId(function (id, ind2) {
        if (mode == "next") if (this._orderCol[ind2 + 1]) tz.parentNode.insertBefore(sz, this._orderCol[ind2 + 1].item);
        else tz.parentNode.appendChild(sz);
        else tz.parentNode.insertBefore(sz, tz);
        this.matchId(function (id2, ind) {
            this._ordMov(ind, ind2, mode)
        }, sid)
    }, tid)
};
dhtmlxFolders.prototype.setItemType = function (name, processor) {
    if (this._item_type != name || arguments.length > 1) {
        this._item_type = name;
        if (arguments.length > 1 && typeof(arguments[1]) == "string") {
            this.XMLLoader.xslDoc = null;
            this._types[this._item_type][3] = arguments[1];
            this.XMLLoader.XSLProcessor = null;
            var self = this;
            var tmpLoader = new dtmlXMLLoaderObject(function () {
                self.XMLLoader.xslDoc = this.xmlDoc;
                for (var i = 0; i < self._orderCol.length; i++) {
                    self._orderCol[i].resetType();
                    self._orderCol[i].render()
                };
                self.drawFolders()
            });
            tmpLoader.loadXML(this._types[this._item_type][3]);
            return
        } else if (arguments.length > 1 && typeof(arguments[1]) == "function") {
            this.rendererFunction = arguments[1]
        };
        if (this._orderCol.length) {
            for (var i = 0; i < this._orderCol.length; i++) {
                this._orderCol[i].render(true)
            }
        }
    }
};
dhtmlxFolders.prototype.getItemDataObject = function (itemId) {
    return this.getItem(itemId).data.dataObj
};
dhtmlxFolders.prototype.sortItems = function (sortFunc, order) {
    this._orderCol.sort(function (a, b) {
        if (order == 'asc') return sortFunc(a, b);
        else return sortFunc(a, b) * -1
    });
    this.drawFolders()
};
dhtmlxFolders.prototype.filterItems = function (filterFunc, mask, preservePrevious) {
    if (!preservePrevious) this.filterClear(true);
    for (var i = 0; i < this._orderCol.length; i++) {
        if (!filterFunc(this._orderCol[i], mask)) this._orderCol[i].data.filteredOut = true
    };
    this._filtersAr[this._filtersAr.length] = new Array(filterFunc, mask);
    this.goToPage(this.page)
};
dhtmlxFolders.prototype.filterClear = function (skip_redraw) {
    for (var i = 0; i < this._orderCol.length; i++) {
        this._orderCol[i].data.filteredOut = false
    };
    this._filtersAr = new Array();
    if (!skip_redraw) this.goToPage(this.page)
};
dhtmlxFolders.prototype._getCurrentlyVisibleItemsArray = function () {
    var outArray = new Array();
    for (var i = 0; i < this._orderCol.length; i++) {
        if (!this._orderCol[i].data.filteredOut) outArray[outArray.length] = this._orderCol[i]
    };
    return outArray
};
dhtmlxFolders.prototype._filtersReApply = function () {
    for (var i = 0; i < this._orderCol.length; i++) {
        this._filtersReApplyOnItem(this._orderCol[i])
    }
};
dhtmlxFolders.prototype._filtersReApplyOnItem = function (itemObj) {
    for (var n = 0; n < this._filtersAr.length; n++) {
        if (!this._filtersAr[n][0](itemObj, this._filtersAr[n][1])) {
            itemObj.data.filteredOut = true;
            break
        }
    }
};
dhtmlxFolders.prototype.getItemsNum = function () {
    return this._orderCol.length
};
dhtmlxFolders.prototype.loadJSON = function (data) {
    for (var i = 0; i < data.length; i++) this.addItemJSON(data[i])
};
dhtmlxFolders.prototype.loadXMLString = function (xmlString, xslFileURL) {
    if (!this.XMLLoader) this.XMLLoader = new dtmlXMLLoaderObject(this._parseXML, this);
    if (xslFileURL != "undefined") this._types[this._item_type][3] = xslFileURL;
    this.XMLLoader.loadXMLString(xmlString)
};
dhtmlxFolders.prototype.loadXML = function (url, xslFileURL) {
    if (!this.XMLLoader) this.XMLLoader = new dtmlXMLLoaderObject(this._parseXML, this, true, true);
    if (xslFileURL != "undefined") this._types[this._item_type][3] = xslFileURL;
    if (url.indexOf("dhx_global_page") == -1) url += ((url.indexOf("?") != -1) ? "&" : "?") + "dhx_global_page=1"
    else {
        var testAr = /dhx_global_page=([0-9]+)/.exec(url);
        this.globalPage = parseInt(testAr[1]) + 1;
        url = url.replace(/dhx_global_page=[0-9]+/, "dhx_global_page=" + this.globalPage)

    };
    this._xml.url = url;
    this.callEvent("onXLS", []);
    this.XMLLoader.loadXML(this._xml.url)
};
dhtmlxFolders.prototype._parseXML = function (obj, a, b, c, xml) {
    if (_isIE && !xml.xmlDoc.documentElement) xml.getXMLTopNode("data", xml);
    var items = xml.doXPath("//" + obj._xml.itemTag);
    if (obj.globalPage == 1) {
        obj.globalPageSize = items.length;
        if (obj.totalItems == null) {
            obj.totalItems = xml.doXPath("/" + "*")[0].getAttribute("total_count")
        }
    };
    if (items.length == 0) obj.requestServerForPage = false;
    var hide = false;
    if (obj.paging) {
        hide = true
    };
    if (obj._types[obj._item_type][1] == "script") {
        for (var i = 0; i < items.length; i++) {
            var item = xml.xmlNodeToJSON(items[i]);
            obj.addItemJSON(item)
        }
    } else if (obj._types[obj._item_type][1] == "xml-xsl") {
        obj._putUserdataToCol(xml);
        if (obj.XMLLoader.xslDoc == null) {
            var self = obj;
            var selfXML = xml;
            var tmpLoader = new dtmlXMLLoaderObject(function () {
                this.getXMLTopNode("xsl:stylesheet");
                self.XMLLoader.xslDoc = this.xmlDoc;
                self._parseXML(self, null, null, null, selfXML)
            });
            tmpLoader.loadXML(obj._types[obj._item_type][3]);
            return
        };
        if (obj.smartRefreshMode == true) {
            if (items.length != obj._orderCol.length) {
                var newContent = true;
                obj.clearAll()
            } else {
                for (var i = 0; i < items.length; i++) {
                    var itemObj = obj._createFoldersItem(items[i], hide);
                    if (!obj.getItem(itemObj.data.id)) {
                        var newContent = true;
                        obj.clearAll();
                        break
                    }
                }
            }
        };
        if (!obj.smartRefreshMode || newContent == true) {
            for (var i = 0; i < items.length; i++) {
                obj.addItemXML(items[i], hide)
            }
        }
    };
    obj.goToPage(obj.page);
    obj.callEvent("onXMLLoadingEnd", []);
    obj.callEvent("onXLE", [])
};
dhtmlxFolders.prototype.enableXMLSmartRefresh = function (mode) {
    this.smartRefreshMode = mode
};
dhtmlxFolders.prototype.enablePaging = function (itemsPerPage, withDynLoading) {
    this.requestServerForPage = withDynLoading == true
    this.paging = itemsPerPage != 0;
    this.itemsPerPage = itemsPerPage;
    return this.goToPage(1)
};
dhtmlxFolders.prototype.goToPage = function (pageNumber) {
    if (this._filtersAr.length > 0) var itemsAr = this._getCurrentlyVisibleItemsArray();
    else var itemsAr = this._orderCol;
    this.page = pageNumber || 1;
    var from = (this.page - 1) * this.itemsPerPage;
    var to = this.page * this.itemsPerPage - 1
    if (itemsAr.length == 0) {
        this.drawFolders();
        return 0
    };
    if (to > itemsAr.length && this.requestServerForPage) {
        this.loadXML(this._xml.url)
        return 2
    };
    if (from >= itemsAr.length) {
        return this.goToPage(this.page - 1)
    };
    for (var i = 0; i < itemsAr.length; i++) {
        var hide = true;
        if (this.itemsPerPage == 0 || (i >= from && i <= to)) {
            hide = false
        };
        itemsAr[i].data.hidden = hide
    };
    this.drawFolders();
    if (this.paging) this.drawPager();
    return 1
};
dhtmlxFolders.prototype.getCurrentPage = function () {
    return this.page
};
dhtmlxFolders.prototype.getNumberOfPages = function () {
    if (this._filtersAr.length > 0) var itemsAr = this._getCurrentlyVisibleItemsArray();
    else var itemsAr = this._orderCol;
    return Math.ceil(itemsAr.length / this.itemsPerPage)
};
dhtmlxFolders.prototype.drawFolders = function () {
    for (var i = 0; i < this._orderCol.length; i++) {
        var itemObj = this._orderCol[i];
        if ((itemObj.data.hidden || itemObj.data.filteredOut) && itemObj.item.parentNode != null) itemObj.item.parentNode.removeChild(itemObj.item);
        else if (!itemObj.data.hidden && !itemObj.data.filteredOut) {
            if (itemObj.data.type != this._item_type) {
                itemObj.resetType();
                itemObj.render()
            };
            this.cont.appendChild(itemObj.item)
        }
    }
};
dhtmlxFolders.prototype.setPagerContainer = function (obj) {
    this.pagerContainer = typeof(obj) == "string" ? document.getElementById(obj) : obj
};
dhtmlxFolders.prototype.drawPager = function () {
    if (this.pagerContainer == null) {
        return
    };
    this.pagerContainer.style.display = "";
    this.pagerContainer.innerHTML = "";
    this.pagerContainer.obj = this;
    for (var i = 0; i < this.getNumberOfPages(); i++) {
        var ins = "";
        if (i + 1 == this.getCurrentPage()) var className = "dhxfolders_pagingCurrent"
        else var className = "dhxfolders_pagingInact"
        var tmpHTML = "<div style='float:left;' class='" + className + "' onclick='this.parentNode.obj.goToPage(" + (i + 1) + ");'>" + (i + 1) + "</div>"
        this.pagerContainer.innerHTML = this.pagerContainer.innerHTML + tmpHTML
    }
};
dhtmlxFolders.prototype._putUserdataToCol = function (xmlObj) {
    if (this._userdataCol == null) this._userdataCol = new Array();
    var items = xmlObj.doXPath("/node()/userdata");
    if (items != null && items.length > 0) for (var i = 0; i < items.length; i++) {
        var item = items[i];
        this._userdataCol[i] = [item.getAttribute("name"), item.firstChild.nodeValue]
    }
};
dhtmlxFolders.prototype.setUserData = function (name, value) {
    if (this._userdataCol == null) this._userdataCol = new Array();
    this._userdataCol[this._userdataCol.length] = [name, value]
};
dhtmlxFolders.prototype.clearAll = function () {
    this.cont.innerHTML = "";
    this._idpullCol = {};
    this._orderCol = [];
    this._selectedCol = [];
    this._activeItemId = null
};
dhtmlxFolders.prototype.deleteItem = function (id) {
    if (!id) return;
    if (typeof(id) == "object") {
        for (var i = 0; i < id.length; i++) this.deleteItem(id[i])
    } else {
        var item = this._idpullCol[id].item;
        item.parentNode.removeChild(item)


        this.matchId(function (id, ind) {
            this._ordDel(ind)
        }, id);
        this.matchSelected(function (id, ind) {
            this._selectedCol.splice(ind, 1)
        }, id);
        this._idpullCol[id] = null
    };
    if (this.paging) this.goToPage(this.page);
    if (id == this._activeItemId) this._activeItemId = null
};
dhtmlxFolders.prototype.getSelectedId = function () {
    switch (this._selectedCol.length) {
    case 0:
        return null;
    case 1:
        return this._selectedCol[0];
    default:
        return (new Array()).concat(this._selectedCol)
    }
};
dhtmlxFolders.prototype.enableSelection = function (mode) {
    this._set.selectable = mode
};
dhtmlxFolders.prototype._getLineLength = function () {
    for (var i = 0; i < this._orderCol.length; i++) if (this._orderCol[i].item.offsetTop != this._orderCol[0].item.offsetTop) return i;
    return this._orderCol.length
};
dhtmlxFolders.prototype._rectToSelection = function () {
    var dx = this._orderCol[0].item.offsetWidth;
    var dy = this._orderCol[0].item.offsetHeight;
    var x = this._selZone.offsetWidth;
    var y = this._selZone.offsetHeight;
    var ay = parseInt(this._selZone.style.top);
    var ax = parseInt(this._selZone.style.left);
    var y1 = Math.ceil(ay / dy);
    var x1 = Math.ceil(ax / dx);
    var y2 = Math.ceil((y + ay) / dy);
    var x2 = Math.ceil((x + ax) / dx);
    var l = this._getLineLength();
    x1 = x1 < l ? x1 : l;
    x2 = x2 < l ? x2 : l;
    this.unselectAll();
    for (var j = y1 - 1; j < y2; j++) for (var i = x1 - 1; i < x2; i++) {
        var ind = this._orderCol[j * l + i];
        if (ind) this.selectItem(ind.data.id, true)
    }
};
dhtmlxFolders.prototype._drawRect = function () {
    if (this._set.selectable != 1) return;
    var x = this._sPoint[0] - this._lPoint[0];
    var y = this._sPoint[1] - this._lPoint[1];
    this._selZone.style.left = this[x < 0 ? '_sPoint' : '_lPoint'][0] + "px";
    this._selZone.style.top = this[y < 0 ? '_sPoint' : '_lPoint'][1] + "px";
    this._selZone.style.width = Math.abs(x) + "px";
    this._selZone.style.height = Math.abs(y) + "px"
};
dhtmlxFolders.prototype.setSizes = function () {
    this.cont.style.height = this.cont.parentNode.offsetHeight - (_isIE ? 0 : 3) + "px"
};
dhtmlxFolders.prototype._setBSMove = function (e) {
    var id = this._trackParent(e);
    if (!this._selZone) {
        this._sPoint = [e.clientX - this._cPos[0] + this.cont.scrollLeft, e.clientY - this._cPos[1] + this.cont.scrollTop, id];
        this._selZone = document.createElement("DIV");
        this._selZone.className = "dhx_folders_block_selection";
        this.cont.appendChild(this._selZone)
    };
    this._lPoint = [e.clientX - this._cPos[0] + this.cont.scrollLeft, e.clientY - this._cPos[1] + this.cont.scrollTop, id];
    this._drawRect()
};
dhtmlxFolders.prototype.editItem = function (id) {
    if (!this._set.editable) return;
    this.selectItem(id);
    this.stopEdit();
    this.getItem(id).edit(true);
    this._editorId = id
};
dhtmlxFolders.prototype.stopEdit = function (saveFl) {
    if (this._editorId) {
        var it = this.getItem(this._editorId);
        if (saveFl) it.saveDataFromEditor()
        it.edit(false);
        this.callEvent("onEditEnd", [this._editorId])
    };
    this._editorId = null
};
dhtmlxFolders.prototype.unselectAll = function () {
    for (var i = 0; i < this._selectedCol.length; i++) this.getItem(this._selectedCol[i]).setSelectedState(false);
    this._selectedCol = []
};
dhtmlxFolders.prototype.selectItem = function (id, ctr, shf) {
    this.stopEdit(id);
    if (this._set.selectable == 0) return;
    if (shf && this._set.selectable == 1) return this.forEachId(function (id) {
        this._selectItem(id)
    }, this._selectedCol[this._selectedCol.length - 1], id);
    if (((!ctr) && (this._selectedCol.length)) || this._set.selectable != 1) this.unselectAll();
    if (ctr && this._set.selectable == 1) if (this.matchSelected(function (sid, sind) {
        this.getItem(sid).setSelectedState(false);
        this._selectedCol.splice(sind, 1)
    }, id)) return true;
    this._selectItem(id);
    this.setItemActive(id)
};
dhtmlxFolders.prototype.setItemActive = function (id) {
    if (this._activeItemId && this.getItem(this._activeItemId)) this.getItem(this._activeItemId).setActiveState(false);
    this.getItem(id).setActiveState(true);
    this._activeItemId = id
};
dhtmlxFolders.prototype._selectItem = function (id) {
    if (this._set.selectable == 0) return;
    var itemObj = this.getItem(id);
    if (!itemObj.data.selected && itemObj.setSelectedState(true)) this._selectedCol.push(id)
};
dhtmlxFolders.prototype._unicId = function (id) {
    if (!id) id = "agid";
    while (this._idpullCol[id]) id += "_" + Math.random().toString().substr(2, 14);
    return id
};
dhtmlxFolders.prototype.addItemJSON = function (jsonObj, hide, pos) {
    var itemObj = this._createFoldersItem(jsonObj, hide);
    this.addItem(itemObj.data.id, itemObj, pos)
};
dhtmlxFolders.prototype.addItemXML = function (xmlNodeObj, hide, pos) {
    var itemObj = this._createFoldersItem(xmlNodeObj, hide);
    this.addItem(itemObj.data.id, itemObj, pos)
};
dhtmlxFolders.prototype.addItem = function (id, itemObj, pos) {
    id = this._unicId(id);
    this._idpullCol[id] = itemObj;
    var ind = this._orderCol.length;
    if (!pos) return this.addItemAt(itemObj, this._orderCol.length);
    var mode = pos.mode || "next";
    var id = pos.id;
    this.matchId(function (id, ind) {
        if (mode == "next") ind++;
        if (ind > this._orderCol.length) ind = this._orderCol.length;
        this.addItemAt(itemObj, ind)
    }, id);
    return itemObj
};
dhtmlxFolders.prototype.addItemAt = function (itemObj, ind) {
    this._ordIns(ind, itemObj)
    return itemObj
};
dhtmlxFolders.prototype._createFoldersItem = function (dataObj, hide) {
    var fItem = new window[this._types[this._item_type][0]]();
    fItem.setData(dataObj, this, hide);
    this._filtersReApplyOnItem(fItem);
    fItem.render();
    fItem.item.dragLanding = this;
    fItem.item.dragStarter = this;
    return fItem
};
dhtmlxFolders.prototype.getItem = function (id) {
    return this._idpullCol[id]
};
dhtmlxFolders.prototype.matchSelected = function (func, id) {
    for (var i = 0; i < this._selectedCol.length; i++) if (this._selectedCol[i] == id) {
        if (func) func.apply(this, [id, i]);
        return true
    };
    return false
};
dhtmlxFolders.prototype.forEachSelected = function (func) {
    for (var i = 0; i < this._selectedCol.length; i++) return func.apply(this, [this._selectedCol[i], i])
};
dhtmlxFolders.prototype.matchId = function (func, a) {
    this.matchObj(func, this._idpullCol[a])
};
dhtmlxFolders.prototype.forEachId = function (func, a, b) {
    this.forEachObj(func, this._idpullCol[a], this._idpullCol[b])
};
dhtmlxFolders.prototype.matchObj = function (func, a) {
    for (var i = 0; i < this._orderCol.length; i++) if (this._orderCol[i] == a) {
        func.apply(this, [this._orderCol[i].data.id, i]);
        return true
    };
    return false
};
dhtmlxFolders.prototype.forEachObj = function (func, a, b) {
    var check = a ? false : true;
    var i = 0;
    for (i; i < this._orderCol.length; i++) {
        if (this._orderCol[i] == a) {
            a = null;
            break
        };
        if (this._orderCol[i] == b) {
            b = null;
            break
        }
    };
    for (i; i < this._orderCol.length; i++) {
        func.apply(this, [this._orderCol[i].data.id, i]);
        if ((this._orderCol[i] == a) || (this._orderCol[i] == b)) return
    }
};
dhtmlxFolders.prototype.applyValue = function (itemObj, newValue) {};
dhtmlxFolders.prototype._trackParent = function (e) {
    var z = (e.srcElement || e.target);
    while (z && z != this.cont) {
        if (z.itemObj && z.itemObj.data.id) return z.itemObj.data.id;
        z = z.parentNode
    };
    return null
};
dhtmlxFolders.prototype.stopEvent = function (e) {
    (e || event).cancelBubble = true;
    return false
};
dhtmlxFolders.prototype._onKeyPressed = function (e) {
    if (e.keyCode == 13) return this.stopEdit(true);
    else if (e.keyCode == 27) return this.stopEdit(false)
};
dhtmlxFolders.prototype._onmmoveHandler = function (e) {
    if (this._state) {
        switch (this._state) {
        case "DND":
        case "preDND":
            this._state = "DND";
            break;
        case "BS":
        case "preBS":
            return;
            this._state = "BS";
            this._setBSMove(e);
            return
        };
        this._state = ""
    };
    return false
};
dhtmlxFolders.prototype._onmdownHandler = function (e) {
    var id = this._trackParent(e);
    if (id && ((e.srcElement || e.target).tagName == "IMG")) {
        if (this._drager) {
            this._idpullCol[id].item.dragStart = this;
            this._drager.preCreateDragCopy.apply(this._idpullCol[id].item, [e]);
            this._cPos = [getAbsoluteLeft(this.cont), getAbsoluteTop(this.cont)]
        }
    } else {
        if (e.originalTarget && (e.offsetX > this.cont.clientWidth || e.originalTarget != e.target)) {
            return
        };
        this._state = "preBS";
        this._cPos = [getAbsoluteLeft(this.cont), getAbsoluteTop(this.cont)]
    };
    return false
};
dhtmlxFolders.prototype._onmupHandler = function (e) {
    var id = this._trackParent(e);
    switch (this._state) {
    case "BS":
        if (this._orderCol.length) this._rectToSelection();
        this._selZone.parentNode.removeChild(this._selZone);
        this._selZone = null;
    case "preBS":
    case "preDND":
        this._state = "";
        break
    };
    if ((e.button == 2) && (this._ctmndx)) {
        if (!(this.callEvent("onBeforeContextMenu", [id]))) return true;
        var el = this.cont
        if (id) el = this._idpullCol[id];
        if (_isIE) e.srcElement.oncontextmenu = function () {
            event.cancelBubble = true;
            return false
        };
        if (this._ctmndx.showContextMenu) {
            this._ctmndx.showContextMenu(e.clientX, e.clientY)
            this.contextID = id;
            this._ctmndx._skip_hide = true
        } else {
            el.contextMenuId = id;
            el.contextMenu = this._ctmndx;
            el.a = this._ctmndx._contextStart;
            el.a(el, ev);
            el.a = null
        };
        return false
    };
    if (this._ctmndx) {
        if (this._ctmndx.hideContextMenu) this._ctmndx.hideContextMenu()
        else this._ctmndx._contextEnd()
    };
    return true
};
dhtmlxFolders.prototype._onclickHandler = function (e) {
    var id = this._trackParent(e);
    if (!id) return this.stopEdit();
    this.stopEdit();
    if ((e.ctrlKey || e.metaKey) || (e.shiftKey) || this.getItem(id).data.selected || (!this.matchSelected(function (id, ind) {
        this.unselectAll()
    }, id))) {
        this.selectItem(id, (e.ctrlKey || e.metaKey), e.shiftKey)
    };
    this._last_click_time = (new Date()).valueOf();
    this.callEvent("onclick", [id]);
    return true
};
dhtmlxFolders.prototype._ondblclickHandler = function (e, id) {
    var id = id || this._trackParent(e);
    if (!id) return;
    this.callEvent("ondblclick", [id])
};

function dhtmlxFoldersItem() {
    var self = this;
    this.master;
    this.date;
    this.item;
    this.setData = function (dataObject, masterObj, hide) {
        if (this.date == undefined) {
            this.data = {
                dataObj: {},
                selected: false,
                active: false,
                editmode: false,
                id: null,
                master: {},
                hidden: hide,
                filteredOut: false,
                type: ""
            };
            if (this.tmpId) this.data.id = this.tmpId
            else {
                if (dataObject.id) this.data.id = dataObject.id
                else if (dataObject.nodeName != "" && dataObject.getAttribute("id")) this.data.id = dataObject.getAttribute("id");
                else this.data.id = masterObj._unicId()
            }
        };
        this.data.dataObj = dataObject;
        this.data.master = masterObj;
        this.resetType();
        return this.data.id
    };
    this.resetType = function () {
        this.data.type = this.data.master._item_type;
        var t = this.data.master.getCSSBaseName();
        this.css = "dhx_folders" + (t ? ("_" + t.toUpperCase()) : "") + (this.data.master._item_type != "" ? "_" : "") + "item"
    };
    this.setId = function (id) {
        if (this.data != undefined) this.data.id = id;
        else this.tmpId = id
    };
    this.getDataItem = function (name) {
        return dataItem
    };
    this.render = function () {
        return this
    };
    this.renderToActive = function () {
        return this
    };
    this.setSelectedState = function (state) {
        this.data.selected = state;
        this.render();
        return true
    };
    this.setActiveState = function (state) {
        this.data.active = state;
        if (state) {
            this.renderToActive();
            if (!this.aItem) return false;
            this.item.parentNode.appendChild(this.aItem);
            var posArray = getPosition(this.item, this.item.parentNode)
            this.aItem.style.left = posArray[0];
            this.aItem.style.top = posArray[1];
            this.aItem.style.margin = "0px";
            this.item.style.visibility = "hidden"
        } else {
            if (!this.aItem) return false;
            this.aItem.parentNode.removeChild(this.aItem);
            this.item.style.visibility = "visible"
        };
        return true
    };
    this.edit = function (mode, newValue) {
        if (this.data.editmode == mode) return false;
        this.data.editmode = mode;
        if (!mode && newValue) this.data.master.applyValue(this, newValue)
        this.render()
    };
    this.initEditor = function (obj) {
        this.editor = obj;
        this.editor.focus();
        this.editor.select();
        this.editor.onkeypress = this.data.master.onKeyHandler;
        this.editor.onclick = this.data.master.stopEvent
    };
    this.saveDataFromEditor = function (attrName, value) {}
};

function dhtmlxFoldersJSBasedGeneric() {
    this.getDataItem = function (name) {
        return this.data.dataObj[name]
    };
    this.render = function () {
        if (this.item == null) {
            this.item = document.createElement("DIV");
            this.item.itemObj = this;
            this.item.foldersObj = this.data.master
        };
        if (this.data.selected) {
            this.item.className = this.css + "_selected"
        } else {
            this.item.className = this.css
        };
        this.item.innerHTML = this.data.master.rendererFunction(this.data.dataObj, this.data.editmode, this.data.selected, false)
        return this.item
    };
    this.renderToActive = function () {
        this.aItem = document.createElement("DIV");
        this.aItem.itemObj = this;
        this.aItem.foldersObj = this.data.master;
        this.aItem.className = this.css + "_selected";
        this.aItem.style.position = "absolute";
        this.aItem.innerHTML = this.data.master.rendererFunction(this.data.dataObj, this.data.editmode, this.data.selected, true)

    };
    this.saveDataFromEditor = function () {
        this.data.dataObj.text = this.editor.value
    }
};
dhtmlxFoldersJSBasedGeneric.prototype = new dhtmlxFoldersItem;

function dhtmlxFoldersXMLBasedGeneric() {
    this.getDataItem = function (name) {
        return
    };
    this.render = function () {
        if (this.item == null) {
            this.item = document.createElement("DIV");
            this.item.itemObj = this;
            this.item.foldersObj = this.data.master
        };
        if (this.data.selected) {
            this.item.className = this.css + "_selected"
        } else {
            this.item.className = this.css
        };
        var typeSettingsAr = this.data.master._userdataCol;
        for (var n = 0; n < typeSettingsAr.length; n++) {
            this.data.master.XMLLoader.setXSLParamValue(typeSettingsAr[n][0], typeSettingsAr[n][1])
        };
        this.data.master.XMLLoader.setXSLParamValue("editmode", !this.data.master._set.editable ? "false" : this.data.editmode.toString());
        this.data.master.XMLLoader.setXSLParamValue("selected", this.data.selected.toString());
        this.data.master.XMLLoader.setXSLParamValue("active", this.data.active.toString());
        this.item.innerHTML = this.data.master.XMLLoader.doXSLTransToString(undefined, this.data.dataObj);
        return this.item
    }
};
dhtmlxFoldersXMLBasedGeneric.prototype = new dhtmlxFoldersItem;

function getPosition(oNode, pNode) {
    if (!pNode) var pNode = document.body

    var oCurrentNode = oNode;
    var iLeft = 0;
    var iTop = 0;
    while ((oCurrentNode) && (oCurrentNode != pNode)) {
        iLeft += oCurrentNode.offsetLeft - oCurrentNode.scrollLeft;
        iTop += oCurrentNode.offsetTop - oCurrentNode.scrollTop;
        oCurrentNode = oCurrentNode.offsetParent
    };
    if (pNode == document.body) {
        if (_isIE) {
            if (document.documentElement.scrollTop) iTop += document.documentElement.scrollTop;
            if (document.documentElement.scrollLeft) iLeft += document.documentElement.scrollLeft
        } else if (!_isFF) {
            iLeft += document.body.offsetLeft;
            iTop += document.body.offsetTop
        }
    };
    return new Array(iLeft + "px", iTop + "px")
};
dtmlXMLLoaderObject.prototype.xmlNodeToJSON = function (node) {
    var t = {};
    for (var i = 0; i < node.attributes.length; i++) t[node.attributes[i].name] = node.attributes[i].value;
    t["_nodevalue"] = node.firstChild ? node.firstChild.nodeValue : "";
    for (var i = 0; i < node.childNodes.length; i++) {
        var name = node.childNodes[i].tagName;
        if (name) {
            if (!t[name]) t[name] = [];
            t[name].push(this.xmlNodeToJSON(node.childNodes[i]))
        }
    };
    return t
};
dhtmlXFolders = dhtmlxFolders;
(function () {
    dhtmlx.extend_api("dhtmlxFolders", {
        _init: function (obj) {
            return [obj.parent]
        },
        context_menu: "enableContextMenu",
        css: "setCSSBaseName",
        drag: "enableDragAndDrop",
        image_path: "setImagePath",
        selection: "enableSelection",
        tag: "setItemTagName",
        type: "setItemType"
    }, {})
})();
dhtmlxFolders.prototype.enableContextMenu = function (menu) {
    this._ctmndx = menu
};
dhtmlxFolders.prototype.enableDragAndDrop = function (mode) {
    if (convertStringToBoolean(mode)) {
        this._drager = new dhtmlDragAndDropObject();
        this._drager.addDragLanding(this.cont, this)
    } else this._drager = null
};
dhtmlxFolders.prototype._createDragNode = function (htmlObject, e) {
    var id = htmlObject.itemObj.data.id;
    this._dragged = [].concat(this._selectedCol);
    if (!this.matchSelected(null, id)) {
        this.selectItem(id);
        this._dragged = [id]
    };
    if (this._dragged.length > 1) {
        var z = this._idpullCol[this._dragged[1]].item.cloneNode(true);
        var z2 = this._idpullCol[this._dragged[0]].item.cloneNode(true);
        z2.style.left = "10px";
        z2.style.top = "10px";
        z2.className += ' dhx_DnD_drag';
        z.appendChild(z2)
    } else var z = htmlObject.cloneNode(true);
    z.className += ' dhx_DnD_drag';
    this._idpullCol[id].parentObject = {
        id: id,
        ex: this,
        treeNod: {
            _nonTrivialNode: this._dragInTree,
            _nonTrivialRow: this._dragInGrid
        }
    };
    htmlObject.parentObject = this._idpullCol[id].parentObject;
    z._exp_id = id;
    return z
};
dhtmlxFolders.prototype._dragInTree = function (tree, tobj, bnod, item) {
    var that = item.ex;
    for (var i = 0; i < that._dragged.length; i++) {
        var id = that._dragged[i];
        if (!tree.callEvent("onDrag", [id, tobj.id, null, this, tree])) continue;
        var text = "new item";
        var src = "leaf.gif";
        if (!bnod) tree.insertNewItem(tobj.id, id, text, src, src, src);
        else tree.insertNewNext(bnod.id, id, text, src, src, src);
        that.deleteItem(id)
    }
};
dhtmlxFolders.prototype._dragInGrid = function (grid, row, mode, item) {
    var that = item.ex;
    for (var i = 0; i < that._dragged.length; i++) {
        var id = that._dragged[i];
        if (!grid.callEvent("onDrag", [id, row, this, tree])) continue;
        var text = "new item";
        var src = "leaf.gif";
        if (mode == "sibling") grid.addRow(id, [text], grid.getRowIndex(row));
        else tree.addRow(id, [text], null, row);
        that.deleteItem(id)
    }
};
dhtmlxFolders.prototype._drag = function (source, from, target, lastLanding) {
    this.hideDnDSelection(true);
    var tid = 0;
    if (target.itemObj) tid = target.itemObj.data.id;
    if (source.itemObj && target.itemObj) {
        if (!this.matchSelected(null, target.itemObj.data.id)) this.getItem(target.itemObj.data.id).setSelectedState(false);
        if (source.itemObj.data.id == target.itemObj.data.id) return false;
        if (!this.callEvent("onBeforeDrop", [this._dndPos, this._getAllDragItemsIds(source), target.itemObj.data.id])) return false
    };
    var sid = null;
    for (var j = 0; j < from._dragged.length; j++) {
        if (from.mytype == "tree") {
            sid = from._dragged[j].id
        } else if (from.rowsBuffer) {
            sid = from._dragged[j].idd
        } else {
            sid = from._dragged[j]
        };
        if (!this.callEvent("onDrag", [sid, tid, this._dndPos, this, from])) return;
        if (from.mytype == "tree") {
            this.addItem(sid, from.getItemText(sid), {
                id: target._exp_id,
                mode: this._dndPos
            });
            from.deleteItem(sid)
        } else if (from.rowsBuffer) {
            this.addItem(sid, from.cells(sid, 0).getValue(), {
                id: target._exp_id,
                mode: this._dndPos
            });
            from.deleteRow(sid)
        } else {
            this.moveItem(sid, this._dndPos, (tid || sid), from)
        }
    };
    from._dragged = null
};
dhtmlxFolders.prototype.hideDnDSelection = function (mode, left, top, dy) {
    if (!this._DnDSel) {
        this._DnDSel = new Array()
    };
    var orientat = this._getCurrentPlacementType();
    if (!this._DnDSel[orientat]) {
        this._DnDSel[orientat] = document.createElement("IMG");
        this._DnDSel[orientat].className = 'dhx_DnD_selector';
        this._DnDSel[orientat].src = this.imgSrc + 'dnd_selector_' + orientat + '.png';
        this._DnDSel[orientat].dragLanding = this;
        this.cont.appendChild(this._DnDSel[orientat])
    };
    if (mode) this._DnDSel[orientat].style.display = "none";
    else {
        this._DnDSel[orientat].style.display = "";
        this._DnDSel[orientat].style.top = top + "px";
        this._DnDSel[orientat].style.left = left + "px";
        this._DnDSel[orientat].style.width = "6px";
        this._DnDSel[orientat].style.height = "6px";
        if (orientat == "cells") this._DnDSel[orientat].style.height = dy + "px";
        else this._DnDSel[orientat].style.width = dy + "px"
    }
};
dhtmlxFolders.prototype._dragIn = function (htmlObject, shtmlObject, x, y) {
    if (htmlObject.tagName == "IMG") htmlObject = this._lastDH;
    this._lastDH = htmlObject;
    if (!htmlObject.itemObj) return htmlObject;
    if (shtmlObject.itemObj && shtmlObject.itemObj.data.id == htmlObject.itemObj.data.id) return false;
    tObjWidth = htmlObject.offsetWidth;
    tObjHeight = htmlObject.offsetHeight;
    tObjTop = getAbsoluteTop(htmlObject);
    tObjLeft = getAbsoluteLeft(htmlObject);
    topCorrector = getAbsoluteTop(this.cont);
    leftCorrector = getAbsoluteLeft(this.cont);
    var ids = shtmlObject.itemObj ? this._getAllDragItemsIds(shtmlObject) : "0";
    if (this._getCurrentPlacementType() == "cells") {
        if (x - tObjLeft < tObjWidth / 4 && this.callEvent("onBeforeDragIn", ["before", ids, htmlObject.itemObj.data.id])) {
            this.hideDnDSelection(false, tObjLeft - leftCorrector, tObjTop - topCorrector, tObjHeight)
            this._dndPos = "before"
        } else if (x - tObjLeft > (tObjWidth / 4) * 3 && this.callEvent("onBeforeDragIn", ["next", ids, htmlObject.itemObj.data.id])) {
            this.hideDnDSelection(false, tObjLeft + tObjWidth - leftCorrector, tObjTop - topCorrector, tObjHeight);
            this._dndPos = "next"
        } else if (this.callEvent("onBeforeDragIn", ["in", ids, htmlObject.itemObj.data.id])) {
            this._dndPos = "in";
            this.hideDnDSelection(true);
            this.getItem(htmlObject.itemObj.data.id).setSelectedState(true)
        }
    } else if (this._getCurrentPlacementType() == "lines") {
        if (y - tObjTop < tObjHeight / 4 && this.callEvent("onBeforeDragIn", ["before", ids, htmlObject.itemObj.data.id])) {
            this.hideDnDSelection(false, tObjLeft - leftCorrector, tObjTop - topCorrector, tObjWidth)
            this._dndPos = "before"
        } else if (y - tObjTop > (tObjHeight / 4) * 3 && this.callEvent("onBeforeDragIn", ["next", ids, htmlObject.itemObj.data.id])) {
            this.hideDnDSelection(false, tObjLeft + tObjWidth - leftCorrector, tObjTop - topCorrector, tObjWidth);
            this._dndPos = "next"
        } else if (this.callEvent("onBeforeDragIn", ["in", ids, htmlObject.itemObj.data.id])) {
            this._dndPos = "in";
            this.hideDnDSelection(true);
            this.getItem(htmlObject.itemObj.data.id).setSelectedState(true)
        }
    };
    return htmlObject
};
dhtmlxFolders.prototype._dragOut = function (htmlObject) {
    this.hideDnDSelection(true);
    if (!htmlObject.itemObj) return;
    if (!this.matchSelected(null, htmlObject.itemObj.data.id)) this.getItem(htmlObject.itemObj.data.id).setSelectedState(false)
};
dhtmlxFolders.prototype._getAllDragItemsIds = function (sHTMLObj) {
    var curItemId = sHTMLObj.itemObj.data.id;
    var selected = this.getSelectedId();
    if (typeof(selected) == "object") {
        for (var i = 0; i < selected.length; i++) {
            if (curItemId == selected[i]) return selected
        };
        selected[selected.length] = curItemId;
        return selected
    } else if (selected != null) {
        if (selected != curItemId) return [selected, curItemId];
        else return selected
    } else return curItemId
};
var globalActiveDHTMLGridObject;
String.prototype._dhx_trim = function () {
    return this.replace(/&nbsp;/g, " ").replace(/(^[ \t]*)|([ \t]*$)/g, "")
};

function dhtmlxArray(ar) {
    return dhtmlXHeir((ar || new Array()), dhtmlxArray._master)
};
dhtmlxArray._master = {
    _dhx_find: function (pattern) {
        for (var i = 0; i < this.length; i++) {
            if (pattern == this[i]) return i
        };
        return -1
    },
    _dhx_insertAt: function (ind, value) {
        this[this.length] = null;
        for (var i = this.length - 1; 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
    }
};

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.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();
    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();
    this.UserData = {};
    this._sizeFix = this._borderFix = 0;
    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%";
    this.entBox.style.cursor = 'default';
    this.entBox.onselectstart = function () {
        return false
    };
    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);
    this.entBox.grid = this;
    this.objBox.grid = this;
    this.hdrBox.grid = this;
    this.obj.grid = this;
    this.hdr.grid = this;
    this.cellWidthPX = [];
    this.cellWidthPC = [];
    this.cellWidthType = this.entBox.cellwidthtype || "px";
    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") ? 24 : 20);
    this.imgURL = window.dhx_globalImgPath || "";
    this.isActive = false;
    this.isEditable = true;
    this.useImagesInHeader = false;
    this.pagingOn = false;
    this.rowsBufferOutSize = 0;
    dhtmlxEvent(window, "unload", function () {
        try {
            if (self.destructor) self.destructor()
        } catch (e) {}
    });
    this.setSkin = function (name) {
        this.skin_name = name;
        this.entBox.className = "gridbox gridbox_" + name;
        this.skin_h_correction = 0;
        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 = "<img style='left:0px' src='" + this.imgURL + "skinC_top_left.gif'><img style='right:20px' src='" + this.imgURL + "skinC_top_right.gif'>";
            this.entBox.appendChild(this._topMb);
            this._botMb = document.createElement("DIV");
            this._botMb.className = "bottomMumba";
            this._botMb.innerHTML = "<img style='left:0px' src='" + this.imgURL + "skinD_bottom_left.gif'><img style='right:20px' src='" + this.imgURL + "skinD_bottom_right.gif'>";
            this.entBox.appendChild(this._botMb);
            this.entBox.style.position = "relative";
            this.skin_h_correction = 20;
            break;
        case "dhx_skyblue":
        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 = 25;
            else this._srdh = 22;
            break;
        case "mt":
            if ((_isIE) && (document.compatMode != "BackCompat")) this._srdh = 25;
            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();
    this._doOnScroll = function (e, mode) {
        this.callEvent("onScroll", [
        this.objBox.scrollLeft, this.objBox.scrollTop]);
        this.doOnScroll(e, mode)
    };
    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 () {
                self._update_srnd_view()
            }, 100)
        }
    };
    this.attachToObject = function (obj) {
        obj.appendChild(this.globalBox ? this.globalBox : this.entBox);
        this.setSizes()
    };
    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()

        this.lastClicked = null;
        this.resized = null;
        this.fldSorted = this.r_fldSorted = null;
        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 () {
            self.setSizes()
        }, 1);
        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.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
        };
        if (this._ivizcol) this.setColHidden();
        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 = [];
        for (var i = 0; i < this._cCount; i++) {
            if ((this.initCellWidth[i] == "*") && !this._hrrar[i]) {
                this._awdth = false;
                fcols.push(i);
                continue
            };
            if (this.cellWidthType == '%') {
                if (typeof this.cellWidthPC[i] == "undefined") this.cellWidthPC[i] = this.initCellWidth[i];
                this.cellWidthPX[i] = Math.floor(gridWidth * this.cellWidthPC[i] / 100) || 0
            } else {
                if (typeof this.cellWidthPX[i] == "undefined") this.cellWidthPX[i] = this.initCellWidth[i]
            };
            if (!this._hrrar[i]) summ += this.cellWidthPX[i] * 1
        };
        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), ms)
                this.cellWidthPX[fcols[i]] = next;
                summ += next
            };
            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
    };
    this.setSizes = function () {
        if ((!this.hdr.rows[0])) return;
        window.clearTimeout(this._sizeTime);
        if (!this.entBox.offsetWidth && (!this.globalBox || !this.globalBox.offsetWidth)) {
            this._sizeTime = window.setTimeout(function () {
                self.setSizes()
            }, 250);
            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) {
                if (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
        };
        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);
        var gridWidthActive = this.entBox.clientWidth - (this.skin_h_correction || 0);
        var gridHeight = this.entBox.clientHeight;
        var summ = this.setColumnSizes(gridWidthActive - (isVScroll ? scrfix : 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 (this._awdth && this._awdth[0] && this._awdth[1] == 99999) isHScroll = 0;
        if (this._ahgr) {
            if (this._ahgrMA) newHeight = this.entBox.parentNode.clientHeight - headerHeight - footerHeight;
            else newHeight = this.obj.offsetHeight + (isHScroll ? scrfix : 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;
                this.setColumnSizes(gridWidthActive)
            }
        };
        if ((this._awdth) && (this._awdth[0])) {
            if (this.cellWidthType == '%') this.cellWidthType = "px";
            if (this._fake) summ += this._fake.entBox.clientWidth;
            var newWidth = Math.min(Math.max(summ + (isVScroll ? scrfix : 0), this._awdth[2]), this._awdth[1]);
            if (this._fake) newWidth -= this._fake.entBox.clientWidth
        };
        newHeight = Math.max(0, newHeight);
        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 = 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.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();
        if (headerHeight != this.hdr.clientHeight && this._ahgr) this.setSizes()
    };
    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"
    };
    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"
        }
    };
    this.setDelimiter = function (delim) {
        this.delim = delim
    };
    this.setInitWidthsP = function (wp) {
        this.cellWidthType = "%";
        this.initCellWidth = wp.split(this.delim.replace(/px/gi, ""));
        if (!arguments[1]) this._setAutoResize()
    };
    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 () {
                self.setSizes();
                if (self._fake) self._fake._correctSplit()
            }, 100)
        })
    };
    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])
        }
    };
    this.enableMultiline = function (state) {
        this.multiLine = convertStringToBoolean(state)
    };
    this.enableMultiselect = function (state) {
        this.selMultiRows = convertStringToBoolean(state)
    };
    this.setImagePath = function (path) {
        this.imgURL = path
    };
    this.setImagesPath = this.setImagePath;
    this.setIconPath = function (path) {
        this.iconURL = path
    };
    this.setIconsPath = this.setIconPath;
    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
    };
    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()
            }
        }
    };
    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])
    };
    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()
    };
    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()
        }
    };
    this.setSortImgState = function (state, ind, order, row) {
        order = (order || "asc").toLowerCase();
        if (!convertStringToBoolean(state)) {
            this.sortImg.style.display = "none";
            this.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)
    };
    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";
            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"
        }
    };
    this.setActive = function (fl) {
        if (arguments.length == 0) var fl = true;
        if (fl == true) {
            if (globalActiveDHTMLGridObject && (globalActiveDHTMLGridObject != this)) globalActiveDHTMLGridObject.editStop();
            globalActiveDHTMLGridObject = this;
            this.isActive = true
        } else {
            this.isActive = false
        }
    };
    this._doClick = function (ev) {
        var selMethod = 0;
        var el = this.getFirstParentOfType(_isIE ? ev.srcElement : ev.target, "TD");
        if (!el) return;
        var fl = true;
        if (this.markedCells) {
            var markMethod = 0;
            if (ev.shiftKey || ev.metaKey) {
                markMethod = 1
            };
            if (ev.ctrlKey) {
                markMethod = 2
            };
            this.doMark(el, markMethod);
            return true
        };
        if (this.selMultiRows != false) {
            if (ev.shiftKey && this.row != null) {
                selMethod = 1
            };
            if (ev.ctrlKey || ev.metaKey) {
                selMethod = 2
            }
        };
        this.doClick(el, fl, selMethod)
    };
    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
            }
        } else if (this._ctmndx) {
            if (this._ctmndx.hideContextMenu) this._ctmndx.hideContextMenu()
            else this._ctmndx._contextEnd()
        };
        return true
    };
    this.doClick = function (el, fl, selMethod, show) {
        if (!this.selMultiRows) selMethod = 0;
        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
                }
            };
            this.editStop()
            if (typeof(el.parentNode.idd) == "undefined") return true;
            if ((!skipRowSelection) && (!el.parentNode._sRow)) {
                if (this.callEvent("onBeforeSelect", [
                el.parentNode.idd, psid])) {
                    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) {
                        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
                }
            };
            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 () {
                self.callEvent("onRowSelect", [
                rid, cid._cellIndex])
            }, 100)

            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)
    };
    this.selectAll = function () {
        this.clearSelection();
        this.selectedRows = dhtmlxArray([].concat(this.rowsCol));
        for (var i = this.rowsCol.length - 1; i >= 0; i--) {
            if (this.rowsCol[i]._cntr) this.selectedRows.splice(i, 1);
            else this.rowsCol[i].className += " rowselected"
        };
        if (this.selectedRows.length) {
            this.row = this.selectedRows[0];
            this.cell = this.row.cells[0]
        };
        if ((this._fake) && (!this._realfake)) this._fake.selectAll()
    };
    this.selectCell = function (r, cInd, fl, preserve, edit, show) {
        if (!fl) fl = false;
        if (typeof(r) != "object") r = this.render_row(r)
        if (!r || r == -1) return null;
        if (r._childIndexes) var c = r.childNodes[r._childIndexes[cInd]];
        else var c = r.childNodes[cInd];
        if (!c) c = r.childNodes[0];
        if (preserve) this.doClick(c, fl, 3, show)
        else this.doClick(c, fl, 0, show)

        if (edit) this.editCell()
    };
    this.moveToVisible = function (cell_obj, onlyVScroll) {
        if (this.pagingOn) {
            var newPage = Math.floor(this.getRowIndex(cell_obj.parentNode.idd) / this.rowsBufferOutSize) + 1;
            if (newPage != this.currentPage) this.changePage(newPage)
        };
        if (!cell_obj.offsetHeight) {
            var mask = this._realfake ? this._fake.rowsAr[cell_obj.parentNode.idd] : cell_obj.parentNode;
            var h = this.rowsBuffer._dhx_find(mask) * this._srdh;
            return this.objBox.scrollTop = h
        };
        try {
            var distance = cell_obj.offsetLeft + cell_obj.offsetWidth + 20;
            var scrollLeft = 0;
            if (distance > (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;
            var distance = cell_obj.offsetTop + cell_obj.offsetHeight + 20;
            if (distance > (this.objBox.offsetHeight + this.objBox.scrollTop)) {
                var scrollTop = distance - this.objBox.offsetHeight
            } else if (cell_obj.offsetTop < this.objBox.scrollTop) {
                var scrollTop = cell_obj.offsetTop - 5
            };
            if (scrollTop) this.objBox.scrollTop = scrollTop
        } catch (er) {}
    };
    this.editCell = function () {
        if (this.editor && this.cell == this.editor.cell) return;
        this.editStop();
        if ((this.isEditable != true) || (!this.cell)) return false;
        var c = this.cell;
        if (c.parentNode._locked) return false;
        this.editor = this.cells4(c);
        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 {
                this.editor = null
            }
        }
    };
    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;
                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)
        }
    };
    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]
    };
    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
        };
        if (acell.style.display != "none" && (!this.smartTabOrder || !this.cells(acell.parentNode.idd, acell._cellIndex).isDisabled())) return acell;
        return this._getNextCell(acell, dir)
    };
    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
    };
    this.scrollPage = function (dir) {
        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);
            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;
            master._r_select = null
        }
    };
    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) {
            return true
        };
        if (this._htkebl) return true;
        if (!this.callEvent("onKeyPress", [
        ev.keyCode, ev.ctrlKey, ev.shiftKey, ev])) return false;
        var code = "k" + ev.keyCode + "_" + (ev.ctrlKey ? 1 : 0) + "_" + (ev.shiftKey ? 1 : 0);
        if (this.cell) {
            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
    };
    this.selectRow = function (r, fl, preserve, show) {
        if (typeof(r) != 'object') r = this.render_row(r);
        this.selectCell(r, 0, fl, preserve, false, show)
    };
    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])
        }
    };
    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;
            that.sortField(el._cellIndexS, false, el)

        }
    };
    this.deleteSelectedRows = function () {
        var num = this.selectedRows.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
                }
            }
        };
        if (ind) {
            try {
                if (ind + 1 > this.rowsCol.length) ind--;
                this.selectCell(ind, 0, true)
            } catch (er) {
                this.row = null
                this.cell = null
            }
        }
    };
    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)
    };
    this.getSelectedCellIndex = function () {
        if (this.cell != null) return this.cell._cellIndex;
        else return -1
    };
    this.getColWidth = function (ind) {
        return parseInt(this.cellWidthPX[ind]) + ((_isFF) ? 2 : 0)
    };
    this.setColWidth = function (ind, value) {
        if (this._hrrar[ind]) return;
        if (this.cellWidthType == 'px') this.cellWidthPX[ind] = parseInt(value) - +((_isFF) ? 2 : 0);
        else this.cellWidthPC[ind] = parseInt(value);
        this.setSizes()
    };
    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
    };
    this.getRowId = function (ind) {
        return this.rowsBuffer[ind] ? this.rowsBuffer[ind].idd : this.undefined
    };
    this.setRowId = function (ind, row_id) {
        this.changeRowId(this.getRowId(ind), row_id)
    };
    this.changeRowId = function (oldRowId, newRowId) {
        if (oldRowId == newRowId) return;
        var row = this.rowsAr[oldRowId]
        row.idd = newRowId;
        if (this.UserData[oldRowId]) {
            this.UserData[newRowId] = this.UserData[oldRowId]
            this.UserData[oldRowId] = null
        };
        if (this._h2 && this._h2.get[oldRowId]) {
            this._h2.get[newRowId] = this._h2.get[oldRowId];
            this._h2.get[newRowId].id = newRowId;
            delete this._h2.get[oldRowId]
        };
        this.rowsAr[oldRowId] = null;
        this.rowsAr[newRowId] = row;
        for (var i = 0; i < row.childNodes.length; i++) if (row.childNodes[i]._code) row.childNodes[i]._code = this._compileSCL(row.childNodes[i]._val, row.childNodes[i]);
        if (this._mat_links && this._mat_links[oldRowId]) {
            var a = this._mat_links[oldRowId];
            delete this._mat_links[oldRowId];
            for (var c in a) for (var i = 0; i < a[c].length; i++) this._compileSCL(a[c][i].original, a[c][i])
        };
        this.callEvent("onRowIdChange", [oldRowId, newRowId])
    };
    this.setColumnIds = function (ids) {
        this.columnIds = ids.split(this.delim)
    };
    this.setColumnId = function (ind, id) {
        this.columnIds[ind] = id
    };
    this.getColIndexById = function (id) {
        for (var i = 0; i < this.columnIds.length; i++) if (this.columnIds[i] == id) return i
    };
    this.getColumnId = function (cin) {
        return this.columnIds[cin]
    };
    this.getColumnLabel = function (cin, ind, hdr) {
        var z = (hdr || this.hdr).rows[(ind || 0) + 1];
        for (var i = 0; i < z.cells.length; i++) if (z.cells[i]._cellIndexS == cin) return (_isIE ? z.cells[i].innerText : z.cells[i].textContent);
        return ""
    };
    this.getFooterLabel = function (cin, ind) {
        return this.getColumnLabel(cin, ind, this.ftr)
    };
    this.setRowTextBold = function (row_id) {
        var r = this.getRowById(row_id)
        if (r) r.style.fontWeight = "bold"
    };
    this.setRowTextStyle = function (row_id, styleString) {
        var r = this.getRowById(row_id)
        if (!r) return;
        for (var i = 0; i < r.childNodes.length; i++) {
            var pfix = r.childNodes[i]._attrs["style"] || "";
            if ((this._hrrar) && (this._hrrar[i])) pfix = "display:none;";
            if (_isIE) r.childNodes[i].style.cssText = pfix + "width:" + r.childNodes[i].style.width + ";" + styleString;
            else r.childNodes[i].style.cssText = pfix + "width:" + r.childNodes[i].style.width + ";" + styleString
        }
    };
    this.setRowColor = function (row_id, color) {
        var r = this.getRowById(row_id)

        for (var i = 0; i < r.childNodes.length; i++) r.childNodes[i].bgColor = color
    };
    this.setCellTextStyle = function (row_id, ind, styleString) {
        var r = this.getRowById(row_id)

        if (!r) return;
        var cell = r.childNodes[r._childIndexes ? r._childIndexes[ind] : ind];
        if (!cell) return;
        var pfix = "";
        if ((this._hrrar) && (this._hrrar[ind])) pfix = "display:none;";
        if (_isIE) cell.style.cssText = pfix + "width:" + cell.style.width + ";" + styleString;
        else cell.style.cssText = pfix + "width:" + cell.style.width + ";" + styleString
    };
    this.setRowTextNormal = function (row_id) {
        var r = this.getRowById(row_id);
        if (r) r.style.fontWeight = "normal"
    };
    this.doesRowExist = function (row_id) {
        if (this.getRowById(row_id) != null) return true
        else return false
    };
    this.getColumnsNum = function () {
        return this._cCount
    };
    this.moveRowUp = function (row_id) {
        var r = this.getRowById(row_id)

        if (this.isTreeGrid()) return this.moveRowUDTG(row_id, -1);
        var rInd = this.rowsCol._dhx_find(r)
        if ((r.previousSibling) && (rInd != 0)) {
            r.parentNode.insertBefore(r, r.previousSibling)
            this.rowsCol._dhx_swapItems(rInd, rInd - 1)
            this.setSizes();
            var bInd = this.rowsBuffer._dhx_find(r);
            this.rowsBuffer._dhx_swapItems(bInd, bInd - 1);
            if (this._cssEven) this._fixAlterCss(rInd - 1)
        }
    };
    this.moveRowDown = function (row_id) {
        var r = this.getRowById(row_id)

        if (this.isTreeGrid()) return this.moveRowUDTG(row_id, 1);
        var rInd = this.rowsCol._dhx_find(r);
        if (r.nextSibling) {
            this.rowsCol._dhx_swapItems(rInd, rInd + 1)

            if (r.nextSibling.nextSibling) r.parentNode.insertBefore(r, r.nextSibling.nextSibling)
            else r.parentNode.appendChild(r)
            this.setSizes();
            var bInd = this.rowsBuffer._dhx_find(r);
            this.rowsBuffer._dhx_swapItems(bInd, bInd + 1);
            if (this._cssEven) this._fixAlterCss(rInd)
        }
    };
    this.getCombo = function (col_ind) {
        if (!this.combos[col_ind]) {
            this.combos[col_ind] = new dhtmlXGridComboObject()
        };
        return this.combos[col_ind]
    };
    this.setUserData = function (row_id, name, value) {
        if (!row_id) row_id = "gridglobaluserdata";
        if (!this.UserData[row_id]) this.UserData[row_id] = new Hashtable()
        this.UserData[row_id].put(name, value)
    };
    this.getUserData = function (row_id, name) {
        if (!row_id) row_id = "gridglobaluserdata";
        this.getRowById(row_id);
        var z = this.UserData[row_id];
        return (z ? z.get(name) : "")
    };
    this.setEditable = function (fl) {
        this.isEditable = convertStringToBoolean(fl)
    };
    this.selectRowById = function (row_id, multiFL, show, call) {
        if (!call) call = false;
        this.selectCell(this.getRowById(row_id), 0, call, multiFL, false, show)
    };
    this.clearSelection = function () {
        this.editStop()

        for (var i = 0; i < this.selectedRows.length; i++) {
            var r = this.rowsAr[this.selectedRows[i].idd];
            if (r) r.className = r.className.replace(/rowselected/g, "")
        };
        this.selectedRows = dhtmlxArray()
        this.row = null;
        if (this.cell != null) {
            this.cell.className = this.cell.className.replace(/cellselected/g, "");
            this.cell = null
        }
    };
    this.copyRowContent = function (from_row_id, to_row_id) {
        var frRow = this.getRowById(from_row_id)

        if (!this.isTreeGrid()) for (var i = 0; i < frRow.cells.length; i++) {
            this.cells(to_row_id, i).setValue(this.cells(from_row_id, i).getValue())
        } else this._copyTreeGridRowContent(frRow, from_row_id, to_row_id);
        if (!_isIE) this.getRowById(from_row_id).cells[0].height = frRow.cells[0].offsetHeight
    };
    this.setFooterLabel = function (c, label, ind) {
        return this.setColumnLabel(c, label, ind, this.ftr)
    };
    this.setColumnLabel = function (c, label, ind, hdr) {
        var z = (hdr || this.hdr).rows[ind || 1];
        var col = (z._childIndexes ? z._childIndexes[c] : c);
        if (!z.cells[col]) return;
        if (!this.useImagesInHeader) {
            var hdrHTML = "<div class='hdrcell'>"

            if (label.indexOf('img:[') != -1) {
                var imUrl = label.replace(/.*\[([^>]+)\].*/, "$1");
                label = label.substr(label.indexOf("]") + 1, label.length)
                hdrHTML += "<img width='18px' height='18px' align='absmiddle' src='" + imUrl + "' hspace='2'>"
            };
            hdrHTML += label;
            hdrHTML += "</div>";
            z.cells[col].innerHTML = hdrHTML;
            if (this._hstyles[col]) z.cells[col].style.cssText = this._hstyles[col]
        } else {
            z.cells[col].style.textAlign = "left";
            z.cells[col].innerHTML = "<img src='" + this.imgURL + "" + label + "' onerror='this.src = \"" + this.imgURL + "imageloaderror.gif\"'>";
            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.clearAll = function (header) {
        if (!this.obj.rows[0]) return;
        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;
        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.cellType = this._aFoot = null;
            this._hrrar = [];
            this.columnIds = [];
            this.combos = []
        };
        this.row = null;
        this.cell = null;
        this.rowsCol = dhtmlxArray()
        this.rowsAr = [];
        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._contextCallTimer) window.clearTimeout(this._contextCallTimer);
        if (this._sst) this.enableStableSorting(true);
        this._fillers = this.undefined;
        this.setSortImgState(false);
        this.setSizes();
        this.callEvent("onClearAll", [])
    };
    this.sortField = function (ind, repeatFl, r_el) {
        if (this.getRowsNum() == 0) return false;
        var el = this.hdr.rows[0].cells[ind];
        if (!el) return;
        if (el.tagName == "TH" && (this.fldSort.length - 1) >= el._cellIndex && this.fldSort[el._cellIndex] != 'na') {
            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";
            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)
        }
    };
    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"
    };
    this.enableHeaderImages = function (fl) {
        this.useImagesInHeader = fl
    };
    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";
            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 || []
    };
    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)
    };
    this.getColType = function (cInd) {
        return this.cellType[cInd]
    };
    this.getColTypeById = function (cID) {
        return this.cellType[this.getColIndexById(cID)]
    };
    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]])
        }
    };
    this.setColSorting = function (sortStr) {
        this.fldSort = sortStr.split(this.delim)


        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"
        }
    };
    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()
    };
    this.setColVAlign = function (valStr) {
        this.cellVAlign = valStr.split(this.delim)
    };
    this.setNoHeader = function (fl) {
        this.noHeader = convertStringToBoolean(fl)
    };
    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)
    };
    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"];
        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[0].insertRule(prefs[i] + " {" + this.ssModifier[i] + " };", 0)
        }
    };
    this.setColumnColor = function (clr) {
        this.columnColor = clr.split(this.delim)
    };
    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
    };
    this._fixAlterCss = function (ind) {
        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].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++
            }
        }
    };
    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
        }
    };
    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)
    };
    this._sUDa = false;
    this._sAll = false;
    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
    };
    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])
    };
    this._serialise = function (rCol, inner, closed) {
        this.editStop()
        var out = [];
        var close = "</" + this.xml.s_row + ">"

        if (this.isTreeGrid()) {
            this._h2.forEachChildF(0, function (el) {
                var temp = this._serializeRow(this.render_row_tree(-1, el.id));
                out.push(temp);
                if (temp) return true;
                else return false
            }, this, function () {
                out.push(close)
            })
        } else for (var i = 0; i < this.rowsBuffer.length; i++) if (this.rowsBuffer[i]) {
            var temp = this._serializeRow(this.render_row(i));
            out.push(temp);
            if (temp) out.push(close)
        };
        return [out.join("")]
    };
    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(">");
        if (this._sUDa && this.UserData[r.idd]) {
            keysAr = this.UserData[r.idd].getKeys()

            for (var ii = 0; ii < keysAr.length; ii++) out.push("<userdata name='" + keysAr[ii] + "'>" + (this._asCDATA ? "<![CDATA[" : "") + this.UserData[r.idd].get(keysAr[ii]) + (this._asCDATA ? "]]>" : "") + "</userdata>")
        };
        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("<cell");
                if (ca.length) for (var i = 0; i < ca.length; i++) out.push(" " + ca[i] + "='" + zx.cell._attrs[ca[i]] + "'");
                zxVal = zx[this._agetm]();
                if (this._asCDATA) zxVal = "<![CDATA[" + zxVal + "]]>";
                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 + "</cell>");
                else out.push(">" + zxVal + "</cell>");
                if ((this._ecspn) && (zx.cell.colSpan)) for (var u = 0; u < zx.cell.colSpan - 1; u++) {
                    out.push("<cell/>");
                    jj++
                }
            }
        };
        if ((this._onlChAttr) && (!changeFl) && (!r._added)) return "";
        return out.join("")
    };
    this._serialiseConfig = function () {
        var out = "<head>";
        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 += "<column width='" + this.getColWidth(i) + "' align='" + this.cellAlign[i] + "' type='" + this.cellType[i] + "' sort='" + (sort || "na") + "' color='" + this.columnColor[i] + "'" + (this.columnIds[i] ? (" id='" + this.columnIds[i] + "'") : "") + ">";
            if (this._asCDATA) out += "<![CDATA[" + this.getHeaderCol(i) + "]]>";
            else out += this.getHeaderCol(i);
            var z = this.getCombo(i);
            if (z) for (var j = 0; j < z.keys.length; j++) out += "<option value='" + z.keys[j] + "'>" + z.values[j] + "</option>";
            out += "</column>"
        };
        return out += "</head>"
    };
    this.serialize = function () {
        var out = '<?xml version="1.0"?><rows>';
        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 += "<userdata name='" + keysAr[i] + "'>" + this.UserData["gridglobaluserdata"].get(keysAr[i]) + "</userdata>"
        };
        if (this._sConfig) out += this._serialiseConfig();
        out += this._serialise();
        out += '</rows>';
        return out
    };
    this.getPosition = function (oNode, pNode) {
        if (!pNode && !_isChrome) {
            var pos = getOffset(oNode);
            return [pos.left, pos.top]
        };
        var oCurrentNode = oNode;
        var iLeft = 0;
        var iTop = 0;
        while ((oCurrentNode) && (oCurrentNode != pNode)) {
            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]
    };
    this.getFirstParentOfType = function (obj, tag) {
        while (obj && obj.tagName != tag && obj.tagName != "BODY") {
            obj = obj.parentNode
        };
        return obj
    };
    this.objBox.onscroll = function () {
        this.grid._doOnScroll()
    };
    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)
        }
    };
    this.obj.onmousemove = this._drawTooltip;
    this.obj.onclick = function (e) {
        this.grid._doClick(e || window.event);
        if (this.grid._sclE) this.grid.editCell(e || window.event);
        (e || event).cancelBubble = true
    };
    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._ctmndx || this.grid._ctmndx)(e || event).cancelBubble = true;
            return !this._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
    };
    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, _isOpera ? "keypress" : "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()
    });
    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();
    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
    },

    isTreeGrid: function () {
        return (this.cellType._dhx_find("tree") != -1)
    },



    setRowHidden: function (id, state) {
        var f = convertStringToBoolean(state);
        var row = this.getRowById(id)

        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.setSizes()
    },



    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])
    },



    isColumnHidden: function (ind) {
        if ((this._hrrar) && (this._hrrar[ind])) return true;
        return false
    },

    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])
    },

    _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
        }
    },

    _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)) {
            this.obj.border = 1;
            this.obj.border = 0
        }
    },





    enableColSpan: function (mode) {
        this._ecspn = convertStringToBoolean(mode)
    },




    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
            }
        }
    },


    enableEditEvents: function (click, dblclick, f2Key) {
        this._sclE = convertStringToBoolean(click);
        this._dclE = convertStringToBoolean(dblclick);
        this._f2kE = convertStringToBoolean(f2Key)
    },



    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
            }
        }
    },



    _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
        }
    },


    _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)
    },


    _autoMoveSelect: function (e) {
        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)
    },




    enableDistributedParsing: function (mode, count, time) {
        if (convertStringToBoolean(mode)) {
            this._ads_count = count || 10;
            this._ads_time = time || 250
        } else this._ads_count = 0
    },



    destructor: function () {
        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 = new Array();
        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 = null;
        for (a in this) {
            if ((this[a]) && (this[a].m_obj)) this[a].m_obj = null;
            this[a] = null
        };
        if (this == globalActiveDHTMLGridObject) globalActiveDHTMLGridObject = null;
        return null
    },



    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
    },



    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()
        }
    },

    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--
            }
        }
    },



    enableKeyboardSupport: function (mode) {
        this._htkebl = !convertStringToBoolean(mode)
    },



    enableContextMenu: function (menu) {
        this._ctmndx = menu
    },



    setScrollbarWidthCorrection: function (width) {},


    enableTooltips: function (list) {
        this._enbTts = list.split(",");
        for (var i = 0; i < this._enbTts.length; i++) this._enbTts[i] = convertStringToBoolean(this._enbTts[i])
    },




    enableResizing: function (list) {
        this._drsclmn = list.split(",");
        for (var i = 0; i < this._drsclmn.length; i++) this._drsclmn[i] = convertStringToBoolean(this._drsclmn[i])
    },


    setColumnMinWidth: function (width, ind) {
        if (arguments.length == 2) {
            if (!this._drsclmW) this._drsclmW = new Array();
            this._drsclmW[ind] = width
        } else this._drsclmW = width.split(",")
    },



    enableCellIds: function (mode) {
        this._enbCid = convertStringToBoolean(mode)
    },




    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()
        }
    },



    _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
    },



    setDateFormat: function (mask, incoming) {
        this._dtmask = mask;
        this._dtmask_inc = incoming
    },


    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]
    },

    _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
    },


    _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]
    },






    _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)
        }
    },



    _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);
                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);
                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]))
        };
        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++) {
                this.UserData["gridglobaluserdata"].put(gudCol[j].getAttribute("name"), gudCol[j].firstChild ? gudCol[j].firstChild.data : "")
            }
        }
    },






    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(",")
    },

    checkAll: function () {
        var mode = arguments.length ? arguments[0] : 1;
        for (var cInd = 0; cInd < this.getColumnsNum(); cInd++) {
            if (this.getColType(cInd) == "ch") this.setCheckedRows(cInd, mode)
        }
    },

    uncheckAll: function () {
        this.checkAll(0)
    },

    setCheckedRows: function (cInd, v) {
        this.forEachRowA(function (id) {
            if (this.cells(id, cInd).isCheckbox()) this.cells(id, cInd).setValue(v)
        })
    },


    _drawTooltip: function (e) {
        var c = this.grid.getFirstParentOfType(e ? e.target : event.srcElement, 'TD');
        if (!c || ((this.grid.editor) && (this.grid.editor.cell == c))) return true;
        var r = c.parentNode;
        if (!r.idd || r.idd == "__filler__") return;
        var el = (e ? e.target : event.srcElement);
        if (r.idd == window.unknown) return true;
        if (!this.grid.callEvent("onMouseOver", [
        r.idd, c._cellIndex])) return true;
        if ((this.grid._enbTts) && (!this.grid._enbTts[c._cellIndex])) {
            if (el.title) el.title = '';
            return true
        };
        if (c._cellIndex >= this.grid._cCount) return;
        var ced = this.grid.cells3(r, c._cellIndex);
        if (!ced || !ced.cell || !ced.cell._attrs) return;
        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
    },


    enableCellWidthCorrection: function (size) {
        if (_isFF) this._wcorr = parseInt(size)
    },



    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()
    },





    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)
        }
    },





    preventIECaching: function (mode) {
        this.no_cashe = convertStringToBoolean(mode);
        this.xmlLoader.rSeed = this.no_cashe
    },
    enableColumnAutoSize: function (mode) {
        this._eCAS = convertStringToBoolean(mode)
    },

    _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)
    },


    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 * 7) : a.scrollWidth))
            }
        };
        var l = this.obj.rows.length;
        for (var i = 1; i < l; i++) {
            var z = this.obj.rows[i];
            if (z._childIndexes && z._childIndexes[cInd] != cInd || !z.childNodes[cInd]) continue;
            if (_isFF || _isOpera || complex) z = z.childNodes[cInd].textContent.length * 7;
            else z = z.childNodes[cInd].scrollWidth;
            if (z > m) m = z
        };
        m += 20 + (complex || 0);
        this._setColumnSizeR(cInd, m);
        this._notresize = false;
        this.setSizes()
    },



    detachHeader: function (index, hdr) {
        hdr = hdr || this.hdr;
        var row = hdr.rows[index + 1];
        if (row) row.parentNode.removeChild(row);
        this.setSizes()
    },


    detachFooter: function (index) {
        this.detachHeader(index, this.ftr)
    },


    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]
        }
    },

    _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
            };
            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 = "<div class='hdrcell'>" + (data[0][i] || "&nbsp;") + "</div>";
                else w.innerHTML = (data[0][i] || "&nbsp;");
                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)
        }
    },


    attachFooter: function (values, style) {
        this.attachHeader(values, style, "_aFoot")
    },





    setCellExcellType: function (rowId, cellIndex, type) {
        this.changeCellType(this.rowsAr[rowId], cellIndex, type)
    },

    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)
    },

    setRowExcellType: function (rowId, type) {
        var z = this.rowsAr[rowId];
        for (var i = 0; i < z.childNodes.length; i++) this.changeCellType(z, i, type)
    },

    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
    },





    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 < this.rowsBuffer.length; a++) {
            if (this.rowsBuffer[a]) custom_code.call(this, this.render_row(a).idd)
        }
    },

    forEachCell: function (rowId, custom_code) {
        var z = this.getRowById(rowId);
        if (!z) return;
        for (var i = 0; i < this._cCount; i++) custom_code(this.cells3(z, i), i)
    },

    enableAutoWidth: function (mode, max_limit, min_limit) {
        this._awdth = [
        convertStringToBoolean(mode), parseInt(max_limit || 99999), parseInt(min_limit || 0)];
        if (arguments.length == 1) this.objBox.style.overflowX = mode ? "hidden" : "auto"
    },



    updateFromXML: function (url, insert_new, del_missed, afterCall) {
        if (typeof insert_new == "undefined") insert_new = true;
        this._refresh_mode = [
        true, insert_new, del_missed];
        this.load(url, afterCall)
    },
    _refreshFromXML: function (xml) {
        if (this._f_rowsBuffer) this.filterBy(0, "");
        reset = false;
        if (window.eXcell_tree) {
            eXcell_tree.prototype.setValueX = eXcell_tree.prototype.setValue;
            eXcell_tree.prototype.setValue = function (content) {
                var r = this.grid._h2.get[this.cell.parentNode.idd]
                if (r && this.cell.parentNode.valTag) {
                    this.setLabel(content)
                } else this.setValueX(content)
            }
        };
        var tree = this.cellType._dhx_find("tree");
        xml.getXMLTopNode("rows");
        var pid = xml.doXPath("//rows")[0].getAttribute("parent") || 0;
        var del = {};
        if (this._refresh_mode[2]) {
            if (tree != -1) this._h2.forEachChild(pid, function (obj) {
                del[obj.id] = true
            }, this);
            else this.forEachRow(function (id) {
                del[id] = true
            })
        };
        var rows = xml.doXPath("//row");
        for (var i = 0; i < rows.length; i++) {
            var row = rows[i];
            var id = row.getAttribute("id");
            del[id] = false;
            var pid = row.parentNode.getAttribute("id") || pid;
            if (this.rowsAr[id] && this.rowsAr[id].tagName != "TR") {
                if (this._h2) this._h2.get[id].buff.data = row;
                else this.rowsBuffer[this.getRowIndex(id)].data = row;
                this.rowsAr[id] = row
            } else if (this.rowsAr[id]) {
                this._process_xml_row(this.rowsAr[id], row, -1);
                this._postRowProcessing(this.rowsAr[id], true)
            } else if (this._refresh_mode[1]) {
                var dadd = {
                    idd: id,
                    data: row,
                    _parser: this._process_xml_row,
                    _locator: this._get_xml_data
                };
                if (this._refresh_mode[1] == "top") this.rowsBuffer.unshift(dadd);
                else this.rowsBuffer.push(dadd);
                if (this._h2) {
                    reset = true;
                    (this._h2.add(id, (row.parentNode.getAttribute("id") || row.parentNode.getAttribute("parent")))).buff = this.rowsBuffer[this.rowsBuffer.length - 1]
                };
                this.rowsAr[id] = row;
                row = this.render_row(this.rowsBuffer.length - 1);
                this._insertRowAt(row, -1)
            }
        };
        if (this._refresh_mode[2]) for (id in del) {
            if (del[id] && this.rowsAr[id]) this.deleteRow(id)
        };
        this._refresh_mode = null;
        if (window.eXcell_tree) eXcell_tree.prototype.setValue = eXcell_tree.prototype.setValueX;
        if (reset) this._renderSort();
        this.callEvent("onXLE", [
        this, rows.length]);
        if (this._f_rowsBuffer) this.filterByAll()
    },



    getCustomCombo: function (id, ind) {
        var cell = this.cells(id, ind).cell;
        if (!cell._combo) cell._combo = new dhtmlXGridComboObject();
        return cell._combo
    },


    setTabOrder: function (order) {
        var t = order.split(this.delim);
        this._tabOrder = [];
        var max = this._cCount || order.length;
        for (var i = 0; i < max; i++) t[i] = {
            c: parseInt(t[i]),
            ind: i
        };
        t.sort(function (a, b) {
            return (a.c > 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_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 {
                    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, [])
                }
            };
            this._still_active = true
        }
    },



    _build_master_row: function () {
        var t = document.createElement("DIV");
        var html = ["<table><tr>"];
        for (var i = 0; i < this._cCount; i++) html.push("<td></td>");
        html.push("</tr></table>");
        t.innerHTML = html.join("");
        this._master_row = t.firstChild.rows[0]
    },

    _prepareRow: function (new_id) {
        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
    },


    _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) {
        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) : data.data));
        return r
    },
    _get_json_data: function (data, ind) {
        return data.data[ind]
    },

    _process_csv_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.split(this.csv.cell)) : data.split(this.csv.cell)));
        return r
    },
    _get_csv_data: function (data, ind) {
        return data.split(this.csv.cell)[ind]
    },


    _process_xml_row: function (r, xml) {
        var cellsCol = this.xmlLoader.doXPath(this.xml.cell, xml);
        var strAr = [];
        r._attrs = this._xml_attrs(xml);
        if (this._ud_enabled) {
            var udCol = this.xmlLoader.doXPath("./userdata", xml);
            for (var i = udCol.length - 1; i >= 0; i--) this.setUserData(r.idd, udCol[i].getAttribute("name"), udCol[i].firstChild ? udCol[i].firstChild.data : "")
        };
        for (var j = 0; j < cellsCol.length; j++) {
            var cellVal = cellsCol[this._c_order ? this._c_order[j] : j];
            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 = {};
        if (r.parentNode && r.parentNode.tagName == "row") r._attrs["parent"] = r.parentNode.getAttribute("idd");
        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 = "&nbsp;";
                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;
            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"]);
                cor += (c._attrs["colspan"] - 1)
            };
            if (this._hrrar && this._hrrar[ii] && !donly) {
                c.style.display = "none"
            }
        };
        this.callEvent("onRowCreated", [
        r.idd, r, null])
    },

    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) {
            xml = that["_process_" + type](xml);
            if (!that._contextCallTimer) that.callEvent("onXLE", [that, 0, 0, xml]);
            if (call) {
                call();
                call = null
            }
        };
        this.xmlLoader.loadXML(url)
    },

    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")
    },

    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
    },

    _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.toLowerCase() != this.xml.top) return;
        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);
        if (total && !this.rowsBuffer[total - 1]) this.rowsBuffer[total - 1] = null;
        if (this.isTreeGrid()) return this._process_tree_xml(xml);
        for (var i = 0; i < rows.length; i++) {
            if (this.rowsBuffer[i + cr]) continue;
            var id = rows[i].getAttribute("id") || (i + cr + 1);
            this.rowsBuffer[i + cr] = {
                idd: id,
                data: rows[i],
                _parser: this._process_xml_row,
                _locator: this._get_xml_data
            };
            this.rowsAr[id] = rows[i]
        };
        this.render_dataset();
        this._parsing = false;
        return xml.xmlDoc.responseXML ? xml.xmlDoc.responseXML : xml.xmlDoc
    },


    _process_jsarray: function (data) {
        this._parsing = true;
        if (data && data.xmlDoc) eval("data=" + data.xmlDoc.responseText + ";");
        for (var i = 0; i < data.length; i++) {
            var id = i + 1;
            this.rowsBuffer.push({
                idd: id,
                data: data[i],
                _parser: this._process_jsarray_row,
                _locator: this._get_jsarray_data
            });
            this.rowsAr[id] = data[i]
        };
        this.render_dataset();
        this._parsing = false
    },

    _process_csv: function (data) {
        this._parsing = true;
        if (data.xmlDoc) data = data.xmlDoc.responseText;
        data = data.replace(/\r/g, "");
        data = data.split(this.csv.row);
        if (this._csvHdr) {
            this.clearAll();
            var thead = data.splice(0, 1)[0].split(this.csv.cell);
            if (!this._csvAID) thead.splice(0, 1);
            this.setHeader(thead.join(this.delim));
            this.init()
        };
        for (var i = 0; i < data.length; i++) {
            if (!data[i] && i == data.length - 1) continue;
            if (this._csvAID) {
                var id = i + 1;
                this.rowsBuffer.push({
                    idd: id,
                    data: data[i],
                    _parser: this._process_csv_row,
                    _locator: this._get_csv_data
                })
            } else {
                var temp = data[i].split(this.csv.cell);
                var id = temp.splice(0, 1)[0];
                this.rowsBuffer.push({
                    idd: id,
                    data: temp,
                    _parser: this._process_jsarray_row,
                    _locator: this._get_jsarray_data
                })
            };
            this.rowsAr[id] = data[i]
        };
        this.render_dataset();
        this._parsing = false
    },

    _process_json: function (data) {
        this._parsing = true;
        if (data && data.xmlDoc) eval("data=" + data.xmlDoc.responseText + ";");
        for (var i = 0; i < data.rows.length; i++) {
            var id = data.rows[i].id;
            this.rowsBuffer.push({
                idd: id,
                data: data.rows[i],
                _parser: this._process_json_row,
                _locator: this._get_json_data
            });
            this.rowsAr[id] = data[i]
        };
        this.render_dataset();
        this._parsing = false
    },

    render_dataset: function (min, max) {
        if (this._srnd) {
            if (this._fillers) return this._update_srnd_view();
            max = Math.min((this._get_view_size() + (this._srnd_pr || 0)), this.rowsBuffer.length)
        };
        if (this.pagingOn) {
            min = Math.max((min || 0), (this.currentPage - 1) * this.rowsBufferOutSize);
            max = Math.min(this.currentPage * this.rowsBufferOutSize, this.rowsBuffer.length)
        } else {
            min = min || 0;
            max = max || this.rowsBuffer.length
        };
        for (var i = min; i < max; i++) {
            var r = this.render_row(i)

            if (r == -1) {
                if (this.xmlFileUrl) {
                    if (this.callEvent("onDynXLS", [i, (this._dpref ? this._dpref : (max - i))])) this.load(this.xmlFileUrl + getUrlSymbol(this.xmlFileUrl) + "posStart=" + i + "&count=" + (this._dpref ? this._dpref : (max - i)), this._data_type)
                };
                max = i;
                break
            };
            if (!r.parentNode || !r.parentNode.tagName) {
                this._insertRowAt(r, i);
                if (r._attrs["selected"] || r._attrs["select"]) {
                    this.selectRow(r, r._attrs["call"] ? true : false, true);
                    r._attrs["selected"] = r._attrs["select"] = null
                }
            };
            if (this._ads_count && i - min == this._ads_count) {
                var that = this;
                this._context_parsing = this._context_parsing || this._parsing;
                return this._contextCallTimer = window.setTimeout(function () {
                    that._contextCallTimer = null;
                    that.render_dataset(i, max);
                    if (!that._contextCallTimer) {
                        if (that._context_parsing) that.callEvent("onXLE", [])
                        else that._fixAlterCss();
                        that.callEvent("onDistributedEnd", []);
                        that._context_parsing = false
                    }
                }, this._ads_time)
            }
        };
        if (this._srnd && !this._fillers) this._fillers = [this._add_filler(max, this.rowsBuffer.length - max)];
        this.setSizes()
    },

    render_row: function (ind) {
        if (!this.rowsBuffer[ind]) return -1;
        if (this.rowsBuffer[ind]._parser) {
            var r = this.rowsBuffer[ind];
            if (this.rowsAr[r.idd] && this.rowsAr[r.idd].tagName == "TR") return this.rowsBuffer[ind] = this.rowsAr[r.idd];
            var row = this._prepareRow(r.idd);
            this.rowsBuffer[ind] = row;
            this.rowsAr[r.idd] = row;
            r._parser.call(this, row, r.data);
            this._postRowProcessing(row);
            return row
        };
        return this.rowsBuffer[ind]
    },


    _get_cell_value: function (row, ind, method) {
        if (row._locator) {
            if (this._c_order) ind = this._c_order[ind];
            return row._locator.call(this, row.data, ind)
        };
        return this.cells3(row, ind)[method ? method : "getValue"]()
    },


    sortRows: function (col, type, order) {
        order = (order || "asc").toLowerCase();
        type = (type || this.fldSort[col]);
        col = col || 0;
        if (this.isTreeGrid()) this.sortTreeRows(col, type, order);
        else {
            var arrTS = {};
            var atype = this.cellType[col];
            var amet = "getValue";
            if (atype == "link") amet = "getContent";
            if (atype == "dhxCalendar" || atype == "dhxCalendarA") amet = "getDate";
            for (var i = 0; i < this.rowsBuffer.length; i++) arrTS[this.rowsBuffer[i].idd] = this._get_cell_value(this.rowsBuffer[i], col, amet);
            this._sortRows(col, type, order, arrTS)
        };
        this.callEvent("onAfterSorting", [col, type, order])
    },

    _sortCore: function (col, type, order, arrTS, s) {
        var sort = "sort";
        if (this._sst) {
            s["stablesort"] = this.rowsCol.stablesort;
            sort = "stablesort"
        };
        if (type.length > 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
            })
        }
    },

    _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;
        var tb = this.obj.rows[0].parentNode;
        var tr = tb.removeChild(tb.childNodes[0], true)
        if (_isKHTML) 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) {
                this.render_dataset()
            } else this.render_dataset()
        }
    },


    deleteRow: function (row_id, node) {
        if (!node) node = this.getRowById(row_id)

        if (!node) return;
        this.editStop();
        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;
                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;
        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])));
            return row
        };
        this.rowsBuffer._dhx_insertAt(ind, row);
        return this._insertRowAt(row, ind)
    },


    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 (!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);
        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
    },


    cellById: function (row_id, col) {
        return this.cells(row_id, col)
    },

    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)
    },

    cellByIndex: function (row_index, col) {
        return this.cells2(row_index, col)
    },

    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)
    },

    cells3: function (row, col) {
        var cell = (row._childIndexes ? row.childNodes[row._childIndexes[col]] : row.childNodes[col]);
        return this.cells4(cell)
    },

    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
        }
    },


    getRowsNum: function () {
        return this.rowsBuffer.length
    },



    enableEditTabOnly: function (mode) {
        if (arguments.length > 0) this.smartTabOrder = convertStringToBoolean(mode);
        else this.smartTabOrder = true
    },

    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
    },

    uid: function () {
        if (!this._ui_seed) this._ui_seed = (new Date()).valueOf();
        return this._ui_seed++
    },

    clearAndLoad: function () {
        var t = this._pgn_skin;
        this._pgn_skin = null;
        this.clearAll();
        this._pgn_skin = t;
        this.load.apply(this, arguments)
    },

    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]
    }
};
(function () {
    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) {
        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; i < value.length; i++) {
            if (typeof(value[i]) == "object" && value[i].length) {
                for (var j = 0; j < value[i].length; j++) add(i, j, value[i][j])
            } else add(i, 0, value[i])
        };
        for (var i = 0; i < header.length; i++) for (var j = 0; j < header[0].length; j++) {
            var h = header[i][j];
            header[i][j] = (h || "").toString() || "&nbsp;";
            if (h && h.colspan) for (var k = 1; k < h.colspan; k++) add(j + k, i, "#cspan");
            if (h && h.rowspan) for (var k = 1; k < h.rowspan; k++) add(j, i + k, "#rspan")
        };
        this.setHeader(header[0]);
        for (var i = 1; i < header.length; i++) this.attachHeader(header[i])
    };
    var columns_map = [{
        name: "label",
        def: "&nbsp;",
        operation: "setHeader",
        type: header_set
    }, {
        name: "id",
        def: "",
        operation: "columnIds",
        type: direct_set
    }, {
        name: "width",
        def: "*",
        operation: "setInitWidths",
        type: joined_call
    }, {
        name: "align",
        def: "left",
        operation: "cellAlign",
        type: direct_set
    }, {
        name: "valign",
        def: "middle",
        operation: "cellVAlign",
        type: direct_set
    }, {
        name: "sort",
        def: "na",
        operation: "fldSort",
        type: direct_set
    }, {
        name: "type",
        def: "ro",
        operation: "setColTypes",
        type: joined_call
    }, {
        name: "options",
        def: "",
        operation: "",
        type: set_options
    }];
    dhtmlx.extend_api("dhtmlXGridObject", {
        _init: function (obj) {
            return [obj.parent]
        },
        image_path: "setImagePath",
        columns: "columns",
        rows: "rows",
        headers: "headers",
        skin: "setSkin",
        smart_rendering: "enableSmartRendering",
        css: "enableAlterCss",
        auto_height: "enableAutoHeight",
        save_hidden: "enableAutoHiddenColumnsSaving",
        save_cookie: "enableAutoSaving",
        save_size: "enableAutoSizeSaving",
        auto_width: "enableAutoWidth",
        block_selection: "enableBlockSelection",
        csv_id: "enableCSVAutoID",
        csv_header: "enableCSVHeader",
        cell_ids: "enableCellIds",
        colspan: "enableColSpan",
        column_move: "enableColumnMove",
        context_menu: "enableContextMenu",
        distributed: "enableDistributedParsing",
        drag: "enableDragAndDrop",
        drag_order: "enableDragOrder",
        tabulation: "enableEditTabOnly",
        header_images: "enableHeaderImages",
        header_menu: "enableHeaderMenu",
        keymap: "enableKeyboardSupport",
        mouse_navigation: "enableLightMouseNavigation",
        markers: "enableMarkedCells",
        math_editing: "enableMathEditing",
        math_serialization: "enableMathSerialization",
        drag_copy: "enableMercyDrag",
        multiline: "enableMultiline",
        multiselect: "enableMultiselect",
        save_column_order: "enableOrderSaving",
        hover: "enableRowsHover",
        rowspan: "enableRowspan",
        smart: "enableSmartRendering",
        save_sorting: "enableSortingSaving",
        stable_sorting: "enableStableSorting",
        undo: "enableUndoRedo",
        csv_cell: "setCSVDelimiter",
        date_format: "setDateFormat",
        drag_behavior: "setDragBehavior",
        editable: "setEditable",
        without_header: "setNoHeader",
        submit_changed: "submitOnlyChanged",
        submit_serialization: "submitSerialization",
        submit_selected: "submitOnlySelected",
        submit_id: "submitOnlyRowID",
        xml: "load"
    }, {
        columns: function (obj) {
            for (var j = 0; j < columns_map.length; j++) {
                var settings = [];
                for (var i = 0; i < obj.length; i++) settings[i] = obj[i][columns_map[j].name] || columns_map[j].def;
                var type = columns_map[j].type || direct_call;
                type.call(this, columns_map[j].operation, settings, obj)
            };
            this.init()
        },
        rows: function (obj) {},
        headers: function (obj) {
            for (var i = 0; i < obj.length; i++) this.attachHeader(obj[i])
        }
    })
})();

function dhtmlXGridCellObject(obj) {
    this.destructor = function () {
        this.cell.obj = null;
        this.cell = null;
        this.grid = null;
        this.base = null;
        return null
    };
    this.cell = obj;
    this.getValue = function () {
        if ((this.cell.firstChild) && (this.cell.firstChild.tagName == "TEXTAREA")) return this.cell.firstChild.value;
        else return this.cell.innerHTML._dhx_trim()
    };
    this.getMathValue = function () {
        if (this.cell._val) return this.cell._val;
        else return this.getValue()
    };
    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("-")
    };
    this.getTextColor = function () {
        if (this.cell.style.color) return this.cell.style.color
        else return "#000000"
    };
    this.getBgColor = function () {
        if (this.cell.bgColor) return this.cell.bgColor
        else return "#FFFFFF"
    };
    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"
    };
    this.getWidth = function () {
        return this.cell.scrollWidth
    };
    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"
        }
    };
    this.setTextColor = function (val) {
        this.cell.style.color = val
    };
    this.setBgColor = function (val) {
        if (val == "") val = null;
        this.cell.bgColor = val
    };
    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
    };
    this.wasChanged = function () {
        if (this.cell.wasChanged) return true;
        else return false
    };
    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
    };
    this.isChecked = function () {
        if (this.isCheckbox()) {
            return this.cell.firstChild.checked
        }
    };
    this.isDisabled = function () {
        return this.cell._disabled
    };
    this.setChecked = function (fl) {
        if (this.isCheckbox()) {
            if (fl != 'true' && fl != 1) fl = false;
            this.cell.firstChild.checked = fl
        }
    };
    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]
    }
};
dhtmlXGridCellObject.prototype.setValue = function (val) {
    if ((typeof(val) != "number") && (!val || val.toString()._dhx_trim() == "")) {
        val = "&nbsp;"
        this.cell._clearCell = true
    } else this.cell._clearCell = false;
    this.setCValue(val)
};
dhtmlXGridCellObject.prototype.getTitle = function () {
    return (_isIE ? this.cell.innerText : this.cell.textContent)
};
dhtmlXGridCellObject.prototype.setCValue = function (val, val2) {
    this.cell.innerHTML = val;
    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));
    this.grid.callEvent("onCellChanged", [
    this.cell.parentNode.idd, this.cell._cellIndex, val])
};
dhtmlXGridCellObject.prototype.setLabel = function (val) {
    this.cell.innerHTML = val
};
dhtmlXGridCellObject.prototype.getMath = function () {
    if (this._val) return this.val;
    else return this.getValue()
};

function eXcell() {
    this.obj = null;
    this.val = null;
    this.changeState = function () {
        return false
    };
    this.edit = function () {
        this.val = this.getValue()
    };
    this.detach = function () {
        return false
    };
    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;

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) {
            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;

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;

function eXcell_edn(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 "";
        return this.grid._aplNFb(this.cell.innerHTML.toString()._dhx_trim(), this.cell._cellIndex)
    };
    this.detach = function () {
        var tv = this.obj.value;
        this.setValue(tv);
        return this.val != this.getValue()
    }
};
eXcell_edn.prototype = new eXcell_ed;
eXcell_edn.prototype.setValue = function (val) {
    if (!val || val.toString()._dhx_trim() == "") {
        this.cell._clearCell = true;
        return this.setCValue("&nbsp;", 0)
    } else this.cell._clearCell = false;
    this.setCValue(this.grid._aplNF(val, this.cell._cellIndex))
};

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 () {
        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;
            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 {
            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";
    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("<img src='" + this.grid.imgURL + "item_chk" + val + ".gif' onclick='new eXcell_ch(this.parentNode).changeState();(arguments[0]||event).cancelBubble=true;'>", this.cell.chstate)
};

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;
            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 {
            this.editor = null
        }
    };
    this.edit = null
};
eXcell_ra.prototype = new eXcell_ch;
eXcell_ra.prototype.setValue = function (val) {
    this.cell.style.verticalAlign = "middle";
    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("<img src='" + this.grid.imgURL + "radio_chk" + val + ".gif' onclick='new eXcell_ra(this.parentNode).changeState(false);'>", this.cell.chstate)
};

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.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);
        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
        };
        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(/<br[^>]*>/gi, "\n")._dhx_trim()
    }
};
eXcell_txt.prototype = new eXcell;

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.setCTxtValue(val)
    }
};
eXcell_txttxt.prototype = new eXcell_txt;
eXcell_txt.prototype.setValue = function (val) {
    if (!val || val.toString()._dhx_trim() == "") {
        val = "&nbsp;"
        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, "<br/>"), val)
};

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.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.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";
        this.list.style.top = arPos[1] + this.cell.offsetHeight + "px";
        this.list.onclick = function (e) {
            var ev = e || window.event;
            var cell = ev.target || ev.srcElement


            if (cell.tagName == "OPTION") cell = cell.parentNode;
            editor_obj.editable = false;
            editor_obj.grid.editStop()
        };
        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) {
            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)
        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;
        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) this.setCValue((this.cell._combo || this.grid.getCombo(this.cell._cellIndex)).get(val) || val, val);
    else this.setCValue("&nbsp;", val)
};

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;

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.colorPanel(4, this.obj)
        document.body.appendChild(this.obj);
        this.obj.style.left = arPos[0] + "px";
        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 = "&nbsp;";
                    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.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);
        return this.val != this.getValue()
    }
};
eXcell_cp.prototype = new eXcell;
eXcell_cp.prototype.setValue = function (val) {
    this.setCValue("<div style='width:100%;height:" + ((this.grid.multiLine ? cell.offsetHeight - 2 : 16)) + ";background-color:" + (val || "") + ";border:0px;'>&nbsp;</div>", val);
    this.cell.firstChild._bg = val
};

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];
        if (ar.length > 2) {
            this.cell.lnk = ar[2]

            if (ar[3]) this.cell.trg = ar[3]
        };
        this.cell.titFl = "1"
    };
    this.setCValue("<img src='" + this.grid.iconURL + (val || "")._dhx_trim() + "' border='0'>", val);
    if (this.cell.lnk) {
        this.cell.innerHTML = "<a href='" + this.cell.lnk + "' target='" + this.cell.trg + "'>" + this.cell.innerHTML + "</a>"
    };
    this.cell._brval = title
};

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("<span>$</span><span style='padding-right:2px;color:" + color + ";'>" + val + "</span>", val)
};

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("<div style='position:relative;padding-right:2px;width:100%;overflow:hidden;white-space:nowrap;'><img src='" + this.grid.imgURL + "" + img + "' height='15' style='position:absolute;top:0px;left:0px;'><span style=' padding-left:20px;width:100%;color:" + color + ";'>" + val + "</span></div>", val)
};

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("&nbsp;");
        return this.cell._clearCell = true
    };
    this.cell._clearCell = false;
    this.setCValue(val ? this.grid._aplNF(val, this.cell._cellIndex) : "0")
};

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.toString()._dhx_trim() == "") {
            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;

function dhtmlXGridComboObject() {
    this.keys = new dhtmlxArray();
    this.values = new dhtmlxArray();
    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
    };
    this.get = function (key) {
        for (var i = 0; i < this.keys.length; i++) {
            if (this.keys[i] == key) {
                return this.values[i]
            }
        };
        return null
    };
    this.clear = function () {
        this.keys = new dhtmlxArray();
        this.values = new dhtmlxArray()
    };
    this.remove = function (key) {
        for (var i = 0; i < this.keys.length; i++) {
            if (this.keys[i] == key) {
                this.keys._dhx_removeAt(i);
                this.values._dhx_removeAt(i);
                return true
            }
        }
    };
    this.size = function () {
        var j = 0;
        for (var i = 0; i < this.keys.length; i++) {
            if (this.keys[i] != null) j++
        };
        return j
    };
    this.getKeys = function () {
        var keyAr = new Array(0);
        for (var i = 0; i < this.keys.length; i++) {
            if (this.keys[i] != null) keyAr[keyAr.length] = this.keys[i]
        };
        return keyAr
    };
    this.save = function () {
        this._save = new Array();
        for (var i = 0; i < this.keys.length; i++) this._save[i] = [
        this.keys[i], this.values[i]]
    };
    this.restore = function () {
        if (this._save) {
            this.keys[i] = new Array();
            this.values[i] = new Array();
            for (var i = 0; i < this._save.length; i++) {
                this.keys[i] = this._save[i][0];
                this.values[i] = this._save[i][1]
            }
        }
    };
    return this
};

function Hashtable() {
    this.keys = new dhtmlxArray();
    this.values = new dhtmlxArray();
    return this
};
Hashtable.prototype = new dhtmlXGridComboObject;
dhtmlXGridObject.prototype._process_json_row = function (r, data) {
    r._attrs = data;
    for (var j = 0; j < r.childNodes.length; j++) r.childNodes[j]._attrs = {};
    if (data.userdata) for (var a in data.userdata) this.setUserData(r.idd, a, data.userdata[a])

    for (var i = 0; i < data.data.length; i++) if (typeof data.data[i] == "object") {
        r.childNodes[i]._attrs = data.data[i];
        if (data.data[i].type) r.childNodes[i]._cellType = data.data[i].type;
        data.data[i] = data.data[i].value
    };
    this._fillRow(r, (this._c_order ? this._swapColumns(data.data) : data.data));
    return r
};
dhtmlXGridObject.prototype._process_json = function (data) {
    this._parsing = true;
    try {
        if (data && data.xmlDoc) eval("data=" + data.xmlDoc.responseText + ";");
        else if (typeof data == "string") eval("data=" + data + ";")
    } catch (e) {
        dhtmlxError.throwError("LoadXML", "Incorrect JSON", [(data.xmlDoc || data), this]);
        data = {
            rows: []
        }
    };
    var cr = parseInt(data.pos || 0);
    var total = parseInt(data.total_count || 0);
    if (total && !this.rowsBuffer[total - 1]) this.rowsBuffer[total - 1] = null;
    if (this.isTreeGrid()) return this._process_tree_json(data);
    for (var i = 0; i < data.rows.length; i++) {
        if (this.rowsBuffer[i + cr]) continue;
        var id = data.rows[i].id;
        this.rowsBuffer[i + cr] = {
            idd: id,
            data: data.rows[i],
            _parser: this._process_json_row,
            _locator: this._get_json_data
        };
        this.rowsAr[id] = data[i]
    };
    this.render_dataset();
    this._parsing = false
};
dhtmlXGridObject.prototype._process_tree_json = function (data, top, pid) {
    this._parsing = true;
    var main = false;
    if (!top) {
        this.render_row = this.render_row_tree;
        main = true;
        top = data;
        pid = top.parent || 0;
        if (pid == "0") pid = 0;
        if (!this._h2) this._h2 = new dhtmlxHierarchy();
        if (this._fake) this._fake._h2 = this._h2
    };
    if (top.rows) for (var i = 0; i < top.rows.length; i++) {
        var id = top.rows[i].id;
        var row = this._h2.add(id, pid);
        row.buff = {
            idd: id,
            data: top.rows[i],
            _parser: this._process_json_row,
            _locator: this._get_json_data
        };
        if (top.rows[i].open) row.state = "minus";
        this.rowsAr[id] = row.buff;
        this._process_tree_json(top.rows[i], top.rows[i], id)
    };
    if (main) {
        if (pid != 0) this._h2.change(pid, "state", "minus")
        this._updateTGRState(this._h2.get[pid]);
        this._h2_to_buff();
        this.render_dataset();
        if (this._slowParse === false) {
            this.forEachRow(function (id) {
                this.render_row_tree(0, id)
            })
        };
        this._parsing = false
    }
};
dhtmlXGridObject.prototype.filterBy = function (column, value, preserve) {
    if (this.isTreeGrid()) return this.filterTreeBy(column, value, preserve);
    if (this._f_rowsBuffer) {
        if (!preserve) {
            this.rowsBuffer = dhtmlxArray([].concat(this._f_rowsBuffer));
            if (this._fake) this._fake.rowsBuffer = this.rowsBuffer
        }
    } else this._f_rowsBuffer = [].concat(this.rowsBuffer);
    if (!this.rowsBuffer.length) return;
    var d = true;
    this.dma(true)
    if (typeof(column) == "object") for (var j = 0; j < value.length; j++) this._filterA(column[j], value[j]);
    else this._filterA(column, value);
    this.dma(false)
    if (this.pagingOn && this.rowsBuffer.length / this.rowsBufferOutSize < (this.currentPage - 1)) this.changePage(0);
    this._reset_view();
    this.callEvent("onGridReconstructed", [])
};
dhtmlXGridObject.prototype._filterA = function (column, value) {
    if (value == "") return;
    var d = true;
    if (typeof(value) == "function") d = false;
    else value = (value || "").toString().toLowerCase();
    if (!this.rowsBuffer.length) return;
    for (var i = this.rowsBuffer.length - 1; i >= 0; i--) if (d ? (this._get_cell_value(this.rowsBuffer[i], column).toString().toLowerCase().indexOf(value) == -1) : (!value(this._get_cell_value(this.rowsBuffer[i], column), this.rowsBuffer[i].idd))) this.rowsBuffer.splice(i, 1)
};
dhtmlXGridObject.prototype.getFilterElement = function (index) {
    if (!this.filters) return;
    for (var i = 0; i < this.filters.length; i++) {
        if (this.filters[i][1] == index) return (this.filters[i][0].combo || this.filters[i][0])
    };
    return null
};
dhtmlXGridObject.prototype.collectValues = function (column) {
    var value = this.callEvent("onCollectValues", [column]);
    if (value !== true) return value;
    if (this.isTreeGrid()) return this.collectTreeValues(column);
    this.dma(true)
    column = this._m_order ? this._m_order[column] : column;
    var c = {};
    var f = [];
    this._build_m_order();
    var col = this._f_rowsBuffer || this.rowsBuffer;
    for (var i = 0; i < col.length; i++) {
        var val = this._get_cell_value(col[i], column);
        if (val && (!col[i]._childIndexes || col[i]._childIndexes[column] != col[i]._childIndexes[column - 1])) c[val] = true
    };
    this.dma(false)

    var vals = this.combos[column];
    for (d in c) if (c[d] === true) f.push(vals ? (vals.get(d) || d) : d);
    return f.sort()
};
dhtmlXGridObject.prototype._build_m_order = function () {
    if (this._c_order) {
        this._m_order = []
        for (var i = 0; i < this._c_order.length; i++) {
            this._m_order[this._c_order[i]] = i
        }
    }
};
dhtmlXGridObject.prototype.filterByAll = function () {
    var a = [];
    var b = [];
    this._build_m_order();
    for (var i = 0; i < this.filters.length; i++) {
        var ind = this._m_order ? this._m_order[this.filters[i][1]] : this.filters[i][1];
        b.push(ind);
        var val = this.filters[i][0]._filter ? this.filters[i][0]._filter() : this.filters[i][0].value;
        var vals;
        if (typeof val != "function" && (vals = this.combos[ind])) {
            ind = vals.values._dhx_find(val);
            val = (ind == -1) ? val : vals.keys[ind]
        };
        a.push(val)
    };
    if (!this.callEvent("onFilterStart", [b, a])) return;
    this.filterBy(b, a);
    if (this._cssEven) this._fixAlterCss();
    this.callEvent("onFilterEnd", [this.filters])
};
dhtmlXGridObject.prototype.makeFilter = function (id, column, preserve) {
    if (!this.filters) this.filters = [];
    if (typeof(id) != "object") id = document.getElementById(id);
    if (!id) return;
    var self = this;
    if (!id.style.width) id.style.width = "90%";
    if (id.tagName == 'SELECT') {
        this.filters.push([id, column]);
        this._loadSelectOptins(id, column);
        id.onchange = function () {
            self.filterByAll()
        };
        if (_isIE) id.style.marginTop = "1px";
        this.attachEvent("onEditCell", function (stage, a, ind) {
            this._build_m_order();
            if (stage == 2 && this.filters && (this._m_order ? (ind == this._m_order[column]) : (ind == column))) this._loadSelectOptins(id, column);
            return true
        })
    } else if (id.tagName == 'INPUT') {
        this.filters.push([id, column]);
        id.value = '';
        id.onkeydown = function () {
            if (this._timer) window.clearTimeout(this._timer);
            this._timer = window.setTimeout(function () {
                if (id.value != id.old_value) {
                    self.filterByAll();
                    id.old_value = id.value
                }
            }, 500)
        }
    } else if (id.tagName == 'DIV' && id.className == "combo") {
        this.filters.push([id, column]);
        id.style.padding = "0px";
        id.style.margin = "0px";
        if (!window.dhx_globalImgPath) window.dhx_globalImgPath = this.imgURL;
        var z = new dhtmlXCombo(id, "_filter", "90%");
        z.filterSelfA = z.filterSelf;
        z.filterSelf = function () {
            if (this.getSelectedIndex() == 0) this.setComboText("");
            this.filterSelfA.apply(this, arguments);
            this.optionsArr[0].hide(false)
        };
        z.enableFilteringMode(true);
        id.combo = z;
        id.value = "";
        this._loadComboOptins(id, column);
        z.attachEvent("onChange", function () {
            id.value = z.getSelectedValue();
            self.filterByAll()
        })
    };
    if (id.parentNode) id.parentNode.className += " filter";
    this._filters_ready()
};
dhtmlXGridObject.prototype.findCell = function (value, c_ind, count) {
    var res = new Array();
    value = value.toString().toLowerCase();
    if (typeof count != "number") count = count ? 1 : 0;
    if (!this.rowsBuffer.length) return res;
    for (var i = (c_ind || 0); i < this._cCount; i++) {
        if (this._h2) this._h2.forEachChild(0, function (el) {
            if (count && res.length == count) return res;
            if (this._get_cell_value(el.buff, i).toString().toLowerCase().indexOf(value) != -1) {
                res.push([el.id, i])
            }
        }, this)
        else for (var j = 0; j < this.rowsBuffer.length; j++) if (this._get_cell_value(this.rowsBuffer[j], i).toString().toLowerCase().indexOf(value) != -1) {
            res.push([this.rowsBuffer[j].idd, i]);
            if (count && res.length == count) return res
        };
        if (typeof(c_ind) != "undefined") return res
    };
    return res
};
dhtmlXGridObject.prototype.makeSearch = function (id, column) {
    if (typeof(id) != "object") id = document.getElementById(id);
    if (!id) return;
    var self = this;
    if (id.tagName == 'INPUT') {
        id.onkeypress = function () {
            if (this._timer) window.clearTimeout(this._timer);
            this._timer = window.setTimeout(function () {
                if (id.value == "") return;
                var z = self.findCell(id.value, column, true);
                if (z.length) {
                    if (self._h2) self.openItem(z[0][0]);
                    self.selectCell(self.getRowIndex(z[0][0]), (column || 0))
                }
            }, 500)
        }
    };
    if (id.parentNode) id.parentNode.className += " filter"
};
dhtmlXGridObject.prototype._loadSelectOptins = function (t, c) {
    var l = this.collectValues(c);
    var v = t.value;
    t.innerHTML = "";
    t.options[0] = new Option("", "");
    var f = this._filter_tr ? this._filter_tr[c] : null;
    for (var i = 0; i < l.length; i++) t.options[t.options.length] = new Option(f ? f(l[i]) : l[i], l[i]);
    t.value = v
};
dhtmlXGridObject.prototype.setSelectFilterLabel = function (ind, fun) {
    if (!this._filter_tr) this._filter_tr = [];
    this._filter_tr[ind] = fun
};
dhtmlXGridObject.prototype._loadComboOptins = function (t, c) {
    var l = this.collectValues(c);
    t.combo.clearAll();
    t.combo.render(false);
    t.combo.addOption("", "&nbsp;");
    for (var i = 0; i < l.length; i++) t.combo.addOption(l[i], l[i]);
    t.combo.render(true)
};
dhtmlXGridObject.prototype.refreshFilters = function () {
    for (var i = 0; i < this.filters.length; i++) {
        switch (this.filters[i][0].tagName.toLowerCase()) {
        case "input":
            break;
        case "select":
            this._loadSelectOptins.apply(this, this.filters[i]);
            break;
        case "div":
            this._loadComboOptins.apply(this, this.filters[i]);
            break
        }
    }
};
dhtmlXGridObject.prototype._filters_ready = function (fl, code) {
    this.attachEvent("onXLE", this.refreshFilters);
    this.attachEvent("onRowCreated", function (id, r) {
        if (this._f_rowsBuffer) for (var i = 0; i < this._f_rowsBuffer.length; i++) if (this._f_rowsBuffer[i].idd == id) return this._f_rowsBuffer[i] = r
    })
    this.attachEvent("onClearAll", function () {
        this._f_rowsBuffer = null;
        if (!this.obj.rows.length) this.filters = []
    });
    if (window.dhtmlXCombo) this.attachEvent("onScroll", dhtmlXCombo.prototype.closeAll);
    this._filters_ready = function () {}
};
dhtmlXGridObject.prototype._in_header_text_filter = function (t, i) {
    t.innerHTML = "<input type='text' style='width:90%;font-size:8pt;font-family:Tahoma;-moz-user-select:text;'>";
    t.onclick = t.onmousedown = function (e) {
        (e || event).cancelBubble = true;
        return true
    };
    t.onselectstart = function () {
        return (event.cancelBubble = true)
    };
    this.makeFilter(t.firstChild, i)
};
dhtmlXGridObject.prototype._in_header_text_filter_inc = function (t, i) {
    t.innerHTML = "<input type='text' style='width:90%;font-size:8pt;font-family:Tahoma;-moz-user-select:text;'>";
    t.onclick = t.onmousedown = function (e) {
        (e || event).cancelBubble = true;
        return true
    };
    t.onselectstart = function () {
        return (event.cancelBubble = true)
    };
    this.makeFilter(t.firstChild, i);
    t.firstChild._filter = function () {
        return function (val) {
            return (val.toString().toLowerCase().indexOf(t.firstChild.value.toLowerCase()) == 0)
        }
    };
    this._filters_ready()
};
dhtmlXGridObject.prototype._in_header_select_filter = function (t, i) {
    t.innerHTML = "<select style='width:90%;font-size:8pt;font-family:Tahoma;'></select>";
    t.onclick = function (e) {
        (e || event).cancelBubble = true;
        return false
    };
    this.makeFilter(t.firstChild, i)
};
dhtmlXGridObject.prototype._in_header_select_filter_strict = function (t, i) {
    t.innerHTML = "<select style='width:90%;font-size:8pt;font-family:Tahoma;'></select>";
    t.onclick = function (e) {
        (e || event).cancelBubble = true;
        return false
    };
    this.makeFilter(t.firstChild, i);
    t.firstChild._filter = function () {
        return function (val) {
            if (t.firstChild.value.toLowerCase() == "") return true;
            return (val.toString().toLowerCase() == t.firstChild.value.toLowerCase())
        }
    };
    this._filters_ready()
};
dhtmlXGridObject.prototype._in_header_combo_filter = function (t, i) {
    t.innerHTML = "<div style='width:100%;padding-left:2px;overflow:hidden;font-size:8pt;font-family:Tahoma;-moz-user-select:text;' class='combo'></div>";
    t.onselectstart = function () {
        return (event.cancelBubble = true)
    };
    t.onclick = t.onmousedown = function (e) {
        (e || event).cancelBubble = true;
        return true
    };
    this.makeFilter(t.firstChild, i)
};
dhtmlXGridObject.prototype._in_header_text_search = function (t, i) {
    t.innerHTML = "<input type='text' style='width:90%;font-size:8pt;font-family:Tahoma;-moz-user-select:text;'>";
    t.onclick = t.onmousedown = function (e) {
        (e || event).cancelBubble = true;
        return true
    };
    t.onselectstart = function () {
        return (event.cancelBubble = true)
    };
    this.makeSearch(t.firstChild, i)
};
dhtmlXGridObject.prototype._in_header_numeric_filter = function (t, i) {
    this._in_header_text_filter.call(this, t, i);
    t.firstChild._filter = function () {
        var v = this.value;
        var r;
        var op = "==";
        var num = parseFloat(v.replace("=", ""));
        var num2 = null;
        if (v) {
            if (v.indexOf("..") != -1) {
                v = v.split("..");
                num = parseFloat(v[0]);
                num2 = parseFloat(v[1]);
                return function (v) {
                    if (v >= num && v <= num2) return true;
                    return false
                }
            };
            r = v.match(/>|>=|<=|</)
            if (r) {
                op = r[0];
                num = parseFloat(v.replace(op, ""))
            };
            return Function("v", " if (v " + op + " " + num + " )return true;return false;")
        }
    }
};
dhtmlXGridObject.prototype._in_header_master_checkbox = function (t, i, c) {
    t.innerHTML = c[0] + "<input type='checkbox' />" + c[1];
    var self = this;
    t.firstChild.onclick = function (e) {
        self._build_m_order();
        var j = self._m_order ? self._m_order[i] : i;
        var val = this.checked ? 1 : 0;
        self.forEachRowA(function (id) {
            var c = this.cells(id, j);
            if (c.isCheckbox()) c.setValue(val)
        });
        (e || event).cancelBubble = true
    }
};
dhtmlXGridObject.prototype._in_header_stat_total = function (t, i, c) {
    var calck = function () {
        var summ = 0;
        for (var j = 0; j < this.rowsBuffer.length; j++) {
            var v = parseFloat(this._get_cell_value(this.rowsBuffer[j], i));
            summ += isNaN(v) ? 0 : v
        };
        return this._maskArr[i] ? this._aplNF(summ, i) : (Math.round(summ * 100) / 100)
    };
    this._stat_in_header(t, calck, i, c, c)
};
dhtmlXGridObject.prototype._in_header_stat_multi_total = function (t, i, c) {
    var cols = c[1].split(":");
    c[1] = "";
    for (var k = 0; k < cols.length; k++) {
        cols[k] = parseInt(cols[k])
    };
    var calck = function () {
        var summ = 0;
        for (var j = 0; j < this.rowsBuffer.length; j++) {
            var v = 1;
            for (var k = 0; k < cols.length; k++) {
                v *= parseFloat(this._get_cell_value(this.rowsBuffer[j], cols[k]))
            };
            summ += isNaN(v) ? 0 : v
        };
        return this._maskArr[i] ? this._aplNF(summ, i) : (Math.round(summ * 100) / 100)
    };
    var track = [];
    for (var i = 0; i < cols.length; i++) {
        track[cols[i]] = true
    };
    this._stat_in_header(t, calck, track, c, c)
};
dhtmlXGridObject.prototype._in_header_stat_max = function (t, i, c) {
    var calck = function () {
        var summ = -999999999;
        if (this.getRowsNum() == 0) return "&nbsp;";
        for (var j = 0; j < this.rowsBuffer.length; j++) summ = Math.max(summ, parseFloat(this._get_cell_value(this.rowsBuffer[j], i)));
        return this._maskArr[i] ? this._aplNF(summ, i) : summ
    };
    this._stat_in_header(t, calck, i, c)
};
dhtmlXGridObject.prototype._in_header_stat_min = function (t, i, c) {
    var calck = function () {
        var summ = 999999999;
        if (this.getRowsNum() == 0) return "&nbsp;";
        for (var j = 0; j < this.rowsBuffer.length; j++) summ = Math.min(summ, parseFloat(this._get_cell_value(this.rowsBuffer[j], i)));
        return this._maskArr[i] ? this._aplNF(summ, i) : summ
    };
    this._stat_in_header(t, calck, i, c)
};
dhtmlXGridObject.prototype._in_header_stat_average = function (t, i, c) {
    var calck = function () {
        var summ = 0;
        var count = 0;
        if (this.getRowsNum() == 0) return "&nbsp;";
        for (var j = 0; j < this.rowsBuffer.length; j++) {
            var v = parseFloat(this._get_cell_value(this.rowsBuffer[j], i));
            summ += isNaN(v) ? 0 : v;
            count++
        };
        return this._maskArr[i] ? this._aplNF(summ / count, i) : (Math.round(summ / count * 100) / 100)
    };
    this._stat_in_header(t, calck, i, c)
};
dhtmlXGridObject.prototype._in_header_stat_count = function (t, i, c) {
    var calck = function () {
        return this.getRowsNum()
    };
    this._stat_in_header(t, calck, i, c)
};
dhtmlXGridObject.prototype._stat_in_header = function (t, calck, i, c) {
    var that = this;
    var f = function () {
        this.dma(true)
        t.innerHTML = (c[0] ? c[0] : "") + calck.call(this) + (c[1] ? c[1] : "");
        this.dma(false)
        this.callEvent("onStatReady", [])
    };
    if (!this._stat_events) {
        this._stat_events = [];
        this.attachEvent("onClearAll", function () {
            if (!this.hdr.rows[1]) {
                for (var i = 0; i < this._stat_events.length; i++) for (var j = 0; j < 4; j++) this.detachEvent(this._stat_events[i][j]);
                this._stat_events = []
            }
        })
    };
    this._stat_events.push([
    this.attachEvent("onGridReconstructed", f), this.attachEvent("onXLE", f), this.attachEvent("onFilterEnd", f), this.attachEvent("onEditCell", function (stage, id, ind) {
        if (stage == 2 && (ind == i || (i && i[ind]))) f.call(this);
        return true
    })]);
    t.innerHTML = ""
};
dhtmlXGridObject.prototype.unGroup = function () {
    if (!this._groups) return;
    this._dndProblematic = false;
    delete this._groups;
    delete this._gIndex;
    if (this._fake) this._mirror_rowsCol();
    this.forEachRow(function (id) {
        this.rowsAr[id].style.display = ''
    })
    this._reset_view();
    this.callEvent("onGridReconstructed", [])
    this.callEvent("onUnGroup", [])
};
dhtmlXGridObject.prototype._mirror_rowsCol = function () {
    this._fake._groups = this._groups;
    this._fake._gIndex = this._gIndex;
    this.rowsBuffer = dhtmlxArray();
    for (var i = 0; i < this.rowsCol.length; i++) if (!this.rowsCol[i]._cntr) this.rowsBuffer.push(this.rowsCol[i]);
    this._fake.rowsBuffer = dhtmlxArray();
    for (var i = 0; i < this._fake.rowsCol.length; i++) if (!this._fake.rowsCol[i]._cntr) this._fake.rowsBuffer.push(this._fake.rowsCol[i])
};
dhtmlXGridObject.prototype.groupBy = function (ind, mask) {
    if (this._groups) this.unGroup();
    this._dndProblematic = true;
    this._groups = {};
    if (!mask) {
        mask = ["#title"];
        for (var i = 1; i < this._cCount; i++) mask.push("#cspan")
    };
    this._gmask = document.createElement("TR");
    this._gmask.origin = mask;
    var ltd, rindex = 0;
    for (var i = 0; i < mask.length; i++) {
        if (mask[i] == "#cspan") ltd.colSpan = (parseInt(ltd.colSpan) || 1) + 1
        else {
            ltd = document.createElement("TD");
            ltd._cellIndex = i;
            if (this._hrrar[i] && !this._fake) ltd.style.display = "none";
            ltd.className = "group_row";
            ltd.innerHTML = "&nbsp;";
            if (mask[i] == "#title") this._gmask._title = rindex;
            else ltd.align = this.cellAlign[i] || "left";
            this._gmask.appendChild(ltd);
            if (mask[i].indexOf("#stat") == 0) {
                this._gmask._math = true;
                ltd._counter = [this["_g_" + mask[i].replace("#", "")], i, rindex]
            };
            rindex++
        }
    };
    for (var a in this._groups) this._groups[a] = this.undefined;
    this._gIndex = ind;
    if (this._fake && !this._realfake) {
        this._fake._groups = [];
        this._fake._gIndex = this._gIndex
    };
    this._nextRow = function (ind, dir) {
        var r = this.rowsCol[ind + dir];
        if (r && (r.style.display == "none" || r._cntr)) return this._nextRow(ind + dir, dir);
        return r
    };
    if (!this.__sortRowsBG) {
        this._key_events = dhtmlXHeir({}, this._key_events)
        this._key_events.k38_0_0 = function () {
            if (this.editor && this.editor.combo) this.editor.shiftPrev();
            else {
                var rowInd = this.row.rowIndex;
                if (!rowInd) return;
                var nrow = this._nextRow(rowInd - 1, -1);
                if (nrow) this.selectCell(nrow, this.cell._cellIndex, true)
            }
        };
        this._key_events.k13_1_0 = this._key_events.k13_0_1 = function () {};
        this._key_events.k40_0_0 = function () {
            if (this.editor && this.editor.combo) this.editor.shiftNext();
            else {
                var rowInd = this.row.rowIndex;
                if (!rowInd) return;
                var nrow = this._nextRow(rowInd - 1, 1);
                if (nrow) this.selectCell(nrow, this.cell._cellIndex, true)
            }
        };
        this.attachEvent("onFilterStart", function () {
            if (this._groups) this._groups = this.undefined;
            return true
        });
        this.attachEvent("onFilterEnd", function () {
            if (typeof this._gIndex != "undefined") this.groupBy(this._gIndex, this._gmask.origin)
        });
        this.sortRows_bg = this.sortRows;
        this.sortRows = function (ind, type, dir) {
            if (typeof(this._groups) == "undefined") return this.sortRows_bg.apply(this, arguments);
            this.callEvent("onBeforeSorting", [ind, (type || "str"), (dir || "asc")])
        };
        this.attachEvent("onBeforeSorting", function (ind, type, dir) {
            if (typeof(this._groups) == "undefined") return true;
            if (ind == this._gIndex) this._sortByGroup(ind, type, dir);
            else this._sortInGroup(ind, type, dir);
            this.setSortImgState(true, ind, dir)
            if (this._fake) {
                this._mirror_rowsCol();
                this._fake._groups = [];
                this._fake._reset_view()
            };
            this.setSortImgState(true, ind, dir);
            this.callEvent("onAfterSorting", [ind, type, dir]);
            return false
        });
        this.attachEvent("onClearAll", function () {
            this.unGroup()
        });
        this.attachEvent("onBeforeRowDeleted", function (id) {
            if (!this._groups) return true;
            if (!this.rowsAr[id]) return true;
            var val = this.cells(id, this._gIndex).getValue();
            if (val === "") val = " ";
            var z = this._groups[val];
            this._dec_group(z);
            return true
        });
        this.attachEvent("onCheckbox", function (id, index, value) {
            this.callEvent("onEditCell", [2, id, index, (value ? 1 : 0), (value ? 0 : 1)])
        });
        this.attachEvent("onXLE", this.updateGroups);
        this.attachEvent("onColumnHidden", this.hideGroupColumn);
        this.attachEvent("onEditCell", function (stage, id, ind, val, oldval) {
            if (!this._groups) return true;
            if (stage == 2 && val != oldval && ind == this._gIndex) {
                if (oldval === "") oldval = " ";
                this._dec_group(this._groups[oldval]);
                var r = this.rowsAr[id];
                var i = this.rowsCol._dhx_find(r)
                var ni = this._inc_group(val);
                var n = this.rowsCol[ni];
                if (r == n) n = n.nextSibling;
                var p = r.parentNode;
                var o = r.rowIndex;
                p.removeChild(r);
                if (n) p.insertBefore(r, n);
                else p.appendChild(r);
                this.rowsCol._dhx_insertAt(ni, r);
                if (ni < i) i++;
                this.rowsCol._dhx_removeAt(i, r);
                this._fixAlterCss()
            } else if (stage == 2 && val != oldval) {
                this.updateGroups();
                this._updateGroupView(this._groups[this.cells(id, this._gIndex).getValue() || " "])
            };
            return true
        })
        this.__sortRowsBG = true
    };
    this._groupExisting();
    if (this._hrrar) for (var i = 0; i < this._hrrar.length; i++) if (this._hrrar[i]) this.hideGroupColumn(i, true);
    this.callEvent("onGroup", []);
    if (this._ahgr || this._awdth) this.setSizes()
};
dhtmlXGridObject.prototype._sortInGroup = function (col, type, order) {
    var b = this._groups_get();
    b.reverse();
    for (var i = 0; i < b.length; i++) {
        var c = b[i]._cntr._childs;
        var a = {};
        for (var j = 0; j < c.length; j++) {
            var cell = this.cells3(c[j], col);
            a[c[j].idd] = cell.getDate ? cell.getDate() : cell.getValue()
        };
        this._sortCore(col, type, order, a, c)
    };
    this._groups_put(b);
    this.setSizes();
    this.callEvent("onGridReconstructed", [])
};
dhtmlXGridObject.prototype._sortByGroup = function (col, type, order) {
    var b = this._groups_get();
    var a = [];
    for (var i = 0; i < b.length; i++) {
        b[i].idd = "_sort_" + i;
        a["_sort_" + i] = b[i]._cntr.text
    };
    this._sortCore(col, type, order, a, b);
    this._groups_put(b);
    this.callEvent("onGridReconstructed", [])
    this.setSizes()
};
dhtmlXGridObject.prototype._inc_group = function (val, hidden, skip) {
    if (val === "") val = " ";
    if (!this._groups[val]) {
        this._groups[val] = {
            text: val,
            row: this._addPseudoRow(),
            count: 0,
            state: hidden ? "plus" : "minus"
        }
    };
    var z = this._groups[val];
    z.row._cntr = z;
    var ind = this.rowsCol._dhx_find(z.row) + z.count + 1;
    z.count++;
    if (!skip) {
        this._updateGroupView(z);
        this.updateGroups()
    };
    return ind
};
dhtmlXGridObject.prototype._dec_group = function (z) {
    if (!z) return;
    z.count--;
    if (z.count == 0) {
        z.row.parentNode.removeChild(z.row);
        this.rowsCol._dhx_removeAt(this.rowsCol._dhx_find(z.row));
        delete this._groups[z.text]
    } else this._updateGroupView(z);
    if (this._fake && !this._realfake) this._fake._dec_group(this._fake._groups[z.text]);
    this.updateGroups();
    return true
};
dhtmlXGridObject.prototype._insertRowAt_gA = dhtmlXGridObject.prototype._insertRowAt;
dhtmlXGridObject.prototype._insertRowAt = function (r, ind, skip) {
    if (typeof(this._groups) != "undefined") {
        if (this._realfake) var val = this._fake._bfs_cells(r.idd, this._gIndex).getValue();
        else if (this._bfs_cells3) var val = this._bfs_cells3(r, this._gIndex).getValue();
        else var val = this.cells3(r, this._gIndex).getValue();
        if (!val) val = " ";
        ind = this._inc_group(val, r.style.display == "none")
    };
    var res = this._insertRowAt_gA(r, ind, skip);
    if (typeof(this._groups) != "undefined") {
        this.expandGroup(val);
        this._updateGroupView(this._groups[val]);
        this.updateGroups()
    };
    return res
};
dhtmlXGridObject.prototype._updateGroupView = function (z) {
    if (this._fake && !this._realfake) return z.row.firstChild.innerHTML = "&nbsp;";
    var mask = this._gmask || this._fake._gmask;
    var html = "<img style='margin-bottom:-4px' src='" + this.imgURL + z.state + ".gif'> ";
    if (this.customGroupFormat) html += this.customGroupFormat(z.text, z.count);
    else html += z.text + " ( " + z.count + " ) ";
    z.row.childNodes[mask._title].innerHTML = html
};
dhtmlXGridObject.prototype._addPseudoRow = function (skip) {
    var mask = this._gmask || this._fake._gmask;
    var r = mask.cloneNode(true)

    for (var i = 0; i < r.childNodes.length; i++) r.childNodes[i]._cellIndex = mask.childNodes[i]._cellIndex;
    var that = this;
    r.onclick = function (e) {
        if (that._fake && that._realfake) that._fake._switchGroupState(that._fake._groups[this._cntr.text].row);
        else that._switchGroupState(this);
        (e || event).cancelBubble = "true"
    };
    r.ondblclick = function (e) {
        (e || event).cancelBubble = "true"
    };
    if (!skip) {
        if (_isKHTML) this.obj.appendChild(r)
        else this.obj.firstChild.appendChild(r)
        this.rowsCol.push(r)
    };
    return r
};
dhtmlXGridObject.prototype._groups_get = function () {
    var b = [];
    this._temp_par = this.obj.parentNode;
    this._temp_par.removeChild(this.obj);
    var a = [];
    for (var i = this.rowsCol.length - 1; i >= 0; i--) {
        if (this.rowsCol[i]._cntr) {
            this.rowsCol[i]._cntr._childs = a;
            a = [];
            b.push(this.rowsCol[i])
        } else a.push(this.rowsCol[i]);
        this.rowsCol[i].parentNode.removeChild(this.rowsCol[i])
    };
    return b
};
dhtmlXGridObject.prototype._groups_put = function (b) {
    this.rowsCol = new dhtmlxArray(0);
    for (var i = 0; i < b.length; i++) {
        var gr = b[i]._cntr;
        this.obj.firstChild.appendChild(gr.row);
        this.rowsCol.push(gr.row)
        gr.row.idd = null;
        for (var j = 0; j < gr._childs.length; j++) {
            this.obj.firstChild.appendChild(gr._childs[j]);
            this.rowsCol.push(gr._childs[j])
        };
        delete gr._childs
    };
    this._temp_par.appendChild(this.obj)
};
dhtmlXGridObject.prototype._groupExisting = function (b) {
    if (!this.getRowsNum()) return;
    var b = [];
    this._temp_par = this.obj.parentNode;
    this._temp_par.removeChild(this.obj);
    var a = [];
    var mlen = this.rowsCol.length;
    for (var i = 0; i < mlen; i++) {
        var val = this.cells4(this.rowsCol[i].childNodes[this._gIndex]).getValue();
        if (!val) val = " ";
        if (!this._groups[val]) {
            this._groups[val] = {
                text: val,
                row: this._addPseudoRow(true),
                count: 0,
                state: "minus"
            };
            var z = this._groups[val];
            z.row._cntr = z;
            this._groups[val]._childs = [];
            b.push(z.row)
        };
        this._groups[val].count++;
        this._groups[val]._childs.push(this.rowsCol[i]);
        this.rowsCol[i].parentNode.removeChild(this.rowsCol[i])
    };
    for (var i = 0; i < b.length; i++) this._updateGroupView(b[i]._cntr)
    this._groups_put(b);
    if (this._fake && !this._realfake) {
        this._mirror_rowsCol();
        this._fake._groups = [];
        this._fake._reset_view()
    };
    this.callEvent("onGridReconstructed", [])
    this.updateGroups()
};
dhtmlXGridObject.prototype._switchGroupState = function (row) {
    var z = row._cntr;
    if (this._fake && !this._realfake) {
        z.state = this._fake._groups[row._cntr.text].row._cntr.state;
        this._fake._switchGroupState(this._fake._groups[row._cntr.text].row)
    };
    var ind = this.rowsCol._dhx_find(z.row) + 1;
    z.state = z.state == "minus" ? "plus" : "minus";
    var st = z.state == "plus" ? "none" : "";
    while (this.rowsCol[ind] && !this.rowsCol[ind]._cntr) {
        this.rowsCol[ind].style.display = st;
        ind++
    };
    this._updateGroupView(z);
    this.callEvent("onGroupStateChanged", [z.text, (z.state == "minus")]);
    this.setSizes()
};
dhtmlXGridObject.prototype.expandGroup = function (val) {
    if (this._groups[val].state == "plus") this._switchGroupState(this._groups[val].row)
};
dhtmlXGridObject.prototype.collapseGroup = function (val) {
    if (this._groups[val].state == "minus") this._switchGroupState(this._groups[val].row)
};
dhtmlXGridObject.prototype.expandAllGroups = function () {
    for (var i in this._groups) if (this._groups[i] && this._groups[i].state == "plus") this._switchGroupState(this._groups[i].row)
};
dhtmlXGridObject.prototype.collapseAllGroups = function () {
    for (var i in this._groups) if (this._groups[i] && this._groups[i].state == "minus") this._switchGroupState(this._groups[i].row)
};
dhtmlXGridObject.prototype.hideGroupColumn = function (ind, state) {
    if (this._fake) return;
    var rind = -1;
    var row = this._gmask.childNodes;
    for (var i = 0; i < row.length; i++) if (row[i]._cellIndex == ind) {
        rind = i;
        break
    };
    if (rind == -1) return;
    for (var a in this._groups) this._groups[a].row.childNodes[rind].style.display = state ? "none" : ""
};
dhtmlXGridObject.prototype.groupStat = function (name, ind, math) {
    math = this["_g_" + (math || "stat_total")];
    var summ = 0;
    var index = 0;
    this.forEachRowInGroup(name, function (id) {
        summ = math(summ, this.cells(id, ind).getValue() * 1, index)
        index++
    })
    return summ
};
dhtmlXGridObject.prototype.forEachRowInGroup = function (name, code) {
    var row = this._groups[name].row.nextSibling;
    if (row) {
        while (row && !row._cntr) {
            code.call(this, row.idd);
            row = row.nextSibling
        }
    } else {
        var cs = this._groups[name]._childs;
        if (cs) for (var i = 0; i < cs.length; i++) code.call(this, cs[i].idd)
    }
};
dhtmlXGridObject.prototype.updateGroups = function () {
    if (!this._gmask || !this._gmask._math || this._parsing) return;
    var r = this._gmask.childNodes;
    for (var i = 0; i < r.length; i++) if (r[i]._counter) this._b_processing.apply(this, r[i]._counter)
};
dhtmlXGridObject.prototype._b_processing = function (a, ind, rind) {
    var c = 0,
        j = 0;
    if (!this._ecache[this.cellType[ind]]) this.cells5({
        parentNode: {
            grid: this
        }
    }, this.cellType[ind]);
    for (var i = this.rowsCol.length - 1; i >= 0; i--) {
        if (!this.rowsCol[i]._cntr) {
            c = a(c, this.cells3(this.rowsCol[i], ind).getValue() * 1, j);
            j++
        } else {
            this.cells5(this.rowsCol[i].childNodes[rind], this.cellType[ind]).setValue(c);
            j = c = 0
        }
    }
};
dhtmlXGridObject.prototype._g_stat_total = function (c, n, i) {
    return c + n
};
dhtmlXGridObject.prototype._g_stat_min = function (c, n, i) {
    if (!i) c = Infinity;
    return Math.min(c, n)
};
dhtmlXGridObject.prototype._g_stat_max = function (c, n, i) {
    if (!i) c = -Infinity;
    return Math.max(c, n)
};
dhtmlXGridObject.prototype._g_stat_average = function (c, n, i) {
    return (c * i + n) / (i + 1)
};
dhtmlXGridObject.prototype._g_stat_count = function (c, n, i) {
    return c++
};
dhtmlXGridObject.prototype.enableDragAndDrop = function (mode) {
    if (mode == "temporary_disabled") {
        this.dADTempOff = false;
        mode = true
    } else this.dADTempOff = true;
    this.dragAndDropOff = convertStringToBoolean(mode);
    this._drag_validate = true
};
dhtmlXGridObject.prototype.setDragBehavior = function (mode) {
    this.dadmodec = this.dadmodefix = 0;
    switch (mode) {
    case "child":
        this.dadmode = 0;
        this._sbmod = false;
        break;
    case "sibling":
        this.dadmode = 1;
        this._sbmod = false;
        break;
    case "sibling-next":
        this.dadmode = 1;
        this._sbmod = true;
        break;
    case "complex":
        this.dadmode = 2;
        this._sbmod = false;
        break;
    case "complex-next":
        this.dadmode = 2;
        this._sbmod = true;
        break
    }
};
dhtmlXGridObject.prototype.enableDragOrder = function (mode) {
    this._dndorder = convertStringToBoolean(mode)
};
dhtmlXGridObject.prototype._checkParent = function (row, ids) {
    var z = this._h2.get[row.idd].parent;
    if (!z.parent) return;
    for (var i = 0; i < ids.length; i++) if (ids[i] == z.id) return true;
    return this._checkParent(this.rowsAr[z.id], ids)
};
dhtmlXGridObject.prototype._createDragNode = function (htmlObject, e) {
    this.editSt
