if (typeof Tc == 'undefined') Tc = function () {};
if (typeof Tc.techlibPath == 'undefined') {
    Tc.techlibPath = function () {
        if (document.documentElement) {
            var aTokens = document.documentElement.innerHTML.match(/<script[^>]+src="([^"]*techlib(-core|-src)?.js[^"]*)"/i);
            if (aTokens && aTokens.length >= 2) {
                aTokens = aTokens[1].split('?');
                aTokens = aTokens[0].split('/');
                if (Array.prototype.pop) aTokens.pop();
                else aTokens.length -= 1;
                return aTokens.length ? aTokens.join('/') + '/' : ''
            }
        }
        return ''
    }
}
Tc.Rn = {};
Tc.Rn.getAbsolutePos = function (el, scrollOff) {
    var SL = 0,
        ST = 0;
    if (!scrollOff) {
        var is_div = /^div$/i.test(el.tagName);
        if (is_div && el.scrollLeft) SL = el.scrollLeft;
        if (is_div && el.scrollTop) ST = el.scrollTop
    }
    var r = {
        x: el.offsetLeft - SL,
        y: el.offsetTop - ST
    };
    if (el.offsetParent) {
        var tmp = this.getAbsolutePos(el.offsetParent);
        r.x += tmp.x;
        r.y += tmp.y
    }
    return r
};
Tc.Rn.getElementOffset = function (oEl) {
    var iLeft = iTop = iWidth = iHeight = 0;
    var sTag;
    if (oEl.getBoundingClientRect) {
        var oRect = oEl.getBoundingClientRect();
        iLeft = oRect.left;
        iTop = oRect.top;
        iWidth = oRect.right - iLeft;
        iHeight = oRect.bottom - iTop;
        iLeft += Tc.Rn.getPageScrollX() - 2;
        iTop += Tc.Rn.getPageScrollY() - 2
    } else {
        iWidth = oEl.offsetWidth;
        iHeight = oEl.offsetHeight;
        var sPos = Tc.Rn.getStyleProperty(oEl, 'position');
        if (sPos == 'fixed') {
            iLeft = oEl.offsetLeft + Tc.Rn.getPageScrollX();
            iTop = oEl.offsetTop + Tc.Rn.getPageScrollY()
        } else if (sPos == 'absolute') {
            while (oEl) {
                sTag = oEl.tagName;
                if (sTag) {
                    sTag = sTag.toLowerCase();
                    if (sTag != 'body' && sTag != 'html') {
                        iLeft += parseInt(oEl.offsetLeft, 10) || 0;
                        iTop += parseInt(oEl.offsetTop, 10) || 0
                    }
                }
                oEl = oEl.offsetParent;
                sTag = oEl ? oEl.tagName : null;
                if (sTag) {
                    sTag = sTag.toLowerCase();
                    if (sTag != 'body' && sTag != 'html') iLeft -= oEl.scrollLeft;
                    iTop -= oEl.scrollTop
                }
            }
        } else {
            var bMoz = (Tc.is_gecko && !Tc.is_khtml);
            var fStyle = Tc.Rn.getStyleProperty;
            var oP = oEl;
            while (oP) {
                if (bMoz) {
                    sTag = oP.tagName;
                    if (sTag) {
                        sTag = sTag.toLowerCase();
                        if (sTag == 'body' && !(fStyle(oP, '-moz-box-sizing') == 'border-box')) {
                            iLeft += parseInt(fStyle(oP, 'border-left-width'));
                            iTop += parseInt(fStyle(oP, 'border-top-width'))
                        }
                    }
                }
                iLeft += parseInt(oP.offsetLeft, 10) || 0;
                iTop += parseInt(oP.offsetTop, 10) || 0;
                oP = oP.offsetParent
            }
            oP = oEl;
            while (oP.parentNode) {
                oP = oP.parentNode;
                sTag = oP.tagName;
                if (sTag) {
                    sTag = sTag.toLowerCase();
                    if (sTag != 'body' && sTag != 'html' && sTag != 'tr') {
                        iLeft -= oP.scrollLeft;
                        iTop -= oP.scrollTop
                    }
                }
            }
        }
    }
    return {
        left: iLeft,
        top: iTop,
        x: iLeft,
        y: iTop,
        width: iWidth,
        height: iHeight
    }
};
Tc.Rn.getElementOffsetScrollable = function (oEl) {
    var oPos = Tc.Rn.getElementOffset(oEl);
    if (oEl.scrollLeft) {
        oPos.left -= oEl.scrollLeft;
        oPos.x = oPos.left
    }
    if (oEl.scrollTop) {
        oPos.top -= oEl.scrollTop;
        oPos.y = oPos.top
    }
    return oPos
};
Tc.Rn.fixBoxPosition = function (box, leave) {
    var screenX = Tc.Rn.getPageScrollX();
    var screenY = Tc.Rn.getPageScrollY();
    var sizes = Tc.Rn.getWindowSize();
    leave = parseInt(leave, 10) || 0;
    if (box.x < screenX) {
        box.x = screenX + leave
    }
    if (box.y < screenY) {
        box.y = screenY + leave
    }
    if (box.x + box.width > screenX + sizes.width) {
        box.x = screenX + sizes.width - box.width - leave
    }
    if (box.y + box.height > screenY + sizes.height) {
        box.y = screenY + sizes.height - box.height - leave
    }
};
Tc.Rn.isRelated = function (el, evt) {
    evt || (evt = window.event);
    var related = evt.relatedTarget;
    if (!related) {
        var type = evt.type;
        if (type == "mouseover") {
            related = evt.fromElement
        } else if (type == "mouseout") {
            related = evt.toElement
        }
    }
    try {
        while (related) {
            if (related == el) {
                return true
            }
            related = related.parentNode
        }
    } catch (e) {};
    return false
};
Tc.Rn.removeClass = function (el, className) {
    if (!(el && el.className)) {
        return
    }
    var cls = el.className.split(" ");
    var ar = [];
    for (var i = cls.length; i > 0;) {
        if (cls[--i] != className) {
            ar[ar.length] = cls[i]
        }
    }
    el.className = ar.join(" ")
};
Tc.Rn.addClass = function (el, className) {
    Tc.Rn.removeClass(el, className);
    el.className += " " + className
};
Tc.Rn.replaceClass = function (el, className, withClassName) {
    if (!Tc.isHtmlElement(el) || !className) {
        return false
    }
    el.className.replace(className, withClassName)
};
Tc.Rn.getElement = function (ev) {
    if (Tc.is_ie) {
        return window.event.srcElement
    } else {
        return ev.currentTarget
    }
};
Tc.Rn.getTargetElement = function (ev) {
    if (Tc.is_ie) {
        return window.event.srcElement
    } else {
        return ev.target
    }
};
Tc.Rn.getMousePos = function (oEv) {
    oEv || (oEv = window.event);
    var oPos = {
        pageX: 0,
        pageY: 0,
        clientX: 0,
        clientY: 0
    };
    if (oEv) {
        var bIsPageX = (typeof oEv.pageX != 'undefined');
        var bIsClientX = (typeof oEv.clientX != 'undefined');
        if (bIsPageX || bIsClientX) {
            if (bIsPageX) {
                oPos.pageX = oEv.pageX;
                oPos.pageY = oEv.pageY
            } else {
                oPos.pageX = oEv.clientX + Tc.Rn.getPageScrollX();
                oPos.pageY = oEv.clientY + Tc.Rn.getPageScrollY()
            }
            if (bIsClientX) {
                oPos.clientX = oEv.clientX;
                oPos.clientY = oEv.clientY
            } else {
                oPos.clientX = oEv.pageX - Tc.Rn.getPageScrollX();
                oPos.clientY = oEv.pageY - Tc.Rn.getPageScrollY()
            }
        }
    }
    return oPos
};
Tc.Rn.stopEvent = function (ev) {
    ev || (ev = window.event);
    if (ev) {
        if (Tc.is_ie) {
            ev.cancelBubble = true;
            ev.returnValue = false
        } else {
            ev.preventDefault();
            ev.stopPropagation()
        }
    }
    return false
};
Tc.Rn.removeOnUnload = [];
Tc.Rn.addEvent = function (oElement, sEvent, fListener, bUseCapture) {
    if (oElement.addEventListener) {
        if (!bUseCapture) {
            bUseCapture = false
        }
        oElement.addEventListener(sEvent, fListener, bUseCapture)
    } else if (oElement.attachEvent) {
        oElement.detachEvent('on' + sEvent, fListener);
        oElement.attachEvent('on' + sEvent, fListener);
        if (bUseCapture) {
            oElement.setCapture(false)
        }
    }
    Tc.Rn.removeOnUnload.push({
        'element': oElement,
        'event': sEvent,
        'listener': fListener,
        'capture': bUseCapture
    })
};
Tc.Rn.removeEvent = function (oElement, sEvent, fListener, bUseCapture) {
    if (oElement.removeEventListener) {
        oElement.removeEventListener(sEvent, fListener, bUseCapture)
    } else if (oElement.detachEvent) {
        oElement.detachEvent('on' + sEvent, fListener)
    }
    for (var iLis = Tc.Rn.removeOnUnload.length - 1; iLis >= 0; iLis--) {
        var oParams = Tc.Rn.removeOnUnload[iLis];
        if (!oParams) {
            continue
        }
        if (oElement == oParams['element'] && sEvent == oParams['event'] && fListener == oParams['listener'] && bUseCapture == oParams['capture']) {
            Tc.Rn.removeOnUnload[iLis] = null;
            Tc.Rn.removeEvent(oParams['element'], oParams['event'], oParams['listener'], oParams['capture'])
        }
    }
};
Tc.Rn.createElement = function (type, parent, selectable) {
    var el = null;
    if (document.createElementNS) el = document.createElementNS("http://www.w3.org/1999/xhtml", type);
    else el = document.createElement(type);
    if (typeof parent != "undefined" && parent != null) parent.appendChild(el);
    if (!selectable) {
        if (Tc.is_ie) el.setAttribute("unselectable", true);
        if (Tc.is_gecko) el.style.setProperty("-moz-user-select", "none", "")
    }
    return el
};
Tc.Rn.writeCookie = function (name, value, domain, path, exp_days) {
    value = escape(value);
    var ck = name + "=" + value,
        exp;
    if (domain) ck += ";domain=" + domain;
    if (path) ck += ";path=" + path;
    if (exp_days) {
        exp = new Date();
        exp.setTime(exp_days * 86400000 + exp.getTime());
        ck += ";expires=" + exp.toGMTString()
    }
    document.cookie = ck
};
Tc.Rn.getCookie = function (name) {
    var pattern = name + "=";
    var tokenPos = 0;
    while (tokenPos < document.cookie.length) {
        var valuePos = tokenPos + pattern.length;
        if (document.cookie.substring(tokenPos, valuePos) == pattern) {
            var endValuePos = document.cookie.indexOf(";", valuePos);
            if (endValuePos == -1) {
                endValuePos = document.cookie.length
            }
            return unescape(document.cookie.substring(valuePos, endValuePos))
        }
        tokenPos = document.cookie.indexOf(" ", tokenPos) + 1;
        if (tokenPos == 0) {
            break
        }
    }
    return null
};
Tc.Rn.makePref = function (obj) {
    function stringify(val) {
        if (typeof val == "object" && !val) return "null";
        else if (typeof val == "number" || typeof val == "boolean") return val;
        else if (typeof val == "string") return '"' + val.replace(/\x22/, "\\22") + '"';
        else return null
    };
    var txt = "",
        i;
    for (i in obj) txt += (txt ? ",'" : "'") + i + "':" + stringify(obj[i]);
    return txt
};
Tc.Rn.loadPref = function (txt) {
    var obj = null;
    try {
        eval("obj={" + txt + "}")
    } catch (e) {}
    return obj
};
Tc.Rn.mergeObjects = function (dest, src) {
    for (var i in src) dest[i] = src[i]
};
Tc.Rn.__wch_id = 0;
Tc.Rn.createWCH = function (oEl) {
    if (!Tc.is_ie || Tc.is_ie5 || Tc.is_ie7) {
        return null
    }
    var sId = 'WCH' + (++Tc.Rn.__wch_id);
    var sIframe = ['<iframe id="', sId, '" scrolling="no" frameborder="0" style="z-index:0;position:absolute;visibility:hidden;filter:progid:DXImageTransform.Microsoft.alpha(style=0,opacity=0);border:0;top:0;left:0;width:0;height:0" src="javascript:false"></iframe>'].join('');
    if (!oEl) {
        oEl = document.body
    }
    if (Tc.windowLoaded) {
        oEl.insertAdjacentHTML('beforeEnd', sIframe)
    } else {
        Tc.Rn.addEvent(window, 'load', function () {
            oEl.insertAdjacentHTML('beforeEnd', sIframe);
            oEl = null
        })
    }
    return document.getElementById(sId)
};
Tc.Rn.setupWCH_el = function (f, el, el2) {
    if (f) {
        var pos = Tc.Rn.getAbsolutePos(el),
            X1 = pos.x,
            Y1 = pos.y,
            X2 = X1 + el.offsetWidth,
            Y2 = Y1 + el.offsetHeight;
        if (el2) {
            var p2 = Tc.Rn.getAbsolutePos(el2),
                XX1 = p2.x,
                YY1 = p2.y,
                XX2 = XX1 + el2.offsetWidth,
                YY2 = YY1 + el2.offsetHeight;
            if (X1 > XX1) X1 = XX1;
            if (Y1 > YY1) Y1 = YY1;
            if (X2 < XX2) X2 = XX2;
            if (Y2 < YY2) Y2 = YY2
        }
        Tc.Rn.setupWCH(f, X1, Y1, X2 - X1, Y2 - Y1)
    }
};
Tc.Rn.setupWCH = function (f, x, y, w, h) {
    if (f) {
        var s = f.style;
        (typeof x != "undefined") && (s.left = x + "px");
        (typeof y != "undefined") && (s.top = y + "px");
        (typeof w != "undefined") && (s.width = w + "px");
        (typeof h != "undefined") && (s.height = h + "px");
        s.visibility = "inherit"
    }
};
Tc.Rn.hideWCH = function (f) {
    if (f) f.style.visibility = "hidden"
};
Tc.Rn.getPageScrollY = function () {
    if (window.pageYOffset) {
        return window.pageYOffset
    } else if (document.body && document.body.scrollTop) {
        return document.body.scrollTop
    } else if (document.documentElement && document.documentElement.scrollTop) {
        return document.documentElement.scrollTop
    }
    return 0
};
Tc.Rn.getPageScrollX = function () {
    if (window.pageXOffset) {
        return window.pageXOffset
    } else if (document.body && document.body.scrollLeft) {
        return document.body.scrollLeft
    } else if (document.documentElement && document.documentElement.scrollLeft) {
        return document.documentElement.scrollLeft
    }
    return 0
};
Tc.ScrollWithWindow = {};
Tc.ScrollWithWindow.list = [];
Tc.ScrollWithWindow.stickiness = 0.25;
Tc.Rn.destroy = function (el) {
    if (el && el.parentNode) el.parentNode.removeChild(el)
};
Tc.Rn.newCenteredWindow = function (url, windowName, width, height, scrollbars) {
    var leftPosition = 0;
    var topPosition = 0;
    if (screen.width) leftPosition = (screen.width - width) / 2;
    if (screen.height) topPosition = (screen.height - height) / 2;
    var winArgs = 'height=' + height + ',width=' + width + ',top=' + topPosition + ',left=' + leftPosition + ',scrollbars=' + scrollbars + ',resizable';
    var win = window.open(url, windowName, winArgs);
    return win
};
Tc.Rn.getWindowSize = function () {
    var iWidth = 0;
    var iHeight = 0;
    if (Tc.is_opera) {
        iWidth = document.body.clientWidth || 0;
        iHeight = document.body.clientHeight || 0
    } else if (Tc.is_khtml) {
        iWidth = window.innerWidth || 0;
        iHeight = window.innerHeight || 0
    } else if (document.compatMode && document.compatMode == 'CSS1Compat') {
        iWidth = document.documentElement.clientWidth || 0;
        iHeight = document.documentElement.clientHeight || 0
    } else {
        iWidth = document.body.clientWidth || 0;
        iHeight = document.body.clientHeight || 0
    }
    return {
        width: iWidth,
        height: iHeight
    }
};
Tc.Rn.selectOption = function (sel, val, call_default) {
    var a = sel.options,
        i, o;
    for (i = a.length; --i >= 0;) {
        o = a[i];
        o.selected = (o.value == val)
    }
    sel.value = val;
    if (call_default) {
        if (typeof sel.onchange == "function") sel.onchange();
        else if (typeof sel.onchange == "string") eval(sel.onchange)
    }
};
Tc.Rn.getNextSibling = function (el, tag, alternateTag) {
    el = el.nextSibling;
    if (!tag) {
        return el
    }
    tag = tag.toLowerCase();
    if (alternateTag) alternateTag = alternateTag.toLowerCase();
    while (el) {
        if (el.nodeType == 1 && (el.tagName.toLowerCase() == tag || (alternateTag && el.tagName.toLowerCase() == alternateTag))) {
            return el
        }
        el = el.nextSibling
    }
    return el
};
Tc.Rn.getPreviousSibling = function (el, tag, alternateTag) {
    el = el.previousSibling;
    if (!tag) {
        return el
    }
    tag = tag.toLowerCase();
    if (alternateTag) alternateTag = alternateTag.toLowerCase();
    while (el) {
        if (el.nodeType == 1 && (el.tagName.toLowerCase() == tag || (alternateTag && el.tagName.toLowerCase() == alternateTag))) {
            return el
        }
        el = el.previousSibling
    }
    return el
};
Tc.Rn.getFirstChild = function (el, tag, alternateTag) {
    if (!el) {
        return null
    }
    el = el.firstChild;
    if (!el) {
        return null
    }
    if (!tag) {
        return el
    }
    tag = tag.toLowerCase();
    if (el.nodeType == 1) {
        if (el.tagName.toLowerCase() == tag) {
            return el
        } else if (alternateTag) {
            alternateTag = alternateTag.toLowerCase();
            if (el.tagName.toLowerCase() == alternateTag) {
                return el
            }
        }
    }
    return Tc.Rn.getNextSibling(el, tag, alternateTag)
};
Tc.Rn.getLastChild = function (el, tag, alternateTag) {
    if (!el) {
        return null
    }
    el = el.lastChild;
    if (!el) {
        return null
    }
    if (!tag) {
        return el
    }
    tag = tag.toLowerCase();
    if (el.nodeType == 1) {
        if (el.tagName.toLowerCase() == tag) {
            return el
        } else if (alternateTag) {
            alternateTag = alternateTag.toLowerCase();
            if (el.tagName.toLowerCase() == alternateTag) {
                return el
            }
        }
    }
    return Tc.Rn.getPreviousSibling(el, tag, alternateTag)
};
Tc.Rn.getChildText = function (objNode) {
    if (objNode == null) {
        return ''
    }
    var arrText = [];
    var objChild = objNode.firstChild;
    while (objChild != null) {
        if (objChild.nodeType == 3) {
            arrText.push(objChild.data)
        }
        objChild = objChild.nextSibling
    }
    return arrText.join(' ')
};
Tc.Rn.insertAfter = function (oldNode, newNode) {
    if (oldNode.nextSibling) {
        oldNode.parentNode.insertBefore(newNode, oldNode.nextSibling)
    } else {
        oldNode.parentNode.appendChild(newNode)
    }
};
Tc.Rn._ids = {};
Tc.Rn.generateID = function (code, id) {
    if (typeof id == "undefined") {
        if (typeof this._ids[code] == "undefined") this._ids[code] = 0;
        id = ++this._ids[code]
    }
    return "techlib-" + code + "-" + id
};
Tc.Rn.clone = function (oSrc) {
    if (typeof oSrc == 'object' && oSrc) {
        var oClone = new oSrc.constructor();
        var fClone = Tc.Rn.clone;
        for (var sProp in oSrc) {
            oClone[sProp] = fClone(oSrc[sProp])
        }
        return oClone
    }
    return oSrc
};
Tc.is_opera = /opera/i.test(navigator.userAgent);
Tc.is_ie = (/msie/i.test(navigator.userAgent) && !Tc.is_opera);
Tc.is_ie5 = (Tc.is_ie && /msie 5\.0/i.test(navigator.userAgent));
Tc.is_ie7 = (Tc.is_ie && /msie 7\.0/i.test(navigator.userAgent));
Tc.is_mac_ie = (/msie.*mac/i.test(navigator.userAgent) && !Tc.is_opera);
Tc.is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent);
Tc.is_konqueror = /Konqueror/i.test(navigator.userAgent);
Tc.is_gecko = /Gecko/i.test(navigator.userAgent);
Tc.is_webkit = /WebKit/i.test(navigator.userAgent);
Tc.webkitVersion = Tc.is_webkit ? parseInt(navigator.userAgent.replace(/.+WebKit\/([0-9]+)\..+/, "$1")) : -1;
if (!Object.prototype.hasOwnProperty) {
    Object.prototype.hasOwnProperty = function (strProperty) {
        try {
            var objPrototype = this.constructor.prototype;
            while (objPrototype) {
                if (objPrototype[strProperty] == this[strProperty]) {
                    return false
                }
                objPrototype = objPrototype.prototype
            }
        } catch (objException) {}
        return true
    }
}
if (!Function.prototype.call) {
    Function.prototype.call = function () {
        var objThis = arguments[0];
        objThis._this_func = this;
        var arrArgs = [];
        for (var iArg = 1; iArg < arguments.length; iArg++) {
            arrArgs[arrArgs.length] = 'arguments[' + iArg + ']'
        }
        var ret = eval('objThis._this_func(' + arrArgs.join(',') + ')');
        objThis._this_func = null;
        return ret
    }
}
if (!Function.prototype.apply) {
    Function.prototype.apply = function () {
        var objThis = arguments[0];
        var objArgs = arguments[1];
        objThis._this_func = this;
        var arrArgs = [];
        if (objArgs) {
            for (var iArg = 0; iArg < objArgs.length; iArg++) {
                arrArgs[arrArgs.length] = 'objArgs[' + iArg + ']'
            }
        }
        var ret = eval('objThis._this_func(' + arrArgs.join(',') + ')');
        objThis._this_func = null;
        return ret
    }
}
if (!Array.prototype.pop) {
    Array.prototype.pop = function () {
        var last;
        if (this.length) {
            last = this[this.length - 1];
            this.length -= 1
        }
        return last
    }
}
if (!Array.prototype.push) {
    Array.prototype.push = function () {
        for (var i = 0; i < arguments.length; i++) {
            this[this.length] = arguments[i]
        }
        return this.length
    }
}
if (!Array.prototype.shift) {
    Array.prototype.shift = function () {
        var first;
        if (this.length) {
            first = this[0];
            for (var i = 0; i < this.length - 1; i++) {
                this[i] = this[i + 1]
            }
            this.length -= 1
        }
        return first
    }
}
if (!Array.prototype.unshift) {
    Array.prototype.unshift = function () {
        if (arguments.length) {
            var i, len = arguments.length;
            for (i = this.length + len - 1; i >= len; i--) {
                this[i] = this[i - len]
            }
            for (i = 0; i < len; i++) {
                this[i] = arguments[i]
            }
        }
        return this.length
    }
}
if (!Array.prototype.splice) {
    Array.prototype.splice = function (index, howMany) {
        var elements = [],
            removed = [],
            i;
        for (i = 2; i < arguments.length; i++) {
            elements.push(arguments[i])
        }
        for (i = index;
        (i < index + howMany) && (i < this.length); i++) {
            removed.push(this[i])
        }
        for (i = index + howMany; i < this.length; i++) {
            this[i - howMany] = this[i]
        }
        this.length -= removed.length;
        for (i = this.length + elements.length - 1; i >= index + elements.length; i--) {
            this[i] = this[i - elements.length]
        }
        for (i = 0; i < elements.length; i++) {
            this[index + i] = elements[i]
        }
        return removed
    }
}
Tc.Rn.arrIndexOf = function (aArr, vSearchEl, iFromInd) {
    if (!(aArr instanceof Array)) {
        return -1
    }
    if (Array.prototype.indexOf) {
        return aArr.indexOf(vSearchEl, iFromInd)
    }
    if (!iFromInd) {
        iFromInd = 0
    }
    var iEls = aArr.length;
    for (var iEl = iFromInd; iEl < iEls; iEl++) {
        if (aArr[iEl] == vSearchEl) {
            return iEl
        }
    }
    return -1
};
Tc.inherit = function (oSubClass, oSuperClass, oArg) {
    var Inheritance = function () {};
    Inheritance.prototype = oSuperClass.prototype;
    oSubClass.prototype = new Inheritance();
    oSubClass.prototype.constructor = oSubClass;
    oSubClass.SUPERconstructor = oSuperClass;
    oSubClass.SUPERclass = oSuperClass.prototype;
    if (typeof oSuperClass.path != 'undefined') {
        if (oArg && oArg.keepPath) {
            oSubClass.path = oSuperClass.path
        } else {
            oSubClass.path = Tc.getPath(oSubClass.id)
        }
    }
};
Tc.getPath = function (sId) {
    var sSrc;
    if (typeof sId == 'string') {
        var oScript = document.getElementById(sId);
        if (oScript) {
            sSrc = oScript.getAttribute('src')
        }
    }
    if (!sSrc) {
        if (typeof Tc.lastLoadedModule == 'string') {
            return Tc.lastLoadedModule
        }
        if (document.documentElement) {
            var sHtml = document.documentElement.innerHTML;
            var aMatch = sHtml.match(/<script[^>]+src=[^>]+>/gi);
            if (aMatch && aMatch.length) {
                sHtml = aMatch[aMatch.length - 1];
                aMatch = sHtml.match(/src="([^"]+)/i);
                if (aMatch && aMatch.length == 2) {
                    sSrc = aMatch[1]
                }
            }
        }
        if (!sSrc) {
            return ''
        }
    }
    sSrc = sSrc.replace(/\\/g, '/');
    var aTokens = sSrc.split('?');
    aTokens = aTokens[0].split('/');
    aTokens = aTokens.slice(0, -1);
    if (!aTokens.length) {
        return ''
    }
    return aTokens.join('/') + '/'
};
Tc.Rn.addEvent(window, "load", function () {
    Tc.windowLoaded = true
});
Tc.Rn.destroyOnUnload = [];
Tc.Rn.addDestroyOnUnload = function (objElement, strProperty) {
    Tc.Rn.destroyOnUnload.push([objElement, strProperty])
};
Tc.Rn.createProperty = function (objElement, strProperty, val) {
    objElement[strProperty] = val;
    Tc.Rn.addDestroyOnUnload(objElement, strProperty)
};
Tc.Rn.addEvent(window, 'unload', function () {
    for (var iObj = Tc.Rn.destroyOnUnload.length - 1; iObj >= 0; iObj--) {
        var objDestroy = Tc.Rn.destroyOnUnload[iObj];
        objDestroy[0][objDestroy[1]] = null;
        objDestroy[0] = null
    }
    for (var iLis = Tc.Rn.removeOnUnload.length - 1; iLis >= 0; iLis--) {
        var oParams = Tc.Rn.removeOnUnload[iLis];
        if (!oParams) {
            continue
        }
        Tc.Rn.removeOnUnload[iLis] = null;
        Tc.Rn.removeEvent(oParams['element'], oParams['event'], oParams['listener'], oParams['capture'])
    }
});
Tc.Rn.htmlEncode = function (str) {
    str = str.replace(/&/ig, "&amp;");
    str = str.replace(/</ig, "&lt;");
    str = str.replace(/>/ig, "&gt;");
    str = str.replace(/\x22/ig, "&quot;");
    return str
};
Tc.Rn.applyStyle = function (elRef, style) {
    if (typeof(elRef) == 'string') {
        elRef = document.getElementById(elRef)
    }
    if (elRef == null || style == null || elRef.style == null) {
        return null
    }
    if (Tc.is_opera) {
        var pairs = style.split(";");
        for (var ii = 0; ii < pairs.length; ii++) {
            var kv = pairs[ii].split(":");
            if (!kv[1]) {
                continue
            }
            var value = kv[1].replace(/^\s*/, '').replace(/\s*$/, '');
            var key = "";
            for (var jj = 0; jj < kv[0].length; jj++) {
                if (kv[0].charAt(jj) == "-") {
                    jj++;
                    if (jj < kv[0].length) {
                        key += kv[0].charAt(jj).toUpperCase()
                    }
                    continue
                }
                key += kv[0].charAt(jj)
            }
            switch (key) {
            case "float":
                key = "cssFloat";
                break
            }
            try {
                elRef.style[key] = value
            } catch (e) {}
        }
    } else {
        elRef.style.cssText = style
    }
    return true
};
Tc.Rn.getStyleProperty = function (oEl, sPr) {
    var oDV = document.defaultView;
    if (oDV && oDV.getComputedStyle) {
        var oCS = oDV.getComputedStyle(oEl, '');
        if (oCS) {
            sPr = sPr.replace(/([A-Z])/g, '-$1').toLowerCase();
            return oCS.getPropertyValue(sPr)
        }
    } else if (oEl.currentStyle) {
        return oEl.currentStyle[sPr]
    }
    return oEl.style[sPr]
};
Tc.Rn.getPrecision = function (dFloat) {
    return (dFloat + '').replace(/^-?\d*\.*/, '').length
};
Tc.Rn.setPrecision = function (dFloat, iPrecision) {
    dFloat *= 1;
    if (dFloat.toFixed) {
        return dFloat.toFixed(iPrecision) * 1
    }
    var iPow = Math.pow(10, iPrecision);
    return parseInt(dFloat * iPow, 10) / iPow
};
Tc.Rn.setPrecisionString = function (dFloat, iPrecision) {
    var sFloat = Tc.Rn.setPrecision(dFloat, iPrecision) + '';
    var iOldPrecision = Tc.Rn.getPrecision(sFloat);
    var iZeros = iPrecision - iOldPrecision;
    if (iZeros) {
        if (!iOldPrecision) {
            sFloat += '.'
        }
        for (var iZero = 0; iZero < iZeros; iZero++) {
            sFloat += '0'
        }
    }
    return sFloat
};
Tc.implement = function (classOrObject, interfaceStr) {
    if (typeof interfaceStr != "string") {
        return false
    }
    if (typeof classOrObject == "function") {
        classOrObject = classOrObject.prototype
    }
    if (!classOrObject || typeof classOrObject != "object") {
        return false
    }
    var interfaceObj = window;
    var objs = interfaceStr.split(".");
    try {
        for (var i = 0; i < objs.length; ++i) {
            interfaceObj = interfaceObj[objs[i]]
        }
    } catch (e) {
        return false
    }
    if (typeof classOrObject.interfaces != "object") {
        classOrObject.interfaces = {};
        classOrObject.interfaces[interfaceStr] = true
    } else if (classOrObject.interfaces[interfaceStr] !== true) {
        classOrObject.interfaces = Tc.Rn.clone(classOrObject.interfaces);
        classOrObject.interfaces[interfaceStr] = true
    } else {
        return true
    }
    for (var iProp in interfaceObj) {
        classOrObject[iProp] = interfaceObj[iProp]
    }
    classOrObject.hasInterface = function (interfaceStr) {
        if (this.interfaces[interfaceStr] === true) {
            return true
        }
        return false
    };
    classOrObject.requireInterface = function (interfaceStr) {
        if (!this.hasInterface(interfaceStr)) {
            Tc.Log({
                description: "The object with ID '" + this.id + "' has no " + interfaceStr + " interface!"
            });
            return false
        }
        return true
    };
    interfaceObj.setNamedProperty = classOrObject.setNamedProperty = function (name, val) {
        this[name] = val
    };
    interfaceObj.getNamedProperty = classOrObject.getNamedProperty = function (name) {
        return this[name]
    };
    return true
};
Tc.Rn.getCharFromEvent = function (evt) {
    if (!evt) {
        evt = window.event
    }
    var response = {};
    if (Tc.is_gecko && !Tc.is_khtml && evt.type != "keydown" && evt.type != "keyup") {
        if (evt.charCode) {
            response.chr = String.fromCharCode(evt.charCode)
        } else {
            response.charCode = evt.keyCode
        }
    } else {
        response.charCode = evt.keyCode || evt.which;
        response.chr = String.fromCharCode(response.charCode)
    }
    if (Tc.is_opera && response.charCode == 0) {
        response.charCode = null;
        response.chr = null
    }
    if (Tc.is_khtml && response.charCode == 63272) {
        response.charCode = 46;
        response.chr = null
    }
    return response
};
Tc.EventDriven = function () {};
Tc.wdg = function (oArg) {
    this.config = {};
    Tc.wdg.SUPERconstructor.call(this);
    this.init(oArg)
};
Tc.inherit(Tc.wdg, Tc.EventDriven);
Tc.wdg.path = Tc.getPath('Tc.wdg');
Tc.wdg.all = [];
Tc.DatePicker = function (firstDayOfWeek, dateStr, onSelected, onClose) {
    if (typeof this.id == 'undefined') {
        var iId = 0;
        while (Tc.wdg.all[iId]) {
            iId++
        }
        this.id = iId;
        Tc.wdg.all[iId] = this
    }
    this.bShowHistoryEvent = false;
    this.activeDiv = null;
    this.currentDateEl = null;
    this.getDateStatus = null;
    this.getDateToolTip = null;
    this.getDateText = null;
    this.timeout = null;
    this.onSelected = onSelected || null;
    this.onClose = onClose || null;
    this.onFDOW = null;
    this.dragging = false;
    this.hidden = false;
    this.minYear = 1970;
    this.maxYear = 2050;
    this.minMonth = 0;
    this.maxMonth = 11;
    this.dateFormat = Tc.DatePicker.i18n("DEF_DATE_FORMAT");
    this.ttDateFormat = Tc.DatePicker.i18n("TT_DATE_FORMAT");
    this.historyDateFormat = "%B %d, %Y";
    this.isPopup = true;
    this.weekNumbers = true;
    this.noGrab = false;
    if (Tc.DatePicker.prefs.fdow || (Tc.DatePicker.prefs.fdow == 0)) {
        this.firstDayOfWeek = parseInt(Tc.DatePicker.prefs.fdow, 10)
    } else {
        var fd = 0;
        if (typeof firstDayOfWeek == "number") {
            fd = firstDayOfWeek
        } else if (typeof Tc.DatePicker._FD == 'number') {
            fd = Tc.DatePicker._FD
        }
        this.firstDayOfWeek = fd
    }
    this.showsOtherMonths = false;
    this.dateStr = dateStr;
    this.showsTime = false;
    this.sortOrder = "asc";
    this.time24 = true;
    this.timeInterval = null;
    this.yearStep = 2;
    this.hiliteToday = true;
    this.multiple = null;
    this.table = null;
    this.element = null;
    this.tbody = new Array();
    this.firstdayname = null;
    this.monthsCombo = null;
    this.hilitedMonth = null;
    this.activeMonth = null;
    this.yearsCombo = null;
    this.hilitedYear = null;
    this.activeYear = null;
    this.histCombo = null;
    this.hilitedHist = null;
    this.dateClicked = false;
    this.numberMonths = 1;
    this.controlMonth = 1;
    this.vertical = false;
    this.monthsInRow = 1;
    this.titles = new Array();
    this.rowsOfDayNames = new Array();
    this.helpButton = true;
    this.disableFdowClick = true;
    this.disableDrag = false;
    this.yearNav = true;
    this.closeButton = true;
    Tc.DatePicker._initSDN()
};
Tc.DatePicker._initSDN = function () {
    if (typeof Tc.DatePicker._TT._SDN == "undefined") {
        if (typeof Tc.DatePicker._TT._SDN_len == "undefined") Tc.DatePicker._TT._SDN_len = 3;
        var ar = [];
        for (var i = 8; i > 0;) {
            ar[--i] = Tc.DatePicker._TT._DN[i].substr(0, Tc.DatePicker._TT._SDN_len)
        }
        Tc.DatePicker._TT._SDN = ar;
        if (typeof Tc.DatePicker._TT._SMN_len == "undefined") Tc.DatePicker._TT._SMN_len = 3;
        ar = [];
        for (var i = 12; i > 0;) {
            ar[--i] = Tc.DatePicker._TT._MN[i].substr(0, Tc.DatePicker._TT._SMN_len)
        }
        Tc.DatePicker._TT._SMN = ar
    }
    if (typeof Tc.DatePicker._TT._AMPM == "undefined") {
        Tc.DatePicker._TT._AMPM = {
            am: "am",
            pm: "pm"
        }
    }
};
Tc.DatePicker.i18n = function (str, type) {
    var tr = '';
    if (!type) {
        if (Tc.DatePicker._TT) tr = Tc.DatePicker._TT[str];
        if (!tr && Tc.DatePicker._TT_en) tr = Tc.DatePicker._TT_en[str]
    } else switch (type) {
    case "dn":
        tr = Tc.DatePicker._TT._DN[str];
        break;
    case "sdn":
        tr = Tc.DatePicker._TT._SDN[str];
        break;
    case "mn":
        tr = Tc.DatePicker._TT._MN[str];
        break;
    case "smn":
        tr = Tc.DatePicker._TT._SMN[str];
        break;
    case "ampm":
        tr = Tc.DatePicker._TT._AMPM[str];
        break
    }
    if (!tr) tr = "" + str;
    return tr
};
Tc.DatePicker._C = null;
Tc.DatePicker.prefs = {
    fdow: null,
    history: "",
    sortOrder: "asc",
    hsize: 9
};
Tc.DatePicker.savePrefs = function () {
    Tc.Rn.writeCookie("ZP_CAL", Tc.Rn.makePref(this.prefs), null, '/', 30)
};
Tc.DatePicker.loadPrefs = function () {
    var txt = Tc.Rn.getCookie("ZP_CAL"),
        tmp;
    if (txt) {
        tmp = Tc.Rn.loadPref(txt);
        if (tmp) Tc.Rn.mergeObjects(this.prefs, tmp)
    }
};
Tc.DatePicker._add_evs = function (el) {
    var C = Tc.DatePicker;
    el.onmouseover = C.dayMouseOver;
    el.onmousedown = C.dayMouseDown;
    el.onmouseout = C.dayMouseOut;
    if (Tc.is_ie) el.ondblclick = C.dayMouseDblClick
};
Tc.DatePicker._del_evs = function (el) {
    el.onmouseover = null;
    el.onmousedown = null;
    el.onmouseout = null;
    if (Tc.is_ie) el.ondblclick = null
};
Tc.DatePicker.findMonth = function (el) {
    if (typeof el.month != "undefined") {
        return el
    } else if (el.parentNode && typeof el.parentNode.month != "undefined") {
        return el.parentNode
    }
    return null
};
Tc.DatePicker.findHist = function (el) {
    if (typeof el.histDate != "undefined") {
        return el
    } else if (el.parentNode && typeof el.parentNode.histDate != "undefined") {
        return el.parentNode
    }
    return null
};
Tc.DatePicker.findYear = function (el) {
    if (typeof el.year != "undefined") {
        return el
    } else if (el.parentNode && typeof el.parentNode.year != "undefined") {
        return el.parentNode
    }
    return null
};
Tc.DatePicker.showMonthsCombo = function () {
    var cal = Tc.DatePicker._C;
    if (!cal) {
        return false
    }
    var cd = cal.activeDiv;
    var mc = cal.monthsCombo;
    var date = cal.date,
        MM = cal.date.getMonth(),
        YY = cal.date.getFullYear(),
        min = (YY == cal.minYear),
        max = (YY == cal.maxYear);
    for (var i = mc.firstChild; i; i = i.nextSibling) {
        var m = i.month;
        Tc.Rn.removeClass(i, "hilite");
        Tc.Rn.removeClass(i, "active");
        Tc.Rn.removeClass(i, "disabled");
        i.disabled = false;
        if ((min && m < cal.minMonth) || (max && m > cal.maxMonth)) {
            Tc.Rn.addClass(i, "disabled");
            i.disabled = true
        }
        if (m == MM) Tc.Rn.addClass(cal.activeMonth = i, "active")
    }
    var s = mc.style;
    s.display = "block";
    if (cd.navtype < 0) s.left = cd.offsetLeft + "px";
    else {
        var mcw = mc.offsetWidth;
        if (typeof mcw == "undefined") mcw = 50;
        s.left = (cd.offsetLeft + cd.offsetWidth - mcw) + "px"
    }
    s.top = (cd.offsetTop + cd.offsetHeight) + "px";
    cal.updateWCH(mc)
};
Tc.DatePicker.showHistoryCombo = function () {
    var cal = Tc.DatePicker._C,
        a, h, i, cd, hc, s, tmp, div;
    if (!cal) return false;
    hc = cal.histCombo;
    while (hc.firstChild) hc.removeChild(hc.lastChild);
    if (Tc.DatePicker.prefs.history) {
        a = Tc.DatePicker.prefs.history.split(/,/);
        i = 0;
        while (tmp = a[i++]) {
            tmp = tmp.split(/\//);
            h = Tc.Rn.createElement("div");
            h.className = Tc.is_ie ? "label-IEfix" : "label";
            h.id = "zpCal" + cal.id + "HistoryDropdownItem" + (i - 1);
            h.histDate = new Date(parseInt(tmp[0], 10), parseInt(tmp[1], 10) - 1, parseInt(tmp[2], 10), tmp[3] ? parseInt(tmp[3], 10) : 0, tmp[4] ? parseInt(tmp[4], 10) : 0);
            h.appendChild(window.document.createTextNode(h.histDate.print(cal.historyDateFormat)));
            hc.appendChild(h);
            if (h.histDate.dateEqualsTo(cal.date)) Tc.Rn.addClass(h, "active")
        }
    }
    cd = cal.activeDiv;
    s = hc.style;
    s.display = "block";
    s.left = Math.floor(cd.offsetLeft + (cd.offsetWidth - hc.offsetWidth) / 2) + "px";
    s.top = (cd.offsetTop + cd.offsetHeight) + "px";
    cal.updateWCH(hc);
    cal.bEventShowHistory = true
};
Tc.DatePicker.showYearsCombo = function (fwd) {
    var cal = Tc.DatePicker._C;
    if (!cal) {
        return false
    }
    var cd = cal.activeDiv;
    var yc = cal.yearsCombo;
    if (cal.hilitedYear) {
        Tc.Rn.removeClass(cal.hilitedYear, "hilite")
    }
    if (cal.activeYear) {
        Tc.Rn.removeClass(cal.activeYear, "active")
    }
    cal.activeYear = null;
    var Y = cal.date.getFullYear() + (fwd ? 1 : -1);
    var yr = yc.firstChild;
    var show = false;
    for (var i = 12; i > 0; --i) {
        if (Y >= cal.minYear && Y <= cal.maxYear) {
            yr.firstChild.data = Y;
            yr.year = Y;
            yr.style.display = "block";
            show = true
        } else {
            yr.style.display = "none"
        }
        yr = yr.nextSibling;
        Y += fwd ? cal.yearStep : -cal.yearStep
    }
    if (show) {
        var s = yc.style;
        s.display = "block";
        if (cd.navtype < 0) s.left = cd.offsetLeft + "px";
        else {
            var ycw = yc.offsetWidth;
            if (typeof ycw == "undefined") ycw = 50;
            s.left = (cd.offsetLeft + cd.offsetWidth - ycw) + "px"
        }
        s.top = (cd.offsetTop + cd.offsetHeight) + "px"
    }
    cal.updateWCH(yc)
};
Tc.DatePicker.tableMouseUp = function (ev) {
    var cal = Tc.DatePicker._C;
    if (!cal) {
        return false
    }
    if (cal.timeout) {
        clearTimeout(cal.timeout)
    }
    var el = cal.activeDiv;
    if (!el) {
        return false
    }
    var target = Tc.Rn.getTargetElement(ev);
    if (typeof(el.navtype) == "undefined") {
        while (target && !target.calendar) {
            target = target.parentNode
        }
    }
    ev || (ev = window.event);
    Tc.Rn.removeClass(el, "active");
    if (target == el || target.parentNode == el) {
        Tc.DatePicker.cellClick(el, ev)
    }
    var mon = Tc.DatePicker.findMonth(target);
    var date = null;
    if (mon) {
        if (!mon.disabled) {
            date = new Date(cal.date);
            if (mon.month != date.getMonth()) {
                date.setMonth(mon.month);
                cal.setDate(date, true);
                cal.dateClicked = false;
                cal.callHandler()
            }
        }
    } else {
        var year = Tc.DatePicker.findYear(target);
        if (year) {
            date = new Date(cal.date);
            if (year.year != date.getFullYear()) {
                date.setFullYear(year.year);
                cal.setDate(date, true);
                cal.dateClicked = false;
                cal.callHandler()
            }
        } else {
            var hist = Tc.DatePicker.findHist(target);
            if (hist && !hist.histDate.dateEqualsTo(cal.date)) {
                date = new Date(hist.histDate);
                cal._init(cal.firstDayOfWeek, cal.date = date);
                cal.dateClicked = false;
                cal.callHandler();
                cal.updateHistory()
            }
        }
    }
    Tc.Rn.removeEvent(window.document, "mouseup", Tc.DatePicker.tableMouseUp);
    Tc.Rn.removeEvent(window.document, "mouseover", Tc.DatePicker.tableMouseOver);
    Tc.Rn.removeEvent(window.document, "mousemove", Tc.DatePicker.tableMouseOver);
    cal._hideCombos();
    Tc.DatePicker._C = null;
    return Tc.Rn.stopEvent(ev)
};
Tc.DatePicker.tableMouseOver = function (ev) {
    var cal = Tc.DatePicker._C;
    if (!cal) {
        return
    }
    var el = cal.activeDiv;
    var target = Tc.Rn.getTargetElement(ev);
    if (target == el || target.parentNode == el) {
        Tc.Rn.addClass(el, "hilite active");
        Tc.Rn.addClass(el.parentNode, "rowhilite")
    } else {
        if (typeof el.navtype == "undefined" || (el.navtype != 50 && ((el.navtype == 0 && !cal.histCombo) || Math.abs(el.navtype) > 2))) Tc.Rn.removeClass(el, "active");
        Tc.Rn.removeClass(el, "hilite");
        Tc.Rn.removeClass(el.parentNode, "rowhilite")
    }
    ev || (ev = window.event);
    if (el.navtype == 50 && target != el) {
        var pos = Tc.Rn.getAbsolutePos(el);
        var w = el.offsetWidth;
        var x = ev.clientX;
        var dx;
        var decrease = true;
        if (x > pos.x + w) {
            dx = x - pos.x - w;
            decrease = false
        } else dx = pos.x - x;
        if (dx < 0) dx = 0;
        var range = el._range;
        var current = el._current;
        var date = cal.currentDate;
        var pm = (date.getHours() >= 12);
        var old = el.firstChild.data;
        var count = Math.floor(dx / 10) % range.length;
        for (var i = range.length; --i >= 0;) if (range[i] == current) break;
        while (count-- > 0) if (decrease) {
            if (--i < 0) {
                i = range.length - 1
            }
        } else if (++i >= range.length) {
            i = 0
        }
        if (cal.getDateStatus) {
            var minute = null;
            var hour = null;
            var new_date = new Date(date);
            if (el.className.indexOf("ampm", 0) != -1) {
                minute = date.getMinutes();
                if (old != range[i]) {
                    hour = (range[i] == Tc.DatePicker.i18n("pm", "ampm")) ? ((date.getHours() == 0) ? (12) : (date.getHours() + 12)) : (date.getHours() - 12)
                } else {
                    hour = date.getHours()
                }
                new_date.setHours(hour)
            }
            if (el.className.indexOf("hour", 0) != -1) {
                minute = date.getMinutes();
                hour = (!cal.time24) ? ((pm) ? ((range[i] != 12) ? (parseInt(range[i], 10) + 12) : (12)) : ((range[i] != 12) ? (range[i]) : (0))) : (range[i]);
                new_date.setHours(hour)
            }
            if (el.className.indexOf("minute", 0) != -1) {
                hour = date.getHours();
                minute = range[i];
                new_date.setMinutes(minute)
            }
        }
        var status = false;
        if (cal.getDateStatus) {
            status = cal.getDateStatus(new_date, date.getFullYear(), date.getMonth(), date.getDate(), parseInt(hour, 10), parseInt(minute, 10))
        }
        if (status == false) {
            if (!((!cal.time24) && (range[i] == Tc.DatePicker.i18n("pm", "ampm")) && (hour > 23))) {
                el.firstChild.data = range[i]
            }
        }
        cal.onUpdateTime()
    }
    var mon = Tc.DatePicker.findMonth(target);
    if (mon) {
        if (!mon.disabled) {
            if (mon.month != cal.date.getMonth()) {
                if (cal.hilitedMonth) {
                    Tc.Rn.removeClass(cal.hilitedMonth, "hilite")
                }
                Tc.Rn.addClass(mon, "hilite");
                cal.hilitedMonth = mon
            } else if (cal.hilitedMonth) {
                Tc.Rn.removeClass(cal.hilitedMonth, "hilite")
            }
        }
    } else {
        if (cal.hilitedMonth) {
            Tc.Rn.removeClass(cal.hilitedMonth, "hilite")
        }
        var year = Tc.DatePicker.findYear(target);
        if (year) {
            if (year.year != cal.date.getFullYear()) {
                if (cal.hilitedYear) {
                    Tc.Rn.removeClass(cal.hilitedYear, "hilite")
                }
                Tc.Rn.addClass(year, "hilite");
                cal.hilitedYear = year
            } else if (cal.hilitedYear) {
                Tc.Rn.removeClass(cal.hilitedYear, "hilite")
            }
        } else {
            if (cal.hilitedYear) {
                Tc.Rn.removeClass(cal.hilitedYear, "hilite")
            }
            var hist = Tc.DatePicker.findHist(target);
            if (hist) {
                if (!hist.histDate.dateEqualsTo(cal.date)) {
                    if (cal.hilitedHist) {
                        Tc.Rn.removeClass(cal.hilitedHist, "hilite")
                    }
                    Tc.Rn.addClass(hist, "hilite");
                    cal.hilitedHist = hist
                } else if (cal.hilitedHist) {
                    Tc.Rn.removeClass(cal.hilitedHist, "hilite")
                }
            } else if (cal.hilitedHist) {
                Tc.Rn.removeClass(cal.hilitedHist, "hilite")
            }
        }
    }
    return Tc.Rn.stopEvent(ev)
};
Tc.DatePicker.tableMouseDown = function (ev) {
    if (Tc.Rn.getTargetElement(ev) == Tc.Rn.getElement(ev)) {
        return Tc.Rn.stopEvent(ev)
    }
};
Tc.DatePicker.calDragIt = function (ev) {
    ev || (ev = window.event);
    var cal = Tc.DatePicker._C;
    if (!cal) {
        Tc.DatePicker.calDragEnd()
    }
    if (!cal.disableDrag) {
        if (!(cal && cal.dragging)) {
            return false
        }
        var posX = ev.clientX + window.document.body.scrollLeft;
        var posY = ev.clientY + window.document.body.scrollTop;
        cal.hideShowCovered();
        var st = cal.element.style,
            L = posX - cal.xOffs,
            T = posY - cal.yOffs;
        st.left = L + "px";
        st.top = T + "px";
        Tc.Rn.setupWCH(cal.WCH, L, T)
    }
    return Tc.Rn.stopEvent(ev)
};
Tc.DatePicker.calDragEnd = function (ev) {
    var cal = Tc.DatePicker._C;
    Tc.Rn.removeEvent(window.document, "mousemove", Tc.DatePicker.calDragIt);
    Tc.Rn.removeEvent(window.document, "mouseover", Tc.DatePicker.calDragIt);
    Tc.Rn.removeEvent(window.document, "mouseup", Tc.DatePicker.calDragEnd);
    if (!cal) {
        return false
    }
    cal.dragging = false;
    Tc.DatePicker.tableMouseUp(ev);
    cal.hideShowCovered()
};
Tc.DatePicker.dayMouseDown = function (ev) {
    var canDrag = true;
    var el = Tc.Rn.getElement(ev);
    if (el.className.indexOf("disabled") != -1 || el.className.indexOf("true") != -1) {
        return false
    }
    var cal = el.calendar;
    while (!cal) {
        el = el.parentNode;
        cal = el.calendar
    }
    cal.bEventShowHistory = false;
    cal.activeDiv = el;
    Tc.DatePicker._C = cal;
    if (el.navtype != 300) {
        if (el.navtype == 50) {
            if (!((cal.timeInterval == null) || ((cal.timeInterval < 60) && (el.className.indexOf("hour", 0) != -1)))) {
                canDrag = false
            }
            el._current = el.firstChild.data;
            if (canDrag) {
                Tc.Rn.addEvent(window.document, "mousemove", Tc.DatePicker.tableMouseOver)
            }
        } else {
            if (((el.navtype == 201) || (el.navtype == 202)) && (cal.timeInterval > 30) && (el.timePart.className.indexOf("minute", 0) != -1)) {
                canDrag = false
            }
            if (canDrag) {
                Tc.Rn.addEvent(window.document, Tc.is_ie5 ? "mousemove" : "mouseover", Tc.DatePicker.tableMouseOver)
            }
        }
        if (canDrag) {
            Tc.Rn.addClass(el, "hilite active")
        }
        Tc.Rn.addEvent(window.document, "mouseup", Tc.DatePicker.tableMouseUp)
    } else if (cal.isPopup) {
        cal._dragStart(ev)
    } else {
        Tc.DatePicker._C = null
    }
    if (el.navtype == -1 || el.navtype == 1) {
        if (cal.timeout) clearTimeout(cal.timeout);
        cal.timeout = setTimeout("Tc.DatePicker.showMonthsCombo()", 250)
    } else if (el.navtype == -2 || el.navtype == 2) {
        if (cal.timeout) clearTimeout(cal.timeout);
        cal.timeout = setTimeout((el.navtype > 0) ? "Tc.DatePicker.showYearsCombo(true)" : "Tc.DatePicker.showYearsCombo(false)", 250)
    } else if (el.navtype == 0 && Tc.DatePicker.prefs.history) {
        if (cal.timeout) clearTimeout(cal.timeout);
        cal.timeout = setTimeout("Tc.DatePicker.showHistoryCombo()", 250)
    } else {
        cal.timeout = null
    }
    return Tc.Rn.stopEvent(ev)
};
Tc.DatePicker.dayMouseDblClick = function (ev) {
    Tc.DatePicker.cellClick(Tc.Rn.getElement(ev), ev || window.event);
    if (Tc.is_ie) window.document.selection.empty()
};
Tc.DatePicker.dayMouseOver = function (ev) {
    var el = Tc.Rn.getElement(ev),
        caldate = el.caldate;
    while (!el.calendar) {
        el = el.parentNode;
        caldate = el.caldate
    }
    var cal = el.calendar;
    var cel = el.timePart;
    if (caldate) {
        caldate = new Date(caldate[0], caldate[1], caldate[2]);
        if (caldate.getDate() != el.caldate[2]) caldate.setDate(el.caldate[2])
    }
    if (Tc.Rn.isRelated(el, ev) || Tc.DatePicker._C || el.className.indexOf("disabled") != -1 || el.className.indexOf("true") != -1) {
        return false
    }
    if (el.ttip) {
        if (el.ttip.substr(0, 1) == "_") {
            el.ttip = caldate.print(el.calendar.ttDateFormat) + el.ttip.substr(1)
        }
        el.calendar.showHint(el.ttip)
    }
    if (el.navtype != 300) {
        if (!((cal.timeInterval == null) || (el.className.indexOf("ampm", 0) != -1) || ((cal.timeInterval < 60) && (el.className.indexOf("hour", 0) != -1))) && (el.navtype == 50)) {
            return Tc.Rn.stopEvent(ev)
        }
        if (((el.navtype == 201) || (el.navtype == 202)) && (cal.timeInterval > 30) && (cel.className.indexOf("minute", 0) != -1)) {
            return Tc.Rn.stopEvent(ev)
        }
        Tc.Rn.addClass(el, "hilite");
        if (caldate) {
            Tc.Rn.addClass(el.parentNode, "rowhilite")
        }
    }
    return Tc.Rn.stopEvent(ev)
};
Tc.DatePicker.dayMouseOut = function (ev) {
    var el = Tc.Rn.getElement(ev);
    while (!el.calendar) {
        el = el.parentNode;
        caldate = el.caldate
    }
    if (Tc.Rn.isRelated(el, ev) || Tc.DatePicker._C || el.className.indexOf("disabled") != -1 || el.className.indexOf("true") != -1) return false;
    Tc.Rn.removeClass(el, "hilite");
    if (el.caldate) Tc.Rn.removeClass(el.parentNode, "rowhilite");
    if (el.calendar) el.calendar.showHint(Tc.DatePicker.i18n("SEL_DATE"));
    return Tc.Rn.stopEvent(ev)
};
Tc.DatePicker.cellClick = function (el, ev) {
    var cal = el.calendar;
    var closing = false;
    var newdate = false;
    var date = null;
    while (!cal) {
        el = el.parentNode;
        cal = el.calendar
    }
    if (el.className.indexOf("disabled") != -1 || el.className.indexOf("true") != -1) {
        return false
    }
    if (typeof el.navtype == "undefined") {
        if (cal.currentDateEl) {
            Tc.Rn.removeClass(cal.currentDateEl, "selected");
            Tc.Rn.addClass(el, "selected");
            closing = (cal.currentDateEl == el);
            if (!closing) {
                cal.currentDateEl = el
            }
        }
        var tmpDate = new Date(el.caldate[0], el.caldate[1], el.caldate[2]);
        if (tmpDate.getDate() != el.caldate[2]) {
            tmpDate.setDate(el.caldate[2])
        }
        cal.date.setDateOnly(tmpDate);
        cal.currentDate.setDateOnly(tmpDate);
        date = cal.date;
        cal.dateClicked = true;
        if (cal.multiple) cal._toggleMultipleDate(new Date(date));
        newdate = true;
        if (el.otherMonth) cal._init(cal.firstDayOfWeek, date);
        cal.onSetTime()
    } else {
        if (el.navtype == 200) {
            Tc.Rn.removeClass(el, "hilite");
            cal.callCloseHandler();
            return
        }
        date = new Date(cal.date);
        if (el.navtype == 0 && !cal.bEventShowHistory) date.setDateOnly(new Date());
        cal.dateClicked = false;
        var year = date.getFullYear();
        var mon = date.getMonth();

        function setMonth(m) {
            var day = date.getDate();
            var max = date.getMonthDays(m);
            if (day > max) {
                date.setDate(max)
            }
            date.setMonth(m)
        };
        switch (el.navtype) {
        case 400:
            Tc.Rn.removeClass(el, "hilite");
            var text = Tc.DatePicker.i18n("ABOUT");
            if (typeof text != "undefined") {
                text += cal.showsTime ? Tc.DatePicker.i18n("ABOUT_TIME") : ""
            } else {
                text = "Help and about box text is not translated into this language.\n" + "If you know this language and you feel generous please update\n" + "the corresponding file in \"lang\" subdir to match calendar-en.js\n" + "and send it back to <support@techlib.com> to get it into the distribution  ;-)\n\n" + "Thank you!\n" + "http://www.techlib.com\n"
            }
            alert(text);
            return;
        case -2:
            if (year > cal.minYear) {
                date.setFullYear(year - 1)
            }
            break;
        case -1:
            if (mon > 0) {
                setMonth(mon - 1)
            } else if (year-- > cal.minYear) {
                date.setFullYear(year);
                setMonth(11)
            }
            break;
        case 1:
            if (mon < 11) {
                setMonth(mon + 1)
            } else if (year < cal.maxYear) {
                date.setFullYear(year + 1);
                setMonth(0)
            }
            break;
        case 2:
            if (year < cal.maxYear) {
                date.setFullYear(year + 1)
            }
            break;
        case 100:
            cal.setFirstDayOfWeek(el.fdow);
            Tc.DatePicker.prefs.fdow = cal.firstDayOfWeek;
            Tc.DatePicker.savePrefs();
            if (cal.onFDOW) cal.onFDOW(cal.firstDayOfWeek);
            return;
        case 50:
            var date = cal.currentDate;
            if (el.className.indexOf("ampm", 0) >= 0);
            else if (!((cal.timeInterval == null) || ((cal.timeInterval < 60) && (el.className.indexOf("hour", 0) != -1)))) {
                break
            }
            var range = el._range;
            var current = el.firstChild.data;
            var pm = (date.getHours() >= 12);
            for (var i = range.length; --i >= 0;) if (range[i] == current) break;
            if (ev && ev.shiftKey) {
                if (--i < 0) {
                    i = range.length - 1
                }
            } else if (++i >= range.length) {
                i = 0
            }
            if (cal.getDateStatus) {
                var minute = null;
                var hour = null;
                var new_date = new Date(date);
                if (el.className.indexOf("ampm", 0) != -1) {
                    minute = date.getMinutes();
                    hour = (range[i] == Tc.DatePicker.i18n("pm", "ampm")) ? ((date.getHours() == 12) ? (date.getHours()) : (date.getHours() + 12)) : (date.getHours() - 12);
                    if (cal.getDateStatus && cal.getDateStatus(new_date, date.getFullYear(), date.getMonth(), date.getDate(), parseInt(hour, 10), parseInt(minute, 10))) {
                        var dirrect;
                        if (range[i] == Tc.DatePicker.i18n("pm", "ampm")) {
                            dirrect = -5
                        } else {
                            dirrect = 5
                        }
                        hours = hour;
                        minutes = minute;
                        do {
                            minutes += dirrect;
                            if (minutes >= 60) {
                                minutes -= 60;
                                ++hours;
                                if (hours >= 24) hours -= 24;
                                new_date.setHours(hours)
                            }
                            if (minutes < 0) {
                                minutes += 60;
                                --hours;
                                if (hours < 0) hours += 24;
                                new_date.setHours(hours)
                            }
                            new_date.setMinutes(minutes);
                            if (!cal.getDateStatus(new_date, date.getFullYear(), date.getMonth(), date.getDate(), parseInt(hours, 10), parseInt(minutes, 10))) {
                                hour = hours;
                                minute = minutes;
                                if (hour > 12) i = 1;
                                else i = 0;
                                cal.date.setHours(hour);
                                cal.date.setMinutes(minute);
                                cal.onSetTime()
                            }
                        } while ((hour != hours) || (minute != minutes))
                    }
                    new_date.setHours(hour)
                }
                if (el.className.indexOf("hour", 0) != -1) {
                    minute = date.getMinutes();
                    hour = (!cal.time24) ? ((pm) ? ((range[i] != 12) ? (parseInt(range[i], 10) + 12) : (12)) : ((range[i] != 12) ? (range[i]) : (0))) : (range[i]);
                    new_date.setHours(hour)
                }
                if (el.className.indexOf("minute", 0) != -1) {
                    hour = date.getHours();
                    minute = range[i];
                    new_date.setMinutes(minute)
                }
            }
            var status = false;
            if (cal.getDateStatus) {
                status = cal.getDateStatus(new_date, date.getFullYear(), date.getMonth(), date.getDate(), parseInt(hour, 10), parseInt(minute, 10))
            }
            if (!status) {
                el.firstChild.data = range[i]
            }
            cal.onUpdateTime();
            return;
        case 201:
        case 202:
            var cel = el.timePart;
            var date = cal.currentDate;
            if ((cel.className.indexOf("minute", 0) != -1) && (cal.timeInterval > 30)) {
                break
            }
            var val = parseInt(cel.firstChild.data, 10);
            var pm = (date.getHours() >= 12);
            var range = cel._range;
            for (var i = range.length; --i >= 0;) if (val == range[i]) {
                val = i;
                break
            }
            var step = cel._step;
            if (el.navtype == 201) {
                val = step * Math.floor(val / step);
                val += step;
                if (val >= range.length) val = 0
            } else {
                val = step * Math.ceil(val / step);
                val -= step;
                if (val < 0) val = range.length - step
            }
            if (cal.getDateStatus) {
                var minute = null;
                var hour = null;
                var new_date = new Date(date);
                if (cel.className == "hour") {
                    minute = date.getMinutes();
                    hour = (!cal.time24) ? ((pm) ? ((range[val] != 12) ? (parseInt(range[val], 10) + 12) : (12)) : ((range[val] != 12) ? (range[val]) : (0))) : (range[val]);
                    new_date.setHours(hour)
                }
                if (cel.className == "minute") {
                    hour = date.getHours();
                    minute = val;
                    new_date.setMinutes(range[val])
                }
            }
            var status = false;
            if (cal.getDateStatus) {
                status = cal.getDateStatus(new_date, date.getFullYear(), date.getMonth(), date.getDate(), parseInt(hour, 10), parseInt(minute, 10))
            }
            if (!status) {
                cel.firstChild.data = range[val]
            }
            cal.onUpdateTime();
            return;
        case 0:
            if (cal.getDateStatus && ((cal.getDateStatus(date, date.getFullYear(), date.getMonth(), date.getDate()) == true) || (cal.getDateStatus(date, date.getFullYear(), date.getMonth(), date.getDate()) == "disabled"))) {
                return false
            }
            break
        }
        if (!date.equalsTo(cal.date)) {
            if ((el.navtype >= -2 && el.navtype <= 2) && (el.navtype != 0)) {
                cal._init(cal.firstDayOfWeek, date, true);
                return
            }
            cal.setDate(date);
            newdate = !(el.navtype && (el.navtype >= -2 && el.navtype <= 2))
        }
    }
    if (newdate) {
        cal.callHandler()
    }
    if (closing) {
        Tc.Rn.removeClass(el, "hilite");
        cal.callCloseHandler()
    }
};
Tc.DatePicker.prototype.create = function (_par) {
    var parent = null;
    if (!_par) {
        parent = window.document.getElementsByTagName("body")[0];
        this.isPopup = true;
        this.WCH = Tc.Rn.createWCH()
    } else {
        parent = _par;
        this.isPopup = false
    }
    this.currentDate = this.date = this.dateStr ? new Date(this.dateStr) : new Date();
    var table = Tc.Rn.createElement("table");
    this.table = table;
    table.cellSpacing = 0;
    table.cellPadding = 0;
    Tc.Rn.createProperty(table, "calendar", this);
    Tc.Rn.addEvent(table, "mousedown", Tc.DatePicker.tableMouseDown);
    var div = Tc.Rn.createElement("div");
    this.element = div;
    div.className = "datepicker";
    div.id = "zpCal" + this.id + "Container";
    if (Tc.is_opera) {
        table.style.width = (this.monthsInRow * ((this.weekNumbers) ? (8) : (7)) * 2 + 4.4 * this.monthsInRow) + "em"
    }
    if (this.isPopup) {
        div.style.position = "absolute";
        div.style.display = "none"
    }
    div.appendChild(table);
    var cell = null;
    var row = null;
    var cal = this;
    var hh = function (text, cs, navtype, buttonType) {
        cell = Tc.Rn.createElement("td", row);
        if (buttonType) {
            cell.id = "zpCal" + cal.id + buttonType + "ButtonStatus"
        }
        cell.colSpan = cs;
        cell.className = "button";
        if (Math.abs(navtype) <= 2) cell.className += " nav";
        Tc.DatePicker._add_evs(cell);
        Tc.Rn.createProperty(cell, "calendar", cal);
        cell.navtype = navtype;
        if (text.substr(0, 1) != "&") {
            cell.appendChild(document.createTextNode(text))
        } else {
            cell.innerHTML = text
        }
        return cell
    };
    var hd = function (par, colspan, buttonType) {
        cell = Tc.Rn.createElement("td", par);
        if (buttonType) {
            cell.id = "zpCal" + cal.id + buttonType + "ButtonStatus"
        }
        cell.colSpan = colspan;
        cell.className = "button";
        cell.innerHTML = "<div>&nbsp</div>";
        return cell
    };
    var title_length = ((this.weekNumbers) ? (8) : (7)) * this.monthsInRow - 2;
    var thead = Tc.Rn.createElement("thead", table);
    if (this.numberMonths == 1) {
        this.title = thead;
    }
    row = Tc.Rn.createElement("tr", thead);
    if (this.helpButton) {
        hh("?", 1, 400, "Help").ttip = Tc.DatePicker.i18n("INFO")
    } else {
        hd(row, 1, "Help")
    }
    this.title = hh("&nbsp;", title_length, 300);
    this.title.className = "title";
    this.title.id = "zpCal" + this.id + "Title";
    if (this.isPopup) {
        if (!this.disableDrag) {
            this.title.ttip = Tc.DatePicker.i18n("DRAG_TO_MOVE");
            this.title.style.cursor = "move"
        }
        if (this.closeButton) {
            hh("&#x00d7;", 1, 200, "Close").ttip = Tc.DatePicker.i18n("CLOSE")
        } else {
            hd(row, 1, "Close")
        }
    } else {
        hd(row, 1, "Close")
    }
    row = Tc.Rn.createElement("tr", thead);
    this._nav_py = hh("&#x00ab;", 1, -2, "PrevYear");
    this._nav_py.ttip = Tc.DatePicker.i18n("PREV_YEAR");
    this._nav_pm = hh("&#x2039;", 1, -1, "PrevMonth");
    this._nav_pm.ttip = Tc.DatePicker.i18n("PREV_MONTH");
    this._nav_now = hh(Tc.DatePicker.i18n("TODAY"), title_length - 2, 0, "Today");
    this._nav_now.ttip = Tc.DatePicker.i18n("GO_TODAY");
    this._nav_nm = hh("&#x203a;", 1, 1, "NextMonth");
    this._nav_nm.ttip = Tc.DatePicker.i18n("NEXT_MONTH");
    this._nav_ny = hh("&#x00bb;", 1, 2, "NextYear");
    this._nav_ny.ttip = Tc.DatePicker.i18n("NEXT_YEAR");
    var rowsOfMonths = Math.floor(this.numberMonths / this.monthsInRow);
    if (this.numberMonths % this.monthsInRow > 0) {
        ++rowsOfMonths;
    }
    for (var l = 1; l <= rowsOfMonths; ++l) {
        var thead = Tc.Rn.createElement("thead", table);
        if (Tc.is_opera) {
            thead.style.display = "table-row-group"
        }
        if (this.numberMonths != 1) {
            row = Tc.Rn.createElement("tr", thead);
            var title_length = 5;
            this.weekNumbers && ++title_length;
            this.titles[l] = new Array();
            for (var k = 1;
            (k <= this.monthsInRow) && ((l - 1) * this.monthsInRow + k <= this.numberMonths); ++k) {
                hd(row, 1);
                this.titles[l][k] = hh("&nbsp;", title_length, 300);
                this.titles[l][k].className = "title";
                this.titles[l][k].id = "zpCal" + this.id + "SubTitle" + ((l - 1) * this.monthsInRow + k);
                hd(row, 1)
            }
        }
        row = Tc.Rn.createElement("tr", thead);
        row.className = "daynames";
        for (k = 1;
        (k <= this.monthsInRow) && ((l - 1) * this.monthsInRow + k <= this.numberMonths); ++k) {
            if (this.weekNumbers) {
                cell = Tc.Rn.createElement("td", row);
                cell.className = "name wn";
                cell.appendChild(window.document.createTextNode(Tc.DatePicker.i18n("WK")));
                if (k > 1) {
                    Tc.Rn.addClass(cell, "month-left-border")
                }
                var cal_wk = Tc.DatePicker.i18n("WK");
                if (cal_wk == null) {
                    cal_wk = ""
                }
            }
            for (var i = 7; i > 0; --i) {
                cell = Tc.Rn.createElement("td", row);
                cell.appendChild(document.createTextNode("&nbsp;"));
                cell.id = "zpCal" + this.id + "WeekDayButton" + (7 - i) + "Status"
            }
        }
        this.firstdayname = row.childNodes[this.weekNumbers ? 1 : 0];
        this.rowsOfDayNames[l] = this.firstdayname;
        this._displayWeekdays();
        var tbody = Tc.Rn.createElement("tbody", table);
        this.tbody[l] = tbody;
        for (i = 6; i > 0; --i) {
            row = Tc.Rn.createElement("tr", tbody);
            for (k = 1;
            (k <= this.monthsInRow) && ((l - 1) * this.monthsInRow + k <= this.numberMonths); ++k) {
                if (this.weekNumbers) {
                    cell = Tc.Rn.createElement("td", row);
                    cell.id = "zpCal" + this.id + "WeekNumber" + (6 - i);
                    cell.appendChild(document.createTextNode("&nbsp;"))
                }
                for (var j = 7; j > 0; --j) {
                    cell = Tc.Rn.createElement("td", row);
                    cell.id = "zpCal" + this.id + "DateCell" + ((l - 1) * this.monthsInRow + k) + "-" + (6 - i) + "-" + (7 - j);
                    cell.appendChild(document.createTextNode("&nbsp;"));
                    Tc.Rn.createProperty(cell, "calendar", this);
                    Tc.DatePicker._add_evs(cell)
                }
            }
        }
    }
    var tfoot = Tc.Rn.createElement("tfoot", table);
    if (this.showsTime) {
        row = Tc.Rn.createElement("tr", tfoot);
        row.className = "time";
        var emptyColspan;
        if (this.monthsInRow != 1) {
            cell = Tc.Rn.createElement("td", row);
            emptyColspan = cell.colSpan = Math.ceil((((this.weekNumbers) ? 8 : 7) * (this.monthsInRow - 1)) / 2);
            cell.className = "timetext";
            cell.innerHTML = "&nbsp"
        }
        cell = Tc.Rn.createElement("td", row);
        cell.className = "timetext";
        cell.colSpan = this.weekNumbers ? 2 : 1;
        cell.innerHTML = Tc.DatePicker.i18n("TIME") || "&nbsp;";
        (function () {
            function makeTimePart(className, partId, init, range_start, range_end) {
                var table, tbody, tr, tr2, part;
                if (range_end) {
                    cell = Tc.Rn.createElement("td", row);
                    cell.colSpan = 1;
                    if (cal.showsTime != "seconds") {
                        ++cell.colSpan
                    }
                    cell.className = "parent-" + className;
                    table = Tc.Rn.createElement("table", cell);
                    table.cellSpacing = table.cellPadding = 0;
                    if (className == "hour") table.align = "right";
                    table.className = "datepicker-time-scroller";
                    tbody = Tc.Rn.createElement("tbody", table);
                    tr = Tc.Rn.createElement("tr", tbody);
                    tr2 = Tc.Rn.createElement("tr", tbody)
                } else tr = row;
                part = Tc.Rn.createElement("td", tr);
                part.className = className;
                part.id = "zpTime" + cal.id + partId + "SelectStatus";
                part.appendChild(window.document.createTextNode(init));
                Tc.Rn.createProperty(part, "calendar", cal);
                part.ttip = Tc.DatePicker.i18n("TIME_PART");
                part.navtype = 50;
                part._range = [];
                if (!range_end) part._range = range_start;
                else {
                    part.rowSpan = 2;
                    for (var i = range_start; i <= range_end; ++i) {
                        var txt;
                        if (i < 10 && range_end >= 10) txt = '0' + i;
                        else txt = '' + i;
                        part._range[part._range.length] = txt
                    }
                    var up = Tc.Rn.createElement("td", tr);
                    up.className = "up";
                    up.navtype = 201;
                    up.id = "zpTime" + cal.id + partId + "UpButtonStatus";
                    Tc.Rn.createProperty(up, "calendar", cal);
                    up.timePart = part;
                    if (Tc.is_khtml) up.innerHTML = "&nbsp;";
                    Tc.DatePicker._add_evs(up);
                    var down = Tc.Rn.createElement("td", tr2);
                    down.className = "down";
                    down.navtype = 202;
                    down.id = "zpTime" + cal.id + partId + "DownButtonStatus";
                    Tc.Rn.createProperty(down, "calendar", cal);
                    down.timePart = part;
                    if (Tc.is_khtml) down.innerHTML = "&nbsp;";
                    Tc.DatePicker._add_evs(down)
                }
                Tc.DatePicker._add_evs(part);
                return part
            };
            var hrs = cal.currentDate.getHours();
            var mins = cal.currentDate.getMinutes();
            if (cal.showsTime == "seconds") {
                var secs = cal.currentDate.getSeconds()
            }
            var t12 = !cal.time24;
            var pm = (hrs > 12);
            if (t12 && pm) hrs -= 12;
            var H = makeTimePart("hour", "Hours", hrs, t12 ? 1 : 0, t12 ? 12 : 23);
            H._step = (cal.timeInterval > 30) ? (cal.timeInterval / 60) : 1;
            cell = Tc.Rn.createElement("td", row);
            cell.innerHTML = ":";
            cell.className = "colon";
            var M = makeTimePart("minute", "Minutes", mins, 0, 59);
            M._step = ((cal.timeInterval) && (cal.timeInterval < 60)) ? (cal.timeInterval) : 5;
            if (cal.showsTime == "seconds") {
                cell = Tc.Rn.createElement("td", row);
                cell.innerHTML = ":";
                cell.className = "colon";
                var S = makeTimePart("minute", "Seconds", secs, 0, 59);
                S._step = 5
            }
            var AP = null;
            if (t12) {
                AP = makeTimePart("ampm", "AMPM", pm ? Tc.DatePicker.i18n("pm", "ampm") : Tc.DatePicker.i18n("am", "ampm"), [Tc.DatePicker.i18n("am", "ampm"), Tc.DatePicker.i18n("pm", "ampm")]);
                AP.className += " button"
            } else Tc.Rn.createElement("td", row).innerHTML = "&nbsp;";
            cal.onSetTime = function () {
                var hrs = this.currentDate.getHours();
                var mins = this.currentDate.getMinutes();
                if (this.showsTime == "seconds") {
                    var secs = cal.currentDate.getSeconds()
                }
                if (this.timeInterval) {
                    mins += this.timeInterval - ((mins - 1 + this.timeInterval) % this.timeInterval) - 1
                }
                while (mins >= 60) {
                    mins -= 60;
                    ++hrs
                }
                if (this.timeInterval > 60) {
                    var interval = this.timeInterval / 60;
                    if (hrs % interval != 0) {
                        hrs += interval - ((hrs - 1 + interval) % interval) - 1
                    }
                    if (hrs >= 24) {
                        hrs -= 24
                    }
                }
                var new_date = new Date(this.currentDate);
                if (this.getDateStatus && this.getDateStatus(this.currentDate, this.currentDate.getFullYear(), this.currentDate.getMonth(), this.currentDate.getDate(), hrs, mins)) {
                    hours = hrs;
                    minutes = mins;
                    do {
                        if (this.timeInterval) {
                            if (this.timeInterval < 60) {
                                minutes += this.timeInterval
                            } else {
                                hrs += this.timeInterval / 60
                            }
                        } else {
                            minutes += 5
                        }
                        if (minutes >= 60) {
                            minutes -= 60;
                            hours += 1
                        }
                        if (hours >= 24) {
                            hours -= 24
                        }
                        new_date.setMinutes(minutes);
                        new_date.setHours(hours);
                        if (!this.getDateStatus(new_date, this.currentDate.getFullYear(), this.currentDate.getMonth(), this.currentDate.getDate(), hours, minutes)) {
                            hrs = hours;
                            mins = minutes
                        }
                    } while ((hrs != hours) || (mins != minutes))
                }
                this.currentDate.setMinutes(mins);
                this.currentDate.setHours(hrs);
                var pm = (hrs >= 12);
                if (pm && t12 && hrs != 12) hrs -= 12;
                if (!pm && t12 && hrs == 0) hrs = 12;
                H.firstChild.data = (hrs < 10) ? ("0" + hrs) : hrs;
                M.firstChild.data = (mins < 10) ? ("0" + mins) : mins;
                if (this.showsTime == "seconds") {
                    S.firstChild.data = (secs < 10) ? ("0" + secs) : secs
                }
                if (t12) AP.firstChild.data = pm ? Tc.DatePicker.i18n("pm", "ampm") : Tc.DatePicker.i18n("am", "ampm")
            };
            cal.onUpdateTime = function () {
                var date = this.currentDate;
                var h = parseInt(H.firstChild.data, 10);
                if (t12) {
                    if (/pm/i.test(AP.firstChild.data) && h < 12) h += 12;
                    else if (/am/i.test(AP.firstChild.data) && h == 12) h = 0
                }
                var d = date.getDate();
                var m = date.getMonth();
                var y = date.getFullYear();
                date.setHours(h);
                date.setMinutes(parseInt(M.firstChild.data, 10));
                if (this.showsTime == "seconds") {
                    date.setSeconds(parseInt(S.firstChild.data, 10))
                }
                date.setFullYear(y);
                date.setMonth(m);
                date.setDate(d);
                this.dateClicked = false;
                this.callHandler()
            }
        })();
        if (this.monthsInRow != 1) {
            cell = Tc.Rn.createElement("td", row);
            cell.colSpan = ((this.weekNumbers) ? 8 : 7) * (this.monthsInRow - 1) - Math.ceil(emptyColspan);
            cell.className = "timetext";
            cell.innerHTML = "&nbsp"
        }
    } else {
        this.onSetTime = this.onUpdateTime = function () {}
    }
    row = Tc.Rn.createElement("tr", tfoot);
    row.className = "footrow";
    cell = hh(Tc.DatePicker.i18n("SEL_DATE"), this.weekNumbers ? (8 * this.numberMonths) : (7 * this.numberMonths), 300);
    cell.className = "ttip";
    cell.id = "zpCal" + this.id + "Status";
    if (this.isPopup && !this.disableDrag) {
        cell.ttip = Tc.DatePicker.i18n("DRAG_TO_MOVE");
        cell.style.cursor = "move"
    }
    this.tooltips = cell;
    div = this.monthsCombo = Tc.Rn.createElement("div", this.element);
    div.className = "combo";
    div.id = "zpCal" + this.id + "MonthDropdownCombo";
    for (i = 0; i < 12; ++i) {
        var mn = Tc.Rn.createElement("div");
        mn.className = Tc.is_ie ? "label-IEfix" : "label";
        mn.id = "zpCal" + this.id + "MonthDropdownItem" + i;
        mn.month = i;
        mn.appendChild(window.document.createTextNode(Tc.DatePicker.i18n(i, "smn")));
        div.appendChild(mn)
    }
    div = this.yearsCombo = Tc.Rn.createElement("div", this.element);
    div.className = "combo";
    div.id = "zpCal" + this.id + "YearDropdownCombo";
    for (i = 0; i < 12; ++i) {
        var yr = Tc.Rn.createElement("div");
        yr.className = Tc.is_ie ? "label-IEfix" : "label";
        yr.id = "zpCal" + this.id + "YearDropdownItem" + i;
        yr.appendChild(window.document.createTextNode("&nbsp;"));
        div.appendChild(yr)
    }
    div = this.histCombo = Tc.Rn.createElement("div", this.element);
    div.id = "zpCal" + this.id + "HistoryDropdownCombo";
    div.className = "combo history";
    this._init(this.firstDayOfWeek, this.date);
    parent.appendChild(this.element)
};
Tc.DatePicker._keyEvent = function (ev) {
    if (!window.calendar) {
        return false
    }(Tc.is_ie) && (ev = window.event);
    var cal = window.calendar;
    var act = (Tc.is_ie || ev.type == "keypress");
    var K = ev.keyCode;
    var date = new Date(cal.date);
    if (ev.ctrlKey) {
        switch (K) {
        case 37:
            act && Tc.DatePicker.cellClick(cal._nav_pm);
            break;
        case 38:
            act && Tc.DatePicker.cellClick(cal._nav_py);
            break;
        case 39:
            act && Tc.DatePicker.cellClick(cal._nav_nm);
            break;
        case 40:
            act && Tc.DatePicker.cellClick(cal._nav_ny);
            break;
        default:
            return false
        }
    } else switch (K) {
    case 32:
        Tc.DatePicker.cellClick(cal._nav_now);
        break;
    case 27:
        act && cal.callCloseHandler();
        break;
    case 37:
        if (act && !cal.multiple) {
            date.setTime(date.getTime() - 86400000);
            cal.setDate(date)
        }
        break;
    case 38:
        if (act && !cal.multiple) {
            date.setTime(date.getTime() - 7 * 86400000);
            cal.setDate(date)
        }
        break;
    case 39:
        if (act && !cal.multiple) {
            date.setTime(date.getTime() + 86400000);
            cal.setDate(date)
        }
        break;
    case 40:
        if (act && !cal.multiple) {
            date.setTime(date.getTime() + 7 * 86400000);
            cal.setDate(date)
        }
        break;
    case 13:
        if (act) {
            Tc.DatePicker.cellClick(cal.currentDateEl)
        }
        break;
    default:
        return false
    }
    return Tc.Rn.stopEvent(ev)
};
Tc.DatePicker.prototype._init = function (firstDayOfWeek, date, last) {
    var today = new Date(),
        TD = today.getDate(),
        TY = today.getFullYear(),
        TM = today.getMonth();
    if (this.getDateStatus && !last) {
        var status = this.getDateStatus(date, date.getFullYear(), date.getMonth(), date.getDate());
        var backupDate = new Date(date);
        while (((status == true) || (status == "disabled")) && (backupDate.getMonth() == date.getMonth())) {
            date.setTime(date.getTime() + 86400000);
            var status = this.getDateStatus(date, date.getFullYear(), date.getMonth(), date.getDate())
        }
        if (backupDate.getMonth() != date.getMonth()) {
            date = new Date(backupDate);
            while (((status == true) || (status == "disabled")) && (backupDate.getMonth() == date.getMonth())) {
                date.setTime(date.getTime() - 86400000);
                var status = this.getDateStatus(date, date.getFullYear(), date.getMonth(), date.getDate())
            }
        }
        if (backupDate.getMonth() != date.getMonth()) {
            last = true;
            date = new Date(backupDate)
        }
    }
    var year = date.getFullYear();
    var month = date.getMonth();
    var rowsOfMonths = Math.floor(this.numberMonths / this.monthsInRow);
    var minMonth;
    var diffMonth, last_row, before_control;
    if (!this.vertical) {
        diffMonth = (this.controlMonth - 1);
        minMonth = month - diffMonth
    } else {
        last_row = ((this.numberMonths - 1) % this.monthsInRow) + 1;
        before_control = (this.controlMonth - 1) % this.monthsInRow;
        bottom = (before_control >= (last_row) ? (last_row) : (before_control));
        diffMonth = (before_control) * (rowsOfMonths - 1) + Math.floor((this.controlMonth - 1) / this.monthsInRow) + bottom;
        minMonth = month - diffMonth
    }
    var minYear = year;
    if (minMonth < 0) {
        minMonth += 12;
        --minYear
    }
    var maxMonth = minMonth + this.numberMonths - 1;
    var maxYear = minYear;
    if (maxMonth > 11) {
        maxMonth -= 12;
        ++maxYear
    }
    function disableControl(ctrl) {
        Tc.DatePicker._del_evs(ctrl);
        ctrl.disabled = true;
        ctrl.className = "button";
        ctrl.innerHTML = "<div>&nbsp</div>"
    }
    function enableControl(ctrl, sign) {
        Tc.DatePicker._add_evs(ctrl);
        ctrl.disabled = false;
        ctrl.className = "button nav";
        ctrl.innerHTML = sign
    }
    if ((minYear <= this.minYear) || !this.yearNav) {
        if (!this._nav_py.disabled) {
            disableControl(this._nav_py)
        }
    } else {
        if (this._nav_py.disabled) {
            enableControl(this._nav_py, "&#x00ab;")
        }
    }
    if (maxYear >= this.maxYear || !this.yearNav) {
        if (!this._nav_ny.disabled) {
            disableControl(this._nav_ny)
        }
    } else {
        if (this._nav_ny.disabled) {
            enableControl(this._nav_ny, "&#x00bb;")
        }
    }
    if (((minYear == this.minYear) && (minMonth <= this.minMonth)) || (minYear < this.minYear)) {
        if (!this._nav_pm.disabled) {
            disableControl(this._nav_pm)
        }
    } else {
        if (this._nav_pm.disabled) {
            enableControl(this._nav_pm, "&#x2039;")
        }
    }
    if (((maxYear == this.maxYear) && (maxMonth >= this.maxMonth)) || (maxYear > this.maxYear)) {
        if (!this._nav_nm.disabled) {
            disableControl(this._nav_nm)
        }
    } else {
        if (this._nav_nm.disabled) {
            enableControl(this._nav_nm, "&#x203a;")
        }
    }
    upperMonth = this.maxMonth + 1;
    upperYear = this.maxYear;
    if (upperMonth > 11) {
        upperMonth -= 12;
        ++upperYear
    }
    bottomMonth = this.minMonth - 1;
    bottomYear = this.minYear;
    if (bottomMonth < 0) {
        bottomMonth += 12;
        --bottomYear
    }
    maxDate1 = new Date(maxYear, maxMonth, date.getMonthDays(maxMonth), 23, 59, 59, 999);
    maxDate2 = new Date(upperYear, upperMonth, 1, 0, 0, 0, 0);
    minDate1 = new Date(minYear, minMonth, 1, 0, 0, 0, 0);
    minDate2 = new Date(bottomYear, bottomMonth, date.getMonthDays(bottomMonth), 23, 59, 59, 999);
    if (maxDate1.getTime() > maxDate2.getTime()) {
        date.setTime(date.getTime() - (maxDate1.getTime() - maxDate2.getTime()))
    }
    if (minDate1.getTime() < minDate2.getTime()) {
        date.setTime(date.getTime() + (minDate2.getTime() - minDate1.getTime()) + 1)
    }
    delete maxDate1;
    delete maxDate2;
    delete minDate1;
    delete minDate2;
    this.firstDayOfWeek = firstDayOfWeek;
    if (!last) {
        this.currentDate = date
    }
    this.date = date;
    (this.date = new Date(this.date)).setDateOnly(date);
    year = this.date.getFullYear();
    month = this.date.getMonth();
    var initMonth = date.getMonth();
    var mday = this.date.getDate();
    var no_days = date.getMonthDays();
    var months = new Array();
    if (this.numberMonths % this.monthsInRow > 0) {
        ++rowsOfMonths
    }
    for (var l = 1; l <= rowsOfMonths; ++l) {
        months[l] = new Array();
        for (var k = 1;
        (k <= this.monthsInRow) && ((l - 1) * this.monthsInRow + k <= this.numberMonths); ++k) {
            var tmpDate = new Date(date);
            if (this.vertical) {
                var validMonth = date.getMonth() - diffMonth + ((k - 1) * (rowsOfMonths - 1) + (l - 1) + ((last_row < k) ? (last_row) : (k - 1)))
            } else {
                var validMonth = date.getMonth() - diffMonth + (l - 1) * this.monthsInRow + k - 1
            }
            if (validMonth < 0) {
                tmpDate.setFullYear(tmpDate.getFullYear() - 1);
                validMonth = 12 + validMonth
            }
            if (validMonth > 11) {
                tmpDate.setFullYear(tmpDate.getFullYear() + 1);
                validMonth = validMonth - 12
            }
            tmpDate.setDate(1);
            tmpDate.setMonth(validMonth);
            var day1 = (tmpDate.getDay() - this.firstDayOfWeek) % 7;
            if (day1 < 0) day1 += 7;
            var hrs = tmpDate.getHours();
            tmpDate.setDate(-day1);
            tmpDate.setDate(tmpDate.getDate() + 1);
            if (hrs != tmpDate.getHours()) {
                tmpDate.setDate(1);
                tmpDate.setMonth(validMonth);
                tmpDate.setDate(-day1);
                tmpDate.setDate(tmpDate.getDate() + 1)
            }
            months[l][k] = tmpDate
        }
    }
    var MN = Tc.DatePicker.i18n(month, "smn");
    var weekend = Tc.DatePicker.i18n("WEEKEND");
    var dates = this.multiple ? (this.datesCells = {}) : null;
    var DATETXT = this.getDateText;
    for (var l = 1; l <= rowsOfMonths; ++l) {
        var row = this.tbody[l].firstChild;
        for (var i = 7; --i > 0; row = row.nextSibling) {
            var cell = row.firstChild;
            var hasdays = false;
            for (var k = 1;
            (k <= this.monthsInRow) && ((l - 1) * this.monthsInRow + k <= this.numberMonths); ++k) {
                date = months[l][k];
                if (this.weekNumbers) {
                    cell.className = " day wn";
                    cell.innerHTML = date.getWeekNumber();
                    if (k > 1) {
                        Tc.Rn.addClass(cell, "month-left-border")
                    }
                    cell = cell.nextSibling
                }
                row.className = "daysrow";
                row.id = "zpCal" + this.id + "Daysrow" + (6 - i);
                var iday;
                for (j = 7; cell && (iday = date.getDate()) && (j > 0); date.setDate(iday + 1), ((date.getDate() == iday) ? (date.setHours(1) && date.setDate(iday + 1)) : (false)), cell = cell.nextSibling, --j) {
                    var wday = date.getDay(),
                        dmonth = date.getMonth(),
                        dyear = date.getFullYear();
                    cell.className = " day";
                    if ((!this.weekNumbers) && (j == 7) && (k != 1)) {
                        Tc.Rn.addClass(cell, "month-left-border")
                    }
                    if ((j == 1) && (k != this.monthsInRow)) {
                        Tc.Rn.addClass(cell, "month-right-border")
                    }
                    if (this.vertical) {
                        validMonth = initMonth - diffMonth + ((k - 1) * (rowsOfMonths - 1) + (l - 1) + ((last_row < k) ? (last_row) : (k - 1)))
                    } else {
                        validMonth = initMonth - diffMonth + ((l - 1) * this.monthsInRow + k - 1)
                    }
                    if (validMonth < 0) {
                        validMonth = 12 + validMonth
                    }
                    if (validMonth > 11) {
                        validMonth = validMonth - 12
                    }
                    var current_month = !(cell.otherMonth = !(dmonth == validMonth));
                    if (!current_month) {
                        if (this.showsOtherMonths) cell.className += " othermonth";
                        else {
                            cell.className += " true";
                            cell.innerHTML = "<div>&nbsp;</div>";
                            continue
                        }
                    } else hasdays = true;
                    cell.innerHTML = DATETXT ? DATETXT(date, dyear, dmonth, iday) : iday;
                    dates && (dates[date.print("%Y%m%d")] = cell);
                    if (this.getDateStatus) {
                        var status = this.getDateStatus(date, dyear, dmonth, iday);
                        if (this.getDateToolTip) {
                            var toolTip = this.getDateToolTip(date, dyear, dmonth, iday);
                            if (toolTip) cell.title = toolTip
                        }
                        if (status == true) {
                            cell.className += " disabled"
                        } else {
                            cell.className += " " + status
                        }
                    }
                    if (!cell.disabled) {
                        cell.caldate = [dyear, dmonth, iday];
                        cell.ttip = "_";
                        if (!this.multiple && current_month && iday == this.currentDate.getDate() && this.hiliteToday && (dmonth == this.currentDate.getMonth()) && (dyear == this.currentDate.getFullYear())) {
                            cell.className += " selected";
                            this.currentDateEl = cell
                        }
                        if (dyear == TY && dmonth == TM && iday == TD) {
                            cell.className += " today";
                            cell.ttip += Tc.DatePicker.i18n("PART_TODAY")
                        }
                        if ((weekend != null) && (weekend.indexOf(wday.toString()) != -1)) {
                            cell.className += cell.otherMonth ? " oweekend" : " weekend"
                        }
                    }
                }
                if (!(hasdays || this.showsOtherMonths)) row.className = "emptyrow"
            }
            if ((i == 1) && (l < rowsOfMonths)) {
                if (row.className == "emptyrow") {
                    row = row.previousSibling
                }
                cell = row.firstChild;
                while (cell != null) {
                    Tc.Rn.addClass(cell, "month-bottom-border");
                    cell = cell.nextSibling
                }
            }
        }
    }
    if (this.numberMonths == 1) {
        this.title.innerHTML = Tc.DatePicker.i18n(month, "mn") + ", " + year;
        if (this.params && this.params.titleHtml) if (typeof this.params.titleHtml == 'function') this.title.innerHTML = this.params.titleHtml(this.title.innerHTML, month, year);
        else this.title.innerHTML += this.params.titleHtml
    } else {
        if (this.params && this.params.titleHtml) if (typeof this.params.titleHtml == 'function') this.title.innerHTML = this.params.titleHtml(Tc.DatePicker.i18n(month, "mn") + ", " + year, month, year);
        else this.title.innerHTML = this.params.titleHtml;
        for (var l = 1; l <= rowsOfMonths; ++l) {
            for (var k = 1;
            (k <= this.monthsInRow) && ((l - 1) * this.monthsInRow + k <= this.numberMonths); ++k) {
                if (this.vertical) {
                    validMonth = month - diffMonth + ((k - 1) * (rowsOfMonths - 1) + (l - 1) + ((last_row < k) ? (last_row) : (k - 1)))
                } else {
                    validMonth = month - diffMonth + (l - 1) * this.monthsInRow + k - 1
                }
                validYear = year;
                if (validMonth < 0) {
                    --validYear;
                    validMonth = 12 + validMonth
                }
                if (validMonth > 11) {
                    ++validYear;
                    validMonth = validMonth - 12
                }
                this.titles[l][k].innerHTML = Tc.DatePicker.i18n(validMonth, "mn") + ", " + validYear
            }
        }
    }
    this.onSetTime();
    this._initMultipleDates();
    this.updateWCH()
};
Tc.DatePicker.prototype._initMultipleDates = function () {
    if (this.multiple) {
        for (var i in this.multiple) {
            var cell = this.datesCells[i];
            var d = this.multiple[i];
            if (!d) continue;
            if (cell) cell.className += " selected"
        }
    }
};
Tc.DatePicker.prototype._toggleMultipleDate = function (date) {
    if (this.multiple) {
        var ds = date.print("%Y%m%d");
        var cell = this.datesCells[ds];
        if (cell) {
            var d = this.multiple[ds];
            if (!d) {
                Tc.Rn.addClass(cell, "selected");
                this.multiple[ds] = date
            } else {
                Tc.Rn.removeClass(cell, "selected");
                delete this.multiple[ds]
            }
        }
    }
};
Tc.DatePicker.prototype.setDateToolTipHandler = function (unaryFunction) {
    this.getDateToolTip = unaryFunction
};
Tc.DatePicker.prototype.setDate = function (date, justInit) {
    if (!date) date = new Date();
    if (!date.equalsTo(this.date)) {
        var year = date.getFullYear(),
            m = date.getMonth();
        if (year < this.minYear || (year == this.minYear && m < this.minMonth)) this.showHint("<div class='error'>" + Tc.DatePicker.i18n("E_RANGE") + " Â»Â»Â»</div>");
        else if (year > this.maxYear || (year == this.maxYear && m > this.maxMonth)) this.showHint("<div class='error'>Â«Â«Â« " + Tc.DatePicker.i18n("E_RANGE") + "</div>");
        this._init(this.firstDayOfWeek, date, justInit)
    }
};
Tc.DatePicker.prototype.showHint = function (text) {
    this.tooltips.innerHTML = text
};
Tc.DatePicker.prototype.reinit = function () {
    this._init(this.firstDayOfWeek, this.date)
};
Tc.DatePicker.prototype.refresh = function () {
    var p = this.isPopup ? null : this.element.parentNode;
    var x = parseInt(this.element.style.left);
    var y = parseInt(this.element.style.top);
    this.destroy();
    this.dateStr = this.date;
    this.create(p);
    if (this.isPopup) this.showAt(x, y);
    else this.show()
};
Tc.DatePicker.prototype.setFirstDayOfWeek = function (firstDayOfWeek) {
    if (this.firstDayOfWeek != firstDayOfWeek) {
        this._init(firstDayOfWeek, this.date);
        var rowsOfMonths = Math.floor(this.numberMonths / this.monthsInRow);
        if (this.numberMonths % this.monthsInRow > 0) {
            ++rowsOfMonths
        }
        for (var l = 1; l <= rowsOfMonths; ++l) {
            this.firstdayname = this.rowsOfDayNames[l];
            this._displayWeekdays()
        }
    }
};
Tc.DatePicker.prototype.setDateStatusHandler = Tc.DatePicker.prototype.setDisabledHandler = function (unaryFunction) {
    this.getDateStatus = unaryFunction
};
Tc.DatePicker.prototype.setRange = function (A, Z) {
    var m, a = Math.min(A, Z),
        z = Math.max(A, Z);
    this.minYear = m = Math.floor(a);
    this.minMonth = (m == a) ? 0 : Math.ceil((a - m) * 100 - 1);
    this.maxYear = m = Math.floor(z);
    this.maxMonth = (m == z) ? 11 : Math.ceil((z - m) * 100 - 1)
};
Tc.DatePicker.prototype.setMultipleDates = function (multiple) {
    if (!multiple || typeof multiple == "undefined") return;
    this.multiple = {};
    for (var i = multiple.length; --i >= 0;) {
        var d = multiple[i];
        var ds = d.print("%Y%m%d");
        this.multiple[ds] = d
    }
};
Tc.DatePicker.prototype.submitFlatDates = function () {
    if (typeof this.params.flatCallback == "function") {
        Tc.Rn.sortOrder = (this.sortOrder != "asc" && this.sortOrder != "desc" && this.sortOrder != "none") ? "none" : this.sortOrder;
        if (this.multiple && (Tc.Rn.sortOrder != "none")) {
            var dateArray = new Array();
            for (var i in this.multiple) {
                var currentDate = this.multiple[i];
                if (currentDate) {
                    dateArray[dateArray.length] = currentDate
                }
                dateArray.sort(Tc.Rn.compareDates)
            }
            this.multiple = {};
            for (var i = 0; i < dateArray.length; i++) {
                var d = dateArray[i];
                var ds = d.print("%Y%m%d");
                this.multiple[ds] = d
            }
        }
        this.params.flatCallback(this)
    }
};
Tc.DatePicker.prototype.callHandler = function () {
    if (this.onSelected) {
        this.onSelected(this, this.date.print(this.dateFormat))
    }
};
Tc.DatePicker.prototype.updateHistory = function () {
    var a, i, d, tmp, s, str = "",
        len = Tc.DatePicker.prefs.hsize - 1;
    if (Tc.DatePicker.prefs.history) {
        a = Tc.DatePicker.prefs.history.split(/,/);
        i = 0;
        while (i < len && (tmp = a[i++])) {
            s = tmp.split(/\//);
            d = new Date(parseInt(s[0], 10), parseInt(s[1], 10) - 1, parseInt(s[2], 10), parseInt(s[3], 10), parseInt(s[4], 10));
            if (!d.dateEqualsTo(this.date)) str += "," + tmp
        }
    }
    Tc.DatePicker.prefs.history = this.date.print("%Y/%m/%d/%H/%M") + str;
    Tc.DatePicker.savePrefs()
};
Tc.DatePicker.prototype.callCloseHandler = function () {
    if (this.dateClicked) {
        this.updateHistory()
    }
    if (this.onClose) {
        this.onClose(this)
    }
    this.hideShowCovered()
};
Tc.DatePicker.prototype.destroy = function () {
    this.hide();
    Tc.Rn.destroy(this.element);
    Tc.Rn.destroy(this.WCH);
    Tc.DatePicker._C = null;
    window.calendar = null
};
Tc.DatePicker.prototype.reparent = function (new_parent) {
    var el = this.element;
    el.parentNode.removeChild(el);
    new_parent.appendChild(el)
};
Tc.DatePicker._checkCalendar = function (ev) {
    if (!window.calendar) {
        return false
    }
    var el = Tc.is_ie ? Tc.Rn.getElement(ev) : Tc.Rn.getTargetElement(ev);
    for (; el != null && el != calendar.element; el = el.parentNode);
    if (el == null) {
        window.calendar.callCloseHandler()
    }
};
Tc.DatePicker.prototype.updateWCH = function (other_el) {
    Tc.Rn.setupWCH_el(this.WCH, this.element, other_el)
};
Tc.DatePicker.prototype.show = function () {
    var rows = this.table.getElementsByTagName("tr");
    for (var i = rows.length; i > 0;) {
        var row = rows[--i];
        Tc.Rn.removeClass(row, "rowhilite");
        var cells = row.getElementsByTagName("td");
        for (var j = cells.length; j > 0;) {
            var cell = cells[--j];
            Tc.Rn.removeClass(cell, "hilite");
            Tc.Rn.removeClass(cell, "active")
        }
    }
    if (this.element.style.display != "block") {
        this.element.style.display = "block"
    }
    this.hidden = false;
    if (this.isPopup) {
        this.updateWCH();
        window.calendar = this;
        if (!this.noGrab) {
            Tc.Rn.addEvent(window.document, "keydown", Tc.DatePicker._keyEvent);
            Tc.Rn.addEvent(window.document, "keypress", Tc.DatePicker._keyEvent);
            Tc.Rn.addEvent(window.document, "mousedown", Tc.DatePicker._checkCalendar)
        }
    }
    this.hideShowCovered()
};
Tc.DatePicker.prototype.hide = function () {
    if (this.isPopup) {
        Tc.Rn.removeEvent(window.document, "keydown", Tc.DatePicker._keyEvent);
        Tc.Rn.removeEvent(window.document, "keypress", Tc.DatePicker._keyEvent);
        Tc.Rn.removeEvent(window.document, "mousedown", Tc.DatePicker._checkCalendar)
    }
    this.element.style.display = "none";
    Tc.Rn.hideWCH(this.WCH);
    this.hidden = true;
    this.hideShowCovered()
};
Tc.DatePicker.prototype.showAt = function (x, y) {
    var s = this.element.style;
    s.left = x + "px";
    s.top = y + "px";
    this.show()
};
Tc.DatePicker.prototype.showAtElement = function (el, opts) {
    var self = this;
    var p = Tc.Rn.getElementOffset(el);
    if (!opts || typeof opts != "string") {
        this.showAt(p.x, p.y + el.offsetHeight);
        return true
    }
    this.element.style.display = "block";
    var w = self.element.offsetWidth;
    var h = self.element.offsetHeight;
    self.element.style.display = "none";
    var valign = opts.substr(0, 1);
    var halign = "l";
    if (opts.length > 1) {
        halign = opts.substr(1, 1)
    }
    switch (valign) {
    case "T":
        p.y -= h;
        break;
    case "B":
        p.y += el.offsetHeight;
        break;
    case "C":
        p.y += (el.offsetHeight - h) / 2;
        break;
    case "t":
        p.y += el.offsetHeight - h;
        break;
    case "b":
        break
    }
    switch (halign) {
    case "L":
        p.x -= w;
        break;
    case "R":
        p.x += el.offsetWidth;
        break;
    case "C":
        p.x += (el.offsetWidth - w) / 2;
        break;
    case "l":
        p.x += el.offsetWidth - w;
        break;
    case "r":
        break
    }
    p.width = w;
    p.height = h;
    self.monthsCombo.style.display = "none";
    Tc.Rn.fixBoxPosition(p, 10);
    self.showAt(p.x, p.y)
};
Tc.DatePicker.prototype.setDateFormat = function (str) {
    this.dateFormat = str
};
Tc.DatePicker.prototype.setTtDateFormat = function (str) {
    this.ttDateFormat = str
};
Tc.DatePicker.prototype.parseDate = function (str, fmt) {
    if (!str) return this.setDate(this.date);
    if (!fmt) fmt = this.dateFormat;
    var date = Date.parseDate(str, fmt);
    return this.setDate(date)
};
Tc.DatePicker.prototype.hideShowCovered = function () {
    if (!Tc.is_ie5) return;
    var self = this;

    function getVisib(obj) {
        var value = obj.style.visibility;
        if (!value) {
            if (window.document.defaultView && typeof(window.document.defaultView.getComputedStyle) == "function") {
                if (!Tc.is_khtml) value = window.document.defaultView.getComputedStyle(obj, "").getPropertyValue("visibility");
                else value = ''
            } else if (obj.currentStyle) {
                value = obj.currentStyle.visibility
            } else value = ''
        }
        return value
    };
    var tags = ["applet", "iframe", "select"];
    var el = self.element;
    var p = Tc.Rn.getAbsolutePos(el);
    var EX1 = p.x;
    var EX2 = el.offsetWidth + EX1;
    var EY1 = p.y;
    var EY2 = el.offsetHeight + EY1;
    for (var k = tags.length; k > 0;) {
        var ar = window.document.getElementsByTagName(tags[--k]);
        var cc = null;
        for (var i = ar.length; i > 0;) {
            cc = ar[--i];
            p = Tc.Rn.getAbsolutePos(cc);
            var CX1 = p.x;
            var CX2 = cc.offsetWidth + CX1;
            var CY1 = p.y;
            var CY2 = cc.offsetHeight + CY1;
            if (self.hidden || (CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) {
                if (!cc.__msh_save_visibility) {
                    cc.__msh_save_visibility = getVisib(cc)
                }
                cc.style.visibility = cc.__msh_save_visibility
            } else {
                if (!cc.__msh_save_visibility) {
                    cc.__msh_save_visibility = getVisib(cc)
                }
                cc.style.visibility = "hidden"
            }
        }
    }
};
Tc.DatePicker.prototype._displayWeekdays = function () {
    var fdow = this.firstDayOfWeek;
    var cell = this.firstdayname;
    var weekend = Tc.DatePicker.i18n("WEEKEND");
    for (k = 1;
    (k <= this.monthsInRow) && (cell); ++k) {
        for (var i = 0; i < 7; ++i) {
            cell.className = " day name";
            if ((!this.weekNumbers) && (i == 0) && (k != 1)) {
                Tc.Rn.addClass(cell, "month-left-border")
            }
            if ((i == 6) && (k != this.monthsInRow)) {
                Tc.Rn.addClass(cell, "month-right-border")
            }
            var realday = (i + fdow) % 7;
            if ((!this.disableFdowClick) && ((this.params && this.params.fdowClick) || i)) {
                if (Tc.DatePicker.i18n("DAY_FIRST") != null) {
                    cell.ttip = Tc.DatePicker.i18n("DAY_FIRST").replace("%s", Tc.DatePicker.i18n(realday, "dn"))
                }
                cell.navtype = 100;
                cell.calendar = this;
                cell.fdow = realday;
                Tc.DatePicker._add_evs(cell)
            }
            if ((weekend != null) && (weekend.indexOf(realday.toString()) != -1)) {
                Tc.Rn.addClass(cell, "weekend")
            }
            cell.innerHTML = Tc.DatePicker.i18n((i + fdow) % 7, "sdn");
            cell = cell.nextSibling
        }
        if (this.weekNumbers && cell) {
            cell = cell.nextSibling
        }
    }
};
Tc.Rn.compareDates = function (date1, date2) {
    if (Tc.DatePicker.prefs.sortOrder == "asc") return date1 - date2;
    else return date2 - date1
};
Tc.DatePicker.prototype._hideCombos = function () {
    this.monthsCombo.style.display = "none";
    this.yearsCombo.style.display = "none";
    this.histCombo.style.display = "none";
    this.updateWCH()
};
Tc.DatePicker.prototype._dragStart = function (ev) {
    ev || (ev = window.event);
    if (this.dragging) {
        return
    }
    this.dragging = true;
    var posX = ev.clientX + window.document.body.scrollLeft;
    var posY = ev.clientY + window.document.body.scrollTop;
    var st = this.element.style;
    this.xOffs = posX - parseInt(st.left);
    this.yOffs = posY - parseInt(st.top);
    Tc.Rn.addEvent(window.document, "mousemove", Tc.DatePicker.calDragIt);
    Tc.Rn.addEvent(window.document, "mouseover", Tc.DatePicker.calDragIt);
    Tc.Rn.addEvent(window.document, "mouseup", Tc.DatePicker.calDragEnd)
};
Date._MD = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
Date.SECOND = 1000;
Date.MINUTE = 60 * Date.SECOND;
Date.HOUR = 60 * Date.MINUTE;
Date.DAY = 24 * Date.HOUR;
Date.WEEK = 7 * Date.DAY;
Date.prototype.getMonthDays = function (month) {
    var year = this.getFullYear();
    if (typeof month == "undefined") {
        month = this.getMonth()
    }
    if (((0 == (year % 4)) && ((0 != (year % 100)) || (0 == (year % 400)))) && month == 1) {
        return 29
    } else {
        return Date._MD[month]
    }
};
Date.prototype.getDayOfYear = function () {
    var now = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
    var then = new Date(this.getFullYear(), 0, 0, 0, 0, 0);
    var time = now - then;
    return Math.round(time / Date.DAY)
};
Date.prototype.getWeekNumber = function () {
    var d = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
    var DoW = d.getDay();
    d.setDate(d.getDate() - (DoW + 6) % 7 + 3);
    var ms = d.valueOf();
    d.setMonth(0);
    d.setDate(4);
    return Math.round((ms - d.valueOf()) / (7 * 864e5)) + 1
};
Date.prototype.equalsTo = function (date) {
    return ((this.getFullYear() == date.getFullYear()) && (this.getMonth() == date.getMonth()) && (this.getDate() == date.getDate()) && (this.getHours() == date.getHours()) && (this.getMinutes() == date.getMinutes()))
};
Date.prototype.dateEqualsTo = function (date) {
    return ((this.getFullYear() == date.getFullYear()) && (this.getMonth() == date.getMonth()) && (this.getDate() == date.getDate()))
};
Date.prototype.setDateOnly = function (date) {
    var tmp = new Date(date);
    this.setDate(1);
    this.setFullYear(tmp.getFullYear());
    this.setMonth(tmp.getMonth());
    this.setDate(tmp.getDate())
};
Date.prototype.print = function (str) {
    var m = this.getMonth();
    var d = this.getDate();
    var y = this.getFullYear();
    var wn = this.getWeekNumber();
    var w = this.getDay();
    var s = {};
    var hr = this.getHours();
    var pm = (hr >= 12);
    var ir = (pm) ? (hr - 12) : hr;
    var dy = this.getDayOfYear();
    if (ir == 0) ir = 12;
    var min = this.getMinutes();
    var sec = this.getSeconds();
    s["%a"] = Tc.DatePicker.i18n(w, "sdn");
    s["%A"] = Tc.DatePicker.i18n(w, "dn");
    s["%b"] = Tc.DatePicker.i18n(m, "smn");
    s["%B"] = Tc.DatePicker.i18n(m, "mn");
    s["%C"] = 1 + Math.floor(y / 100);
    s["%d"] = (d < 10) ? ("0" + d) : d;
    s["%e"] = d;
    s["%H"] = (hr < 10) ? ("0" + hr) : hr;
    s["%I"] = (ir < 10) ? ("0" + ir) : ir;
    s["%j"] = (dy < 100) ? ((dy < 10) ? ("00" + dy) : ("0" + dy)) : dy;
    s["%k"] = hr ? hr : "0";
    s["%l"] = ir;
    s["%m"] = (m < 9) ? ("0" + (1 + m)) : (1 + m);
    s["%M"] = (min < 10) ? ("0" + min) : min;
    s["%n"] = "\n";
    s["%p"] = pm ? "PM" : "AM";
    s["%P"] = pm ? "pm" : "am";
    s["%s"] = Math.floor(this.getTime() / 1000);
    s["%S"] = (sec < 10) ? ("0" + sec) : sec;
    s["%t"] = "\t";
    s["%U"] = s["%W"] = s["%V"] = (wn < 10) ? ("0" + wn) : wn;
    s["%u"] = (w == 0) ? 7 : w;
    s["%w"] = w ? w : "0";
    s["%y"] = '' + y % 100;
    if (s["%y"] < 10) {
        s["%y"] = "0" + s["%y"]
    }
    s["%Y"] = y;
    s["%%"] = "%";
    var re = /%./g;
    var a = str.match(re) || [];
    for (var i = 0; i < a.length; i++) {
        var tmp = s[a[i]];
        if (tmp) {
            re = new RegExp(a[i], 'g');
            str = str.replace(re, tmp)
        }
    }
    return str
};
Date.parseDate = function (str, format) {
    var fmt = format,
        strPointer = 0,
        token = null,
        parseFunc = null,
        valueLength = null,
        valueRange = null,
        valueType = null,
        date = new Date(),
        values = {};
    var numberRules = ["%d", "%H", "%I", "%m", "%M", "%S", "%s", "%W", "%u", "%w", "%y", "%e", "%k", "%l", "%s", "%Y", "%C"];

    function isNumberRule(rule) {
        if (Tc.Rn.arrIndexOf(numberRules, rule) != -1) {
            return true
        }
        return false
    }
    function parseString() {
        for (var iString = valueRange[0]; iString < valueRange[1]; ++iString) {
            var value = Tc.DatePicker.i18n(iString, valueType);
            if (!value) {
                return null
            }
            if (value == str.substr(strPointer, value.length)) {
                valueLength = value.length;
                return iString
            }
        }
        return null
    }
    function parseNumber() {
        var val = str.substr(strPointer, valueLength);
        if (val.length != valueLength || /$\d+^/.test(val)) {
            return null
        }
        return parseInt(val, 10)
    }
    function parseAMPM() {
        var result = (str.substr(strPointer, valueLength).toLowerCase() == Tc.DatePicker.i18n("pm", "ampm")) ? true : false;
        return result || ((str.substr(strPointer, valueLength).toLowerCase() == Tc.DatePicker.i18n("am", "ampm")) ? false : null)
    }
    function parseCharacter() {
        return ""
    }
    function parseRule(rule) {
        return (values[rule] = parseFunc())
    }
    function wasParsed(rule) {
        if (typeof rule == "undefined" || rule === null) {
            return false
        }
        return true
    }
    function getValue() {
        for (var i = 0; i < arguments.length; ++i) {
            if (arguments[i] !== null && typeof arguments[i] != "undefined" && !isNaN(arguments[i])) {
                return arguments[i]
            }
        }
        return null
    }
    if (typeof fmt != "string" || typeof str != "string" || str == "" || fmt == "") {
        return null
    }
    while (fmt) {
        parseFunc = parseNumber;
        valueLength = fmt.indexOf("%");
        valueLength = (valueLength == -1) ? fmt.length : valueLength;
        token = fmt.slice(0, valueLength);
        if (token != str.substr(strPointer, valueLength)) {
            return null
        }
        strPointer += valueLength;
        fmt = fmt.slice(valueLength);
        if (fmt == "") {
            break
        }
        token = fmt.slice(0, 2);
        valueLength = 2;
        switch (token) {
        case "%A":
        case "%a":
            {
                valueType = (token == "%A") ? "dn" : "sdn";
                valueRange = [0, 7];
                parseFunc = parseString;
                break
            }
        case "%B":
        case "%b":
            {
                valueType = (token == "%B") ? "mn" : "smn";
                valueRange = [0, 12];
                parseFunc = parseString;
                break
            }
        case "%p":
        case "%P":
            {
                parseFunc = parseAMPM;
                break
            }
        case "%Y":
            {
                valueLength = 4;
                if (isNumberRule(fmt.substr(2, 2))) {
                    return null
                }
                while (isNaN(parseInt(str.charAt(strPointer + valueLength - 1))) && valueLength > 0) {
                    --valueLength
                }
                if (valueLength == 0) {
                    break
                }
                break
            }
        case "%C":
        case "%s":
            {
                valueLength = 1;
                if (isNumberRule(fmt.substr(2, 2))) {
                    return null
                }
                while (!isNaN(parseInt(str.charAt(strPointer + valueLength)))) {
                    ++valueLength
                }
                break
            }
        case "%k":
        case "%l":
        case "%e":
            {
                valueLength = 1;
                if (isNumberRule(fmt.substr(2, 2))) {
                    return null
                }
                if (!isNaN(parseInt(str.charAt(strPointer + 1)))) {
                    ++valueLength
                }
                break
            }
        case "%j":
            valueLength = 3;
            break;
        case "%u":
        case "%w":
            valueLength = 1;
        case "%y":
        case "%m":
        case "%d":
        case "%W":
        case "%H":
        case "%I":
        case "%M":
        case "%S":
            {
                break
            }
        }
        if (parseRule(token) === null) {
            return null
        }
        strPointer += valueLength;
        fmt = fmt.slice(2)
    }
    if (wasParsed(values["%s"])) {
        date.setTime(values["%s"] * 1000)
    } else {
        var year = getValue(values["%Y"], values["%y"] + --values["%C"] * 100, values["%y"] + (date.getFullYear() - date.getFullYear() % 100), values["%C"] * 100 + date.getFullYear() % 100);
        var month = getValue(values["%m"] - 1, values["%b"], values["%B"]);
        var day = getValue(values["%d"] || values["%e"]);
        if (day === null || month === null) {
            var dayOfWeek = getValue(values["%a"], values["%A"], values["%u"] == 7 ? 0 : values["%u"], values["%w"])
        }
        var hour = getValue(values["%H"], values["%k"]);
        if (hour === null && (wasParsed(values["%p"]) || wasParsed(values["%P"]))) {
            var pm = getValue(values["%p"], values["%P"]);
            hour = getValue(values["%I"], values["%l"]);
            hour = pm ? ((hour == 12) ? 12 : (hour + 12)) : ((hour == 12) ? (0) : hour)
        }
        if (year || year === 0) {
            date.setFullYear(year)
        }
        if (month || month === 0) {
            date.setMonth(month)
        }
        if (day || day === 0) {
            date.setDate(day)
        }
        if (wasParsed(values["%j"])) {
            date.setMonth(0);
            date.setDate(1);
            date.setDate(values["%j"])
        }
        if (wasParsed(dayOfWeek)) {
            date.setDate(date.getDate() + (dayOfWeek - date.getDay()))
        }
        if (wasParsed(values["%W"])) {
            var weekNumber = date.getWeekNumber();
            if (weekNumber != values["%W"]) {
                date.setDate(date.getDate() + (values["%W"] - weekNumber) * 7)
            }
        }
        if (hour !== null) {
            date.setHours(hour)
        }
        if (wasParsed(values["%M"])) {
            date.setMinutes(values["%M"])
        }
        if (wasParsed(values["%S"])) {
            date.setSeconds(values["%S"])
        }
    }
    if (date.print(format) != str) {
        return null
    }
    return date
};
Date.prototype.__msh_oldSetFullYear = Date.prototype.setFullYear;
Date.prototype.setFullYear = function (y) {
    var d = new Date(this);
    d.__msh_oldSetFullYear(y);
    if (d.getMonth() != this.getMonth()) this.setDate(28);
    this.__msh_oldSetFullYear(y)
};
Date.prototype.compareDatesOnly = function (date1, date2) {
    var year1 = date1.getYear();
    var year2 = date2.getYear();
    var month1 = date1.getMonth();
    var month2 = date2.getMonth();
    var day1 = date1.getDate();
    var day2 = date2.getDate();
    if (year1 > year2) {
        return -1
    }
    if (year2 > year1) {
        return 1
    }
    if (month1 > month2) {
        return -1
    }
    if (month2 > month1) {
        return 1
    }
    if (day1 > day2) {
        return -1
    }
    if (day2 > day1) {
        return 1
    }
    return 0
};
Tc.Setup = function () {};
Tc.Setup.test = true;
Tc.DatePicker.setup = function (params) {
    paramsList = ["id"];

    function param_default(pname, def) {
        if (typeof params[pname] == "undefined") {
            params[pname] = def
        }
        paramsList.push(pname)
    };
    params.id = Tc.Rn.generateID("calendar");
    param_default("inputField", null);
    param_default("displayArea", null);
    param_default("button", null);
    param_default("eventName", "click");
    param_default("closeEventName", null);
    param_default("ifFormat", "%Y/%m/%d");
    param_default("daFormat", "%Y/%m/%d");
    param_default("singleClick", true);
    param_default("disableFunc", null);
    param_default("dateStatusFunc", params["disableFunc"]);
    param_default("dateText", null);
    param_default("firstDay", null);
    param_default("align", "Br");
    param_default("range", [1900, 2999]);
    param_default("weekNumbers", true);
    param_default("flat", null);
    param_default("flatCallback", null);
    param_default("onSelect", null);
    param_default("onClose", null);
    param_default("onUpdate", null);
	param_default("onShow", null);
    param_default("date", null);
    param_default("showsTime", false);
    param_default("sortOrder", "asc");
    param_default("timeFormat", "24");
    param_default("timeInterval", null);
    param_default("electric", true);
    param_default("step", 2);
    param_default("position", null);
    param_default("cache", false);
    param_default("showOthers", false);
    param_default("multiple", null);
    param_default("saveDate", null);
    param_default("fdowClick", false);
    param_default("titleHtml", null);
    param_default("noHelp", false);
    param_default("noCloseButton", false);
    param_default("disableYearNav", false);
    param_default("disableFdowChange", false);
    if (params.weekNumbers) {
        params.disableFdowChange = true;
        params.firstDay = 1
    }
    param_default("disableDrag", false);
    param_default("numberMonths", 1);
    if ((params.numberMonths > 12) || (params.numberMonths < 1)) {
        params.numberMonths = 1
    }
    if (params.numberMonths > 1) {
        params.showOthers = false
    }
    params.numberMonths = parseInt(params.numberMonths, 10);
    param_default("controlMonth", 1);
    if ((params.controlMonth > params.numberMonths) || (params.controlMonth < 1)) {
        params.controlMonth = 1
    }
    params.controlMonth = parseInt(params.controlMonth, 10);
    param_default("vertical", false);
    if (params.monthsInRow > params.numberMonths) {
        params.monthsInRow = params.numberMonths
    }
    param_default("monthsInRow", params.numberMonths);
    params.monthsInRow = parseInt(params.monthsInRow, 10);
    param_default("multiple", false);
    if (params.multiple) {
        params.singleClick = false
    }
    param_default("canType", false);
    var tmp = ["inputField", "displayArea", "button"];
    for (var i in tmp) {
        if (typeof params[tmp[i]] == "string") {
            params[tmp[i]] = document.getElementById(params[tmp[i]])
        }
    }
    if (!params.inputField) {
        params.canType = false
    } else {
        params.inputField.setAttribute("autocomplete", "off")
    }
    if (!(params.flat || params.multiple || params.inputField || params.displayArea || params.button)) {
        alert("Calendar.setup '" + params.id + "':\n  Nothing to setup (no fields found).  Please check your code");
        return false
    }
    if (((params.timeInterval) && ((params.timeInterval !== Math.floor(params.timeInterval)) || ((60 % params.timeInterval !== 0) && (params.timeInterval % 60 !== 0)))) || (params.timeInterval > 360)) {
        alert("'" + params.id + "': timeInterval option can only have the following number of minutes:\n1, 2, 3, 4, 5, 6, 10, 15, 30,  60, 120, 180, 240, 300, 360 ");
        params.timeInterval = null
    }
    if (params.date && !Date.parse(params.date)) {
        alert("'" + params.id + "' Start Date Invalid: " + params.date + ".\nSee date option.\nDefaulting to today.");
        params.date = null
    }
    if (params.saveDate) {
        param_default("cookiePrefix", window.location.href + "--" + params.button.id);
        var cookieName = params.cookiePrefix;
        var newdate = Tc.Rn.getCookie(cookieName);
        if (newdate != null) {
            document.getElementById(params.inputField.id).value = newdate
        }
    }
    for (var ii in params) {
        if (typeof params.constructor.prototype[ii] != "undefined") {
            continue
        }
        if (Tc.Rn.arrIndexOf(paramsList, ii) == -1) {
            alert("Wrong config option: " + ii)
        }
    }
    function onSelect(cal) {
        var p = cal.params;
        var update = (cal.dateClicked || p.electric);
        if (update && p.flat) {
            if (typeof p.flatCallback == "function") {
                if (!p.multiple) p.flatCallback(cal)
            } else alert("'" + cal.id + "': No flatCallback given -- doing nothing.");
            return false
        }
        if (update && p.inputField) {
            p.inputField.value = cal.currentDate.print(p.ifFormat);
            if (typeof p.inputField.onchange == "function") p.inputField.onchange()
        }
        if (update && p.displayArea) p.displayArea.innerHTML = cal.currentDate.print(p.daFormat);
        if (update && p.singleClick && cal.dateClicked) cal.callCloseHandler();
        if (update && typeof p.onUpdate == "function") p.onUpdate(cal);
        if (p.saveDate) {
            var cookieName = p.cookiePrefix;
            Tc.Rn.writeCookie(cookieName, p.inputField.value, null, '/', p.saveDate)
        }
    };
    if (params.flat != null) {
        if (typeof params.flat == "string") params.flat = document.getElementById(params.flat);
        if (!params.flat) {
            alert("Calendar.setup '" + params.id + "':\n  Flat specified but can't find parent.");
            return false
        }
        var cal = new Tc.DatePicker(params.firstDay, params.date, params.onSelect || onSelect);
        cal.disableFdowClick = params.disableFdowChange;
        cal.showsOtherMonths = params.showOthers;
        cal.showsTime = params.showsTime;
        cal.time24 = (params.timeFormat == "24");
        cal.timeInterval = params.timeInterval;
        cal.params = params;
        cal.weekNumbers = params.weekNumbers;
        cal.sortOrder = params.sortOrder.toLowerCase();
        cal.setRange(params.range[0], params.range[1]);
        cal.setDateStatusHandler(params.dateStatusFunc);
        cal.getDateText = params.dateText;
        cal.numberMonths = params.numberMonths;
        cal.controlMonth = params.controlMonth;
        cal.vertical = params.vertical;
        cal.yearStep = params.step;
        cal.monthsInRow = params.monthsInRow;
        cal.helpButton = !params.noHelp;
        cal.closeButton = !params.noCloseButton;
        cal.yearNav = !params.disableYearNav;
        if (params.ifFormat) {
            cal.setDateFormat(params.ifFormat)
        }
        if (params.inputField && params.inputField.type == "text" && typeof params.inputField.value == "string") {
            cal.parseDate(params.inputField.value)
        }
        if (params.multiple) {
            cal.setMultipleDates(params.multiple)
        }
        cal.create(params.flat);
        cal.show();
        return cal
    }
    var triggerEl = params.button || params.displayArea || params.inputField;
    if (params.canType) {
        function cancelBubble(ev) {
            ev = ev || window.event;
            if (Tc.is_ie) {
                ev.cancelBubble = true
            } else {
                ev.stopPropagation()
            }
        }
        Tc.Rn.addEvent(params.inputField, "mousedown", cancelBubble);
        Tc.Rn.addEvent(params.inputField, "keydown", cancelBubble);
        Tc.Rn.addEvent(params.inputField, "keypress", cancelBubble);
        Tc.Rn.addEvent(params.inputField, "keyup", function (ev) {
            var format = params.inputField ? params.ifFormat : params.daFormat;
            var parsedDate = Date.parseDate(params.inputField.value, format);
            var cal = window.calendar;
            if (cal && parsedDate && !cal.hidden) {
                cal.setDate(parsedDate)
            }
        })
    }
    triggerEl["on" + params.eventName] = function () {
        var dateEl = params.inputField || params.displayArea;
        if ((!params.canType || params.inputField != triggerEl) && triggerEl.blur) {
            triggerEl.blur()
        }
        var dateFmt = params.inputField ? params.ifFormat : params.daFormat;
        var mustCreate = false;
        var cal = window.calendar;
        if (params.canType && (params.inputField == triggerEl) && cal && !cal.hidden) {
            return
        }
        if (!(cal && params.cache)) {
            window.calendar = cal = new Tc.DatePicker(params.firstDay, params.date, params.onSelect || onSelect, params.onClose ||
            function (cal) {
                if (params.cache) cal.hide();
                else cal.destroy()
            });
            cal.disableFdowClick = params.disableFdowChange;
            cal.showsTime = params.showsTime;
            cal.time24 = (params.timeFormat == "24");
            cal.timeInterval = params.timeInterval;
            cal.weekNumbers = params.weekNumbers;
            cal.numberMonths = params.numberMonths;
            cal.controlMonth = params.controlMonth;
            cal.vertical = params.vertical;
            cal.monthsInRow = params.monthsInRow;
            cal.historyDateFormat = params.ifFormat || params.daFormat;
            cal.helpButton = !params.noHelp;
            cal.disableDrag = params.disableDrag;
            cal.closeButton = !params.noCloseButton;
            cal.yearNav = !params.disableYearNav;
            cal.sortOrder = params.sortOrder.toLowerCase();
            mustCreate = true
        } else {
            if (params.date) cal.setDate(params.date);
            cal.hide()
        }
        if (params.multiple) {
            cal.setMultipleDates(params.multiple)
        }
        cal.showsOtherMonths = params.showOthers;
        cal.yearStep = params.step;
        cal.setRange(params.range[0], params.range[1]);
        cal.params = params;
        cal.setDateStatusHandler(params.dateStatusFunc);
        cal.getDateText = params.dateText;
        cal.setDateFormat(dateFmt);
        if (mustCreate) cal.create();

        if (dateEl) {
            var dateValue;
            if (dateEl.value) {
                dateValue = dateEl.value
            } else {
                dateValue = dateEl.innerHTML
            }
            if (dateValue != "") {
                var parsedDate = Date.parseDate(dateEl.value || dateEl.innerHTML, dateFmt);
                if (parsedDate != null) {
                    cal.setDate(parsedDate)
                }
            }

			if(typeof params.onShow == "function")params.onShow(cal);
        }


        if (!params.position) cal.showAtElement(params.button || params.displayArea || params.inputField, params.align);
        else cal.showAt(params.position[0], params.position[1]);
        return false
    };
    if (params.closeEventName) {
        triggerEl["on" + params.closeEventName] = function () {
            if (window.calendar) window.calendar.callCloseHandler()
        }
    }
    return cal
};

Tc.DatePicker._DN = new Array("Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado", "Domingo");

Tc.DatePicker._SDN = new Array("Dom", "Lun", "Mar", "Mie", "Jue", "Vie", "Sab", "Dom");

Tc.DatePicker._MN = new Array("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre");

Tc.DatePicker._SMN = new Array("Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic");

Tc.DatePicker._TT_sp = Tc.DatePicker._TT = {};
Tc.DatePicker._TT["INFO"] = "Información del Calendario";

Tc.DatePicker._TT["ABOUT"] = "Selección de Fechas:\n" + "- Use  \xab, \xbb para seleccionar el año\n" + "- Use " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " para seleccionar el mes\n" + "- Mantenga presionado el botón del ratón en cualquiera de las opciones superiores para un acceso rapido .";

Tc.DatePicker._TT["ABOUT_TIME"] = "\n\n" + "Selección del Reloj:\n" + "- Seleccione la hora para cambiar el reloj\n" + "- o presione  Shift-click para disminuirlo\n" + "- o presione click y arrastre del ratón para una selección rapida.";

Tc.DatePicker._TT["PREV_YEAR"] = "Año anterior (Presione para menu)";
Tc.DatePicker._TT["PREV_MONTH"] = "Mes Anterior (Presione para menu)";
Tc.DatePicker._TT["GO_TODAY"] = "Ir a Hoy";
Tc.DatePicker._TT["NEXT_MONTH"] = "Mes Siguiente (Presione para menu)";
Tc.DatePicker._TT["NEXT_YEAR"] = "Año Siguiente (Presione para menu)";
Tc.DatePicker._TT["SEL_DATE"] = "Seleccione fecha";
Tc.DatePicker._TT["DRAG_TO_MOVE"] = "Arrastre y mueva";
Tc.DatePicker._TT["PART_TODAY"] = " (Hoy)";

Tc.DatePicker._TT["DAY_FIRST"] = "Mostrar %s primero";

Tc.DatePicker._TT["WEEKEND"] = "0,6";

Tc.DatePicker._TT["CLOSE"] = "Cerrar";
Tc.DatePicker._TT["TODAY"] = "Hoy";
Tc.DatePicker._TT["TIME_PART"] = "(Shift-)Click o arrastra para cambar el valor";

Tc.DatePicker._TT["DEF_DATE_FORMAT"] = "%dd-%mm-%yy";
Tc.DatePicker._TT["TT_DATE_FORMAT"] = "%A, %e de %B de %Y";

Tc.DatePicker._TT["WK"] = "Sm";
Tc.DatePicker._TT["TIME"] = "Hora:";

if (Tc.DatePicker._DN) Tc.DatePicker._TT._DN = Tc.DatePicker._DN;
if (Tc.DatePicker._SDN) Tc.DatePicker._TT._SDN = Tc.DatePicker._SDN;
if (Tc.DatePicker._SDN_len) Tc.DatePicker._TT._SDN_len = Tc.DatePicker._SDN_len;
if (Tc.DatePicker._MN) Tc.DatePicker._TT._MN = Tc.DatePicker._MN;
if (Tc.DatePicker._SMN) Tc.DatePicker._TT._SMN = Tc.DatePicker._SMN;
if (Tc.DatePicker._SMN_len) Tc.DatePicker._TT._SMN_len = Tc.DatePicker._SMN_len;
Tc.DatePicker._DN = Tc.DatePicker._SDN = Tc.DatePicker._SDN_len = Tc.DatePicker._MN = Tc.DatePicker._SMN = Tc.DatePicker._SMN_len = null;
