/*
Copyright (c) 2008, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:
http://developer.yahoo.net/yui/license.txt
version: 2.5.2
*/
(function() {
    YAHOO.util.Config = function(D) {
        if (D) {
            this.init(D);
        }
    };
    var B = YAHOO.lang,
    C = YAHOO.util.CustomEvent,
    A = YAHOO.util.Config;
    A.CONFIG_CHANGED_EVENT = "configChanged";
    A.BOOLEAN_TYPE = "boolean";
    A.prototype = {
        owner: null,
        queueInProgress: false,
        config: null,
        initialConfig: null,
        eventQueue: null,
        configChangedEvent: null,
        init: function(D) {
            this.owner = D;
            this.configChangedEvent = this.createEvent(A.CONFIG_CHANGED_EVENT);
            this.configChangedEvent.signature = C.LIST;
            this.queueInProgress = false;
            this.config = {};
            this.initialConfig = {};
            this.eventQueue = [];
        },
        checkBoolean: function(D) {
            return (typeof D == A.BOOLEAN_TYPE);
        },
        checkNumber: function(D) {
            return (!isNaN(D));
        },
        fireEvent: function(D, F) {
            var E = this.config[D];
            if (E && E.event) {
                E.event.fire(F);
            }
        },
        addProperty: function(E, D) {
            E = E.toLowerCase();
            this.config[E] = D;
            D.event = this.createEvent(E, {
                scope: this.owner
            });
            D.event.signature = C.LIST;
            D.key = E;
            if (D.handler) {
                D.event.subscribe(D.handler, this.owner);
            }
            this.setProperty(E, D.value, true);
            if (!D.suppressEvent) {
                this.queueProperty(E, D.value);
            }
        },
        getConfig: function() {
            var D = {},
            F, E;
            for (F in this.config) {
                E = this.config[F];
                if (E && E.event) {
                    D[F] = E.value;
                }
            }
            return D;
        },
        getProperty: function(D) {
            var E = this.config[D.toLowerCase()];
            if (E && E.event) {
                return E.value;
            } else {
                return undefined;
            }
        },
        resetProperty: function(D) {
            D = D.toLowerCase();
            var E = this.config[D];
            if (E && E.event) {
                if (this.initialConfig[D] && !B.isUndefined(this.initialConfig[D])) {
                    this.setProperty(D, this.initialConfig[D]);
                    return true;
                }
            } else {
                return false;
            }
        },
        setProperty: function(E, G, D) {
            var F;
            E = E.toLowerCase();
            if (this.queueInProgress && !D) {
                this.queueProperty(E, G);
                return true;
            } else {
                F = this.config[E];
                if (F && F.event) {
                    if (F.validator && !F.validator(G)) {
                        return false;
                    } else {
                        F.value = G;
                        if (!D) {
                            this.fireEvent(E, G);
                            this.configChangedEvent.fire([E, G]);
                        }
                        return true;
                    }
                } else {
                    return false;
                }
            }
        },
        queueProperty: function(S, P) {
            S = S.toLowerCase();
            var R = this.config[S],
            K = false,
            J,
            G,
            H,
            I,
            O,
            Q,
            F,
            M,
            N,
            D,
            L,
            T,
            E;
            if (R && R.event) {
                if (!B.isUndefined(P) && R.validator && !R.validator(P)) {
                    return false;
                } else {
                    if (!B.isUndefined(P)) {
                        R.value = P;
                    } else {
                        P = R.value;
                    }
                    K = false;
                    J = this.eventQueue.length;
                    for (L = 0; L < J; L++) {
                        G = this.eventQueue[L];
                        if (G) {
                            H = G[0];
                            I = G[1];
                            if (H == S) {
                                this.eventQueue[L] = null;
                                this.eventQueue.push([S, (!B.isUndefined(P) ? P: I)]);
                                K = true;
                                break;
                            }
                        }
                    }
                    if (!K && !B.isUndefined(P)) {
                        this.eventQueue.push([S, P]);
                    }
                }
                if (R.supercedes) {
                    O = R.supercedes.length;
                    for (T = 0; T < O; T++) {
                        Q = R.supercedes[T];
                        F = this.eventQueue.length;
                        for (E = 0; E < F; E++) {
                            M = this.eventQueue[E];
                            if (M) {
                                N = M[0];
                                D = M[1];
                                if (N == Q.toLowerCase()) {
                                    this.eventQueue.push([N, D]);
                                    this.eventQueue[E] = null;
                                    break;
                                }
                            }
                        }
                    }
                }
                return true;
            } else {
                return false;
            }
        },
        refireEvent: function(D) {
            D = D.toLowerCase();
            var E = this.config[D];
            if (E && E.event && !B.isUndefined(E.value)) {
                if (this.queueInProgress) {
                    this.queueProperty(D);
                } else {
                    this.fireEvent(D, E.value);
                }
            }
        },
        applyConfig: function(D, G) {
            var F, E;
            if (G) {
                E = {};
                for (F in D) {
                    if (B.hasOwnProperty(D, F)) {
                        E[F.toLowerCase()] = D[F];
                    }
                }
                this.initialConfig = E;
            }
            for (F in D) {
                if (B.hasOwnProperty(D, F)) {
                    this.queueProperty(F, D[F]);
                }
            }
        },
        refresh: function() {
            var D;
            for (D in this.config) {
                this.refireEvent(D);
            }
        },
        fireQueue: function() {
            var E, H, D, G, F;
            this.queueInProgress = true;
            for (E = 0; E < this.eventQueue.length; E++) {
                H = this.eventQueue[E];
                if (H) {
                    D = H[0];
                    G = H[1];
                    F = this.config[D];
                    F.value = G;
                    this.fireEvent(D, G);
                }
            }
            this.queueInProgress = false;
            this.eventQueue = [];
        },
        subscribeToConfigEvent: function(E, F, H, D) {
            var G = this.config[E.toLowerCase()];
            if (G && G.event) {
                if (!A.alreadySubscribed(G.event, F, H)) {
                    G.event.subscribe(F, H, D);
                }
                return true;
            } else {
                return false;
            }
        },
        unsubscribeFromConfigEvent: function(D, E, G) {
            var F = this.config[D.toLowerCase()];
            if (F && F.event) {
                return F.event.unsubscribe(E, G);
            } else {
                return false;
            }
        },
        toString: function() {
            var D = "Config";
            if (this.owner) {
                D += " [" + this.owner.toString() + "]";
            }
            return D;
        },
        outputEventQueue: function() {
            var D = "",
            G, E, F = this.eventQueue.length;
            for (E = 0; E < F; E++) {
                G = this.eventQueue[E];
                if (G) {
                    D += G[0] + "=" + G[1] + ", ";
                }
            }
            return D;
        },
        destroy: function() {
            var E = this.config,
            D, F;
            for (D in E) {
                if (B.hasOwnProperty(E, D)) {
                    F = E[D];
                    F.event.unsubscribeAll();
                    F.event = null;
                }
            }
            this.configChangedEvent.unsubscribeAll();
            this.configChangedEvent = null;
            this.owner = null;
            this.config = null;
            this.initialConfig = null;
            this.eventQueue = null;
        }
    };
    A.alreadySubscribed = function(E, H, I) {
        var F = E.subscribers.length,
        D, G;
        if (F > 0) {
            G = F - 1;
            do {
                D = E.subscribers[G];
                if (D && D.obj == I && D.fn == H) {
                    return true;
                }
            } while ( G --);
        }
        return false;
    };
    YAHOO.lang.augmentProto(A, YAHOO.util.EventProvider);
} ());
YAHOO.widget.DateMath = {
    DAY: "D",
    WEEK: "W",
    YEAR: "Y",
    MONTH: "M",
    ONE_DAY_MS: 1000 * 60 * 60 * 24,
    WEEK_ONE_JAN_DATE: 1,
    add: function(A, D, C) {
        var F = new Date(A.getTime());
        switch (D) {
        case this.MONTH:
            var E = A.getMonth() + C;
            var B = 0;
            if (E < 0) {
                while (E < 0) {
                    E += 12;
                    B -= 1;
                }
            } else {
                if (E > 11) {
                    while (E > 11) {
                        E -= 12;
                        B += 1;
                    }
                }
            }
            F.setMonth(E);
            F.setFullYear(A.getFullYear() + B);
            break;
        case this.DAY:
            this._addDays(F, C);
            break;
        case this.YEAR:
            F.setFullYear(A.getFullYear() + C);
            break;
        case this.WEEK:
            this._addDays(F, (C * 7));
            break;
        }
        return F;
    },
    _addDays: function(D, C) {
        if (YAHOO.env.ua.webkit && YAHOO.env.ua.webkit < 420) {
            if (C < 0) {
                for (var B = -128; C < B; C -= B) {
                    D.setDate(D.getDate() + B);
                }
            } else {
                for (var A = 96; C > A; C -= A) {
                    D.setDate(D.getDate() + A);
                }
            }
        }
        D.setDate(D.getDate() + C);
    },
    subtract: function(A, C, B) {
        return this.add(A, C, (B * -1));
    },
    before: function(C, B) {
        var A = B.getTime();
        if (C.getTime() < A) {
            return true;
        } else {
            return false;
        }
    },
    after: function(C, B) {
        var A = B.getTime();
        if (C.getTime() > A) {
            return true;
        } else {
            return false;
        }
    },
    between: function(B, A, C) {
        if (this.after(B, A) && this.before(B, C)) {
            return true;
        } else {
            return false;
        }
    },
    getJan1: function(A) {
        return this.getDate(A, 0, 1);
    },
    getDayOffset: function(B, D) {
        var C = this.getJan1(D);
        var A = Math.ceil((B.getTime() - C.getTime()) / this.ONE_DAY_MS);
        return A;
    },
    getWeekNumber: function(E, B, H) {
        B = B || 0;
        H = H || this.WEEK_ONE_JAN_DATE;
        var I = this.clearTime(E),
        M,
        N;
        if (I.getDay() === B) {
            M = I;
        } else {
            M = this.getFirstDayOfWeek(I, B);
        }
        var J = M.getFullYear(),
        C = M.getTime();
        N = new Date(M.getTime() + 6 * this.ONE_DAY_MS);
        var G;
        if (J !== N.getFullYear() && N.getDate() >= H) {
            G = 1;
        } else {
            var F = this.clearTime(this.getDate(J, 0, H)),
            A = this.getFirstDayOfWeek(F, B);
            var K = Math.round((I.getTime() - A.getTime()) / this.ONE_DAY_MS);
            var L = K % 7;
            var D = (K - L) / 7;
            G = D + 1;
        }
        return G;
    },
    getFirstDayOfWeek: function(D, A) {
        A = A || 0;
        var B = D.getDay(),
        C = (B - A + 7) % 7;
        return this.subtract(D, this.DAY, C);
    },
    isYearOverlapWeek: function(A) {
        var C = false;
        var B = this.add(A, this.DAY, 6);
        if (B.getFullYear() != A.getFullYear()) {
            C = true;
        }
        return C;
    },
    isMonthOverlapWeek: function(A) {
        var C = false;
        var B = this.add(A, this.DAY, 6);
        if (B.getMonth() != A.getMonth()) {
            C = true;
        }
        return C;
    },
    findMonthStart: function(A) {
        var B = this.getDate(A.getFullYear(), A.getMonth(), 1);
        return B;
    },
    findMonthEnd: function(B) {
        var D = this.findMonthStart(B);
        var C = this.add(D, this.MONTH, 1);
        var A = this.subtract(C, this.DAY, 1);
        return A;
    },
    clearTime: function(A) {
        A.setHours(12, 0, 0, 0);
        return A;
    },
    getDate: function(D, A, C) {
        var B = null;
        if (YAHOO.lang.isUndefined(C)) {
            C = 1;
        }
        if (D >= 100) {
            B = new Date(D, A, C);
        } else {
            B = new Date();
            B.setFullYear(D);
            B.setMonth(A);
            B.setDate(C);
            B.setHours(0, 0, 0, 0);
        }
        return B;
    }
};
YAHOO.widget.Calendar = function(C, A, B) {
    this.init.apply(this, arguments);
};
YAHOO.widget.Calendar.IMG_ROOT = null;
YAHOO.widget.Calendar.DATE = "D";
YAHOO.widget.Calendar.MONTH_DAY = "MD";
YAHOO.widget.Calendar.WEEKDAY = "WD";
YAHOO.widget.Calendar.RANGE = "R";
YAHOO.widget.Calendar.MONTH = "M";
YAHOO.widget.Calendar.DISPLAY_DAYS = 42;
YAHOO.widget.Calendar.STOP_RENDER = "S";
YAHOO.widget.Calendar.SHORT = "short";
YAHOO.widget.Calendar.LONG = "long";
YAHOO.widget.Calendar.MEDIUM = "medium";
YAHOO.widget.Calendar.ONE_CHAR = "1char";
YAHOO.widget.Calendar._DEFAULT_CONFIG = {
    PAGEDATE: {
        key: "pagedate",
        value: null
    },
    SELECTED: {
        key: "selected",
        value: null
    },
    TITLE: {
        key: "title",
        value: ""
    },
    CLOSE: {
        key: "close",
        value: false
    },
    IFRAME: {
        key: "iframe",
        value: (YAHOO.env.ua.ie && YAHOO.env.ua.ie <= 6) ? true: false
    },
    MINDATE: {
        key: "mindate",
        value: null
    },
    MAXDATE: {
        key: "maxdate",
        value: null
    },
    MULTI_SELECT: {
        key: "multi_select",
        value: false
    },
    START_WEEKDAY: {
        key: "start_weekday",
        value: 0
    },
    SHOW_WEEKDAYS: {
        key: "show_weekdays",
        value: true
    },
    SHOW_WEEK_HEADER: {
        key: "show_week_header",
        value: false
    },
    SHOW_WEEK_FOOTER: {
        key: "show_week_footer",
        value: false
    },
    HIDE_BLANK_WEEKS: {
        key: "hide_blank_weeks",
        value: false
    },
    NAV_ARROW_LEFT: {
        key: "nav_arrow_left",
        value: null
    },
    NAV_ARROW_RIGHT: {
        key: "nav_arrow_right",
        value: null
    },
    MONTHS_SHORT: {
        key: "months_short",
        value: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
    },
    MONTHS_LONG: {
        key: "months_long",
        value: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
    },
    WEEKDAYS_1CHAR: {
        key: "weekdays_1char",
        value: ["S", "M", "T", "W", "T", "F", "S"]
    },
    WEEKDAYS_SHORT: {
        key: "weekdays_short",
        value: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]
    },
    WEEKDAYS_MEDIUM: {
        key: "weekdays_medium",
        value: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
    },
    WEEKDAYS_LONG: {
        key: "weekdays_long",
        value: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
    },
    LOCALE_MONTHS: {
        key: "locale_months",
        value: "long"
    },
    LOCALE_WEEKDAYS: {
        key: "locale_weekdays",
        value: "short"
    },
    DATE_DELIMITER: {
        key: "date_delimiter",
        value: ","
    },
    DATE_FIELD_DELIMITER: {
        key: "date_field_delimiter",
        value: "/"
    },
    DATE_RANGE_DELIMITER: {
        key: "date_range_delimiter",
        value: "-"
    },
    MY_MONTH_POSITION: {
        key: "my_month_position",
        value: 1
    },
    MY_YEAR_POSITION: {
        key: "my_year_position",
        value: 2
    },
    MD_MONTH_POSITION: {
        key: "md_month_position",
        value: 1
    },
    MD_DAY_POSITION: {
        key: "md_day_position",
        value: 2
    },
    MDY_MONTH_POSITION: {
        key: "mdy_month_position",
        value: 1
    },
    MDY_DAY_POSITION: {
        key: "mdy_day_position",
        value: 2
    },
    MDY_YEAR_POSITION: {
        key: "mdy_year_position",
        value: 3
    },
    MY_LABEL_MONTH_POSITION: {
        key: "my_label_month_position",
        value: 1
    },
    MY_LABEL_YEAR_POSITION: {
        key: "my_label_year_position",
        value: 2
    },
    MY_LABEL_MONTH_SUFFIX: {
        key: "my_label_month_suffix",
        value: " "
    },
    MY_LABEL_YEAR_SUFFIX: {
        key: "my_label_year_suffix",
        value: ""
    },
    NAV: {
        key: "navigator",
        value: null
    }
};
YAHOO.widget.Calendar._EVENT_TYPES = {
    BEFORE_SELECT: "beforeSelect",
    SELECT: "select",
    BEFORE_DESELECT: "beforeDeselect",
    DESELECT: "deselect",
    CHANGE_PAGE: "changePage",
    BEFORE_RENDER: "beforeRender",
    RENDER: "render",
    RESET: "reset",
    CLEAR: "clear",
    BEFORE_HIDE: "beforeHide",
    HIDE: "hide",
    BEFORE_SHOW: "beforeShow",
    SHOW: "show",
    BEFORE_HIDE_NAV: "beforeHideNav",
    HIDE_NAV: "hideNav",
    BEFORE_SHOW_NAV: "beforeShowNav",
    SHOW_NAV: "showNav",
    BEFORE_RENDER_NAV: "beforeRenderNav",
    RENDER_NAV: "renderNav"
};
YAHOO.widget.Calendar._STYLES = {
    CSS_ROW_HEADER: "calrowhead",
    CSS_ROW_FOOTER: "calrowfoot",
    CSS_CELL: "calcell",
    CSS_CELL_SELECTOR: "selector",
    CSS_CELL_SELECTED: "selected",
    CSS_CELL_SELECTABLE: "selectable",
    CSS_CELL_RESTRICTED: "restricted",
    CSS_CELL_TODAY: "today",
    CSS_CELL_OOM: "oom",
    CSS_CELL_OOB: "previous",
    CSS_HEADER: "calheader",
    CSS_HEADER_TEXT: "calhead",
    CSS_BODY: "calbody",
    CSS_WEEKDAY_CELL: "calweekdaycell",
    CSS_WEEKDAY_ROW: "calweekdayrow",
    CSS_FOOTER: "calfoot",
    CSS_CALENDAR: "yui-calendar",
    CSS_SINGLE: "single",
    CSS_CONTAINER: "yui-calcontainer",
    CSS_NAV_LEFT: "calnavleft",
    CSS_NAV_RIGHT: "calnavright",
    CSS_NAV: "calnav",
    CSS_CLOSE: "calclose",
    CSS_CELL_TOP: "calcelltop",
    CSS_CELL_LEFT: "calcellleft",
    CSS_CELL_RIGHT: "calcellright",
    CSS_CELL_BOTTOM: "calcellbottom",
    CSS_CELL_HOVER: "calcellhover",
    CSS_CELL_HIGHLIGHT1: "highlight1",
    CSS_CELL_HIGHLIGHT2: "highlight2",
    CSS_CELL_HIGHLIGHT3: "highlight3",
    CSS_CELL_HIGHLIGHT4: "highlight4"
};
YAHOO.widget.Calendar.prototype = {
    Config: null,
    parent: null,
    index: -1,
    cells: null,
    cellDates: null,
    id: null,
    containerId: null,
    oDomContainer: null,
    today: null,
    renderStack: null,
    _renderStack: null,
    oNavigator: null,
    _selectedDates: null,
    domEventMap: null,
    _parseArgs: function(B) {
        var A = {
            id: null,
            container: null,
            config: null
        };
        if (B && B.length && B.length > 0) {
            switch (B.length) {
            case 1:
                A.id = null;
                A.container = B[0];
                A.config = null;
                break;
            case 2:
                if (YAHOO.lang.isObject(B[1]) && !B[1].tagName && !(B[1] instanceof String)) {
                    A.id = null;
                    A.container = B[0];
                    A.config = B[1];
                } else {
                    A.id = B[0];
                    A.container = B[1];
                    A.config = null;
                }
                break;
            default:
                A.id = B[0];
                A.container = B[1];
                A.config = B[2];
                break;
            }
        } else {}
        return A;
    },
    init: function(D, B, C) {
        var A = this._parseArgs(arguments);
        D = A.id;
        B = A.container;
        C = A.config;
        this.oDomContainer = YAHOO.util.Dom.get(B);
        if (!this.oDomContainer.id) {
            this.oDomContainer.id = YAHOO.util.Dom.generateId();
        }
        if (!D) {
            D = this.oDomContainer.id + "_t";
        }
        this.id = D;
        this.containerId = this.oDomContainer.id;
        this.initEvents();
        this.today = new Date();
        YAHOO.widget.DateMath.clearTime(this.today);
        this.cfg = new YAHOO.util.Config(this);
        this.Options = {};
        this.Locale = {};
        this.initStyles();
        YAHOO.util.Dom.addClass(this.oDomContainer, this.Style.CSS_CONTAINER);
        YAHOO.util.Dom.addClass(this.oDomContainer, this.Style.CSS_SINGLE);
        this.cellDates = [];
        this.cells = [];
        this.renderStack = [];
        this._renderStack = [];
        this.setupConfig();
        if (C) {
            this.cfg.applyConfig(C, true);
        }
        this.cfg.fireQueue();
    },
    configIframe: function(C, B, D) {
        var A = B[0];
        if (!this.parent) {
            if (YAHOO.util.Dom.inDocument(this.oDomContainer)) {
                if (A) {
                    var E = YAHOO.util.Dom.getStyle(this.oDomContainer, "position");
                    if (E == "absolute" || E == "relative") {
                        if (!YAHOO.util.Dom.inDocument(this.iframe)) {
                            this.iframe = document.createElement("iframe");
                            this.iframe.src = "javascript:false;";
                            YAHOO.util.Dom.setStyle(this.iframe, "opacity", "0");
                            if (YAHOO.env.ua.ie && YAHOO.env.ua.ie <= 6) {
                                YAHOO.util.Dom.addClass(this.iframe, "fixedsize");
                            }
                            this.oDomContainer.insertBefore(this.iframe, this.oDomContainer.firstChild);
                        }
                    }
                } else {
                    if (this.iframe) {
                        if (this.iframe.parentNode) {
                            this.iframe.parentNode.removeChild(this.iframe);
                        }
                        this.iframe = null;
                    }
                }
            }
        }
    },
    configTitle: function(B, A, C) {
        var E = A[0];
        if (E) {
            this.createTitleBar(E);
        } else {
            var D = this.cfg.getProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.CLOSE.key);
            if (!D) {
                this.removeTitleBar();
            } else {
                this.createTitleBar("&#160;");
            }
        }
    },
    configClose: function(B, A, C) {
        var E = A[0],
        D = this.cfg.getProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.TITLE.key);
        if (E) {
            if (!D) {
                this.createTitleBar("&#160;");
            }
            this.createCloseButton();
        } else {
            this.removeCloseButton();
            if (!D) {
                this.removeTitleBar();
            }
        }
    },
    initEvents: function() {
        var A = YAHOO.widget.Calendar._EVENT_TYPES;
        this.beforeSelectEvent = new YAHOO.util.CustomEvent(A.BEFORE_SELECT);
        this.selectEvent = new YAHOO.util.CustomEvent(A.SELECT);
        this.beforeDeselectEvent = new YAHOO.util.CustomEvent(A.BEFORE_DESELECT);
        this.deselectEvent = new YAHOO.util.CustomEvent(A.DESELECT);
        this.changePageEvent = new YAHOO.util.CustomEvent(A.CHANGE_PAGE);
        this.beforeRenderEvent = new YAHOO.util.CustomEvent(A.BEFORE_RENDER);
        this.renderEvent = new YAHOO.util.CustomEvent(A.RENDER);
        this.resetEvent = new YAHOO.util.CustomEvent(A.RESET);
        this.clearEvent = new YAHOO.util.CustomEvent(A.CLEAR);
        this.beforeShowEvent = new YAHOO.util.CustomEvent(A.BEFORE_SHOW);
        this.showEvent = new YAHOO.util.CustomEvent(A.SHOW);
        this.beforeHideEvent = new YAHOO.util.CustomEvent(A.BEFORE_HIDE);
        this.hideEvent = new YAHOO.util.CustomEvent(A.HIDE);
        this.beforeShowNavEvent = new YAHOO.util.CustomEvent(A.BEFORE_SHOW_NAV);
        this.showNavEvent = new YAHOO.util.CustomEvent(A.SHOW_NAV);
        this.beforeHideNavEvent = new YAHOO.util.CustomEvent(A.BEFORE_HIDE_NAV);
        this.hideNavEvent = new YAHOO.util.CustomEvent(A.HIDE_NAV);
        this.beforeRenderNavEvent = new YAHOO.util.CustomEvent(A.BEFORE_RENDER_NAV);
        this.renderNavEvent = new YAHOO.util.CustomEvent(A.RENDER_NAV);
        this.beforeSelectEvent.subscribe(this.onBeforeSelect, this, true);
        this.selectEvent.subscribe(this.onSelect, this, true);
        this.beforeDeselectEvent.subscribe(this.onBeforeDeselect, this, true);
        this.deselectEvent.subscribe(this.onDeselect, this, true);
        this.changePageEvent.subscribe(this.onChangePage, this, true);
        this.renderEvent.subscribe(this.onRender, this, true);
        this.resetEvent.subscribe(this.onReset, this, true);
        this.clearEvent.subscribe(this.onClear, this, true);
    },
    doSelectCell: function(G, A) {
        var L, F, I, C;
        var H = YAHOO.util.Event.getTarget(G);
        var B = H.tagName.toLowerCase();
        var E = false;
        while (B != "td" && !YAHOO.util.Dom.hasClass(H, A.Style.CSS_CELL_SELECTABLE)) {
            if (!E && B == "a" && YAHOO.util.Dom.hasClass(H, A.Style.CSS_CELL_SELECTOR)) {
                E = true;
            }
            H = H.parentNode;
            B = H.tagName.toLowerCase();
            if (B == "html") {
                return;
            }
        }
        if (E) {
            YAHOO.util.Event.preventDefault(G);
        }
        L = H;
        if (YAHOO.util.Dom.hasClass(L, A.Style.CSS_CELL_SELECTABLE)) {
            F = L.id.split("cell")[1];
            I = A.cellDates[F];
            C = YAHOO.widget.DateMath.getDate(I[0], I[1] - 1, I[2]);
            var K;
            if (A.Options.MULTI_SELECT) {
                K = L.getElementsByTagName("a")[0];
                if (K) {
                    K.blur();
                }
                var D = A.cellDates[F];
                var J = A._indexOfSelectedFieldArray(D);
                if (J > -1) {
                    A.deselectCell(F);
                } else {
                    A.selectCell(F);
                }
            } else {
                K = L.getElementsByTagName("a")[0];
                if (K) {
                    K.blur();
                }
                A.selectCell(F);
            }
        }
    },
    doCellMouseOver: function(C, B) {
        var A;
        if (C) {
            A = YAHOO.util.Event.getTarget(C);
        } else {
            A = this;
        }
        while (A.tagName && A.tagName.toLowerCase() != "td") {
            A = A.parentNode;
            if (!A.tagName || A.tagName.toLowerCase() == "html") {
                return;
            }
        }
        if (YAHOO.util.Dom.hasClass(A, B.Style.CSS_CELL_SELECTABLE)) {
            YAHOO.util.Dom.addClass(A, B.Style.CSS_CELL_HOVER);
        }
    },
    doCellMouseOut: function(C, B) {
        var A;
        if (C) {
            A = YAHOO.util.Event.getTarget(C);
        } else {
            A = this;
        }
        while (A.tagName && A.tagName.toLowerCase() != "td") {
            A = A.parentNode;
            if (!A.tagName || A.tagName.toLowerCase() == "html") {
                return;
            }
        }
        if (YAHOO.util.Dom.hasClass(A, B.Style.CSS_CELL_SELECTABLE)) {
            YAHOO.util.Dom.removeClass(A, B.Style.CSS_CELL_HOVER);
        }
    },
    setupConfig: function() {
        var A = YAHOO.widget.Calendar._DEFAULT_CONFIG;
        this.cfg.addProperty(A.PAGEDATE.key, {
            value: new Date(),
            handler: this.configPageDate
        });
        this.cfg.addProperty(A.SELECTED.key, {
            value: [],
            handler: this.configSelected
        });
        this.cfg.addProperty(A.TITLE.key, {
            value: A.TITLE.value,
            handler: this.configTitle
        });
        this.cfg.addProperty(A.CLOSE.key, {
            value: A.CLOSE.value,
            handler: this.configClose
        });
        this.cfg.addProperty(A.IFRAME.key, {
            value: A.IFRAME.value,
            handler: this.configIframe,
            validator: this.cfg.checkBoolean
        });
        this.cfg.addProperty(A.MINDATE.key, {
            value: A.MINDATE.value,
            handler: this.configMinDate
        });
        this.cfg.addProperty(A.MAXDATE.key, {
            value: A.MAXDATE.value,
            handler: this.configMaxDate
        });
        this.cfg.addProperty(A.MULTI_SELECT.key, {
            value: A.MULTI_SELECT.value,
            handler: this.configOptions,
            validator: this.cfg.checkBoolean
        });
        this.cfg.addProperty(A.START_WEEKDAY.key, {
            value: A.START_WEEKDAY.value,
            handler: this.configOptions,
            validator: this.cfg.checkNumber
        });
        this.cfg.addProperty(A.SHOW_WEEKDAYS.key, {
            value: A.SHOW_WEEKDAYS.value,
            handler: this.configOptions,
            validator: this.cfg.checkBoolean
        });
        this.cfg.addProperty(A.SHOW_WEEK_HEADER.key, {
            value: A.SHOW_WEEK_HEADER.value,
            handler: this.configOptions,
            validator: this.cfg.checkBoolean
        });
        this.cfg.addProperty(A.SHOW_WEEK_FOOTER.key, {
            value: A.SHOW_WEEK_FOOTER.value,
            handler: this.configOptions,
            validator: this.cfg.checkBoolean
        });
        this.cfg.addProperty(A.HIDE_BLANK_WEEKS.key, {
            value: A.HIDE_BLANK_WEEKS.value,
            handler: this.configOptions,
            validator: this.cfg.checkBoolean
        });
        this.cfg.addProperty(A.NAV_ARROW_LEFT.key, {
            value: A.NAV_ARROW_LEFT.value,
            handler: this.configOptions
        });
        this.cfg.addProperty(A.NAV_ARROW_RIGHT.key, {
            value: A.NAV_ARROW_RIGHT.value,
            handler: this.configOptions
        });
        this.cfg.addProperty(A.MONTHS_SHORT.key, {
            value: A.MONTHS_SHORT.value,
            handler: this.configLocale
        });
        this.cfg.addProperty(A.MONTHS_LONG.key, {
            value: A.MONTHS_LONG.value,
            handler: this.configLocale
        });
        this.cfg.addProperty(A.WEEKDAYS_1CHAR.key, {
            value: A.WEEKDAYS_1CHAR.value,
            handler: this.configLocale
        });
        this.cfg.addProperty(A.WEEKDAYS_SHORT.key, {
            value: A.WEEKDAYS_SHORT.value,
            handler: this.configLocale
        });
        this.cfg.addProperty(A.WEEKDAYS_MEDIUM.key, {
            value: A.WEEKDAYS_MEDIUM.value,
            handler: this.configLocale
        });
        this.cfg.addProperty(A.WEEKDAYS_LONG.key, {
            value: A.WEEKDAYS_LONG.value,
            handler: this.configLocale
        });
        var B = function() {
            this.cfg.refireEvent(A.LOCALE_MONTHS.key);
            this.cfg.refireEvent(A.LOCALE_WEEKDAYS.key);
        };
        this.cfg.subscribeToConfigEvent(A.START_WEEKDAY.key, B, this, true);
        this.cfg.subscribeToConfigEvent(A.MONTHS_SHORT.key, B, this, true);
        this.cfg.subscribeToConfigEvent(A.MONTHS_LONG.key, B, this, true);
        this.cfg.subscribeToConfigEvent(A.WEEKDAYS_1CHAR.key, B, this, true);
        this.cfg.subscribeToConfigEvent(A.WEEKDAYS_SHORT.key, B, this, true);
        this.cfg.subscribeToConfigEvent(A.WEEKDAYS_MEDIUM.key, B, this, true);
        this.cfg.subscribeToConfigEvent(A.WEEKDAYS_LONG.key, B, this, true);
        this.cfg.addProperty(A.LOCALE_MONTHS.key, {
            value: A.LOCALE_MONTHS.value,
            handler: this.configLocaleValues
        });
        this.cfg.addProperty(A.LOCALE_WEEKDAYS.key, {
            value: A.LOCALE_WEEKDAYS.value,
            handler: this.configLocaleValues
        });
        this.cfg.addProperty(A.DATE_DELIMITER.key, {
            value: A.DATE_DELIMITER.value,
            handler: this.configLocale
        });
        this.cfg.addProperty(A.DATE_FIELD_DELIMITER.key, {
            value: A.DATE_FIELD_DELIMITER.value,
            handler: this.configLocale
        });
        this.cfg.addProperty(A.DATE_RANGE_DELIMITER.key, {
            value: A.DATE_RANGE_DELIMITER.value,
            handler: this.configLocale
        });
        this.cfg.addProperty(A.MY_MONTH_POSITION.key, {
            value: A.MY_MONTH_POSITION.value,
            handler: this.configLocale,
            validator: this.cfg.checkNumber
        });
        this.cfg.addProperty(A.MY_YEAR_POSITION.key, {
            value: A.MY_YEAR_POSITION.value,
            handler: this.configLocale,
            validator: this.cfg.checkNumber
        });
        this.cfg.addProperty(A.MD_MONTH_POSITION.key, {
            value: A.MD_MONTH_POSITION.value,
            handler: this.configLocale,
            validator: this.cfg.checkNumber
        });
        this.cfg.addProperty(A.MD_DAY_POSITION.key, {
            value: A.MD_DAY_POSITION.value,
            handler: this.configLocale,
            validator: this.cfg.checkNumber
        });
        this.cfg.addProperty(A.MDY_MONTH_POSITION.key, {
            value: A.MDY_MONTH_POSITION.value,
            handler: this.configLocale,
            validator: this.cfg.checkNumber
        });
        this.cfg.addProperty(A.MDY_DAY_POSITION.key, {
            value: A.MDY_DAY_POSITION.value,
            handler: this.configLocale,
            validator: this.cfg.checkNumber
        });
        this.cfg.addProperty(A.MDY_YEAR_POSITION.key, {
            value: A.MDY_YEAR_POSITION.value,
            handler: this.configLocale,
            validator: this.cfg.checkNumber
        });
        this.cfg.addProperty(A.MY_LABEL_MONTH_POSITION.key, {
            value: A.MY_LABEL_MONTH_POSITION.value,
            handler: this.configLocale,
            validator: this.cfg.checkNumber
        });
        this.cfg.addProperty(A.MY_LABEL_YEAR_POSITION.key, {
            value: A.MY_LABEL_YEAR_POSITION.value,
            handler: this.configLocale,
            validator: this.cfg.checkNumber
        });
        this.cfg.addProperty(A.MY_LABEL_MONTH_SUFFIX.key, {
            value: A.MY_LABEL_MONTH_SUFFIX.value,
            handler: this.configLocale
        });
        this.cfg.addProperty(A.MY_LABEL_YEAR_SUFFIX.key, {
            value: A.MY_LABEL_YEAR_SUFFIX.value,
            handler: this.configLocale
        });
        this.cfg.addProperty(A.NAV.key, {
            value: A.NAV.value,
            handler: this.configNavigator
        });
    },
    configPageDate: function(B, A, C) {
        this.cfg.setProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key, this._parsePageDate(A[0]), true);
    },
    configMinDate: function(B, A, C) {
        var D = A[0];
        if (YAHOO.lang.isString(D)) {
            D = this._parseDate(D);
            this.cfg.setProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.MINDATE.key, YAHOO.widget.DateMath.getDate(D[0], (D[1] - 1), D[2]));
        }
    },
    configMaxDate: function(B, A, C) {
        var D = A[0];
        if (YAHOO.lang.isString(D)) {
            D = this._parseDate(D);
            this.cfg.setProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.MAXDATE.key, YAHOO.widget.DateMath.getDate(D[0], (D[1] - 1), D[2]));
        }
    },
    configSelected: function(C, A, E) {
        var B = A[0];
        var D = YAHOO.widget.Calendar._DEFAULT_CONFIG.SELECTED.key;
        if (B) {
            if (YAHOO.lang.isString(B)) {
                this.cfg.setProperty(D, this._parseDates(B), true);
            }
        }
        if (!this._selectedDates) {
            this._selectedDates = this.cfg.getProperty(D);
        }
    },
    configOptions: function(B, A, C) {
        this.Options[B.toUpperCase()] = A[0];
    },
    configLocale: function(C, B, D) {
        var A = YAHOO.widget.Calendar._DEFAULT_CONFIG;
        this.Locale[C.toUpperCase()] = B[0];
        this.cfg.refireEvent(A.LOCALE_MONTHS.key);
        this.cfg.refireEvent(A.LOCALE_WEEKDAYS.key);
    },
    configLocaleValues: function(D, C, E) {
        var B = YAHOO.widget.Calendar._DEFAULT_CONFIG;
        D = D.toLowerCase();
        var G = C[0];
        switch (D) {
        case B.LOCALE_MONTHS.key:
            switch (G) {
            case YAHOO.widget.Calendar.SHORT:
                this.Locale.LOCALE_MONTHS = this.cfg.getProperty(B.MONTHS_SHORT.key).concat();
                break;
            case YAHOO.widget.Calendar.LONG:
                this.Locale.LOCALE_MONTHS = this.cfg.getProperty(B.MONTHS_LONG.key).concat();
                break;
            }
            break;
        case B.LOCALE_WEEKDAYS.key:
            switch (G) {
            case YAHOO.widget.Calendar.ONE_CHAR:
                this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty(B.WEEKDAYS_1CHAR.key).concat();
                break;
            case YAHOO.widget.Calendar.SHORT:
                this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty(B.WEEKDAYS_SHORT.key).concat();
                break;
            case YAHOO.widget.Calendar.MEDIUM:
                this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty(B.WEEKDAYS_MEDIUM.key).concat();
                break;
            case YAHOO.widget.Calendar.LONG:
                this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty(B.WEEKDAYS_LONG.key).concat();
                break;
            }
            var F = this.cfg.getProperty(B.START_WEEKDAY.key);
            if (F > 0) {
                for (var A = 0; A < F; ++A) {
                    this.Locale.LOCALE_WEEKDAYS.push(this.Locale.LOCALE_WEEKDAYS.shift());
                }
            }
            break;
        }
    },
    configNavigator: function(C, A, D) {
        var E = A[0];
        if (YAHOO.widget.CalendarNavigator && (E === true || YAHOO.lang.isObject(E))) {
            if (!this.oNavigator) {
                this.oNavigator = new YAHOO.widget.CalendarNavigator(this);
                function B() {
                    if (!this.pages) {
                        this.oNavigator.erase();
                    }
                }
                this.beforeRenderEvent.subscribe(B, this, true);
            }
        } else {
            if (this.oNavigator) {
                this.oNavigator.destroy();
                this.oNavigator = null;
            }
        }
    },
    initStyles: function() {
        var A = YAHOO.widget.Calendar._STYLES;
        this.Style = {
            CSS_ROW_HEADER: A.CSS_ROW_HEADER,
            CSS_ROW_FOOTER: A.CSS_ROW_FOOTER,
            CSS_CELL: A.CSS_CELL,
            CSS_CELL_SELECTOR: A.CSS_CELL_SELECTOR,
            CSS_CELL_SELECTED: A.CSS_CELL_SELECTED,
            CSS_CELL_SELECTABLE: A.CSS_CELL_SELECTABLE,
            CSS_CELL_RESTRICTED: A.CSS_CELL_RESTRICTED,
            CSS_CELL_TODAY: A.CSS_CELL_TODAY,
            CSS_CELL_OOM: A.CSS_CELL_OOM,
            CSS_CELL_OOB: A.CSS_CELL_OOB,
            CSS_HEADER: A.CSS_HEADER,
            CSS_HEADER_TEXT: A.CSS_HEADER_TEXT,
            CSS_BODY: A.CSS_BODY,
            CSS_WEEKDAY_CELL: A.CSS_WEEKDAY_CELL,
            CSS_WEEKDAY_ROW: A.CSS_WEEKDAY_ROW,
            CSS_FOOTER: A.CSS_FOOTER,
            CSS_CALENDAR: A.CSS_CALENDAR,
            CSS_SINGLE: A.CSS_SINGLE,
            CSS_CONTAINER: A.CSS_CONTAINER,
            CSS_NAV_LEFT: A.CSS_NAV_LEFT,
            CSS_NAV_RIGHT: A.CSS_NAV_RIGHT,
            CSS_NAV: A.CSS_NAV,
            CSS_CLOSE: A.CSS_CLOSE,
            CSS_CELL_TOP: A.CSS_CELL_TOP,
            CSS_CELL_LEFT: A.CSS_CELL_LEFT,
            CSS_CELL_RIGHT: A.CSS_CELL_RIGHT,
            CSS_CELL_BOTTOM: A.CSS_CELL_BOTTOM,
            CSS_CELL_HOVER: A.CSS_CELL_HOVER,
            CSS_CELL_HIGHLIGHT1: A.CSS_CELL_HIGHLIGHT1,
            CSS_CELL_HIGHLIGHT2: A.CSS_CELL_HIGHLIGHT2,
            CSS_CELL_HIGHLIGHT3: A.CSS_CELL_HIGHLIGHT3,
            CSS_CELL_HIGHLIGHT4: A.CSS_CELL_HIGHLIGHT4
        };
    },
    buildMonthLabel: function() {
        var A = this.cfg.getProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key);
        var C = this.Locale.LOCALE_MONTHS[A.getMonth()] + this.Locale.MY_LABEL_MONTH_SUFFIX;
        var B = A.getFullYear() + this.Locale.MY_LABEL_YEAR_SUFFIX;
        if (this.Locale.MY_LABEL_MONTH_POSITION == 2 || this.Locale.MY_LABEL_YEAR_POSITION == 1) {
            return B + C;
        } else {
            return C + B;
        }
    },
    buildDayLabel: function(A) {
        return A.getDate();
    },
    createTitleBar: function(A) {
        var B = YAHOO.util.Dom.getElementsByClassName(YAHOO.widget.CalendarGroup.CSS_2UPTITLE, "div", this.oDomContainer)[0] || document.createElement("div");
        B.className = YAHOO.widget.CalendarGroup.CSS_2UPTITLE;
        B.innerHTML = A;
        this.oDomContainer.insertBefore(B, this.oDomContainer.firstChild);
        YAHOO.util.Dom.addClass(this.oDomContainer, "withtitle");
        return B;
    },
    removeTitleBar: function() {
        var A = YAHOO.util.Dom.getElementsByClassName(YAHOO.widget.CalendarGroup.CSS_2UPTITLE, "div", this.oDomContainer)[0] || null;
        if (A) {
            YAHOO.util.Event.purgeElement(A);
            this.oDomContainer.removeChild(A);
        }
        YAHOO.util.Dom.removeClass(this.oDomContainer, "withtitle");
    },
    createCloseButton: function() {
        var D = YAHOO.util.Dom,
        A = YAHOO.util.Event,
        C = YAHOO.widget.CalendarGroup.CSS_2UPCLOSE,
        F = "us/my/bn/x_d.gif";
        var E = D.getElementsByClassName("link-close", "a", this.oDomContainer)[0];
        if (!E) {
            E = document.createElement("a");
            A.addListener(E, "click",
            function(H, G) {
                G.hide();
                A.preventDefault(H);
            },
            this);
        }
        E.href = "#";
        E.className = "link-close";
        if (YAHOO.widget.Calendar.IMG_ROOT !== null) {
            var B = D.getElementsByClassName(C, "img", E)[0] || document.createElement("img");
            B.src = YAHOO.widget.Calendar.IMG_ROOT + F;
            B.className = C;
            E.appendChild(B);
        } else {
            E.innerHTML = '<span class="' + C + " " + this.Style.CSS_CLOSE + '"></span>';
        }
        this.oDomContainer.appendChild(E);
        return E;
    },
    removeCloseButton: function() {
        var A = YAHOO.util.Dom.getElementsByClassName("link-close", "a", this.oDomContainer)[0] || null;
        if (A) {
            YAHOO.util.Event.purgeElement(A);
            this.oDomContainer.removeChild(A);
        }
    },
    renderHeader: function(E) {
        var H = 7;
        var F = "us/tr/callt.gif";
        var G = "us/tr/calrt.gif";
        var M = YAHOO.widget.Calendar._DEFAULT_CONFIG;
        if (this.cfg.getProperty(M.SHOW_WEEK_HEADER.key)) {
            H += 1;
        }
        if (this.cfg.getProperty(M.SHOW_WEEK_FOOTER.key)) {
            H += 1;
        }
        E[E.length] = "<thead>";
        E[E.length] = "<tr>";
        E[E.length] = '<th colspan="' + H + '" class="' + this.Style.CSS_HEADER_TEXT + '">';
        E[E.length] = '<div class="' + this.Style.CSS_HEADER + '">';
        var K, L = false;
        if (this.parent) {
            if (this.index === 0) {
                K = true;
            }
            if (this.index == (this.parent.cfg.getProperty("pages") - 1)) {
                L = true;
            }
        } else {
            K = true;
            L = true;
        }
        if (K) {
            var A = this.cfg.getProperty(M.NAV_ARROW_LEFT.key);
            if (A === null && YAHOO.widget.Calendar.IMG_ROOT !== null) {
                A = YAHOO.widget.Calendar.IMG_ROOT + F;
            }
            var C = (A === null) ? "": ' style="background-image:url(' + A + ')"';
            E[E.length] = '<a class="' + this.Style.CSS_NAV_LEFT + '"' + C + " >&#160;</a>";
        }
        var J = this.buildMonthLabel();
        var B = this.parent || this;
        if (B.cfg.getProperty("navigator")) {
            J = '<a class="' + this.Style.CSS_NAV + '" href="#">' + J + "</a>";
        }
        E[E.length] = J;
        if (L) {
            var D = this.cfg.getProperty(M.NAV_ARROW_RIGHT.key);
            if (D === null && YAHOO.widget.Calendar.IMG_ROOT !== null) {
                D = YAHOO.widget.Calendar.IMG_ROOT + G;
            }
            var I = (D === null) ? "": ' style="background-image:url(' + D + ')"';
            E[E.length] = '<a class="' + this.Style.CSS_NAV_RIGHT + '"' + I + " >&#160;</a>";
        }
        E[E.length] = "</div>\n</th>\n</tr>";
        if (this.cfg.getProperty(M.SHOW_WEEKDAYS.key)) {
            E = this.buildWeekdays(E);
        }
        E[E.length] = "</thead>";
        return E;
    },
    buildWeekdays: function(C) {
        var A = YAHOO.widget.Calendar._DEFAULT_CONFIG;
        C[C.length] = '<tr class="' + this.Style.CSS_WEEKDAY_ROW + '">';
        if (this.cfg.getProperty(A.SHOW_WEEK_HEADER.key)) {
            C[C.length] = "<th>&#160;</th>";
        }
        for (var B = 0; B < this.Locale.LOCALE_WEEKDAYS.length; ++B) {
        	if(B != 0 && B != this.Locale.LOCALE_WEEKDAYS.length-1)
        	{
            	C[C.length] = '<th class="calweekdaycell">' + this.Locale.LOCALE_WEEKDAYS[B] + "</th>";
            }
            else
            {
            	C[C.length] = '<th class="calweekdayOffcell">' + this.Locale.LOCALE_WEEKDAYS[B] + "</th>";
            }
        }
        if (this.cfg.getProperty(A.SHOW_WEEK_FOOTER.key)) {
            C[C.length] = "<th>&#160;</th>";
        }
        C[C.length] = "</tr>";
        return C;
    },
    renderBody: function(g, e) {
        var AF = YAHOO.widget.DateMath,
        M = YAHOO.widget.Calendar,
        Q = YAHOO.util.Dom,
        q = M._DEFAULT_CONFIG;
        var AE = this.cfg.getProperty(q.START_WEEKDAY.key);
        this.preMonthDays = g.getDay();
        if (AE > 0) {
            this.preMonthDays -= AE;
        }
        if (this.preMonthDays < 0) {
            this.preMonthDays += 7;
        }
        this.monthDays = AF.findMonthEnd(g).getDate();
        this.postMonthDays = M.DISPLAY_DAYS - this.preMonthDays - this.monthDays;
        g = AF.subtract(g, AF.DAY, this.preMonthDays);
        var T, I, H = "w",
        Z = "_cell",
        X = "wd",
        n = "d",
        J, l, R = this.today.getFullYear(),
        m = this.today.getMonth(),
        E = this.today.getDate(),
        v = this.cfg.getProperty(q.PAGEDATE.key),
        C = this.cfg.getProperty(q.HIDE_BLANK_WEEKS.key),
        c = this.cfg.getProperty(q.SHOW_WEEK_FOOTER.key),
        W = this.cfg.getProperty(q.SHOW_WEEK_HEADER.key),
        O = this.cfg.getProperty(q.MINDATE.key),
        V = this.cfg.getProperty(q.MAXDATE.key);
        if (O) {
            O = AF.clearTime(O);
        }
        if (V) {
            V = AF.clearTime(V);
        }
        e[e.length] = '<tbody class="m' + (v.getMonth() + 1) + " " + this.Style.CSS_BODY + '">';
        var AC = 0,
        K = document.createElement("div"),
        f = document.createElement("td");
        K.appendChild(f);
        var u = this.parent || this;
        for (var y = 0; y < 6; y++) {
            T = AF.getWeekNumber(g, AE);
            I = H + T;
            if (y !== 0 && C === true && g.getMonth() != v.getMonth()) {
                break;
            } else {
                e[e.length] = '<tr class="' + I + '">';
                if (W) {
                    e = this.renderRowHeader(T, e);
                }
                for (var AD = 0; AD < 7; AD++) {
                    J = [];
                    this.clearElement(f);
                    f.className = this.Style.CSS_CELL;
                    f.id = this.id + Z + AC;
                    if (g.getDate() == E && g.getMonth() == m && g.getFullYear() == R) {
                        J[J.length] = u.renderCellStyleToday;
                    }
                    var U = [g.getFullYear(), g.getMonth() + 1, g.getDate()];
                    this.cellDates[this.cellDates.length] = U;
                    if (g.getMonth() != v.getMonth()) {
                        J[J.length] = u.renderCellNotThisMonth;
                    } else {
                        Q.addClass(f, X + g.getDay());
                        Q.addClass(f, n + g.getDate());
                        for (var w = 0; w < this.renderStack.length; ++w) {
                            l = null;
                            var o = this.renderStack[w],
                            AG = o[0],
                            B,
                            Y,
                            G;
                            switch (AG) {
                            case M.DATE:
                                B = o[1][1];
                                Y = o[1][2];
                                G = o[1][0];
                                if (g.getMonth() + 1 == B && g.getDate() == Y && g.getFullYear() == G) {
                                    l = o[2];
                                    this.renderStack.splice(w, 1);
                                }
                                break;
                            case M.MONTH_DAY:
                                B = o[1][0];
                                Y = o[1][1];
                                if (g.getMonth() + 1 == B && g.getDate() == Y) {
                                    l = o[2];
                                    this.renderStack.splice(w, 1);
                                }
                                break;
                            case M.RANGE:
                                var b = o[1][0],
                                a = o[1][1],
                                h = b[1],
                                N = b[2],
                                S = b[0],
                                AB = AF.getDate(S, h - 1, N),
                                F = a[1],
                                k = a[2],
                                A = a[0],
                                AA = AF.getDate(A, F - 1, k);
                                if (g.getTime() >= AB.getTime() && g.getTime() <= AA.getTime()) {
                                    l = o[2];
                                    if (g.getTime() == AA.getTime()) {
                                        this.renderStack.splice(w, 1);
                                    }
                                }
                                break;
                            case M.WEEKDAY:
                                var L = o[1][0];
                                if (g.getDay() + 1 == L) {
                                    l = o[2];
                                }
                                break;
                            case M.MONTH:
                                B = o[1][0];
                                if (g.getMonth() + 1 == B) {
                                    l = o[2];
                                }
                                break;
                            }
                            if (l) {
                                J[J.length] = l;
                            }
                        }
                    }
                    if (this._indexOfSelectedFieldArray(U) > -1) {
                        J[J.length] = u.renderCellStyleSelected;
                    }
                    if ((O && (g.getTime() < O.getTime())) || (V && (g.getTime() > V.getTime()))) {
                        J[J.length] = u.renderOutOfBoundsDate;
                    } else {
                        J[J.length] = u.styleCellDefault;
                        J[J.length] = u.renderCellDefault;
                    }
                    for (var t = 0; t < J.length; ++t) {
                        if (J[t].call(u, g, f) == M.STOP_RENDER) {
                            break;
                        }
                    }
                    g.setTime(g.getTime() + AF.ONE_DAY_MS);
                    g = AF.clearTime(g);
                    if (AC >= 0 && AC <= 6) {
                        Q.addClass(f, this.Style.CSS_CELL_TOP);
                    }
                    if ((AC % 7) === 0) {
                        Q.addClass(f, this.Style.CSS_CELL_LEFT);
                    }
                    if (((AC + 1) % 7) === 0) {
                        Q.addClass(f, this.Style.CSS_CELL_RIGHT);
                    }
                    var j = this.postMonthDays;
                    if (C && j >= 7) {
                        var P = Math.floor(j / 7);
                        for (var z = 0; z < P; ++z) {
                            j -= 7;
                        }
                    }
                    if (AC >= ((this.preMonthDays + j + this.monthDays) - 7)) {
                        Q.addClass(f, this.Style.CSS_CELL_BOTTOM);
                    }
                    e[e.length] = K.innerHTML;
                    AC++;
                }
                if (c) {
                    e = this.renderRowFooter(T, e);
                }
                e[e.length] = "</tr>";
            }
        }
        e[e.length] = "</tbody>";
        return e;
    },
    renderFooter: function(A) {
        return A;
    },
    render: function() {
        this.beforeRenderEvent.fire();
        var A = YAHOO.widget.Calendar._DEFAULT_CONFIG;
        var C = YAHOO.widget.DateMath.findMonthStart(this.cfg.getProperty(A.PAGEDATE.key));
        this.resetRenderers();
        this.cellDates.length = 0;
        YAHOO.util.Event.purgeElement(this.oDomContainer, true);
        var B = [];
        B[B.length] = '<table cellSpacing="0" class="' + this.Style.CSS_CALENDAR + " y" + C.getFullYear() + '" id="' + this.id + '">';
        B = this.renderHeader(B);
        B = this.renderBody(C, B);
        B = this.renderFooter(B);
        B[B.length] = "</table>";
        this.oDomContainer.innerHTML = B.join("\n");
        this.applyListeners();
        this.cells = this.oDomContainer.getElementsByTagName("td");
        this.cfg.refireEvent(A.TITLE.key);
        this.cfg.refireEvent(A.CLOSE.key);
        this.cfg.refireEvent(A.IFRAME.key);
        this.renderEvent.fire();
    },
    applyListeners: function() {
        var K = this.oDomContainer;
        var B = this.parent || this;
        var G = "a";
        var D = "mousedown";
        var H = YAHOO.util.Dom.getElementsByClassName(this.Style.CSS_NAV_LEFT, G, K);
        var C = YAHOO.util.Dom.getElementsByClassName(this.Style.CSS_NAV_RIGHT, G, K);
        if (H && H.length > 0) {
            this.linkLeft = H[0];
            YAHOO.util.Event.addListener(this.linkLeft, D, B.previousMonth, B, true);
        }
        if (C && C.length > 0) {
            this.linkRight = C[0];
            YAHOO.util.Event.addListener(this.linkRight, D, B.nextMonth, B, true);
        }
        if (B.cfg.getProperty("navigator") !== null) {
            this.applyNavListeners();
        }
        if (this.domEventMap) {
            var E, A;
            for (var M in this.domEventMap) {
                if (YAHOO.lang.hasOwnProperty(this.domEventMap, M)) {
                    var I = this.domEventMap[M];
                    if (! (I instanceof Array)) {
                        I = [I];
                    }
                    for (var F = 0; F < I.length; F++) {
                        var L = I[F];
                        A = YAHOO.util.Dom.getElementsByClassName(M, L.tag, this.oDomContainer);
                        for (var J = 0; J < A.length; J++) {
                            E = A[J];
                            YAHOO.util.Event.addListener(E, L.event, L.handler, L.scope, L.correct);
                        }
                    }
                }
            }
        }
        YAHOO.util.Event.addListener(this.oDomContainer, "click", this.doSelectCell, this);
        YAHOO.util.Event.addListener(this.oDomContainer, "mouseover", this.doCellMouseOver, this);
        YAHOO.util.Event.addListener(this.oDomContainer, "mouseout", this.doCellMouseOut, this);
    },
    applyNavListeners: function() {
        var D = YAHOO.util.Event;
        var C = this.parent || this;
        var F = this;
        var B = YAHOO.util.Dom.getElementsByClassName(this.Style.CSS_NAV, "a", this.oDomContainer);
        if (B.length > 0) {
            function A(J, I) {
                var H = D.getTarget(J);
                if (this === H || YAHOO.util.Dom.isAncestor(this, H)) {
                    D.preventDefault(J);
                }
                var E = C.oNavigator;
                if (E) {
                    var G = F.cfg.getProperty("pagedate");
                    E.setYear(G.getFullYear());
                    E.setMonth(G.getMonth());
                    E.show();
                }
            }
            D.addListener(B, "click", A);
        }
    },
    getDateByCellId: function(B) {
        var A = this.getDateFieldsByCellId(B);
        return YAHOO.widget.DateMath.getDate(A[0], A[1] - 1, A[2]);
    },
    getDateFieldsByCellId: function(A) {
        A = A.toLowerCase().split("_cell")[1];
        A = parseInt(A, 10);
        return this.cellDates[A];
    },
    getCellIndex: function(C) {
        var B = -1;
        if (C) {
            var A = C.getMonth(),
            H = C.getFullYear(),
            G = C.getDate(),
            E = this.cellDates;
            for (var D = 0; D < E.length; ++D) {
                var F = E[D];
                if (F[0] === H && F[1] === A + 1 && F[2] === G) {
                    B = D;
                    break;
                }
            }
        }
        return B;
    },
    renderOutOfBoundsDate: function(B, A) {
        YAHOO.util.Dom.addClass(A, this.Style.CSS_CELL_OOB);
        A.innerHTML = B.getDate();
        return YAHOO.widget.Calendar.STOP_RENDER;
    },
    renderRowHeader: function(B, A) {
        A[A.length] = '<th class="calrowhead">' + B + "</th>";
        return A;
    },
    renderRowFooter: function(B, A) {
        A[A.length] = '<th class="calrowfoot">' + B + "</th>";
        return A;
    },
    renderCellDefault: function(B, A) {
        A.innerHTML = '<a href="#" class="' + this.Style.CSS_CELL_SELECTOR + '">' + this.buildDayLabel(B) + "</a>";
    },
    styleCellDefault: function(B, A) {
        YAHOO.util.Dom.addClass(A, this.Style.CSS_CELL_SELECTABLE);
    },
    renderCellStyleHighlight1: function(B, A) {
        YAHOO.util.Dom.addClass(A, this.Style.CSS_CELL_HIGHLIGHT1);
    },
    renderCellStyleHighlight2: function(B, A) {
        YAHOO.util.Dom.addClass(A, this.Style.CSS_CELL_HIGHLIGHT2);
    },
    renderCellStyleHighlight3: function(B, A) {
        YAHOO.util.Dom.addClass(A, this.Style.CSS_CELL_HIGHLIGHT3);
    },
    renderCellStyleHighlight4: function(B, A) {
        YAHOO.util.Dom.addClass(A, this.Style.CSS_CELL_HIGHLIGHT4);
    },
    renderCellStyleToday: function(B, A) {
        YAHOO.util.Dom.addClass(A, this.Style.CSS_CELL_TODAY);
    },
    renderCellStyleSelected: function(B, A) {
        YAHOO.util.Dom.addClass(A, this.Style.CSS_CELL_SELECTED);
    },
    renderCellNotThisMonth: function(B, A) {
        YAHOO.util.Dom.addClass(A, this.Style.CSS_CELL_OOM);
        A.innerHTML = B.getDate();
        return YAHOO.widget.Calendar.STOP_RENDER;
    },
    renderBodyCellRestricted: function(B, A) {
        YAHOO.util.Dom.addClass(A, this.Style.CSS_CELL);
        YAHOO.util.Dom.addClass(A, this.Style.CSS_CELL_RESTRICTED);
        A.innerHTML = B.getDate();
        return YAHOO.widget.Calendar.STOP_RENDER;
    },
    addMonths: function(B) {
        var A = YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key;
        this.cfg.setProperty(A, YAHOO.widget.DateMath.add(this.cfg.getProperty(A), YAHOO.widget.DateMath.MONTH, B));
        this.resetRenderers();
        this.changePageEvent.fire();
    },
    subtractMonths: function(B) {
        var A = YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key;
        this.cfg.setProperty(A, YAHOO.widget.DateMath.subtract(this.cfg.getProperty(A), YAHOO.widget.DateMath.MONTH, B));
        this.resetRenderers();
        this.changePageEvent.fire();
    },
    addYears: function(B) {
        var A = YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key;
        this.cfg.setProperty(A, YAHOO.widget.DateMath.add(this.cfg.getProperty(A), YAHOO.widget.DateMath.YEAR, B));
        this.resetRenderers();
        this.changePageEvent.fire();
    },
    subtractYears: function(B) {
        var A = YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key;
        this.cfg.setProperty(A, YAHOO.widget.DateMath.subtract(this.cfg.getProperty(A), YAHOO.widget.DateMath.YEAR, B));
        this.resetRenderers();
        this.changePageEvent.fire();
    },
    nextMonth: function() {
        this.addMonths(1);
    },
    previousMonth: function() {
        this.subtractMonths(1);
    },
    nextYear: function() {
        this.addYears(1);
    },
    previousYear: function() {
        this.subtractYears(1);
    },
    reset: function() {
        var A = YAHOO.widget.Calendar._DEFAULT_CONFIG;
        this.cfg.resetProperty(A.SELECTED.key);
        this.cfg.resetProperty(A.PAGEDATE.key);
        this.resetEvent.fire();
    },
    clear: function() {
        var A = YAHOO.widget.Calendar._DEFAULT_CONFIG;
        this.cfg.setProperty(A.SELECTED.key, []);
        this.cfg.setProperty(A.PAGEDATE.key, new Date(this.today.getTime()));
        this.clearEvent.fire();
    },
    select: function(C) {
        var F = this._toFieldArray(C);
        var B = [];
        var E = [];
        var G = YAHOO.widget.Calendar._DEFAULT_CONFIG.SELECTED.key;
        for (var A = 0; A < F.length; ++A) {
            var D = F[A];
            if (!this.isDateOOB(this._toDate(D))) {
                if (B.length === 0) {
                    this.beforeSelectEvent.fire();
                    E = this.cfg.getProperty(G);
                }
                B.push(D);
                if (this._indexOfSelectedFieldArray(D) == -1) {
                    E[E.length] = D;
                }
            }
        }
        if (B.length > 0) {
            if (this.parent) {
                this.parent.cfg.setProperty(G, E);
            } else {
                this.cfg.setProperty(G, E);
            }
            this.selectEvent.fire(B);
        }
        return this.getSelectedDates();
    },
    selectCell: function(D) {
        var B = this.cells[D];
        var H = this.cellDates[D];
        var G = this._toDate(H);
        var C = YAHOO.util.Dom.hasClass(B, this.Style.CSS_CELL_SELECTABLE);
        if (C) {
            this.beforeSelectEvent.fire();
            var F = YAHOO.widget.Calendar._DEFAULT_CONFIG.SELECTED.key;
            var E = this.cfg.getProperty(F);
            var A = H.concat();
            if (this._indexOfSelectedFieldArray(A) == -1) {
                E[E.length] = A;
            }
            if (this.parent) {
                this.parent.cfg.setProperty(F, E);
            } else {
                this.cfg.setProperty(F, E);
            }
            this.renderCellStyleSelected(G, B);
            this.selectEvent.fire([A]);
            this.doCellMouseOut.call(B, null, this);
        }
        return this.getSelectedDates();
    },
    deselect: function(E) {
        var A = this._toFieldArray(E);
        var D = [];
        var G = [];
        var H = YAHOO.widget.Calendar._DEFAULT_CONFIG.SELECTED.key;
        for (var B = 0; B < A.length; ++B) {
            var F = A[B];
            if (!this.isDateOOB(this._toDate(F))) {
                if (D.length === 0) {
                    this.beforeDeselectEvent.fire();
                    G = this.cfg.getProperty(H);
                }
                D.push(F);
                var C = this._indexOfSelectedFieldArray(F);
                if (C != -1) {
                    G.splice(C, 1);
                }
            }
        }
        if (D.length > 0) {
            if (this.parent) {
                this.parent.cfg.setProperty(H, G);
            } else {
                this.cfg.setProperty(H, G);
            }
            this.deselectEvent.fire(D);
        }
        return this.getSelectedDates();
    },
    deselectCell: function(E) {
        var H = this.cells[E];
        var B = this.cellDates[E];
        var F = this._indexOfSelectedFieldArray(B);
        var G = YAHOO.util.Dom.hasClass(H, this.Style.CSS_CELL_SELECTABLE);
        if (G) {
            this.beforeDeselectEvent.fire();
            var I = YAHOO.widget.Calendar._DEFAULT_CONFIG;
            var D = this.cfg.getProperty(I.SELECTED.key);
            var C = this._toDate(B);
            var A = B.concat();
            if (F > -1) {
                if (this.cfg.getProperty(I.PAGEDATE.key).getMonth() == C.getMonth() && this.cfg.getProperty(I.PAGEDATE.key).getFullYear() == C.getFullYear()) {
                    YAHOO.util.Dom.removeClass(H, this.Style.CSS_CELL_SELECTED);
                }
                D.splice(F, 1);
            }
            if (this.parent) {
                this.parent.cfg.setProperty(I.SELECTED.key, D);
            } else {
                this.cfg.setProperty(I.SELECTED.key, D);
            }
            this.deselectEvent.fire(A);
        }
        return this.getSelectedDates();
    },
    deselectAll: function() {
        this.beforeDeselectEvent.fire();
        var D = YAHOO.widget.Calendar._DEFAULT_CONFIG.SELECTED.key;
        var A = this.cfg.getProperty(D);
        var B = A.length;
        var C = A.concat();
        if (this.parent) {
            this.parent.cfg.setProperty(D, []);
        } else {
            this.cfg.setProperty(D, []);
        }
        if (B > 0) {
            this.deselectEvent.fire(C);
        }
        return this.getSelectedDates();
    },
    _toFieldArray: function(B) {
        var A = [];
        if (B instanceof Date) {
            A = [[B.getFullYear(), B.getMonth() + 1, B.getDate()]];
        } else {
            if (YAHOO.lang.isString(B)) {
                A = this._parseDates(B);
            } else {
                if (YAHOO.lang.isArray(B)) {
                    for (var C = 0; C < B.length; ++C) {
                        var D = B[C];
                        A[A.length] = [D.getFullYear(), D.getMonth() + 1, D.getDate()];
                    }
                }
            }
        }
        return A;
    },
    toDate: function(A) {
        return this._toDate(A);
    },
    _toDate: function(A) {
        if (A instanceof Date) {
            return A;
        } else {
            return YAHOO.widget.DateMath.getDate(A[0], A[1] - 1, A[2]);
        }
    },
    _fieldArraysAreEqual: function(C, B) {
        var A = false;
        if (C[0] == B[0] && C[1] == B[1] && C[2] == B[2]) {
            A = true;
        }
        return A;
    },
    _indexOfSelectedFieldArray: function(E) {
        var D = -1;
        var A = this.cfg.getProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.SELECTED.key);
        for (var C = 0; C < A.length; ++C) {
            var B = A[C];
            if (E[0] == B[0] && E[1] == B[1] && E[2] == B[2]) {
                D = C;
                break;
            }
        }
        return D;
    },
    isDateOOM: function(A) {
        return (A.getMonth() != this.cfg.getProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key).getMonth());
    },
    isDateOOB: function(D) {
        var A = YAHOO.widget.Calendar._DEFAULT_CONFIG;
        var E = this.cfg.getProperty(A.MINDATE.key);
        var F = this.cfg.getProperty(A.MAXDATE.key);
        var C = YAHOO.widget.DateMath;
        if (E) {
            E = C.clearTime(E);
        }
        if (F) {
            F = C.clearTime(F);
        }
        var B = new Date(D.getTime());
        B = C.clearTime(B);
        return ((E && B.getTime() < E.getTime()) || (F && B.getTime() > F.getTime()));
    },
    _parsePageDate: function(B) {
        var E;
        var A = YAHOO.widget.Calendar._DEFAULT_CONFIG;
        if (B) {
            if (B instanceof Date) {
                E = YAHOO.widget.DateMath.findMonthStart(B);
            } else {
                var F, D, C;
                C = B.split(this.cfg.getProperty(A.DATE_FIELD_DELIMITER.key));
                F = parseInt(C[this.cfg.getProperty(A.MY_MONTH_POSITION.key) - 1], 10) - 1;
                D = parseInt(C[this.cfg.getProperty(A.MY_YEAR_POSITION.key) - 1], 10);
                E = YAHOO.widget.DateMath.getDate(D, F, 1);
            }
        } else {
            E = YAHOO.widget.DateMath.getDate(this.today.getFullYear(), this.today.getMonth(), 1);
        }
        return E;
    },
    onBeforeSelect: function() {
        if (this.cfg.getProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.MULTI_SELECT.key) === false) {
            if (this.parent) {
                this.parent.callChildFunction("clearAllBodyCellStyles", this.Style.CSS_CELL_SELECTED);
                this.parent.deselectAll();
            } else {
                this.clearAllBodyCellStyles(this.Style.CSS_CELL_SELECTED);
                this.deselectAll();
            }
        }
    },
    onSelect: function(A) {},
    onBeforeDeselect: function() {},
    onDeselect: function(A) {},
    onChangePage: function() {
        this.render();
    },
    onRender: function() {},
    onReset: function() {
        this.render();
    },
    onClear: function() {
        this.render();
    },
    validate: function() {
        return true;
    },
    _parseDate: function(C) {
        var D = C.split(this.Locale.DATE_FIELD_DELIMITER);
        var A;
        if (D.length == 2) {
            A = [D[this.Locale.MD_MONTH_POSITION - 1], D[this.Locale.MD_DAY_POSITION - 1]];
            A.type = YAHOO.widget.Calendar.MONTH_DAY;
        } else {
            A = [D[this.Locale.MDY_YEAR_POSITION - 1], D[this.Locale.MDY_MONTH_POSITION - 1], D[this.Locale.MDY_DAY_POSITION - 1]];
            A.type = YAHOO.widget.Calendar.DATE;
        }
        for (var B = 0; B < A.length; B++) {
            A[B] = parseInt(A[B], 10);
        }
        return A;
    },
    _parseDates: function(B) {
        var I = [];
        var H = B.split(this.Locale.DATE_DELIMITER);
        for (var G = 0; G < H.length; ++G) {
            var F = H[G];
            if (F.indexOf(this.Locale.DATE_RANGE_DELIMITER) != -1) {
                var A = F.split(this.Locale.DATE_RANGE_DELIMITER);
                var E = this._parseDate(A[0]);
                var J = this._parseDate(A[1]);
                var D = this._parseRange(E, J);
                I = I.concat(D);
            } else {
                var C = this._parseDate(F);
                I.push(C);
            }
        }
        return I;
    },
    _parseRange: function(A, E) {
        var B = YAHOO.widget.DateMath.add(YAHOO.widget.DateMath.getDate(A[0], A[1] - 1, A[2]), YAHOO.widget.DateMath.DAY, 1);
        var D = YAHOO.widget.DateMath.getDate(E[0], E[1] - 1, E[2]);
        var C = [];
        C.push(A);
        while (B.getTime() <= D.getTime()) {
            C.push([B.getFullYear(), B.getMonth() + 1, B.getDate()]);
            B = YAHOO.widget.DateMath.add(B, YAHOO.widget.DateMath.DAY, 1);
        }
        return C;
    },
    resetRenderers: function() {
        this.renderStack = this._renderStack.concat();
    },
    removeRenderers: function() {
        this._renderStack = [];
        this.renderStack = [];
    },
    clearElement: function(A) {
        A.innerHTML = "&#160;";
        A.className = "";
    },
    addRenderer: function(A, B) {
        var D = this._parseDates(A);
        for (var C = 0; C < D.length; ++C) {
            var E = D[C];
            if (E.length == 2) {
                if (E[0] instanceof Array) {
                    this._addRenderer(YAHOO.widget.Calendar.RANGE, E, B);
                } else {
                    this._addRenderer(YAHOO.widget.Calendar.MONTH_DAY, E, B);
                }
            } else {
                if (E.length == 3) {
                    this._addRenderer(YAHOO.widget.Calendar.DATE, E, B);
                }
            }
        }
    },
    _addRenderer: function(B, C, A) {
        var D = [B, C, A];
        this.renderStack.unshift(D);
        this._renderStack = this.renderStack.concat();
    },
    addMonthRenderer: function(B, A) {
        this._addRenderer(YAHOO.widget.Calendar.MONTH, [B], A);
    },
    addWeekdayRenderer: function(B, A) {
        this._addRenderer(YAHOO.widget.Calendar.WEEKDAY, [B], A);
    },
    clearAllBodyCellStyles: function(A) {
        for (var B = 0; B < this.cells.length; ++B) {
            YAHOO.util.Dom.removeClass(this.cells[B], A);
        }
    },
    setMonth: function(C) {
        var A = YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key;
        var B = this.cfg.getProperty(A);
        B.setMonth(parseInt(C, 10));
        this.cfg.setProperty(A, B);
    },
    setYear: function(B) {
        var A = YAHOO.widget.Calendar._DEFAULT_CONFIG.PAGEDATE.key;
        var C = this.cfg.getProperty(A);
        C.setFullYear(parseInt(B, 10));
        this.cfg.setProperty(A, C);
    },
    getSelectedDates: function() {
        var C = [];
        var B = this.cfg.getProperty(YAHOO.widget.Calendar._DEFAULT_CONFIG.SELECTED.key);
        for (var E = 0; E < B.length; ++E) {
            var D = B[E];
            var A = YAHOO.widget.DateMath.getDate(D[0], D[1] - 1, D[2]);
            C.push(A);
        }
        C.sort(function(G, F) {
            return G - F;
        });
        return C;
    },
    hide: function() {
        if (this.beforeHideEvent.fire()) {
            this.oDomContainer.style.display = "none";
            this.hideEvent.fire();
        }
    },
    show: function() {
        if (this.beforeShowEvent.fire()) {
            this.oDomContainer.style.display = "block";
            this.showEvent.fire();
        }
    },
    browser: (function() {
        var A = navigator.userAgent.toLowerCase();
        if (A.indexOf("opera") != -1) {
            return "opera";
        } else {
            if (A.indexOf("msie 7") != -1) {
                return "ie7";
            } else {
                if (A.indexOf("msie") != -1) {
                    return "ie";
                } else {
                    if (A.indexOf("safari") != -1) {
                        return "safari";
                    } else {
                        if (A.indexOf("gecko") != -1) {
                            return "gecko";
                        } else {
                            return false;
                        }
                    }
                }
            }
        }
    })(),
    toString: function() {
        return "Calendar " + this.id;
    }
};
YAHOO.widget.Calendar_Core = YAHOO.widget.Calendar;
YAHOO.widget.Cal_Core = YAHOO.widget.Calendar;
YAHOO.widget.CalendarGroup = function(C, A, B) {
    if (arguments.length > 0) {
        this.init.apply(this, arguments);
    }
};
YAHOO.widget.CalendarGroup.prototype = {
    init: function(D, B, C) {
        var A = this._parseArgs(arguments);
        D = A.id;
        B = A.container;
        C = A.config;
        this.oDomContainer = YAHOO.util.Dom.get(B);
        if (!this.oDomContainer.id) {
            this.oDomContainer.id = YAHOO.util.Dom.generateId();
        }
        if (!D) {
            D = this.oDomContainer.id + "_t";
        }
        this.id = D;
        this.containerId = this.oDomContainer.id;
        this.initEvents();
        this.initStyles();
        this.pages = [];
        YAHOO.util.Dom.addClass(this.oDomContainer, YAHOO.widget.CalendarGroup.CSS_CONTAINER);
        YAHOO.util.Dom.addClass(this.oDomContainer, YAHOO.widget.CalendarGroup.CSS_MULTI_UP);
        this.cfg = new YAHOO.util.Config(this);
        this.Options = {};
        this.Locale = {};
        this.setupConfig();
        if (C) {
            this.cfg.applyConfig(C, true);
        }
        this.cfg.fireQueue();
        if (YAHOO.env.ua.opera) {
            this.renderEvent.subscribe(this._fixWidth, this, true);
            this.showEvent.subscribe(this._fixWidth, this, true);
        }
    },
    setupConfig: function() {
        var A = YAHOO.widget.CalendarGroup._DEFAULT_CONFIG;
        this.cfg.addProperty(A.PAGES.key, {
            value: A.PAGES.value,
            validator: this.cfg.checkNumber,
            handler: this.configPages
        });
        this.cfg.addProperty(A.PAGEDATE.key, {
            value: new Date(),
            handler: this.configPageDate
        });
        this.cfg.addProperty(A.SELECTED.key, {
            value: [],
            handler: this.configSelected
        });
        this.cfg.addProperty(A.TITLE.key, {
            value: A.TITLE.value,
            handler: this.configTitle
        });
        this.cfg.addProperty(A.CLOSE.key, {
            value: A.CLOSE.value,
            handler: this.configClose
        });
        this.cfg.addProperty(A.IFRAME.key, {
            value: A.IFRAME.value,
            handler: this.configIframe,
            validator: this.cfg.checkBoolean
        });
        this.cfg.addProperty(A.MINDATE.key, {
            value: A.MINDATE.value,
            handler: this.delegateConfig
        });
        this.cfg.addProperty(A.MAXDATE.key, {
            value: A.MAXDATE.value,
            handler: this.delegateConfig
        });
        this.cfg.addProperty(A.MULTI_SELECT.key, {
            value: A.MULTI_SELECT.value,
            handler: this.delegateConfig,
            validator: this.cfg.checkBoolean
        });
        this.cfg.addProperty(A.START_WEEKDAY.key, {
            value: A.START_WEEKDAY.value,
            handler: this.delegateConfig,
            validator: this.cfg.checkNumber
        });
        this.cfg.addProperty(A.SHOW_WEEKDAYS.key, {
            value: A.SHOW_WEEKDAYS.value,
            handler: this.delegateConfig,
            validator: this.cfg.checkBoolean
        });
        this.cfg.addProperty(A.SHOW_WEEK_HEADER.key, {
            value: A.SHOW_WEEK_HEADER.value,
            handler: this.delegateConfig,
            validator: this.cfg.checkBoolean
        });
        this.cfg.addProperty(A.SHOW_WEEK_FOOTER.key, {
            value: A.SHOW_WEEK_FOOTER.value,
            handler: this.delegateConfig,
            validator: this.cfg.checkBoolean
        });
        this.cfg.addProperty(A.HIDE_BLANK_WEEKS.key, {
            value: A.HIDE_BLANK_WEEKS.value,
            handler: this.delegateConfig,
            validator: this.cfg.checkBoolean
        });
        this.cfg.addProperty(A.NAV_ARROW_LEFT.key, {
            value: A.NAV_ARROW_LEFT.value,
            handler: this.delegateConfig
        });
        this.cfg.addProperty(A.NAV_ARROW_RIGHT.key, {
            value: A.NAV_ARROW_RIGHT.value,
            handler: this.delegateConfig
        });
        this.cfg.addProperty(A.MONTHS_SHORT.key, {
            value: A.MONTHS_SHORT.value,
            handler: this.delegateConfig
        });
        this.cfg.addProperty(A.MONTHS_LONG.key, {
            value: A.MONTHS_LONG.value,
            handler: this.delegateConfig
        });
        this.cfg.addProperty(A.WEEKDAYS_1CHAR.key, {
            value: A.WEEKDAYS_1CHAR.value,
            handler: this.delegateConfig
        });
        this.cfg.addProperty(A.WEEKDAYS_SHORT.key, {
            value: A.WEEKDAYS_SHORT.value,
            handler: this.delegateConfig
        });
        this.cfg.addProperty(A.WEEKDAYS_MEDIUM.key, {
            value: A.WEEKDAYS_MEDIUM.value,
            handler: this.delegateConfig
        });
        this.cfg.addProperty(A.WEEKDAYS_LONG.key, {
            value: A.WEEKDAYS_LONG.value,
            handler: this.delegateConfig
        });
        this.cfg.addProperty(A.LOCALE_MONTHS.key, {
            value: A.LOCALE_MONTHS.value,
            handler: this.delegateConfig
        });
        this.cfg.addProperty(A.LOCALE_WEEKDAYS.key, {
            value: A.LOCALE_WEEKDAYS.value,
            handler: this.delegateConfig
        });
        this.cfg.addProperty(A.DATE_DELIMITER.key, {
            value: A.DATE_DELIMITER.value,
            handler: this.delegateConfig
        });
        this.cfg.addProperty(A.DATE_FIELD_DELIMITER.key, {
            value: A.DATE_FIELD_DELIMITER.value,
            handler: this.delegateConfig
        });
        this.cfg.addProperty(A.DATE_RANGE_DELIMITER.key, {
            value: A.DATE_RANGE_DELIMITER.value,
            handler: this.delegateConfig
        });
        this.cfg.addProperty(A.MY_MONTH_POSITION.key, {
            value: A.MY_MONTH_POSITION.value,
            handler: this.delegateConfig,
            validator: this.cfg.checkNumber
        });
        this.cfg.addProperty(A.MY_YEAR_POSITION.key, {
            value: A.MY_YEAR_POSITION.value,
            handler: this.delegateConfig,
            validator: this.cfg.checkNumber
        });
        this.cfg.addProperty(A.MD_MONTH_POSITION.key, {
            value: A.MD_MONTH_POSITION.value,
            handler: this.delegateConfig,
            validator: this.cfg.checkNumber
        });
        this.cfg.addProperty(A.MD_DAY_POSITION.key, {
            value: A.MD_DAY_POSITION.value,
            handler: this.delegateConfig,
            validator: this.cfg.checkNumber
        });
        this.cfg.addProperty(A.MDY_MONTH_POSITION.key, {
            value: A.MDY_MONTH_POSITION.value,
            handler: this.delegateConfig,
            validator: this.cfg.checkNumber
        });
        this.cfg.addProperty(A.MDY_DAY_POSITION.key, {
            value: A.MDY_DAY_POSITION.value,
            handler: this.delegateConfig,
            validator: this.cfg.checkNumber
        });
        this.cfg.addProperty(A.MDY_YEAR_POSITION.key, {
            value: A.MDY_YEAR_POSITION.value,
            handler: this.delegateConfig,
            validator: this.cfg.checkNumber
        });
        this.cfg.addProperty(A.MY_LABEL_MONTH_POSITION.key, {
            value: A.MY_LABEL_MONTH_POSITION.value,
            handler: this.delegateConfig,
            validator: this.cfg.checkNumber
        });
        this.cfg.addProperty(A.MY_LABEL_YEAR_POSITION.key, {
            value: A.MY_LABEL_YEAR_POSITION.value,
            handler: this.delegateConfig,
            validator: this.cfg.checkNumber
        });
        this.cfg.addProperty(A.MY_LABEL_MONTH_SUFFIX.key, {
            value: A.MY_LABEL_MONTH_SUFFIX.value,
            handler: this.delegateConfig
        });
        this.cfg.addProperty(A.MY_LABEL_YEAR_SUFFIX.key, {
            value: A.MY_LABEL_YEAR_SUFFIX.value,
            handler: this.delegateConfig
        });
        this.cfg.addProperty(A.NAV.key, {
            value: A.NAV.value,
            handler: this.configNavigator
        });
    },
    initEvents: function() {
        var C = this;
        var E = "Event";
        var B = function(G, J, F) {
            for (var I = 0; I < C.pages.length; ++I) {
                var H = C.pages[I];
                H[this.type + E].subscribe(G, J, F);
            }
        };
        var A = function(F, I) {
            for (var H = 0; H < C.pages.length; ++H) {
                var G = C.pages[H];
                G[this.type + E].unsubscribe(F, I);
            }
        };
        var D = YAHOO.widget.Calendar._EVENT_TYPES;
        this.beforeSelectEvent = new YAHOO.util.CustomEvent(D.BEFORE_SELECT);
        this.beforeSelectEvent.subscribe = B;
        this.beforeSelectEvent.unsubscribe = A;
        this.selectEvent = new YAHOO.util.CustomEvent(D.SELECT);
        this.selectEvent.subscribe = B;
        this.selectEvent.unsubscribe = A;
        this.beforeDeselectEvent = new YAHOO.util.CustomEvent(D.BEFORE_DESELECT);
        this.beforeDeselectEvent.subscribe = B;
        this.beforeDeselectEvent.unsubscribe = A;
        this.deselectEvent = new YAHOO.util.CustomEvent(D.DESELECT);
        this.deselectEvent.subscribe = B;
        this.deselectEvent.unsubscribe = A;
        this.changePageEvent = new YAHOO.util.CustomEvent(D.CHANGE_PAGE);
        this.changePageEvent.subscribe = B;
        this.changePageEvent.unsubscribe = A;
        this.beforeRenderEvent = new YAHOO.util.CustomEvent(D.BEFORE_RENDER);
        this.beforeRenderEvent.subscribe = B;
        this.beforeRenderEvent.unsubscribe = A;
        this.renderEvent = new YAHOO.util.CustomEvent(D.RENDER);
        this.renderEvent.subscribe = B;
        this.renderEvent.unsubscribe = A;
        this.resetEvent = new YAHOO.util.CustomEvent(D.RESET);
        this.resetEvent.subscribe = B;
        this.resetEvent.unsubscribe = A;
        this.clearEvent = new YAHOO.util.CustomEvent(D.CLEAR);
        this.clearEvent.subscribe = B;
        this.clearEvent.unsubscribe = A;
        this.beforeShowEvent = new YAHOO.util.CustomEvent(D.BEFORE_SHOW);
        this.showEvent = new YAHOO.util.CustomEvent(D.SHOW);
        this.beforeHideEvent = new YAHOO.util.CustomEvent(D.BEFORE_HIDE);
        this.hideEvent = new YAHOO.util.CustomEvent(D.HIDE);
        this.beforeShowNavEvent = new YAHOO.util.CustomEvent(D.BEFORE_SHOW_NAV);
        this.showNavEvent = new YAHOO.util.CustomEvent(D.SHOW_NAV);
        this.beforeHideNavEvent = new YAHOO.util.CustomEvent(D.BEFORE_HIDE_NAV);
        this.hideNavEvent = new YAHOO.util.CustomEvent(D.HIDE_NAV);
        this.beforeRenderNavEvent = new YAHOO.util.CustomEvent(D.BEFORE_RENDER_NAV);
        this.renderNavEvent = new YAHOO.util.CustomEvent(D.RENDER_NAV);
    },
    configPages: function(K, J, G) {
        var E = J[0];
        var C = YAHOO.widget.CalendarGroup._DEFAULT_CONFIG.PAGEDATE.key;
        var O = "_";
        var L = "groupcal";
        var N = "first-of-type";
        var D = "last-of-type";
        for (var B = 0; B < E; ++B) {
            var M = this.id + O + B;
            var I = this.containerId + O + B;
            var H = this.cfg.getConfig();
            H.close = false;
            H.title = false;
            H.navigator = null;
            var A = this.constructChild(M, I, H);
            var F = A.cfg.getProperty(C);
            this._setMonthOnDate(F, F.getMonth() + B);
            A.cfg.setProperty(C, F);
            YAHOO.util.Dom.removeClass(A.oDomContainer, this.Style.CSS_SINGLE);
            YAHOO.util.Dom.addClass(A.oDomContainer, L);
            if (B === 0) {
                YAHOO.util.Dom.addClass(A.oDomContainer, N);
            }
            if (B == (E - 1)) {
                YAHOO.util.Dom.addClass(A.oDomContainer, D);
            }
            A.parent = this;
            A.index = B;
            this.pages[this.pages.length] = A;
        }
    },
    configPageDate: function(H, G, E) {
        var C = G[0];
        var F;
        var D = YAHOO.widget.CalendarGroup._DEFAULT_CONFIG.PAGEDATE.key;
        for (var B = 0; B < this.pages.length; ++B) {
            var A = this.pages[B];
            if (B === 0) {
                F = A._parsePageDate(C);
                A.cfg.setProperty(D, F);
            } else {
                var I = new Date(F);
                this._setMonthOnDate(I, I.getMonth() + B);
                A.cfg.setProperty(D, I);
            }
        }
    },
    configSelected: function(C, A, E) {
        var D = YAHOO.widget.CalendarGroup._DEFAULT_CONFIG.SELECTED.key;
        this.delegateConfig(C, A, E);
        var B = (this.pages.length > 0) ? this.pages[0].cfg.getProperty(D) : [];
        this.cfg.setProperty(D, B, true);
    },
    delegateConfig: function(B, A, E) {
        var F = A[0];
        var D;
        for (var C = 0; C < this.pages.length; C++) {
            D = this.pages[C];
            D.cfg.setProperty(B, F);
        }
    },
    setChildFunction: function(D, B) {
        var A = this.cfg.getProperty(YAHOO.widget.CalendarGroup._DEFAULT_CONFIG.PAGES.key);
        for (var C = 0; C < A; ++C) {
            this.pages[C][D] = B;
        }
    },
    callChildFunction: function(F, B) {
        var A = this.cfg.getProperty(YAHOO.widget.CalendarGroup._DEFAULT_CONFIG.PAGES.key);
        for (var E = 0; E < A; ++E) {
            var D = this.pages[E];
            if (D[F]) {
                var C = D[F];
                C.call(D, B);
            }
        }
    },
    constructChild: function(D, B, C) {
        var A = document.getElementById(B);
        if (!A) {
            A = document.createElement("div");
            A.id = B;
            this.oDomContainer.appendChild(A);
        }
        return new YAHOO.widget.Calendar(D, B, C);
    },
    setMonth: function(E) {
        E = parseInt(E, 10);
        var F;
        var B = YAHOO.widget.CalendarGroup._DEFAULT_CONFIG.PAGEDATE.key;
        for (var D = 0; D < this.pages.length; ++D) {
            var C = this.pages[D];
            var A = C.cfg.getProperty(B);
            if (D === 0) {
                F = A.getFullYear();
            } else {
                A.setFullYear(F);
            }
            this._setMonthOnDate(A, E + D);
            C.cfg.setProperty(B, A);
        }
    },
    setYear: function(C) {
        var B = YAHOO.widget.CalendarGroup._DEFAULT_CONFIG.PAGEDATE.key;
        C = parseInt(C, 10);
        for (var E = 0; E < this.pages.length; ++E) {
            var D = this.pages[E];
            var A = D.cfg.getProperty(B);
            if ((A.getMonth() + 1) == 1 && E > 0) {
                C += 1;
            }
            D.setYear(C);
        }
    },
    render: function() {
        this.renderHeader();
        for (var B = 0; B < this.pages.length; ++B) {
            var A = this.pages[B];
            A.render();
        }
        this.renderFooter();
    },
    select: function(A) {
        for (var C = 0; C < this.pages.length; ++C) {
            var B = this.pages[C];
            B.select(A);
        }
        return this.getSelectedDates();
    },
    selectCell: function(A) {
        for (var C = 0; C < this.pages.length; ++C) {
            var B = this.pages[C];
            B.selectCell(A);
        }
        return this.getSelectedDates();
    },
    deselect: function(A) {
        for (var C = 0; C < this.pages.length; ++C) {
            var B = this.pages[C];
            B.deselect(A);
        }
        return this.getSelectedDates();
    },
    deselectAll: function() {
        for (var B = 0; B < this.pages.length; ++B) {
            var A = this.pages[B];
            A.deselectAll();
        }
        return this.getSelectedDates();
    },
    deselectCell: function(A) {
        for (var C = 0; C < this.pages.length; ++C) {
            var B = this.pages[C];
            B.deselectCell(A);
        }
        return this.getSelectedDates();
    },
    reset: function() {
        for (var B = 0; B < this.pages.length; ++B) {
            var A = this.pages[B];
            A.reset();
        }
    },
    clear: function() {
        for (var B = 0; B < this.pages.length; ++B) {
            var A = this.pages[B];
            A.clear();
        }
    },
    nextMonth: function() {
        for (var B = 0; B < this.pages.length; ++B) {
            var A = this.pages[B];
            A.nextMonth();
        }
    },
    previousMonth: function() {
        for (var B = this.pages.length - 1; B >= 0; --B) {
            var A = this.pages[B];
            A.previousMonth();
        }
    },
    nextYear: function() {
        for (var B = 0; B < this.pages.length; ++B) {
            var A = this.pages[B];
            A.nextYear();
        }
    },
    previousYear: function() {
        for (var B = 0; B < this.pages.length; ++B) {
            var A = this.pages[B];
            A.previousYear();
        }
    },
    getSelectedDates: function() {
        var C = [];
        var B = this.cfg.getProperty(YAHOO.widget.CalendarGroup._DEFAULT_CONFIG.SELECTED.key);
        for (var E = 0; E < B.length; ++E) {
            var D = B[E];
            var A = YAHOO.widget.DateMath.getDate(D[0], D[1] - 1, D[2]);
            C.push(A);
        }
        C.sort(function(G, F) {
            return G - F;
        });
        return C;
    },
    addRenderer: function(A, B) {
        for (var D = 0; D < this.pages.length; ++D) {
            var C = this.pages[D];
            C.addRenderer(A, B);
        }
    },
    addMonthRenderer: function(D, A) {
        for (var C = 0; C < this.pages.length; ++C) {
            var B = this.pages[C];
            B.addMonthRenderer(D, A);
        }
    },
    addWeekdayRenderer: function(B, A) {
        for (var D = 0; D < this.pages.length; ++D) {
            var C = this.pages[D];
            C.addWeekdayRenderer(B, A);
        }
    },
    removeRenderers: function() {
        this.callChildFunction("removeRenderers");
    },
    renderHeader: function() {},
    renderFooter: function() {},
    addMonths: function(A) {
        this.callChildFunction("addMonths", A);
    },
    subtractMonths: function(A) {
        this.callChildFunction("subtractMonths", A);
    },
    addYears: function(A) {
        this.callChildFunction("addYears", A);
    },
    subtractYears: function(A) {
        this.callChildFunction("subtractYears", A);
    },
    getCalendarPage: function(D) {
        var F = null;
        if (D) {
            var G = D.getFullYear(),
            C = D.getMonth();
            var B = this.pages;
            for (var E = 0; E < B.length; ++E) {
                var A = B[E].cfg.getProperty("pagedate");
                if (A.getFullYear() === G && A.getMonth() === C) {
                    F = B[E];
                    break;
                }
            }
        }
        return F;
    },
    _setMonthOnDate: function(C, D) {
        if (YAHOO.env.ua.webkit && YAHOO.env.ua.webkit < 420 && (D < 0 || D > 11)) {
            var B = YAHOO.widget.DateMath;
            var A = B.add(C, B.MONTH, D - C.getMonth());
            C.setTime(A.getTime());
        } else {
            C.setMonth(D);
        }
    },
    _fixWidth: function() {
        var A = 0;
        for (var C = 0; C < this.pages.length; ++C) {
            var B = this.pages[C];
            A += B.oDomContainer.offsetWidth;
        }
        if (A > 0) {
            this.oDomContainer.style.width = A + "px";
        }
    },
    toString: function() {
        return "CalendarGroup " + this.id;
    }
};
YAHOO.widget.CalendarGroup.CSS_CONTAINER = "yui-calcontainer";
YAHOO.widget.CalendarGroup.CSS_MULTI_UP = "multi";
YAHOO.widget.CalendarGroup.CSS_2UPTITLE = "title";
YAHOO.widget.CalendarGroup.CSS_2UPCLOSE = "close-icon";
YAHOO.lang.augmentProto(YAHOO.widget.CalendarGroup, YAHOO.widget.Calendar, "buildDayLabel", "buildMonthLabel", "renderOutOfBoundsDate", "renderRowHeader", "renderRowFooter", "renderCellDefault", "styleCellDefault", "renderCellStyleHighlight1", "renderCellStyleHighlight2", "renderCellStyleHighlight3", "renderCellStyleHighlight4", "renderCellStyleToday", "renderCellStyleSelected", "renderCellNotThisMonth", "renderBodyCellRestricted", "initStyles", "configTitle", "configClose", "configIframe", "configNavigator", "createTitleBar", "createCloseButton", "removeTitleBar", "removeCloseButton", "hide", "show", "toDate", "_toDate", "_parseArgs", "browser");
YAHOO.widget.CalendarGroup._DEFAULT_CONFIG = YAHOO.widget.Calendar._DEFAULT_CONFIG;
YAHOO.widget.CalendarGroup._DEFAULT_CONFIG.PAGES = {
    key: "pages",
    value: 2
};
YAHOO.widget.CalGrp = YAHOO.widget.CalendarGroup;
YAHOO.widget.Calendar2up = function(C, A, B) {
    this.init(C, A, B);
};
YAHOO.extend(YAHOO.widget.Calendar2up, YAHOO.widget.CalendarGroup);
YAHOO.widget.Cal2up = YAHOO.widget.Calendar2up;
YAHOO.widget.CalendarNavigator = function(A) {
    this.init(A);
}; (function() {
    var A = YAHOO.widget.CalendarNavigator;
    A.CLASSES = {
        NAV: "yui-cal-nav",
        NAV_VISIBLE: "yui-cal-nav-visible",
        MASK: "yui-cal-nav-mask",
        YEAR: "yui-cal-nav-y",
        MONTH: "yui-cal-nav-m",
        BUTTONS: "yui-cal-nav-b",
        BUTTON: "yui-cal-nav-btn",
        ERROR: "yui-cal-nav-e",
        YEAR_CTRL: "yui-cal-nav-yc",
        MONTH_CTRL: "yui-cal-nav-mc",
        INVALID: "yui-invalid",
        DEFAULT: "yui-default"
    };
    A._DEFAULT_CFG = {
        strings: {
            month: "Month",
            year: "Year",
            submit: "Okay",
            cancel: "Cancel",
            invalidYear: "Year needs to be a number"
        },
        monthFormat: YAHOO.widget.Calendar.LONG,
        initialFocus: "year"
    };
    A.ID_SUFFIX = "_nav";
    A.MONTH_SUFFIX = "_month";
    A.YEAR_SUFFIX = "_year";
    A.ERROR_SUFFIX = "_error";
    A.CANCEL_SUFFIX = "_cancel";
    A.SUBMIT_SUFFIX = "_submit";
    A.YR_MAX_DIGITS = 4;
    A.YR_MINOR_INC = 1;
    A.YR_MAJOR_INC = 10;
    A.UPDATE_DELAY = 50;
    A.YR_PATTERN = /^\d+$/;
    A.TRIM = /^\s*(.*?)\s*$/;
})();
YAHOO.widget.CalendarNavigator.prototype = {
    id: null,
    cal: null,
    navEl: null,
    maskEl: null,
    yearEl: null,
    monthEl: null,
    errorEl: null,
    submitEl: null,
    cancelEl: null,
    firstCtrl: null,
    lastCtrl: null,
    _doc: null,
    _year: null,
    _month: 0,
    __rendered: false,
    init: function(A) {
        var C = A.oDomContainer;
        this.cal = A;
        this.id = C.id + YAHOO.widget.CalendarNavigator.ID_SUFFIX;
        this._doc = C.ownerDocument;
        var B = YAHOO.env.ua.ie;
        this.__isIEQuirks = (B && ((B <= 6) || (B === 7 && this._doc.compatMode == "BackCompat")));
    },
    show: function() {
        var A = YAHOO.widget.CalendarNavigator.CLASSES;
        if (this.cal.beforeShowNavEvent.fire()) {
            if (!this.__rendered) {
                this.render();
            }
            this.clearErrors();
            this._updateMonthUI();
            this._updateYearUI();
            this._show(this.navEl, true);
            this.setInitialFocus();
            this.showMask();
            YAHOO.util.Dom.addClass(this.cal.oDomContainer, A.NAV_VISIBLE);
            this.cal.showNavEvent.fire();
        }
    },
    hide: function() {
        var A = YAHOO.widget.CalendarNavigator.CLASSES;
        if (this.cal.beforeHideNavEvent.fire()) {
            this._show(this.navEl, false);
            this.hideMask();
            YAHOO.util.Dom.removeClass(this.cal.oDomContainer, A.NAV_VISIBLE);
            this.cal.hideNavEvent.fire();
        }
    },
    showMask: function() {
        this._show(this.maskEl, true);
        if (this.__isIEQuirks) {
            this._syncMask();
        }
    },
    hideMask: function() {
        this._show(this.maskEl, false);
    },
    getMonth: function() {
        return this._month;
    },
    getYear: function() {
        return this._year;
    },
    setMonth: function(A) {
        if (A >= 0 && A < 12) {
            this._month = A;
        }
        this._updateMonthUI();
    },
    setYear: function(B) {
        var A = YAHOO.widget.CalendarNavigator.YR_PATTERN;
        if (YAHOO.lang.isNumber(B) && A.test(B + "")) {
            this._year = B;
        }
        this._updateYearUI();
    },
    render: function() {
        this.cal.beforeRenderNavEvent.fire();
        if (!this.__rendered) {
            this.createNav();
            this.createMask();
            this.applyListeners();
            this.__rendered = true;
        }
        this.cal.renderNavEvent.fire();
    },
    createNav: function() {
        var B = YAHOO.widget.CalendarNavigator;
        var C = this._doc;
        var D = C.createElement("div");
        D.className = B.CLASSES.NAV;
        var A = this.renderNavContents([]);
        D.innerHTML = A.join("");
        this.cal.oDomContainer.appendChild(D);
        this.navEl = D;
        this.yearEl = C.getElementById(this.id + B.YEAR_SUFFIX);
        this.monthEl = C.getElementById(this.id + B.MONTH_SUFFIX);
        this.errorEl = C.getElementById(this.id + B.ERROR_SUFFIX);
        this.submitEl = C.getElementById(this.id + B.SUBMIT_SUFFIX);
        this.cancelEl = C.getElementById(this.id + B.CANCEL_SUFFIX);
        if (YAHOO.env.ua.gecko && this.yearEl && this.yearEl.type == "text") {
            this.yearEl.setAttribute("autocomplete", "off");
        }
        this._setFirstLastElements();
    },
    createMask: function() {
        var B = YAHOO.widget.CalendarNavigator.CLASSES;
        var A = this._doc.createElement("div");
        A.className = B.MASK;
        this.cal.oDomContainer.appendChild(A);
        this.maskEl = A;
    },
    _syncMask: function() {
        var B = this.cal.oDomContainer;
        if (B && this.maskEl) {
            var A = YAHOO.util.Dom.getRegion(B);
            YAHOO.util.Dom.setStyle(this.maskEl, "width", A.right - A.left + "px");
            YAHOO.util.Dom.setStyle(this.maskEl, "height", A.bottom - A.top + "px");
        }
    },
    renderNavContents: function(A) {
        var D = YAHOO.widget.CalendarNavigator,
        E = D.CLASSES,
        B = A;
        B[B.length] = '<div class="' + E.MONTH + '">';
        this.renderMonth(B);
        B[B.length] = "</div>";
        B[B.length] = '<div class="' + E.YEAR + '">';
        this.renderYear(B);
        B[B.length] = "</div>";
        B[B.length] = '<div class="' + E.BUTTONS + '">';
        this.renderButtons(B);
        B[B.length] = "</div>";
        B[B.length] = '<div class="' + E.ERROR + '" id="' + this.id + D.ERROR_SUFFIX + '"></div>';
        return B;
    },
    renderMonth: function(D) {
        var G = YAHOO.widget.CalendarNavigator,
        H = G.CLASSES;
        var I = this.id + G.MONTH_SUFFIX,
        F = this.__getCfg("monthFormat"),
        A = this.cal.cfg.getProperty((F == YAHOO.widget.Calendar.SHORT) ? "MONTHS_SHORT": "MONTHS_LONG"),
        E = D;
        if (A && A.length > 0) {
            E[E.length] = '<label for="' + I + '">';
            E[E.length] = this.__getCfg("month", true);
            E[E.length] = "</label>";
            E[E.length] = '<select name="' + I + '" id="' + I + '" class="' + H.MONTH_CTRL + '">';
            for (var B = 0; B < A.length; B++) {
                E[E.length] = '<option value="' + B + '">';
                E[E.length] = A[B];
                E[E.length] = "</option>";
            }
            E[E.length] = "</select>";
        }
        return E;
    },
    renderYear: function(B) {
        var E = YAHOO.widget.CalendarNavigator,
        F = E.CLASSES;
        var G = this.id + E.YEAR_SUFFIX,
        A = E.YR_MAX_DIGITS,
        D = B;
        D[D.length] = '<label for="' + G + '">';
        D[D.length] = this.__getCfg("year", true);
        D[D.length] = "</label>";
        D[D.length] = '<input type="text" name="' + G + '" id="' + G + '" class="' + F.YEAR_CTRL + '" maxlength="' + A + '"/>';
        return D;
    },
    renderButtons: function(A) {
        var D = YAHOO.widget.CalendarNavigator.CLASSES;
        var B = A;
        B[B.length] = '<span class="' + D.BUTTON + " " + D.DEFAULT + '">';
        B[B.length] = '<button type="button" id="' + this.id + "_submit" + '">';
        B[B.length] = this.__getCfg("submit", true);
        B[B.length] = "</button>";
        B[B.length] = "</span>";
        B[B.length] = '<span class="' + D.BUTTON + '">';
        B[B.length] = '<button type="button" id="' + this.id + "_cancel" + '">';
        B[B.length] = this.__getCfg("cancel", true);
        B[B.length] = "</button>";
        B[B.length] = "</span>";
        return B;
    },
    applyListeners: function() {
        var B = YAHOO.util.Event;
        function A() {
            if (this.validate()) {
                this.setYear(this._getYearFromUI());
            }
        }
        function C() {
            this.setMonth(this._getMonthFromUI());
        }
        B.on(this.submitEl, "click", this.submit, this, true);
        B.on(this.cancelEl, "click", this.cancel, this, true);
        B.on(this.yearEl, "blur", A, this, true);
        B.on(this.monthEl, "change", C, this, true);
        if (this.__isIEQuirks) {
            YAHOO.util.Event.on(this.cal.oDomContainer, "resize", this._syncMask, this, true);
        }
        this.applyKeyListeners();
    },
    purgeListeners: function() {
        var A = YAHOO.util.Event;
        A.removeListener(this.submitEl, "click", this.submit);
        A.removeListener(this.cancelEl, "click", this.cancel);
        A.removeListener(this.yearEl, "blur");
        A.removeListener(this.monthEl, "change");
        if (this.__isIEQuirks) {
            A.removeListener(this.cal.oDomContainer, "resize", this._syncMask);
        }
        this.purgeKeyListeners();
    },
    applyKeyListeners: function() {
        var D = YAHOO.util.Event,
        A = YAHOO.env.ua;
        var C = (A.ie || A.webkit) ? "keydown": "keypress";
        var B = (A.ie || A.opera || A.webkit) ? "keydown": "keypress";
        D.on(this.yearEl, "keypress", this._handleEnterKey, this, true);
        D.on(this.yearEl, C, this._handleDirectionKeys, this, true);
        D.on(this.lastCtrl, B, this._handleTabKey, this, true);
        D.on(this.firstCtrl, B, this._handleShiftTabKey, this, true);
    },
    purgeKeyListeners: function() {
        var D = YAHOO.util.Event,
        A = YAHOO.env.ua;
        var C = (A.ie || A.webkit) ? "keydown": "keypress";
        var B = (A.ie || A.opera || A.webkit) ? "keydown": "keypress";
        D.removeListener(this.yearEl, "keypress", this._handleEnterKey);
        D.removeListener(this.yearEl, C, this._handleDirectionKeys);
        D.removeListener(this.lastCtrl, B, this._handleTabKey);
        D.removeListener(this.firstCtrl, B, this._handleShiftTabKey);
    },
    submit: function() {
        if (this.validate()) {
            this.hide();
            this.setMonth(this._getMonthFromUI());
            this.setYear(this._getYearFromUI());
            var B = this.cal;
            var C = this;
            function D() {
                B.setYear(C.getYear());
                B.setMonth(C.getMonth());
                B.render();
            }
            var A = YAHOO.widget.CalendarNavigator.UPDATE_DELAY;
            if (A > 0) {
                window.setTimeout(D, A);
            } else {
                D();
            }
        }
    },
    cancel: function() {
        this.hide();
    },
    validate: function() {
        if (this._getYearFromUI() !== null) {
            this.clearErrors();
            return true;
        } else {
            this.setYearError();
            this.setError(this.__getCfg("invalidYear", true));
            return false;
        }
    },
    setError: function(A) {
        if (this.errorEl) {
            this.errorEl.innerHTML = A;
            this._show(this.errorEl, true);
        }
    },
    clearError: function() {
        if (this.errorEl) {
            this.errorEl.innerHTML = "";
            this._show(this.errorEl, false);
        }
    },
    setYearError: function() {
        YAHOO.util.Dom.addClass(this.yearEl, YAHOO.widget.CalendarNavigator.CLASSES.INVALID);
    },
    clearYearError: function() {
        YAHOO.util.Dom.removeClass(this.yearEl, YAHOO.widget.CalendarNavigator.CLASSES.INVALID);
    },
    clearErrors: function() {
        this.clearError();
        this.clearYearError();
    },
    setInitialFocus: function() {
        var A = this.submitEl,
        C = this.__getCfg("initialFocus");
        if (C && C.toLowerCase) {
            C = C.toLowerCase();
            if (C == "year") {
                A = this.yearEl;
                try {
                    this.yearEl.select();
                } catch(B) {}
            } else {
                if (C == "month") {
                    A = this.monthEl;
                }
            }
        }
        if (A && YAHOO.lang.isFunction(A.focus)) {
            try {
                A.focus();
            } catch(B) {}
        }
    },
    erase: function() {
        if (this.__rendered) {
            this.purgeListeners();
            this.yearEl = null;
            this.monthEl = null;
            this.errorEl = null;
            this.submitEl = null;
            this.cancelEl = null;
            this.firstCtrl = null;
            this.lastCtrl = null;
            if (this.navEl) {
                this.navEl.innerHTML = "";
            }
            var B = this.navEl.parentNode;
            if (B) {
                B.removeChild(this.navEl);
            }
            this.navEl = null;
            var A = this.maskEl.parentNode;
            if (A) {
                A.removeChild(this.maskEl);
            }
            this.maskEl = null;
            this.__rendered = false;
        }
    },
    destroy: function() {
        this.erase();
        this._doc = null;
        this.cal = null;
        this.id = null;
    },
    _show: function(B, A) {
        if (B) {
            YAHOO.util.Dom.setStyle(B, "display", (A) ? "block": "none");
        }
    },
    _getMonthFromUI: function() {
        if (this.monthEl) {
            return this.monthEl.selectedIndex;
        } else {
            return 0;
        }
    },
    _getYearFromUI: function() {
        var B = YAHOO.widget.CalendarNavigator;
        var A = null;
        if (this.yearEl) {
            var C = this.yearEl.value;
            C = C.replace(B.TRIM, "$1");
            if (B.YR_PATTERN.test(C)) {
                A = parseInt(C, 10);
            }
        }
        return A;
    },
    _updateYearUI: function() {
        if (this.yearEl && this._year !== null) {
            this.yearEl.value = this._year;
        }
    },
    _updateMonthUI: function() {
        if (this.monthEl) {
            this.monthEl.selectedIndex = this._month;
        }
    },
    _setFirstLastElements: function() {
        this.firstCtrl = this.monthEl;
        this.lastCtrl = this.cancelEl;
        if (this.__isMac) {
            if (YAHOO.env.ua.webkit && YAHOO.env.ua.webkit < 420) {
                this.firstCtrl = this.monthEl;
                this.lastCtrl = this.yearEl;
            }
            if (YAHOO.env.ua.gecko) {
                this.firstCtrl = this.yearEl;
                this.lastCtrl = this.yearEl;
            }
        }
    },
    _handleEnterKey: function(B) {
        var A = YAHOO.util.KeyListener.KEY;
        if (YAHOO.util.Event.getCharCode(B) == A.ENTER) {
            YAHOO.util.Event.preventDefault(B);
            this.submit();
        }
    },
    _handleDirectionKeys: function(H) {
        var G = YAHOO.util.Event,
        A = YAHOO.util.KeyListener.KEY,
        D = YAHOO.widget.CalendarNavigator;
        var F = (this.yearEl.value) ? parseInt(this.yearEl.value, 10) : null;
        if (isFinite(F)) {
            var B = false;
            switch (G.getCharCode(H)) {
            case A.UP:
                this.yearEl.value = F + D.YR_MINOR_INC;
                B = true;
                break;
            case A.DOWN:
                this.yearEl.value = Math.max(F - D.YR_MINOR_INC, 0);
                B = true;
                break;
            case A.PAGE_UP:
                this.yearEl.value = F + D.YR_MAJOR_INC;
                B = true;
                break;
            case A.PAGE_DOWN:
                this.yearEl.value = Math.max(F - D.YR_MAJOR_INC, 0);
                B = true;
                break;
            default:
                break;
            }
            if (B) {
                G.preventDefault(H);
                try {
                    this.yearEl.select();
                } catch(C) {}
            }
        }
    },
    _handleTabKey: function(D) {
        var C = YAHOO.util.Event,
        A = YAHOO.util.KeyListener.KEY;
        if (C.getCharCode(D) == A.TAB && !D.shiftKey) {
            try {
                C.preventDefault(D);
                this.firstCtrl.focus();
            } catch(B) {}
        }
    },
    _handleShiftTabKey: function(D) {
        var C = YAHOO.util.Event,
        A = YAHOO.util.KeyListener.KEY;
        if (D.shiftKey && C.getCharCode(D) == A.TAB) {
            try {
                C.preventDefault(D);
                this.lastCtrl.focus();
            } catch(B) {}
        }
    },
    __getCfg: function(D, B) {
        var C = YAHOO.widget.CalendarNavigator._DEFAULT_CFG;
        var A = this.cal.cfg.getProperty("navigator");
        if (B) {
            return (A !== true && A.strings && A.strings[D]) ? A.strings[D] : C.strings[D];
        } else {
            return (A !== true && A[D]) ? A[D] : C[D];
        }
    },
    __isMac: (navigator.userAgent.toLowerCase().indexOf("macintosh") != -1)
};
YAHOO.register("calendar", YAHOO.widget.Calendar, {
    version: "2.5.2",
    build: "1076"
});
