(function(C) {
    C.ui = {
        plugin: {
            add: function(E, F, H) {
                var G = C.ui[E].prototype;
                for (var D in H) {
                    G.plugins[D] = G.plugins[D] || [];
                    G.plugins[D].push([F, H[D]])
                }
            },
            call: function(D, F, E) {
                var H = D.plugins[F];
                if (!H) {
                    return
                }
                for (var G = 0; G < H.length; G++) {
                    if (D.options[H[G][0]]) {
                        H[G][1].apply(D.element, E)
                    }
                }
            }
        },
        cssCache: {},
        css: function(D) {
            if (C.ui.cssCache[D]) {
                return C.ui.cssCache[D]
            }
            var E = C('<div class="ui-gen">').addClass(D).css({
                position: "absolute",
                top: "-5000px",
                left: "-5000px",
                display: "block"
            }).appendTo("body");
            C.ui.cssCache[D] = !!((!(/auto|default/).test(E.css("cursor")) || (/^[1-9]/).test(E.css("height")) || (/^[1-9]/).test(E.css("width")) || !(/none/).test(E.css("backgroundImage")) || !(/transparent|rgba\(0, 0, 0, 0\)/).test(E.css("backgroundColor"))));
            try {
                C("body").get(0).removeChild(E.get(0))
            } catch(F) {}
            return C.ui.cssCache[D]
        },
        disableSelection: function(D) {
            C(D).attr("unselectable", "on").css("MozUserSelect", "none")
        },
        enableSelection: function(D) {
            C(D).attr("unselectable", "off").css("MozUserSelect", "")
        },
        hasScroll: function(G, E) {
            var D = /top/.test(E || "top") ? "scrollTop": "scrollLeft",
            F = false;
            if (G[D] > 0) {
                return true
            }
            G[D] = 1;
            F = G[D] > 0 ? true: false;
            G[D] = 0;
            return F
        }
    };
    var B = C.fn.remove;
    C.fn.remove = function() {
        C("*", this).add(this).triggerHandler("remove");
        return B.apply(this, arguments)
    };
    function A(E, F, G) {
        var D = C[E][F].getter || [];
        D = (typeof D == "string" ? D.split(/,?\s+/) : D);
        return (C.inArray(G, D) != -1)
    }
    C.widget = function(E, D) {
        var F = E.split(".")[0];
        E = E.split(".")[1];
        C.fn[E] = function(J) {
            var H = (typeof J == "string"),
            I = Array.prototype.slice.call(arguments, 1);
            if (H && A(F, E, J)) {
                var G = C.data(this[0], E);
                return (G ? G[J].apply(G, I) : undefined)
            }
            return this.each(function() {
                var K = C.data(this, E);
                if (H && K && C.isFunction(K[J])) {
                    K[J].apply(K, I)
                } else {
                    if (!H) {
                        C.data(this, E, new C[F][E](this, J))
                    }
                }
            })
        };
        C[F][E] = function(I, H) {
            var G = this;
            this.widgetName = E;
            this.widgetBaseClass = F + "-" + E;
            this.options = C.extend({},
            C.widget.defaults, C[F][E].defaults, H);
            this.element = C(I).bind("setData." + E,
            function(L, J, K) {
                return G.setData(J, K)
            }).bind("getData." + E,
            function(K, J) {
                return G.getData(J)
            }).bind("remove",
            function() {
                return G.destroy()
            });
            this.init()
        };
        C[F][E].prototype = C.extend({},
        C.widget.prototype, D)
    };
    C.widget.prototype = {
        init: function() {},
        destroy: function() {
            this.element.removeData(this.widgetName)
        },
        getData: function(D) {
            return this.options[D]
        },
        setData: function(D, E) {
            this.options[D] = E;
            if (D == "disabled") {
                this.element[E ? "addClass": "removeClass"](this.widgetBaseClass + "-disabled")
            }
        },
        enable: function() {
            this.setData("disabled", false)
        },
        disable: function() {
            this.setData("disabled", true)
        }
    };
    C.widget.defaults = {
        disabled: false
    };
    C.ui.mouse = {
        mouseInit: function() {
            var D = this;
            this.element.bind("mousedown." + this.widgetName,
            function(E) {
                return D.mouseDown(E)
            });
            if (C.browser.msie) {
                this._mouseUnselectable = this.element.attr("unselectable");
                this.element.attr("unselectable", "on")
            }
            this.started = false
        },
        mouseDestroy: function() {
            this.element.unbind("." + this.widgetName);
            (C.browser.msie && this.element.attr("unselectable", this._mouseUnselectable))
        },
        mouseDown: function(F) { (this._mouseStarted && this.mouseUp(F));
            this._mouseDownEvent = F;
            var E = this,
            G = (F.which == 1),
            D = (typeof this.options.cancel == "string" ? C(F.target).parents().add(F.target).filter(this.options.cancel).length: false);
            if (!G || D || !this.mouseCapture(F)) {
                return true
            }
            this._mouseDelayMet = !this.options.delay;
            if (!this._mouseDelayMet) {
                this._mouseDelayTimer = setTimeout(function() {
                    E._mouseDelayMet = true
                },
                this.options.delay)
            }
            if (this.mouseDistanceMet(F) && this.mouseDelayMet(F)) {
                this._mouseStarted = (this.mouseStart(F) !== false);
                if (!this._mouseStarted) {
                    F.preventDefault();
                    return true
                }
            }
            this._mouseMoveDelegate = function(H) {
                return E.mouseMove(H)
            };
            this._mouseUpDelegate = function(H) {
                return E.mouseUp(H)
            };
            C(document).bind("mousemove." + this.widgetName, this._mouseMoveDelegate).bind("mouseup." + this.widgetName, this._mouseUpDelegate);
            return false
        },
        mouseMove: function(D) {
            if (C.browser.msie && !D.button) {
                return this.mouseUp(D)
            }
            if (this._mouseStarted) {
                this.mouseDrag(D);
                return false
            }
            if (this.mouseDistanceMet(D) && this.mouseDelayMet(D)) {
                this._mouseStarted = (this.mouseStart(this._mouseDownEvent, D) !== false);
                (this._mouseStarted ? this.mouseDrag(D) : this.mouseUp(D))
            }
            return ! this._mouseStarted
        },
        mouseUp: function(D) {
            C(document).unbind("mousemove." + this.widgetName, this._mouseMoveDelegate).unbind("mouseup." + this.widgetName, this._mouseUpDelegate);
            if (this._mouseStarted) {
                this._mouseStarted = false;
                this.mouseStop(D)
            }
            return false
        },
        mouseDistanceMet: function(D) {
            return (Math.max(Math.abs(this._mouseDownEvent.pageX - D.pageX), Math.abs(this._mouseDownEvent.pageY - D.pageY)) >= this.options.distance)
        },
        mouseDelayMet: function(D) {
            return this._mouseDelayMet
        },
        mouseStart: function(D) {},
        mouseDrag: function(D) {},
        mouseStop: function(D) {},
        mouseCapture: function(D) {
            return true
        }
    };
    C.ui.mouse.defaults = {
        cancel: null,
        distance: 1,
        delay: 0
    }
})(jQuery);
(function(A) {
    A.widget("ui.tabs", {
        init: function() {
            this.options.event += ".tabs";
            this.tabify(true)
        },
        setData: function(B, C) {
            if ((/^selected/).test(B)) {
                this.select(C)
            } else {
                this.options[B] = C;
                this.tabify()
            }
        },
        length: function() {
            return this.$tabs.length
        },
        tabId: function(B) {
            return B.title && B.title.replace(/\s/g, "_").replace(/[^A-Za-z0-9\-_:\.]/g, "") || this.options.idPrefix + A.data(B)
        },
        ui: function(C, B) {
            return {
                options: this.options,
                tab: C,
                panel: B,
                index: this.$tabs.index(C)
            }
        },
        tabify: function(O) {
            this.$lis = A("li:has(a[href])", this.element);
            this.$tabs = this.$lis.map(function() {
                return A("a", this)[0]
            });
            this.$panels = A([]);
            var P = this,
            D = this.options;
            this.$tabs.each(function(R, Q) {
                if (Q.hash && Q.hash.replace("#", "")) {
                    P.$panels = P.$panels.add(Q.hash)
                } else {
                    if (A(Q).attr("href") != "#") {
                        A.data(Q, "href.tabs", Q.href);
                        A.data(Q, "load.tabs", Q.href);
                        var T = P.tabId(Q);
                        Q.href = "#" + T;
                        var S = A("#" + T);
                        if (!S.length) {
                            S = A(D.panelTemplate).attr("id", T).addClass(D.panelClass).insertAfter(P.$panels[R - 1] || P.element);
                            S.data("destroy.tabs", true)
                        }
                        P.$panels = P.$panels.add(S)
                    } else {
                        D.disabled.push(R + 1)
                    }
                }
            });
            if (O) {
                this.element.addClass(D.navClass);
                this.$panels.each(function() {
                    var Q = A(this);
                    Q.addClass(D.panelClass)
                });
                if (D.selected === undefined) {
                    if (location.hash) {
                        this.$tabs.each(function(S, Q) {
                            if (Q.hash == location.hash) {
                                D.selected = S;
                                if (A.browser.msie || A.browser.opera) {
                                    var R = A(location.hash),
                                    T = R.attr("id");
                                    R.attr("id", "");
                                    setTimeout(function() {
                                        R.attr("id", T)
                                    },
                                    500)
                                }
                                scrollTo(0, 0);
                                return false
                            }
                        })
                    } else {
                        if (D.cookie) {
                            var J = parseInt(A.cookie("ui-tabs" + A.data(P.element)), 10);
                            if (J && P.$tabs[J]) {
                                D.selected = J
                            }
                        } else {
                            if (P.$lis.filter("." + D.selectedClass).length) {
                                D.selected = P.$lis.index(P.$lis.filter("." + D.selectedClass)[0])
                            }
                        }
                    }
                }
                D.selected = D.selected === null || D.selected !== undefined ? D.selected: 0;
                D.disabled = A.unique(D.disabled.concat(A.map(this.$lis.filter("." + D.disabledClass),
                function(R, Q) {
                    return P.$lis.index(R)
                }))).sort();
                if (A.inArray(D.selected, D.disabled) != -1) {
                    D.disabled.splice(A.inArray(D.selected, D.disabled), 1)
                }
                this.$panels.addClass(D.hideClass);
                this.$lis.removeClass(D.selectedClass);
                if (D.selected !== null) {
                    this.$panels.eq(D.selected).show().removeClass(D.hideClass);
                    this.$lis.eq(D.selected).addClass(D.selectedClass);
                    var K = function() {
                        A(P.element).triggerHandler("tabsshow", [P.fakeEvent("tabsshow"), P.ui(P.$tabs[D.selected], P.$panels[D.selected])], D.show)
                    };
                    if (A.data(this.$tabs[D.selected], "load.tabs")) {
                        this.load(D.selected, K)
                    } else {
                        K()
                    }
                }
                A(window).bind("unload",
                function() {
                    P.$tabs.unbind(".tabs");
                    P.$lis = P.$tabs = P.$panels = null
                })
            }
            for (var G = 0, N; N = this.$lis[G]; G++) {
                A(N)[A.inArray(G, D.disabled) != -1 && !A(N).hasClass(D.selectedClass) ? "addClass": "removeClass"](D.disabledClass)
            }
            if (D.cache === false) {
                this.$tabs.removeData("cache.tabs")
            }
            var C, I, B = {
                "min-width": 0,
                duration: 1
            },
            E = "normal";
            if (D.fx && D.fx.constructor == Array) {
                C = D.fx[0] || B,
                I = D.fx[1] || B
            } else {
                C = I = D.fx || B
            }
            var H = {
                display: "",
                overflow: "",
                height: ""
            };
            if (!A.browser.msie) {
                H.opacity = ""
            }
            function M(R, Q, S) {
                Q.animate(C, C.duration || E,
                function() {
                    Q.addClass(D.hideClass).css(H);
                    if (A.browser.msie && C.opacity) {
                        Q[0].style.filter = ""
                    }
                    if (S) {
                        L(R, S, Q)
                    }
                })
            }
            function L(R, S, Q) {
                if (I === B) {
                    S.css("display", "block")
                }
                S.animate(I, I.duration || E,
                function() {
                    S.removeClass(D.hideClass).css(H);
                    if (A.browser.msie && I.opacity) {
                        S[0].style.filter = ""
                    }
                    A(P.element).triggerHandler("tabsshow", [P.fakeEvent("tabsshow"), P.ui(R, S[0])], D.show)
                })
            }
            function F(R, T, Q, S) {
                T.addClass(D.selectedClass).siblings().removeClass(D.selectedClass);
                M(R, Q, S)
            }
            this.$tabs.unbind(".tabs").bind(D.event,
            function() {
                var T = A(this).parents("li:eq(0)"),
                Q = P.$panels.filter(":visible"),
                S = A(this.hash);
                if ((T.hasClass(D.selectedClass) && !D.unselect) || T.hasClass(D.disabledClass) || A(this).hasClass(D.loadingClass) || A(P.element).triggerHandler("tabsselect", [P.fakeEvent("tabsselect"), P.ui(this, S[0])], D.select) === false) {
                    this.blur();
                    return false
                }
                P.options.selected = P.$tabs.index(this);
                if (D.unselect) {
                    if (T.hasClass(D.selectedClass)) {
                        P.options.selected = null;
                        T.removeClass(D.selectedClass);
                        P.$panels.stop();
                        M(this, Q);
                        this.blur();
                        return false
                    } else {
                        if (!Q.length) {
                            P.$panels.stop();
                            var R = this;
                            P.load(P.$tabs.index(this),
                            function() {
                                T.addClass(D.selectedClass).addClass(D.unselectClass);
                                L(R, S)
                            });
                            this.blur();
                            return false
                        }
                    }
                }
                if (D.cookie) {
                    A.cookie("ui-tabs" + A.data(P.element), P.options.selected, D.cookie)
                }
                P.$panels.stop();
                if (S.length) {
                    var R = this;
                    P.load(P.$tabs.index(this), Q.length ?
                    function() {
                        F(R, T, Q, S)
                    }: function() {
                        T.addClass(D.selectedClass);
                        L(R, S)
                    })
                } else {
                    throw "jQuery UI Tabs: Mismatching fragment identifier."
                }
                if (A.browser.msie) {
                    this.blur()
                }
                return false
            });
            if (! (/^click/).test(D.event)) {
                this.$tabs.bind("click.tabs",
                function() {
                    return false
                })
            }
        },
        add: function(E, D, C) {
            if (C == undefined) {
                C = this.$tabs.length
            }
            var G = this.options;
            var I = A(G.tabTemplate.replace(/#\{href\}/g, E).replace(/#\{label\}/g, D));
            I.data("destroy.tabs", true);
            var H = E.indexOf("#") == 0 ? E.replace("#", "") : this.tabId(A("a:first-child", I)[0]);
            var F = A("#" + H);
            if (!F.length) {
                F = A(G.panelTemplate).attr("id", H).addClass(G.hideClass).data("destroy.tabs", true)
            }
            F.addClass(G.panelClass);
            if (C >= this.$lis.length) {
                I.appendTo(this.element);
                F.appendTo(this.element[0].parentNode)
            } else {
                I.insertBefore(this.$lis[C]);
                F.insertBefore(this.$panels[C])
            }
            G.disabled = A.map(G.disabled,
            function(K, J) {
                return K >= C ? ++K: K
            });
            this.tabify();
            if (this.$tabs.length == 1) {
                I.addClass(G.selectedClass);
                F.removeClass(G.hideClass);
                var B = A.data(this.$tabs[0], "load.tabs");
                if (B) {
                    this.load(C, B)
                }
            }
            this.element.triggerHandler("tabsadd", [this.fakeEvent("tabsadd"), this.ui(this.$tabs[C], this.$panels[C])], G.add)
        },
        remove: function(B) {
            var D = this.options,
            E = this.$lis.eq(B).remove(),
            C = this.$panels.eq(B).remove();
            if (E.hasClass(D.selectedClass) && this.$tabs.length > 1) {
                this.select(B + (B + 1 < this.$tabs.length ? 1 : -1))
            }
            D.disabled = A.map(A.grep(D.disabled,
            function(G, F) {
                return G != B
            }),
            function(G, F) {
                return G >= B ? --G: G
            });
            this.tabify();
            this.element.triggerHandler("tabsremove", [this.fakeEvent("tabsremove"), this.ui(E.find("a")[0], C[0])], D.remove)
        },
        enable: function(B) {
            var C = this.options;
            if (A.inArray(B, C.disabled) == -1) {
                return
            }
            var D = this.$lis.eq(B).removeClass(C.disabledClass);
            if (A.browser.safari) {
                D.css("display", "inline-block");
                setTimeout(function() {
                    D.css("display", "block")
                },
                0)
            }
            C.disabled = A.grep(C.disabled,
            function(F, E) {
                return F != B
            });
            this.element.triggerHandler("tabsenable", [this.fakeEvent("tabsenable"), this.ui(this.$tabs[B], this.$panels[B])], C.enable)
        },
        disable: function(C) {
            var B = this,
            D = this.options;
            if (C != D.selected) {
                this.$lis.eq(C).addClass(D.disabledClass);
                D.disabled.push(C);
                D.disabled.sort();
                this.element.triggerHandler("tabsdisable", [this.fakeEvent("tabsdisable"), this.ui(this.$tabs[C], this.$panels[C])], D.disable)
            }
        },
        select: function(B) {
            if (typeof B == "string") {
                B = this.$tabs.index(this.$tabs.filter("[href$=" + B + "]")[0])
            }
            this.$tabs.eq(B).trigger(this.options.event)
        },
        load: function(G, K) {
            var L = this,
            D = this.options,
            E = this.$tabs.eq(G),
            J = E[0],
            H = K == undefined || K === false,
            B = E.data("load.tabs");
            K = K ||
            function() {};
            if (!B || !H && A.data(J, "cache.tabs")) {
                K();
                return
            }
            var M = function(N) {
                var O = A(N),
                P = O.find("*:last");
                return P.length && P.is(":not(img)") && P || O
            };
            var C = function() {
                L.$tabs.filter("." + D.loadingClass).removeClass(D.loadingClass).each(function() {
                    if (D.spinner) {
                        M(this).parent().html(M(this).data("label.tabs"))
                    }
                });
                L.xhr = null
            };
            if (D.spinner) {
                var I = M(J).html();
                M(J).wrapInner("<em></em>").find("em").data("label.tabs", I).html(D.spinner)
            }
            var F = A.extend({},
            D.ajaxOptions, {
                url: B,
                success: function(O, N) {
                    A(J.hash).html(O);
                    C();
                    if (D.cache) {
                        A.data(J, "cache.tabs", true)
                    }
                    A(L.element).triggerHandler("tabsload", [L.fakeEvent("tabsload"), L.ui(L.$tabs[G], L.$panels[G])], D.load);
                    D.ajaxOptions.success && D.ajaxOptions.success(O, N);
                    K()
                }
            });
            if (this.xhr) {
                this.xhr.abort();
                C()
            }
            E.addClass(D.loadingClass);
            setTimeout(function() {
                L.xhr = A.ajax(F)
            },
            0)
        },
        url: function(C, B) {
            this.$tabs.eq(C).removeData("cache.tabs").data("load.tabs", B)
        },
        destroy: function() {
            var B = this.options;
            this.element.unbind(".tabs").removeClass(B.navClass).removeData("tabs");
            this.$tabs.each(function() {
                var C = A.data(this, "href.tabs");
                if (C) {
                    this.href = C
                }
                var D = A(this).unbind(".tabs");
                A.each(["href", "load", "cache"],
                function(E, F) {
                    D.removeData(F + ".tabs")
                })
            });
            this.$lis.add(this.$panels).each(function() {
                if (A.data(this, "destroy.tabs")) {
                    A(this).remove()
                } else {
                    A(this).removeClass([B.selectedClass, B.unselectClass, B.disabledClass, B.panelClass, B.hideClass].join(" "))
                }
            })
        },
        fakeEvent: function(B) {
            return A.event.fix({
                type: B,
                target: this.element[0]
            })
        }
    });
    A.ui.tabs.defaults = {
        unselect: false,
        event: "click",
        disabled: [],
        cookie: null,
        spinner: "Loading&#8230;",
        cache: false,
        idPrefix: "ui-tabs-",
        ajaxOptions: {},
        fx: null,
        tabTemplate: '<li><a href="#{href}"><span>#{label}</span></a></li>',
        panelTemplate: "<div></div>",
        navClass: "ui-tabs-nav",
        selectedClass: "ui-tabs-selected",
        unselectClass: "ui-tabs-unselect",
        disabledClass: "ui-tabs-disabled",
        panelClass: "ui-tabs-panel",
        hideClass: "ui-tabs-hide",
        loadingClass: "ui-tabs-loading"
    };
    A.ui.tabs.getter = "length";
    A.extend(A.ui.tabs.prototype, {
        rotation: null,
        rotate: function(C, F) {
            F = F || false;
            var B = this,
            E = this.options.selected;
            function G() {
                B.rotation = setInterval(function() {
                    E = ++E < B.$tabs.length ? E: 0;
                    B.select(E)
                },
                C)
            }
            function D(H) {
                if (!H || H.clientX) {
                    clearInterval(B.rotation)
                }
            }
            if (C) {
                G();
                if (!F) {
                    this.$tabs.bind(this.options.event, D)
                } else {
                    this.$tabs.bind(this.options.event,
                    function() {
                        D();
                        E = B.options.selected;
                        G()
                    })
                }
            } else {
                D();
                this.$tabs.unbind(this.options.event, D)
            }
        }
    })
})(jQuery);
(function($) {
    var PROP_NAME = "datepicker";
    function Datepicker() {
        this.debug = false;
        this._curInst = null;
        this._disabledInputs = [];
        this._datepickerShowing = false;
        this._inDialog = false;
        this._mainDivId = "ui-datepicker-div";
        this._appendClass = "ui-datepicker-append";
        this._triggerClass = "ui-datepicker-trigger";
        this._dialogClass = "ui-datepicker-dialog";
        this._promptClass = "ui-datepicker-prompt";
        this._unselectableClass = "ui-datepicker-unselectable";
        this._currentClass = "ui-datepicker-current-day";
        this.regional = [];
        this.regional[""] = {
            clearText: "Clear",
            clearStatus: "Erase the current date",
            closeText: "Close",
            closeStatus: "Close without change",
            prevText: "&#x3c;Prev",
            prevStatus: "Show the previous month",
            nextText: "Next&#x3e;",
            nextStatus: "Show the next month",
            currentText: "Today",
            currentStatus: "Show the current month",
            monthNames: ["Siječanj", "Veljača", "Ožujak", "Travanj", "Svibanj", "Lipanj", "Srpanj", "Kolovoz", "Rujan", "Listopad", "Studeni", "Prosinac"],
            monthNamesShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
            monthStatus: "Show a different month",
            yearStatus: "Show a different year",
            weekHeader: "Wk",
            weekStatus: "Week of the year",
            dayNames: ["Nedjelja", "Ponedjeljak", "Utorak", "Srijeda", "Četvrtak", "Petak", "Subota"],
            dayNamesShort: ["Ned", "Pon", "Uto", "Sri", "Čet", "Pet", "Sub"],
            dayNamesMin: ["Ne", "Po", "Ut", "Sr", "Če", "Pe", "Su"],
            dayStatus: "Set DD as first week day",
            dateStatus: "Select DD, M d",
            dateFormat: "mm/dd/yy",
            firstDay: 0,
            initStatus: "Select a date",
            isRTL: false
        };
        this._defaults = {
            showOn: "focus",
            showAnim: "show",
            showOptions: {},
            defaultDate: null,
            appendText: "",
            buttonText: "...",
            buttonImage: "",
            buttonImageOnly: false,
            closeAtTop: true,
            mandatory: false,
            hideIfNoPrevNext: false,
            navigationAsDateFormat: false,
            gotoCurrent: true,
            changeMonth: true,
            changeYear: true,
            yearRange: "-10:+10",
            changeFirstDay: true,
            highlightWeek: false,
            showOtherMonths: false,
            showWeeks: false,
            calculateWeek: this.iso8601Week,
            shortYearCutoff: "+10",
            showStatus: false,
            statusForDate: this.dateStatus,
            minDate: null,
            maxDate: null,
            duration: "normal",
            beforeShowDay: null,
            beforeShow: null,
            onSelect: null,
            onChangeMonthYear: null,
            onClose: null,
            numberOfMonths: 1,
            stepMonths: 1,
            rangeSelect: false,
            rangeSeparator: " - ",
            altField: "",
            altFormat: ""
        };
        $.extend(this._defaults, this.regional[""]);
        this.dpDiv = $('<div id="' + this._mainDivId + '" style="display: none;"></div>')
    }
    $.extend(Datepicker.prototype, {
        markerClassName: "hasDatepicker",
        log: function() {
            if (this.debug) {
                console.log.apply("", arguments)
            }
        },
        setDefaults: function(settings) {
            extendRemove(this._defaults, settings || {});
            return this
        },
        _attachDatepicker: function(target, settings) {
            var inlineSettings = null;
            for (attrName in this._defaults) {
                var attrValue = target.getAttribute("date:" + attrName);
                if (attrValue) {
                    inlineSettings = inlineSettings || {};
                    try {
                        inlineSettings[attrName] = eval(attrValue)
                    } catch(err) {
                        inlineSettings[attrName] = attrValue
                    }
                }
            }
            var nodeName = target.nodeName.toLowerCase();
            var inline = (nodeName == "div" || nodeName == "span");
            if (!target.id) {
                target.id = "dp" + new Date().getTime()
            }
            var inst = this._newInst($(target), inline);
            inst.settings = $.extend({},
            settings || {},
            inlineSettings || {});
            if (nodeName == "input") {
                this._connectDatepicker(target, inst)
            } else {
                if (inline) {
                    this._inlineDatepicker(target, inst)
                }
            }
        },
        _newInst: function(target, inline) {
            return {
                id: target[0].id,
                input: target,
                selectedDay: 0,
                selectedMonth: 0,
                selectedYear: 0,
                drawMonth: 0,
                drawYear: 0,
                inline: inline,
                dpDiv: (!inline ? this.dpDiv: $('<div class="ui-datepicker-inline"></div>'))
            }
        },
        _connectDatepicker: function(target, inst) {
            var input = $(target);
            if (input.hasClass(this.markerClassName)) {
                return
            }
            var appendText = this._get(inst, "appendText");
            var isRTL = this._get(inst, "isRTL");
            if (appendText) {
                input[isRTL ? "before": "after"]('<span class="' + this._appendClass + '">' + appendText + "</span>")
            }
            var showOn = this._get(inst, "showOn");
            if (showOn == "focus" || showOn == "both") {
                input.focus(this._showDatepicker)
            }
            if (showOn == "button" || showOn == "both") {
                var buttonText = this._get(inst, "buttonText");
                var buttonImage = this._get(inst, "buttonImage");
                var trigger = $(this._get(inst, "buttonImageOnly") ? $("<img/>").addClass(this._triggerClass).attr({
                    src: buttonImage,
                    alt: buttonText,
                    title: buttonText
                }) : $('<button type="button"></button>').addClass(this._triggerClass).html(buttonImage == "" ? buttonText: $("<img/>").attr({
                    src: buttonImage,
                    alt: buttonText,
                    title: buttonText
                })));
                input[isRTL ? "before": "after"](trigger);
                trigger.click(function() {
                    if ($.datepicker._datepickerShowing && $.datepicker._lastInput == target) {
                        $.datepicker._hideDatepicker()
                    } else {
                        $.datepicker._showDatepicker(target)
                    }
                    return false
                })
            }
            input.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).bind("setData.datepicker",
            function(event, key, value) {
                inst.settings[key] = value
            }).bind("getData.datepicker",
            function(event, key) {
                return this._get(inst, key)
            });
            $.data(target, PROP_NAME, inst)
        },
        _inlineDatepicker: function(target, inst) {
            var input = $(target);
            if (input.hasClass(this.markerClassName)) {
                return
            }
            input.addClass(this.markerClassName).append(inst.dpDiv).bind("setData.datepicker",
            function(event, key, value) {
                inst.settings[key] = value
            }).bind("getData.datepicker",
            function(event, key) {
                return this._get(inst, key)
            });
            $.data(target, PROP_NAME, inst);
            this._setDate(inst, this._getDefaultDate(inst));
            this._updateDatepicker(inst)
        },
        _dialogDatepicker: function(input, dateText, onSelect, settings, pos) {
            var inst = this._dialogInst;
            if (!inst) {
                var id = "dp" + new Date().getTime();
                this._dialogInput = $('<input type="text" id="' + id + '" size="1" style="position: absolute; top: -100px;"/>');
                this._dialogInput.keydown(this._doKeyDown);
                $("body").append(this._dialogInput);
                inst = this._dialogInst = this._newInst(this._dialogInput, false);
                inst.settings = {};
                $.data(this._dialogInput[0], PROP_NAME, inst)
            }
            extendRemove(inst.settings, settings || {});
            this._dialogInput.val(dateText);
            this._pos = (pos ? (pos.length ? pos: [pos.pageX, pos.pageY]) : null);
            if (!this._pos) {
                var browserWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
                var browserHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
                var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
                var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
                this._pos = [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY]
            }
            this._dialogInput.css("left", this._pos[0] + "px").css("top", this._pos[1] + "px");
            inst.settings.onSelect = onSelect;
            this._inDialog = true;
            this.dpDiv.addClass(this._dialogClass);
            this._showDatepicker(this._dialogInput[0]);
            if ($.blockUI) {
                $.blockUI(this.dpDiv)
            }
            $.data(this._dialogInput[0], PROP_NAME, inst);
            return this
        },
        _destroyDatepicker: function(target) {
            var nodeName = target.nodeName.toLowerCase();
            var $target = $(target);
            $.removeData(target, PROP_NAME);
            if (nodeName == "input") {
                $target.siblings("." + this._appendClass).remove().end().siblings("." + this._triggerClass).remove().end().removeClass(this.markerClassName).unbind("focus", this._showDatepicker).unbind("keydown", this._doKeyDown).unbind("keypress", this._doKeyPress)
            } else {
                if (nodeName == "div" || nodeName == "span") {
                    $target.removeClass(this.markerClassName).empty()
                }
            }
        },
        _enableDatepicker: function(target) {
            target.disabled = false;
            $(target).siblings("button." + this._triggerClass).each(function() {
                this.disabled = false
            }).end().siblings("img." + this._triggerClass).css({
                opacity: "1.0",
                cursor: ""
            });
            this._disabledInputs = $.map(this._disabledInputs,
            function(value) {
                return (value == target ? null: value)
            })
        },
        _disableDatepicker: function(target) {
            target.disabled = true;
            $(target).siblings("button." + this._triggerClass).each(function() {
                this.disabled = true
            }).end().siblings("img." + this._triggerClass).css({
                opacity: "0.5",
                cursor: "default"
            });
            this._disabledInputs = $.map(this._disabledInputs,
            function(value) {
                return (value == target ? null: value)
            });
            this._disabledInputs[this._disabledInputs.length] = target
        },
        _isDisabledDatepicker: function(target) {
            if (!target) {
                return false
            }
            for (var i = 0; i < this._disabledInputs.length; i++) {
                if (this._disabledInputs[i] == target) {
                    return true
                }
            }
            return false
        },
        _changeDatepicker: function(target, name, value) {
            var settings = name || {};
            if (typeof name == "string") {
                settings = {};
                settings[name] = value
            }
            if (inst = $.data(target, PROP_NAME)) {
                extendRemove(inst.settings, settings);
                this._updateDatepicker(inst)
            }
        },
        _setDateDatepicker: function(target, date, endDate) {
            var inst = $.data(target, PROP_NAME);
            if (inst) {
                this._setDate(inst, date, endDate);
                this._updateDatepicker(inst)
            }
        },
        _getDateDatepicker: function(target) {
            var inst = $.data(target, PROP_NAME);
            if (inst) {
                this._setDateFromField(inst)
            }
            return (inst ? this._getDate(inst) : null)
        },
        _doKeyDown: function(e) {
            var inst = $.data(e.target, PROP_NAME);
            var handled = true;
            if ($.datepicker._datepickerShowing) {
                switch (e.keyCode) {
                case 9:
                    $.datepicker._hideDatepicker(null, "");
                    break;
                case 13:
                    $.datepicker._selectDay(e.target, inst.selectedMonth, inst.selectedYear, $("td.ui-datepicker-days-cell-over", inst.dpDiv)[0]);
                    return false;
                    break;
                case 27:
                    $.datepicker._hideDatepicker(null, $.datepicker._get(inst, "duration"));
                    break;
                case 33:
                    $.datepicker._adjustDate(e.target, (e.ctrlKey ? -1 : -$.datepicker._get(inst, "stepMonths")), (e.ctrlKey ? "Y": "M"));
                    break;
                case 34:
                    $.datepicker._adjustDate(e.target, (e.ctrlKey ? +1 : +$.datepicker._get(inst, "stepMonths")), (e.ctrlKey ? "Y": "M"));
                    break;
                case 35:
                    if (e.ctrlKey) {
                        $.datepicker._clearDate(e.target)
                    }
                    break;
                case 36:
                    if (e.ctrlKey) {
                        $.datepicker._gotoToday(e.target)
                    }
                    break;
                case 37:
                    if (e.ctrlKey) {
                        $.datepicker._adjustDate(e.target, -1, "D")
                    }
                    break;
                case 38:
                    if (e.ctrlKey) {
                        $.datepicker._adjustDate(e.target, -7, "D")
                    }
                    break;
                case 39:
                    if (e.ctrlKey) {
                        $.datepicker._adjustDate(e.target, +1, "D")
                    }
                    break;
                case 40:
                    if (e.ctrlKey) {
                        $.datepicker._adjustDate(e.target, +7, "D")
                    }
                    break;
                default:
                    handled = false
                }
            } else {
                if (e.keyCode == 36 && e.ctrlKey) {
                    $.datepicker._showDatepicker(this)
                } else {
                    handled = false
                }
            }
            if (handled) {
                e.preventDefault();
                e.stopPropagation()
            }
        },
        _doKeyPress: function(e) {
            var inst = $.data(e.target, PROP_NAME);
            var chars = $.datepicker._possibleChars($.datepicker._get(inst, "dateFormat"));
            var chr = String.fromCharCode(e.charCode == undefined ? e.keyCode: e.charCode);
            return e.ctrlKey || (chr < " " || !chars || chars.indexOf(chr) > -1)
        },
        _showDatepicker: function(input) {
            input = input.target || input;
            if (input.nodeName.toLowerCase() != "input") {
                input = $("input", input.parentNode)[0]
            }
            if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput == input) {
                return
            }
            var inst = $.data(input, PROP_NAME);
            var beforeShow = $.datepicker._get(inst, "beforeShow");
            extendRemove(inst.settings, (beforeShow ? beforeShow.apply(input, [input, inst]) : {}));
            $.datepicker._hideDatepicker(null, "");
            $.datepicker._lastInput = input;
            $.datepicker._setDateFromField(inst);
            if ($.datepicker._inDialog) {
                input.value = ""
            }
            if (!$.datepicker._pos) {
                $.datepicker._pos = $.datepicker._findPos(input);
                $.datepicker._pos[1] += input.offsetHeight
            }
            var isFixed = false;
            $(input).parents().each(function() {
                isFixed |= $(this).css("position") == "fixed";
                return ! isFixed
            });
            if (isFixed && $.browser.opera) {
                $.datepicker._pos[0] -= document.documentElement.scrollLeft;
                $.datepicker._pos[1] -= document.documentElement.scrollTop
            }
            var offset = {
                left: $.datepicker._pos[0],
                top: $.datepicker._pos[1]
            };
            $.datepicker._pos = null;
            inst.rangeStart = null;
            inst.dpDiv.css({
                position: "absolute",
                display: "block",
                top: "-1000px"
            });
            $.datepicker._updateDatepicker(inst);
            inst.dpDiv.width($.datepicker._getNumberOfMonths(inst)[1] * $(".ui-datepicker", inst.dpDiv[0])[0].offsetWidth);
            offset = $.datepicker._checkOffset(inst, offset, isFixed);
            inst.dpDiv.css({
                position: ($.datepicker._inDialog && $.blockUI ? "static": (isFixed ? "fixed": "absolute")),
                display: "none",
                left: offset.left + "px",
                top: offset.top + "px"
            });
            if (!inst.inline) {
                var showAnim = $.datepicker._get(inst, "showAnim") || "show";
                var duration = $.datepicker._get(inst, "duration");
                var postProcess = function() {
                    $.datepicker._datepickerShowing = true;
                    if ($.browser.msie && parseInt($.browser.version) < 7) {
                        $("iframe.ui-datepicker-cover").css({
                            width: inst.dpDiv.width() + 4,
                            height: inst.dpDiv.height() + 4
                        })
                    }
                };
                if ($.effects && $.effects[showAnim]) {
                    inst.dpDiv.show(showAnim, $.datepicker._get(inst, "showOptions"), duration, postProcess)
                } else {
                    inst.dpDiv[showAnim](duration, postProcess)
                }
                if (duration == "") {
                    postProcess()
                }
                if (inst.input[0].type != "hidden") {
                    inst.input[0].focus()
                }
                $.datepicker._curInst = inst
            }
        },
        _updateDatepicker: function(inst) {
            var dims = {
                width: inst.dpDiv.width() + 4,
                height: inst.dpDiv.height() + 4
            };
            inst.dpDiv.empty().append(this._generateDatepicker(inst)).find("iframe.ui-datepicker-cover").css({
                width: dims.width,
                height: dims.height
            });
            var numMonths = this._getNumberOfMonths(inst);
            inst.dpDiv[(numMonths[0] != 1 || numMonths[1] != 1 ? "add": "remove") + "Class"]("ui-datepicker-multi");
            inst.dpDiv[(this._get(inst, "isRTL") ? "add": "remove") + "Class"]("ui-datepicker-rtl");
            if (inst.input && inst.input[0].type != "hidden") {
                $(inst.input[0]).focus()
            }
        },
        _checkOffset: function(inst, offset, isFixed) {
            var pos = inst.input ? this._findPos(inst.input[0]) : null;
            var browserWidth = window.innerWidth || document.documentElement.clientWidth;
            var browserHeight = window.innerHeight || document.documentElement.clientHeight;
            var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
            var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
            if (this._get(inst, "isRTL") || (offset.left + inst.dpDiv.width() - scrollX) > browserWidth) {
                offset.left = Math.max((isFixed ? 0 : scrollX), pos[0] + (inst.input ? inst.input.width() : 0) - (isFixed ? scrollX: 0) - inst.dpDiv.width() - (isFixed && $.browser.opera ? document.documentElement.scrollLeft: 0))
            } else {
                offset.left -= (isFixed ? scrollX: 0)
            }
            if ((offset.top + inst.dpDiv.height() - scrollY) > browserHeight) {
                offset.top = Math.max((isFixed ? 0 : scrollY), pos[1] - (isFixed ? scrollY: 0) - (this._inDialog ? 0 : inst.dpDiv.height()) - (isFixed && $.browser.opera ? document.documentElement.scrollTop: 0))
            } else {
                offset.top -= (isFixed ? scrollY: 0)
            }
            return offset
        },
        _findPos: function(obj) {
            while (obj && (obj.type == "hidden" || obj.nodeType != 1)) {
                obj = obj.nextSibling
            }
            var position = $(obj).offset();
            return [position.left, position.top]
        },
        _hideDatepicker: function(input, duration) {
            var inst = this._curInst;
            if (!inst) {
                return
            }
            var rangeSelect = this._get(inst, "rangeSelect");
            if (rangeSelect && this._stayOpen) {
                this._selectDate("#" + inst.id, this._formatDate(inst, inst.currentDay, inst.currentMonth, inst.currentYear))
            }
            this._stayOpen = false;
            if (this._datepickerShowing) {
                duration = (duration != null ? duration: this._get(inst, "duration"));
                var showAnim = this._get(inst, "showAnim");
                var postProcess = function() {
                    $.datepicker._tidyDialog(inst)
                };
                if (duration != "" && $.effects && $.effects[showAnim]) {
                    inst.dpDiv.hide(showAnim, $.datepicker._get(inst, "showOptions"), duration, postProcess)
                } else {
                    inst.dpDiv[(duration == "" ? "hide": (showAnim == "slideDown" ? "slideUp": (showAnim == "fadeIn" ? "fadeOut": "hide")))](duration, postProcess)
                }
                if (duration == "") {
                    this._tidyDialog(inst)
                }
                var onClose = this._get(inst, "onClose");
                if (onClose) {
                    onClose.apply((inst.input ? inst.input[0] : null), [this._getDate(inst), inst])
                }
                this._datepickerShowing = false;
                this._lastInput = null;
                inst.settings.prompt = null;
                if (this._inDialog) {
                    this._dialogInput.css({
                        position: "absolute",
                        left: "0",
                        top: "-100px"
                    });
                    if ($.blockUI) {
                        $.unblockUI();
                        $("body").append(this.dpDiv)
                    }
                }
                this._inDialog = false
            }
            this._curInst = null
        },
        _tidyDialog: function(inst) {
            inst.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker");
            $("." + this._promptClass, inst.dpDiv).remove()
        },
        _checkExternalClick: function(event) {
            if (!$.datepicker._curInst) {
                return
            }
            var $target = $(event.target);
            if (($target.parents("#" + $.datepicker._mainDivId).length == 0) && !$target.hasClass($.datepicker.markerClassName) && !$target.hasClass($.datepicker._triggerClass) && $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI)) {
                $.datepicker._hideDatepicker(null, "")
            }
        },
        _adjustDate: function(id, offset, period) {
            var target = $(id);
            var inst = $.data(target[0], PROP_NAME);
            this._adjustInstDate(inst, offset, period);
            this._updateDatepicker(inst)
        },
        _gotoToday: function(id) {
            var target = $(id);
            var inst = $.data(target[0], PROP_NAME);
            if (this._get(inst, "gotoCurrent") && inst.currentDay) {
                inst.selectedDay = inst.currentDay;
                inst.drawMonth = inst.selectedMonth = inst.currentMonth;
                inst.drawYear = inst.selectedYear = inst.currentYear
            } else {
                var date = new Date();
                inst.selectedDay = date.getDate();
                inst.drawMonth = inst.selectedMonth = date.getMonth();
                inst.drawYear = inst.selectedYear = date.getFullYear()
            }
            this._adjustDate(target);
            this._notifyChange(inst)
        },
        _selectMonthYear: function(id, select, period) {
            var target = $(id);
            var inst = $.data(target[0], PROP_NAME);
            inst._selectingMonthYear = false;
            inst[period == "M" ? "drawMonth": "drawYear"] = select.options[select.selectedIndex].value - 0;
            this._adjustDate(target);
            this._notifyChange(inst)
        },
        _clickMonthYear: function(id) {
            var target = $(id);
            var inst = $.data(target[0], PROP_NAME);
            if (inst.input && inst._selectingMonthYear && !$.browser.msie) {
                inst.input[0].focus()
            }
            inst._selectingMonthYear = !inst._selectingMonthYear
        },
        _changeFirstDay: function(id, day) {
            var target = $(id);
            var inst = $.data(target[0], PROP_NAME);
            inst.settings.firstDay = day;
            this._updateDatepicker(inst)
        },
        _selectDay: function(id, month, year, td) {
            if ($(td).hasClass(this._unselectableClass)) {
                return
            }
            var target = $(id);
            var inst = $.data(target[0], PROP_NAME);
            var rangeSelect = this._get(inst, "rangeSelect");
            if (rangeSelect) {
                this._stayOpen = !this._stayOpen;
                if (this._stayOpen) {
                    $(".ui-datepicker td").removeClass(this._currentClass);
                    $(td).addClass(this._currentClass)
                }
            }
            inst.selectedDay = inst.currentDay = $("a", td).html();
            inst.selectedMonth = inst.currentMonth = month;
            inst.selectedYear = inst.currentYear = year;
            if (this._stayOpen) {
                inst.endDay = inst.endMonth = inst.endYear = null
            } else {
                if (rangeSelect) {
                    inst.endDay = inst.currentDay;
                    inst.endMonth = inst.currentMonth;
                    inst.endYear = inst.currentYear
                }
            }
            this._selectDate(id, this._formatDate(inst, inst.currentDay, inst.currentMonth, inst.currentYear));
            if (this._stayOpen) {
                inst.rangeStart = this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay));
                this._updateDatepicker(inst)
            } else {
                if (rangeSelect) {
                    inst.selectedDay = inst.currentDay = inst.rangeStart.getDate();
                    inst.selectedMonth = inst.currentMonth = inst.rangeStart.getMonth();
                    inst.selectedYear = inst.currentYear = inst.rangeStart.getFullYear();
                    inst.rangeStart = null;
                    if (inst.inline) {
                        this._updateDatepicker(inst)
                    }
                }
            }
        },
        _clearDate: function(id) {
            var target = $(id);
            var inst = $.data(target[0], PROP_NAME);
            if (this._get(inst, "mandatory")) {
                return
            }
            this._stayOpen = false;
            inst.endDay = inst.endMonth = inst.endYear = inst.rangeStart = null;
            this._selectDate(target, "")
        },
        _selectDate: function(id, dateStr) {
            var target = $(id);
            var inst = $.data(target[0], PROP_NAME);
            dateStr = (dateStr != null ? dateStr: this._formatDate(inst));
            if (this._get(inst, "rangeSelect") && dateStr) {
                dateStr = (inst.rangeStart ? this._formatDate(inst, inst.rangeStart) : dateStr) + this._get(inst, "rangeSeparator") + dateStr
            }
            if (inst.input) {
                inst.input.val(dateStr)
            }
            this._updateAlternate(inst);
            var onSelect = this._get(inst, "onSelect");
            if (onSelect) {
                onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst])
            } else {
                if (inst.input) {
                    inst.input.trigger("change")
                }
            }
            if (inst.inline) {
                this._updateDatepicker(inst)
            } else {
                if (!this._stayOpen) {
                    this._hideDatepicker(null, this._get(inst, "duration"));
                    this._lastInput = inst.input[0];
                    if (typeof(inst.input[0]) != "object") {
                        inst.input[0].focus()
                    }
                    this._lastInput = null
                }
            }
        },
        _updateAlternate: function(inst) {
            var altField = this._get(inst, "altField");
            if (altField) {
                var altFormat = this._get(inst, "altFormat");
                var date = this._getDate(inst);
                dateStr = (isArray(date) ? (!date[0] && !date[1] ? "": this.formatDate(altFormat, date[0], this._getFormatConfig(inst)) + this._get(inst, "rangeSeparator") + this.formatDate(altFormat, date[1] || date[0], this._getFormatConfig(inst))) : this.formatDate(altFormat, date, this._getFormatConfig(inst)));
                $(altField).each(function() {
                    $(this).val(dateStr)
                })
            }
        },
        noWeekends: function(date) {
            var day = date.getDay();
            return [(day > 0 && day < 6), ""]
        },
        iso8601Week: function(date) {
            var checkDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());
            var firstMon = new Date(checkDate.getFullYear(), 1 - 1, 4);
            var firstDay = firstMon.getDay() || 7;
            firstMon.setDate(firstMon.getDate() + 1 - firstDay);
            if (firstDay < 4 && checkDate < firstMon) {
                checkDate.setDate(checkDate.getDate() - 3);
                return $.datepicker.iso8601Week(checkDate)
            } else {
                if (checkDate > new Date(checkDate.getFullYear(), 12 - 1, 28)) {
                    firstDay = new Date(checkDate.getFullYear() + 1, 1 - 1, 4).getDay() || 7;
                    if (firstDay > 4 && (checkDate.getDay() || 7) < firstDay - 3) {
                        checkDate.setDate(checkDate.getDate() + 3);
                        return $.datepicker.iso8601Week(checkDate)
                    }
                }
            }
            return Math.floor(((checkDate - firstMon) / 86400000) / 7) + 1
        },
        dateStatus: function(date, inst) {
            return $.datepicker.formatDate($.datepicker._get(inst, "dateStatus"), date, $.datepicker._getFormatConfig(inst))
        },
        parseDate: function(format, value, settings) {
            if (format == null || value == null) {
                throw "Invalid arguments"
            }
            value = (typeof value == "object" ? value.toString() : value + "");
            if (value == "") {
                return null
            }
            var shortYearCutoff = (settings ? settings.shortYearCutoff: null) || this._defaults.shortYearCutoff;
            var dayNamesShort = (settings ? settings.dayNamesShort: null) || this._defaults.dayNamesShort;
            var dayNames = (settings ? settings.dayNames: null) || this._defaults.dayNames;
            var monthNamesShort = (settings ? settings.monthNamesShort: null) || this._defaults.monthNamesShort;
            var monthNames = (settings ? settings.monthNames: null) || this._defaults.monthNames;
            var year = -1;
            var month = -1;
            var day = -1;
            var literal = false;
            var lookAhead = function(match) {
                var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
                if (matches) {
                    iFormat++
                }
                return matches
            };
            var getNumber = function(match) {
                lookAhead(match);
                var origSize = (match == "@" ? 14 : (match == "y" ? 4 : 2));
                var size = origSize;
                var num = 0;
                while (size > 0 && iValue < value.length && value.charAt(iValue) >= "0" && value.charAt(iValue) <= "9") {
                    num = num * 10 + (value.charAt(iValue++) - 0);
                    size--
                }
                if (size == origSize) {
                    throw "Missing number at position " + iValue
                }
                return num
            };
            var getName = function(match, shortNames, longNames) {
                var names = (lookAhead(match) ? longNames: shortNames);
                var size = 0;
                for (var j = 0; j < names.length; j++) {
                    size = Math.max(size, names[j].length)
                }
                var name = "";
                var iInit = iValue;
                while (size > 0 && iValue < value.length) {
                    name += value.charAt(iValue++);
                    for (var i = 0; i < names.length; i++) {
                        if (name == names[i]) {
                            return i + 1
                        }
                    }
                    size--
                }
                throw "Unknown name at position " + iInit
            };
            var checkLiteral = function() {
                if (value.charAt(iValue) != format.charAt(iFormat)) {
                    throw "Unexpected literal at position " + iValue
                }
                iValue++
            };
            var iValue = 0;
            for (var iFormat = 0; iFormat < format.length; iFormat++) {
                if (literal) {
                    if (format.charAt(iFormat) == "'" && !lookAhead("'")) {
                        literal = false
                    } else {
                        checkLiteral()
                    }
                } else {
                    switch (format.charAt(iFormat)) {
                    case "d":
                        day = getNumber("d");
                        break;
                    case "D":
                        getName("D", dayNamesShort, dayNames);
                        break;
                    case "m":
                        month = getNumber("m");
                        break;
                    case "M":
                        month = getName("M", monthNamesShort, monthNames);
                        break;
                    case "y":
                        year = getNumber("y");
                        break;
                    case "@":
                        var date = new Date(getNumber("@"));
                        year = date.getFullYear();
                        month = date.getMonth() + 1;
                        day = date.getDate();
                        break;
                    case "'":
                        if (lookAhead("'")) {
                            checkLiteral()
                        } else {
                            literal = true
                        }
                        break;
                    default:
                        checkLiteral()
                    }
                }
            }
            if (year < 100) {
                year += new Date().getFullYear() - new Date().getFullYear() % 100 + (year <= shortYearCutoff ? 0 : -100)
            }
            var date = this._daylightSavingAdjust(new Date(year, month - 1, day));
            if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day) {
                throw "Invalid date"
            }
            return date
        },
        ATOM: "yy-mm-dd",
        COOKIE: "D, dd M yy",
        ISO_8601: "yy-mm-dd",
        RFC_822: "D, d M y",
        RFC_850: "DD, dd-M-y",
        RFC_1036: "D, d M y",
        RFC_1123: "D, d M yy",
        RFC_2822: "D, d M yy",
        RSS: "D, d M y",
        TIMESTAMP: "@",
        W3C: "yy-mm-dd",
        formatDate: function(format, date, settings) {
            if (!date) {
                return ""
            }
            var dayNamesShort = (settings ? settings.dayNamesShort: null) || this._defaults.dayNamesShort;
            var dayNames = (settings ? settings.dayNames: null) || this._defaults.dayNames;
            var monthNamesShort = (settings ? settings.monthNamesShort: null) || this._defaults.monthNamesShort;
            var monthNames = (settings ? settings.monthNames: null) || this._defaults.monthNames;
            var lookAhead = function(match) {
                var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
                if (matches) {
                    iFormat++
                }
                return matches
            };
            var formatNumber = function(match, value) {
                return (lookAhead(match) && value < 10 ? "0": "") + value
            };
            var formatName = function(match, value, shortNames, longNames) {
                return (lookAhead(match) ? longNames[value] : shortNames[value])
            };
            var output = "";
            var literal = false;
            if (date) {
                for (var iFormat = 0; iFormat < format.length; iFormat++) {
                    if (literal) {
                        if (format.charAt(iFormat) == "'" && !lookAhead("'")) {
                            literal = false
                        } else {
                            output += format.charAt(iFormat)
                        }
                    } else {
                        switch (format.charAt(iFormat)) {
                        case "d":
                            output += formatNumber("d", date.getDate());
                            break;
                        case "D":
                            output += formatName("D", date.getDay(), dayNamesShort, dayNames);
                            break;
                        case "m":
                            output += formatNumber("m", date.getMonth() + 1);
                            break;
                        case "M":
                            output += formatName("M", date.getMonth(), monthNamesShort, monthNames);
                            break;
                        case "y":
                            output += (lookAhead("y") ? date.getFullYear() : (date.getYear() % 100 < 10 ? "0": "") + date.getYear() % 100);
                            break;
                        case "@":
                            output += date.getTime();
                            break;
                        case "'":
                            if (lookAhead("'")) {
                                output += "'"
                            } else {
                                literal = true
                            }
                            break;
                        default:
                            output += format.charAt(iFormat)
                        }
                    }
                }
            }
            return output
        },
        _possibleChars: function(format) {
            var chars = "";
            var literal = false;
            for (var iFormat = 0; iFormat < format.length; iFormat++) {
                if (literal) {
                    if (format.charAt(iFormat) == "'" && !lookAhead("'")) {
                        literal = false
                    } else {
                        chars += format.charAt(iFormat)
                    }
                } else {
                    switch (format.charAt(iFormat)) {
                    case "d":
                    case "m":
                    case "y":
                    case "@":
                        chars += "0123456789";
                        break;
                    case "D":
                    case "M":
                        return null;
                    case "'":
                        if (lookAhead("'")) {
                            chars += "'"
                        } else {
                            literal = true
                        }
                        break;
                    default:
                        chars += format.charAt(iFormat)
                    }
                }
            }
            return chars
        },
        _get: function(inst, name) {
            return inst.settings[name] !== undefined ? inst.settings[name] : this._defaults[name]
        },
        _setDateFromField: function(inst) {
            var dateFormat = this._get(inst, "dateFormat");
            var dates = inst.input ? inst.input.val().split(this._get(inst, "rangeSeparator")) : null;
            inst.endDay = inst.endMonth = inst.endYear = null;
            var date = defaultDate = this._getDefaultDate(inst);
            if (dates.length > 0) {
                var settings = this._getFormatConfig(inst);
                if (dates.length > 1) {
                    date = this.parseDate(dateFormat, dates[1], settings) || defaultDate;
                    inst.endDay = date.getDate();
                    inst.endMonth = date.getMonth();
                    inst.endYear = date.getFullYear()
                }
                try {
                    date = this.parseDate(dateFormat, dates[0], settings) || defaultDate
                } catch(e) {
                    this.log(e);
                    date = defaultDate
                }
            }
            inst.selectedDay = date.getDate();
            inst.drawMonth = inst.selectedMonth = date.getMonth();
            inst.drawYear = inst.selectedYear = date.getFullYear();
            inst.currentDay = (dates[0] ? date.getDate() : 0);
            inst.currentMonth = (dates[0] ? date.getMonth() : 0);
            inst.currentYear = (dates[0] ? date.getFullYear() : 0);
            this._adjustInstDate(inst)
        },
        _getDefaultDate: function(inst) {
            var date = this._determineDate(this._get(inst, "defaultDate"), new Date());
            var minDate = this._getMinMaxDate(inst, "min", true);
            var maxDate = this._getMinMaxDate(inst, "max");
            date = (minDate && date < minDate ? minDate: date);
            date = (maxDate && date > maxDate ? maxDate: date);
            return date
        },
        _determineDate: function(date, defaultDate) {
            var offsetNumeric = function(offset) {
                var date = new Date();
                date.setDate(date.getDate() + offset);
                return date
            };
            var offsetString = function(offset, getDaysInMonth) {
                var date = new Date();
                var year = date.getFullYear();
                var month = date.getMonth();
                var day = date.getDate();
                var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;
                var matches = pattern.exec(offset);
                while (matches) {
                    switch (matches[2] || "d") {
                    case "d":
                    case "D":
                        day += (matches[1] - 0);
                        break;
                    case "w":
                    case "W":
                        day += (matches[1] * 7);
                        break;
                    case "m":
                    case "M":
                        month += (matches[1] - 0);
                        day = Math.min(day, getDaysInMonth(year, month));
                        break;
                    case "y":
                    case "Y":
                        year += (matches[1] - 0);
                        day = Math.min(day, getDaysInMonth(year, month));
                        break
                    }
                    matches = pattern.exec(offset)
                }
                return new Date(year, month, day)
            };
            date = (date == null ? defaultDate: (typeof date == "string" ? offsetString(date, this._getDaysInMonth) : (typeof date == "number" ? (isNaN(date) ? defaultDate: offsetNumeric(date)) : date)));
            date = (date && date.toString() == "Invalid Date" ? defaultDate: date);
            if (date) {
                date.setHours(0);
                date.setMinutes(0);
                date.setSeconds(0);
                date.setMilliseconds(0)
            }
            return this._daylightSavingAdjust(date)
        },
        _daylightSavingAdjust: function(date) {
            if (!date) {
                return null
            }
            date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
            return date
        },
        _setDate: function(inst, date, endDate) {
            var clear = !(date);
            date = this._determineDate(date, new Date());
            inst.selectedDay = inst.currentDay = date.getDate();
            inst.drawMonth = inst.selectedMonth = inst.currentMonth = date.getMonth();
            inst.drawYear = inst.selectedYear = inst.currentYear = date.getFullYear();
            if (this._get(inst, "rangeSelect")) {
                if (endDate) {
                    endDate = this._determineDate(endDate, null);
                    inst.endDay = endDate.getDate();
                    inst.endMonth = endDate.getMonth();
                    inst.endYear = endDate.getFullYear()
                } else {
                    inst.endDay = inst.currentDay;
                    inst.endMonth = inst.currentMonth;
                    inst.endYear = inst.currentYear
                }
            }
            this._adjustInstDate(inst);
            if (inst.input) {
                inst.input.val(clear ? "": this._formatDate(inst) + (!this._get(inst, "rangeSelect") ? "": this._get(inst, "rangeSeparator") + this._formatDate(inst, inst.endDay, inst.endMonth, inst.endYear)))
            }
        },
        _getDate: function(inst) {
            var startDate = (!inst.currentYear || (inst.input && inst.input.val() == "") ? null: this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
            if (this._get(inst, "rangeSelect")) {
                return [inst.rangeStart || startDate, (!inst.endYear ? inst.rangeStart || startDate: this._daylightSavingAdjust(new Date(inst.endYear, inst.endMonth, inst.endDay)))]
            } else {
                return startDate
            }
        },
        _generateDatepicker: function(inst) {
            var today = new Date();
            today = this._daylightSavingAdjust(new Date(today.getFullYear(), today.getMonth(), today.getDate()));
            var showStatus = this._get(inst, "showStatus");
            var isRTL = this._get(inst, "isRTL");
            var clear = (this._get(inst, "mandatory") ? "": '<div class="ui-datepicker-clear"><a onclick="jQuery.datepicker._clearDate(\'#' + inst.id + "');\"" + (showStatus ? this._addStatus(inst, this._get(inst, "clearStatus") || "&#xa0;") : "") + ">" + this._get(inst, "clearText") + "</a></div>");
            var controls = '<div class="ui-datepicker-control">' + (isRTL ? "": clear) + '<div class="ui-datepicker-close"><a onclick="jQuery.datepicker._hideDatepicker();"' + (showStatus ? this._addStatus(inst, this._get(inst, "closeStatus") || "&#xa0;") : "") + ">" + this._get(inst, "closeText") + "</a></div>" + (isRTL ? clear: "") + "</div>";
            var prompt = this._get(inst, "prompt");
            var closeAtTop = this._get(inst, "closeAtTop");
            var hideIfNoPrevNext = this._get(inst, "hideIfNoPrevNext");
            var navigationAsDateFormat = this._get(inst, "navigationAsDateFormat");
            var numMonths = this._getNumberOfMonths(inst);
            var stepMonths = this._get(inst, "stepMonths");
            var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1);
            var currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) : new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
            var minDate = this._getMinMaxDate(inst, "min", true);
            var maxDate = this._getMinMaxDate(inst, "max");
            var drawMonth = inst.drawMonth;
            var drawYear = inst.drawYear;
            if (maxDate) {
                var maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(), maxDate.getMonth() - numMonths[1] + 1, maxDate.getDate()));
                maxDraw = (minDate && maxDraw < minDate ? minDate: maxDraw);
                while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {
                    drawMonth--;
                    if (drawMonth < 0) {
                        drawMonth = 11;
                        drawYear--
                    }
                }
            }
            var prevText = this._get(inst, "prevText");
            prevText = (!navigationAsDateFormat ? prevText: this.formatDate(prevText, this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)), this._getFormatConfig(inst)));
            var prev = '<div class="ui-datepicker-prev">' + (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ? "<a onclick=\"jQuery.datepicker._adjustDate('#" + inst.id + "', -" + stepMonths + ", 'M');\"" + (showStatus ? this._addStatus(inst, this._get(inst, "prevStatus") || "&#xa0;") : "") + ">" + prevText + "</a>": (hideIfNoPrevNext ? "": "<label>" + prevText + "</label>")) + "</div>";
            var nextText = this._get(inst, "nextText");
            nextText = (!navigationAsDateFormat ? nextText: this.formatDate(nextText, this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)), this._getFormatConfig(inst)));
            var next = '<div class="ui-datepicker-next">' + (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ? "<a onclick=\"jQuery.datepicker._adjustDate('#" + inst.id + "', +" + stepMonths + ", 'M');\"" + (showStatus ? this._addStatus(inst, this._get(inst, "nextStatus") || "&#xa0;") : "") + ">" + nextText + "</a>": (hideIfNoPrevNext ? "": "<label>" + nextText + "</label>")) + "</div>";
            var currentText = this._get(inst, "currentText");
            currentText = (!navigationAsDateFormat ? currentText: this.formatDate(currentText, today, this._getFormatConfig(inst)));
            var html = (prompt ? '<div class="' + this._promptClass + '">' + prompt + "</div>": "") + (closeAtTop && !inst.inline ? controls: "") + '<div class="ui-datepicker-links">' + (isRTL ? next: prev) + (this._isInRange(inst, (this._get(inst, "gotoCurrent") && inst.currentDay ? currentDate: today)) ? '<div class="ui-datepicker-current"><a onclick="jQuery.datepicker._gotoToday(\'#' + inst.id + "');\"" + (showStatus ? this._addStatus(inst, this._get(inst, "currentStatus") || "&#xa0;") : "") + ">" + currentText + "</a></div>": "") + (isRTL ? prev: next) + "</div>";
            var firstDay = this._get(inst, "firstDay");
            var changeFirstDay = this._get(inst, "changeFirstDay");
            var dayNames = this._get(inst, "dayNames");
            var dayNamesShort = this._get(inst, "dayNamesShort");
            var dayNamesMin = this._get(inst, "dayNamesMin");
            var monthNames = this._get(inst, "monthNames");
            var beforeShowDay = this._get(inst, "beforeShowDay");
            var highlightWeek = this._get(inst, "highlightWeek");
            var showOtherMonths = this._get(inst, "showOtherMonths");
            var showWeeks = this._get(inst, "showWeeks");
            var calculateWeek = this._get(inst, "calculateWeek") || this.iso8601Week;
            var status = (showStatus ? this._get(inst, "dayStatus") || "&#xa0;": "");
            var dateStatus = this._get(inst, "statusForDate") || this.dateStatus;
            var endDate = inst.endDay ? this._daylightSavingAdjust(new Date(inst.endYear, inst.endMonth, inst.endDay)) : currentDate;
            for (var row = 0; row < numMonths[0]; row++) {
                for (var col = 0; col < numMonths[1]; col++) {
                    var selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));
                    html += '<div class="ui-datepicker-one-month' + (col == 0 ? " ui-datepicker-new-row": "") + '">' + this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate, selectedDate, row > 0 || col > 0, showStatus, monthNames) + '<table class="ui-datepicker" cellpadding="0" cellspacing="0"><thead><tr class="ui-datepicker-title-row">' + (showWeeks ? "<td>" + this._get(inst, "weekHeader") + "</td>": "");
                    for (var dow = 0; dow < 7; dow++) {
                        var day = (dow + firstDay) % 7;
                        var dayStatus = (status.indexOf("DD") > -1 ? status.replace(/DD/, dayNames[day]) : status.replace(/D/, dayNamesShort[day]));
                        html += "<td" + ((dow + firstDay + 6) % 7 >= 5 ? ' class="ui-datepicker-week-end-cell"': "") + ">" + (!changeFirstDay ? "<span": "<a onclick=\"jQuery.datepicker._changeFirstDay('#" + inst.id + "', " + day + ');"') + (showStatus ? this._addStatus(inst, dayStatus) : "") + ' title="' + dayNames[day] + '">' + dayNamesMin[day] + (changeFirstDay ? "</a>": "</span>") + "</td>"
                    }
                    html += "</tr></thead><tbody>";
                    var daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
                    if (drawYear == inst.selectedYear && drawMonth == inst.selectedMonth) {
                        inst.selectedDay = Math.min(inst.selectedDay, daysInMonth)
                    }
                    var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
                    var numRows = (isMultiMonth ? 6 : Math.ceil((leadDays + daysInMonth) / 7));
                    var printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
                    for (var dRow = 0; dRow < numRows; dRow++) {
                        html += '<tr class="ui-datepicker-days-row">' + (showWeeks ? '<td class="ui-datepicker-week-col">' + calculateWeek(printDate) + "</td>": "");
                        for (var dow = 0; dow < 7; dow++) {
                            var daySettings = (beforeShowDay ? beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, ""]);
                            var otherMonth = (printDate.getMonth() != drawMonth);
                            var unselectable = otherMonth || !daySettings[0] || (minDate && printDate < minDate) || (maxDate && printDate > maxDate);
                            html += '<td class="ui-datepicker-days-cell' + ((dow + firstDay + 6) % 7 >= 5 ? " ui-datepicker-week-end-cell": "") + (otherMonth ? " ui-datepicker-otherMonth": "") + (printDate.getTime() == selectedDate.getTime() && drawMonth == inst.selectedMonth ? " ui-datepicker-days-cell-over": "") + (unselectable ? " " + this._unselectableClass: "") + (otherMonth && !showOtherMonths ? "": " " + daySettings[1] + (printDate.getTime() >= currentDate.getTime() && printDate.getTime() <= endDate.getTime() ? " " + this._currentClass: "") + (printDate.getTime() == today.getTime() ? " ui-datepicker-today": "")) + '"' + ((!otherMonth || showOtherMonths) && daySettings[2] ? ' title="' + daySettings[2] + '"': "") + (unselectable ? (highlightWeek ? " onmouseover=\"jQuery(this).parent().addClass('ui-datepicker-week-over');\" onmouseout=\"jQuery(this).parent().removeClass('ui-datepicker-week-over');\"": "") : " onmouseover=\"jQuery(this).addClass('ui-datepicker-days-cell-over')" + (highlightWeek ? ".parent().addClass('ui-datepicker-week-over')": "") + ";" + (!showStatus || (otherMonth && !showOtherMonths) ? "": "jQuery('#ui-datepicker-status-" + inst.id + "').html('" + (dateStatus.apply((inst.input ? inst.input[0] : null), [printDate, inst]) || "&#xa0;") + "');") + "\" onmouseout=\"jQuery(this).removeClass('ui-datepicker-days-cell-over')" + (highlightWeek ? ".parent().removeClass('ui-datepicker-week-over')": "") + ";" + (!showStatus || (otherMonth && !showOtherMonths) ? "": "jQuery('#ui-datepicker-status-" + inst.id + "').html('&#xa0;');") + '" onclick="jQuery.datepicker._selectDay(\'#' + inst.id + "'," + drawMonth + "," + drawYear + ', this);"') + ">" + (otherMonth ? (showOtherMonths ? printDate.getDate() : "&#xa0;") : (unselectable ? printDate.getDate() : "<a>" + printDate.getDate() + "</a>")) + "</td>";
                            printDate.setDate(printDate.getDate() + 1);
                            printDate = this._daylightSavingAdjust(printDate)
                        }
                        html += "</tr>"
                    }
                    drawMonth++;
                    if (drawMonth > 11) {
                        drawMonth = 0;
                        drawYear++
                    }
                    html += "</tbody></table></div>"
                }
            }
            html += (showStatus ? '<div style="clear: both;"></div><div id="ui-datepicker-status-' + inst.id + '" class="ui-datepicker-status">' + (this._get(inst, "initStatus") || "&#xa0;") + "</div>": "") + (!closeAtTop && !inst.inline ? controls: "") + '<div style="clear: both;"></div>' + ($.browser.msie && parseInt($.browser.version) < 7 && !inst.inline ? '<iframe src="javascript:false;" class="ui-datepicker-cover"></iframe>': "");
            return html
        },
        _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate, selectedDate, secondary, showStatus, monthNames) {
            minDate = (inst.rangeStart && minDate && selectedDate < minDate ? selectedDate: minDate);
            var html = '<div class="ui-datepicker-header">';
            if (secondary || !this._get(inst, "changeMonth")) {
                html += monthNames[drawMonth] + "&#xa0;"
            } else {
                var inMinYear = (minDate && minDate.getFullYear() == drawYear);
                var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear);
                html += '<select class="ui-datepicker-new-month" onchange="jQuery.datepicker._selectMonthYear(\'#' + inst.id + "', this, 'M');\" onclick=\"jQuery.datepicker._clickMonthYear('#" + inst.id + "');\"" + (showStatus ? this._addStatus(inst, this._get(inst, "monthStatus") || "&#xa0;") : "") + ">";
                for (var month = 0; month < 12; month++) {
                    if ((!inMinYear || month >= minDate.getMonth()) && (!inMaxYear || month <= maxDate.getMonth())) {
                        html += '<option value="' + month + '"' + (month == drawMonth ? ' selected="selected"': "") + ">" + monthNames[month] + "</option>"
                    }
                }
                html += "</select>"
            }
            if (secondary || !this._get(inst, "changeYear")) {
                html += drawYear
            } else {
                var years = this._get(inst, "yearRange").split(":");
                var year = 0;
                var endYear = 0;
                if (years.length != 2) {
                    year = drawYear - 10;
                    endYear = drawYear + 10
                } else {
                    if (years[0].charAt(0) == "+" || years[0].charAt(0) == "-") {
                        year = endYear = new Date().getFullYear();
                        year += parseInt(years[0], 10);
                        endYear += parseInt(years[1], 10)
                    } else {
                        year = parseInt(years[0], 10);
                        endYear = parseInt(years[1], 10)
                    }
                }
                year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
                endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
                html += '<select class="ui-datepicker-new-year" onchange="jQuery.datepicker._selectMonthYear(\'#' + inst.id + "', this, 'Y');\" onclick=\"jQuery.datepicker._clickMonthYear('#" + inst.id + "');\"" + (showStatus ? this._addStatus(inst, this._get(inst, "yearStatus") || "&#xa0;") : "") + ">";
                for (; year <= endYear; year++) {
                    html += '<option value="' + year + '"' + (year == drawYear ? ' selected="selected"': "") + ">" + year + ".</option>"
                }
                html += "</select>"
            }
            html += "</div>";
            return html
        },
        _addStatus: function(inst, text) {
            return " onmouseover=\"jQuery('#ui-datepicker-status-" + inst.id + "').html('" + text + "');\" onmouseout=\"jQuery('#ui-datepicker-status-" + inst.id + "').html('&#xa0;');\""
        },
        _adjustInstDate: function(inst, offset, period) {
            var year = inst.drawYear + (period == "Y" ? offset: 0);
            var month = inst.drawMonth + (period == "M" ? offset: 0);
            var day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + (period == "D" ? offset: 0);
            var date = this._daylightSavingAdjust(new Date(year, month, day));
            var minDate = this._getMinMaxDate(inst, "min", true);
            var maxDate = this._getMinMaxDate(inst, "max");
            date = (minDate && date < minDate ? minDate: date);
            date = (maxDate && date > maxDate ? maxDate: date);
            inst.selectedDay = date.getDate();
            inst.drawMonth = inst.selectedMonth = date.getMonth();
            inst.drawYear = inst.selectedYear = date.getFullYear();
            if (period == "M" || period == "Y") {
                this._notifyChange(inst)
            }
        },
        _notifyChange: function(inst) {
            var onChange = this._get(inst, "onChangeMonthYear");
            if (onChange) {
                onChange.apply((inst.input ? inst.input[0] : null), [new Date(inst.selectedYear, inst.selectedMonth, 1), inst])
            }
        },
        _getNumberOfMonths: function(inst) {
            var numMonths = this._get(inst, "numberOfMonths");
            return (numMonths == null ? [1, 1] : (typeof numMonths == "number" ? [1, numMonths] : numMonths))
        },
        _getMinMaxDate: function(inst, minMax, checkRange) {
            var date = this._determineDate(this._get(inst, minMax + "Date"), null);
            return (!checkRange || !inst.rangeStart ? date: (!date || inst.rangeStart > date ? inst.rangeStart: date))
        },
        _getDaysInMonth: function(year, month) {
            return 32 - new Date(year, month, 32).getDate()
        },
        _getFirstDayOfMonth: function(year, month) {
            return new Date(year, month, 1).getDay()
        },
        _canAdjustMonth: function(inst, offset, curYear, curMonth) {
            var numMonths = this._getNumberOfMonths(inst);
            var date = this._daylightSavingAdjust(new Date(curYear, curMonth + (offset < 0 ? offset: numMonths[1]), 1));
            if (offset < 0) {
                date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()))
            }
            return this._isInRange(inst, date)
        },
        _isInRange: function(inst, date) {
            var newMinDate = (!inst.rangeStart ? null: this._daylightSavingAdjust(new Date(inst.selectedYear, inst.selectedMonth, inst.selectedDay)));
            newMinDate = (newMinDate && inst.rangeStart < newMinDate ? inst.rangeStart: newMinDate);
            var minDate = newMinDate || this._getMinMaxDate(inst, "min");
            var maxDate = this._getMinMaxDate(inst, "max");
            return ((!minDate || date >= minDate) && (!maxDate || date <= maxDate))
        },
        _getFormatConfig: function(inst) {
            var shortYearCutoff = this._get(inst, "shortYearCutoff");
            shortYearCutoff = (typeof shortYearCutoff != "string" ? shortYearCutoff: new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
            return {
                shortYearCutoff: shortYearCutoff,
                dayNamesShort: this._get(inst, "dayNamesShort"),
                dayNames: this._get(inst, "dayNames"),
                monthNamesShort: this._get(inst, "monthNamesShort"),
                monthNames: this._get(inst, "monthNames")
            }
        },
        _formatDate: function(inst, day, month, year) {
            if (!day) {
                inst.currentDay = inst.selectedDay;
                inst.currentMonth = inst.selectedMonth;
                inst.currentYear = inst.selectedYear
            }
            var date = (day ? (typeof day == "object" ? day: this._daylightSavingAdjust(new Date(year, month, day))) : this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
            return this.formatDate(this._get(inst, "dateFormat"), date, this._getFormatConfig(inst))
        }
    });
    function extendRemove(target, props) {
        $.extend(target, props);
        for (var name in props) {
            if (props[name] == null || props[name] == undefined) {
                target[name] = props[name]
            }
        }
        return target
    }
    function isArray(a) {
        return (a && (($.browser.safari && typeof a == "object" && a.length) || (a.constructor && a.constructor.toString().match(/\Array\(\)/))))
    }
    $.fn.datepicker = function(options) {
        var otherArgs = Array.prototype.slice.call(arguments, 1);
        if (typeof options == "string" && (options == "isDisabled" || options == "getDate")) {
            return $.datepicker["_" + options + "Datepicker"].apply($.datepicker, [this[0]].concat(otherArgs))
        }
        return this.each(function() {
            typeof options == "string" ? $.datepicker["_" + options + "Datepicker"].apply($.datepicker, [this].concat(otherArgs)) : $.datepicker._attachDatepicker(this, options)
        })
    };
    $.datepicker = new Datepicker();
    $(document).ready(function() {
        $(document.body).append($.datepicker.dpDiv).mousedown($.datepicker._checkExternalClick)
    })
})(jQuery);
(function(C) {
    C.effects = C.effects || {};
    C.extend(C.effects, {
        save: function(F, G) {
            for (var E = 0; E < G.length; E++) {
                if (G[E] !== null) {
                    C.data(F[0], "ec.storage." + G[E], F[0].style[G[E]])
                }
            }
        },
        restore: function(F, G) {
            for (var E = 0; E < G.length; E++) {
                if (G[E] !== null) {
                    F.css(G[E], C.data(F[0], "ec.storage." + G[E]))
                }
            }
        },
        setMode: function(E, F) {
            if (F == "toggle") {
                F = E.is(":hidden") ? "show": "hide"
            }
            return F
        },
        getBaseline: function(F, G) {
            var H, E;
            switch (F[0]) {
            case "top":
                H = 0;
                break;
            case "middle":
                H = 0.5;
                break;
            case "bottom":
                H = 1;
                break;
            default:
                H = F[0] / G.height
            }
            switch (F[1]) {
            case "left":
                E = 0;
                break;
            case "center":
                E = 0.5;
                break;
            case "right":
                E = 1;
                break;
            default:
                E = F[1] / G.width
            }
            return {
                x: E,
                y: H
            }
        },
        createWrapper: function(F) {
            if (F.parent().attr("id") == "fxWrapper") {
                return F
            }
            var E = {
                width: F.outerWidth({
                    margin: true
                }),
                height: F.outerHeight({
                    margin: true
                }),
                "float": F.css("float")
            };
            F.wrap('<div id="fxWrapper" style="font-size:100%;background:transparent;border:none;margin:0;padding:0"></div>');
            var I = F.parent();
            if (F.css("position") == "static") {
                I.css({
                    position: "relative"
                });
                F.css({
                    position: "relative"
                })
            } else {
                var H = F.css("top");
                if (isNaN(parseInt(H))) {
                    H = "auto"
                }
                var G = F.css("left");
                if (isNaN(parseInt(G))) {
                    G = "auto"
                }
                I.css({
                    position: F.css("position"),
                    top: H,
                    left: G,
                    zIndex: F.css("z-index")
                }).show();
                F.css({
                    position: "relative",
                    top: 0,
                    left: 0
                })
            }
            I.css(E);
            return I
        },
        removeWrapper: function(E) {
            if (E.parent().attr("id") == "fxWrapper") {
                return E.parent().replaceWith(E)
            }
            return E
        },
        setTransition: function(F, G, E, H) {
            H = H || {};
            C.each(G,
            function(J, I) {
                unit = F.cssUnit(I);
                if (unit[0] > 0) {
                    H[I] = unit[0] * E + unit[1]
                }
            });
            return H
        },
        animateClass: function(G, H, J, I) {
            var E = (typeof J == "function" ? J: (I ? I: null));
            var F = (typeof J == "object" ? J: null);
            return this.each(function() {
                var O = {};
                var M = C(this);
                var N = M.attr("style") || "";
                if (typeof N == "object") {
                    N = N["cssText"]
                }
                if (G.toggle) {
                    M.hasClass(G.toggle) ? G.remove = G.toggle: G.add = G.toggle
                }
                var K = C.extend({},
                (document.defaultView ? document.defaultView.getComputedStyle(this, null) : this.currentStyle));
                if (G.add) {
                    M.addClass(G.add)
                }
                if (G.remove) {
                    M.removeClass(G.remove)
                }
                var L = C.extend({},
                (document.defaultView ? document.defaultView.getComputedStyle(this, null) : this.currentStyle));
                if (G.add) {
                    M.removeClass(G.add)
                }
                if (G.remove) {
                    M.addClass(G.remove)
                }
                for (var P in L) {
                    if (typeof L[P] != "function" && L[P] && P.indexOf("Moz") == -1 && P.indexOf("length") == -1 && L[P] != K[P] && (P.match(/color/i) || (!P.match(/color/i) && !isNaN(parseInt(L[P], 10)))) && (K.position != "static" || (K.position == "static" && !P.match(/left|top|bottom|right/)))) {
                        O[P] = L[P]
                    }
                }
                M.animate(O, H, F,
                function() {
                    if (typeof C(this).attr("style") == "object") {
                        C(this).attr("style")["cssText"] = "";
                        C(this).attr("style")["cssText"] = N
                    } else {
                        C(this).attr("style", N)
                    }
                    if (G.add) {
                        C(this).addClass(G.add)
                    }
                    if (G.remove) {
                        C(this).removeClass(G.remove)
                    }
                    if (E) {
                        E.apply(this, arguments)
                    }
                })
            })
        }
    });
    C.fn.extend({
        _show: C.fn.show,
        _hide: C.fn.hide,
        __toggle: C.fn.toggle,
        _addClass: C.fn.addClass,
        _removeClass: C.fn.removeClass,
        _toggleClass: C.fn.toggleClass,
        effect: function(E, G, F, H) {
            return C.effects[E] ? C.effects[E].call(this, {
                method: E,
                options: G || {},
                duration: F,
                callback: H
            }) : null
        },
        show: function() {
            if (!arguments[0] || (arguments[0].constructor == Number || /(slow|normal|fast)/.test(arguments[0]))) {
                return this._show.apply(this, arguments)
            } else {
                var E = arguments[1] || {};
                E["mode"] = "show";
                return this.effect.apply(this, [arguments[0], E, arguments[2] || E.duration, arguments[3] || E.callback])
            }
        },
        hide: function() {
            if (!arguments[0] || (arguments[0].constructor == Number || /(slow|normal|fast)/.test(arguments[0]))) {
                return this._hide.apply(this, arguments)
            } else {
                var E = arguments[1] || {};
                E["mode"] = "hide";
                return this.effect.apply(this, [arguments[0], E, arguments[2] || E.duration, arguments[3] || E.callback])
            }
        },
        toggle: function() {
            if (!arguments[0] || (arguments[0].constructor == Number || /(slow|normal|fast)/.test(arguments[0])) || (arguments[0].constructor == Function)) {
                return this.__toggle.apply(this, arguments)
            } else {
                var E = arguments[1] || {};
                E["mode"] = "toggle";
                return this.effect.apply(this, [arguments[0], E, arguments[2] || E.duration, arguments[3] || E.callback])
            }
        },
        addClass: function(F, E, H, G) {
            return E ? C.effects.animateClass.apply(this, [{
                add: F
            },
            E, H, G]) : this._addClass(F)
        },
        removeClass: function(F, E, H, G) {
            return E ? C.effects.animateClass.apply(this, [{
                remove: F
            },
            E, H, G]) : this._removeClass(F)
        },
        toggleClass: function(F, E, H, G) {
            return E ? C.effects.animateClass.apply(this, [{
                toggle: F
            },
            E, H, G]) : this._toggleClass(F)
        },
        morph: function(E, G, F, I, H) {
            return C.effects.animateClass.apply(this, [{
                add: G,
                remove: E
            },
            F, I, H])
        },
        switchClass: function() {
            return this.morph.apply(this, arguments)
        },
        cssUnit: function(E) {
            var F = this.css(E),
            G = [];
            C.each(["em", "px", "%", "pt"],
            function(H, I) {
                if (F.indexOf(I) > 0) {
                    G = [parseFloat(F), I]
                }
            });
            return G
        }
    });
    jQuery.each(["backgroundColor", "borderBottomColor", "borderLeftColor", "borderRightColor", "borderTopColor", "color", "outlineColor"],
    function(F, E) {
        jQuery.fx.step[E] = function(G) {
            if (G.state == 0) {
                G.start = D(G.elem, E);
                G.end = B(G.end)
            }
            G.elem.style[E] = "rgb(" + [Math.max(Math.min(parseInt((G.pos * (G.end[0] - G.start[0])) + G.start[0]), 255), 0), Math.max(Math.min(parseInt((G.pos * (G.end[1] - G.start[1])) + G.start[1]), 255), 0), Math.max(Math.min(parseInt((G.pos * (G.end[2] - G.start[2])) + G.start[2]), 255), 0)].join(",") + ")"
        }
    });
    function B(F) {
        var E;
        if (F && F.constructor == Array && F.length == 3) {
            return F
        }
        if (E = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(F)) {
            return [parseInt(E[1]), parseInt(E[2]), parseInt(E[3])]
        }
        if (E = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(F)) {
            return [parseFloat(E[1]) * 2.55, parseFloat(E[2]) * 2.55, parseFloat(E[3]) * 2.55]
        }
        if (E = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(F)) {
            return [parseInt(E[1], 16), parseInt(E[2], 16), parseInt(E[3], 16)]
        }
        if (E = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(F)) {
            return [parseInt(E[1] + E[1], 16), parseInt(E[2] + E[2], 16), parseInt(E[3] + E[3], 16)]
        }
        if (E = /rgba\(0, 0, 0, 0\)/.exec(F)) {
            return A["transparent"]
        }
        return A[jQuery.trim(F).toLowerCase()]
    }
    function D(G, E) {
        var F;
        do {
            F = jQuery.curCSS(G, E);
            if (F != "" && F != "transparent" || jQuery.nodeName(G, "body")) {
                break
            }
            E = "backgroundColor"
        } while ( G = G . parentNode );
        return B(F)
    }
    var A = {
        aqua: [0, 255, 255],
        azure: [240, 255, 255],
        beige: [245, 245, 220],
        black: [0, 0, 0],
        blue: [0, 0, 255],
        brown: [165, 42, 42],
        cyan: [0, 255, 255],
        darkblue: [0, 0, 139],
        darkcyan: [0, 139, 139],
        darkgrey: [169, 169, 169],
        darkgreen: [0, 100, 0],
        darkkhaki: [189, 183, 107],
        darkmagenta: [139, 0, 139],
        darkolivegreen: [85, 107, 47],
        darkorange: [255, 140, 0],
        darkorchid: [153, 50, 204],
        darkred: [139, 0, 0],
        darksalmon: [233, 150, 122],
        darkviolet: [148, 0, 211],
        fuchsia: [255, 0, 255],
        gold: [255, 215, 0],
        green: [0, 128, 0],
        indigo: [75, 0, 130],
        khaki: [240, 230, 140],
        lightblue: [173, 216, 230],
        lightcyan: [224, 255, 255],
        lightgreen: [144, 238, 144],
        lightgrey: [211, 211, 211],
        lightpink: [255, 182, 193],
        lightyellow: [255, 255, 224],
        lime: [0, 255, 0],
        magenta: [255, 0, 255],
        maroon: [128, 0, 0],
        navy: [0, 0, 128],
        olive: [128, 128, 0],
        orange: [255, 165, 0],
        pink: [255, 192, 203],
        purple: [128, 0, 128],
        violet: [128, 0, 128],
        red: [255, 0, 0],
        silver: [192, 192, 192],
        white: [255, 255, 255],
        yellow: [255, 255, 0],
        transparent: [255, 255, 255]
    };
    jQuery.easing["jswing"] = jQuery.easing["swing"];
    jQuery.extend(jQuery.easing, {
        def: "easeOutQuad",
        swing: function(F, G, E, I, H) {
            return jQuery.easing[jQuery.easing.def](F, G, E, I, H)
        },
        easeInQuad: function(F, G, E, I, H) {
            return I * (G /= H) * G + E
        },
        easeOutQuad: function(F, G, E, I, H) {
            return - I * (G /= H) * (G - 2) + E
        },
        easeInOutQuad: function(F, G, E, I, H) {
            if ((G /= H / 2) < 1) {
                return I / 2 * G * G + E
            }
            return - I / 2 * ((--G) * (G - 2) - 1) + E
        },
        easeInCubic: function(F, G, E, I, H) {
            return I * (G /= H) * G * G + E
        },
        easeOutCubic: function(F, G, E, I, H) {
            return I * ((G = G / H - 1) * G * G + 1) + E
        },
        easeInOutCubic: function(F, G, E, I, H) {
            if ((G /= H / 2) < 1) {
                return I / 2 * G * G * G + E
            }
            return I / 2 * ((G -= 2) * G * G + 2) + E
        },
        easeInQuart: function(F, G, E, I, H) {
            return I * (G /= H) * G * G * G + E
        },
        easeOutQuart: function(F, G, E, I, H) {
            return - I * ((G = G / H - 1) * G * G * G - 1) + E
        },
        easeInOutQuart: function(F, G, E, I, H) {
            if ((G /= H / 2) < 1) {
                return I / 2 * G * G * G * G + E
            }
            return - I / 2 * ((G -= 2) * G * G * G - 2) + E
        },
        easeInQuint: function(F, G, E, I, H) {
            return I * (G /= H) * G * G * G * G + E
        },
        easeOutQuint: function(F, G, E, I, H) {
            return I * ((G = G / H - 1) * G * G * G * G + 1) + E
        },
        easeInOutQuint: function(F, G, E, I, H) {
            if ((G /= H / 2) < 1) {
                return I / 2 * G * G * G * G * G + E
            }
            return I / 2 * ((G -= 2) * G * G * G * G + 2) + E
        },
        easeInSine: function(F, G, E, I, H) {
            return - I * Math.cos(G / H * (Math.PI / 2)) + I + E
        },
        easeOutSine: function(F, G, E, I, H) {
            return I * Math.sin(G / H * (Math.PI / 2)) + E
        },
        easeInOutSine: function(F, G, E, I, H) {
            return - I / 2 * (Math.cos(Math.PI * G / H) - 1) + E
        },
        easeInExpo: function(F, G, E, I, H) {
            return (G == 0) ? E: I * Math.pow(2, 10 * (G / H - 1)) + E
        },
        easeOutExpo: function(F, G, E, I, H) {
            return (G == H) ? E + I: I * ( - Math.pow(2, -10 * G / H) + 1) + E
        },
        easeInOutExpo: function(F, G, E, I, H) {
            if (G == 0) {
                return E
            }
            if (G == H) {
                return E + I
            }
            if ((G /= H / 2) < 1) {
                return I / 2 * Math.pow(2, 10 * (G - 1)) + E
            }
            return I / 2 * ( - Math.pow(2, -10 * --G) + 2) + E
        },
        easeInCirc: function(F, G, E, I, H) {
            return - I * (Math.sqrt(1 - (G /= H) * G) - 1) + E
        },
        easeOutCirc: function(F, G, E, I, H) {
            return I * Math.sqrt(1 - (G = G / H - 1) * G) + E
        },
        easeInOutCirc: function(F, G, E, I, H) {
            if ((G /= H / 2) < 1) {
                return - I / 2 * (Math.sqrt(1 - G * G) - 1) + E
            }
            return I / 2 * (Math.sqrt(1 - (G -= 2) * G) + 1) + E
        },
        easeInElastic: function(F, H, E, L, K) {
            var I = 1.70158;
            var J = 0;
            var G = L;
            if (H == 0) {
                return E
            }
            if ((H /= K) == 1) {
                return E + L
            }
            if (!J) {
                J = K * 0.3
            }
            if (G < Math.abs(L)) {
                G = L;
                var I = J / 4
            } else {
                var I = J / (2 * Math.PI) * Math.asin(L / G)
            }
            return - (G * Math.pow(2, 10 * (H -= 1)) * Math.sin((H * K - I) * (2 * Math.PI) / J)) + E
        },
        easeOutElastic: function(F, H, E, L, K) {
            var I = 1.70158;
            var J = 0;
            var G = L;
            if (H == 0) {
                return E
            }
            if ((H /= K) == 1) {
                return E + L
            }
            if (!J) {
                J = K * 0.3
            }
            if (G < Math.abs(L)) {
                G = L;
                var I = J / 4
            } else {
                var I = J / (2 * Math.PI) * Math.asin(L / G)
            }
            return G * Math.pow(2, -10 * H) * Math.sin((H * K - I) * (2 * Math.PI) / J) + L + E
        },
        easeInOutElastic: function(F, H, E, L, K) {
            var I = 1.70158;
            var J = 0;
            var G = L;
            if (H == 0) {
                return E
            }
            if ((H /= K / 2) == 2) {
                return E + L
            }
            if (!J) {
                J = K * (0.3 * 1.5)
            }
            if (G < Math.abs(L)) {
                G = L;
                var I = J / 4
            } else {
                var I = J / (2 * Math.PI) * Math.asin(L / G)
            }
            if (H < 1) {
                return - 0.5 * (G * Math.pow(2, 10 * (H -= 1)) * Math.sin((H * K - I) * (2 * Math.PI) / J)) + E
            }
            return G * Math.pow(2, -10 * (H -= 1)) * Math.sin((H * K - I) * (2 * Math.PI) / J) * 0.5 + L + E
        },
        easeInBack: function(F, G, E, J, I, H) {
            if (H == undefined) {
                H = 1.70158
            }
            return J * (G /= I) * G * ((H + 1) * G - H) + E
        },
        easeOutBack: function(F, G, E, J, I, H) {
            if (H == undefined) {
                H = 1.70158
            }
            return J * ((G = G / I - 1) * G * ((H + 1) * G + H) + 1) + E
        },
        easeInOutBack: function(F, G, E, J, I, H) {
            if (H == undefined) {
                H = 1.70158
            }
            if ((G /= I / 2) < 1) {
                return J / 2 * (G * G * (((H *= (1.525)) + 1) * G - H)) + E
            }
            return J / 2 * ((G -= 2) * G * (((H *= (1.525)) + 1) * G + H) + 2) + E
        },
        easeInBounce: function(F, G, E, I, H) {
            return I - jQuery.easing.easeOutBounce(F, H - G, 0, I, H) + E
        },
        easeOutBounce: function(F, G, E, I, H) {
            if ((G /= H) < (1 / 2.75)) {
                return I * (7.5625 * G * G) + E
            } else {
                if (G < (2 / 2.75)) {
                    return I * (7.5625 * (G -= (1.5 / 2.75)) * G + 0.75) + E
                } else {
                    if (G < (2.5 / 2.75)) {
                        return I * (7.5625 * (G -= (2.25 / 2.75)) * G + 0.9375) + E
                    } else {
                        return I * (7.5625 * (G -= (2.625 / 2.75)) * G + 0.984375) + E
                    }
                }
            }
        },
        easeInOutBounce: function(F, G, E, I, H) {
            if (G < H / 2) {
                return jQuery.easing.easeInBounce(F, G * 2, 0, I, H) * 0.5 + E
            }
            return jQuery.easing.easeOutBounce(F, G * 2 - H, 0, I, H) * 0.5 + I * 0.5 + E
        }
    })
})(jQuery);
(function(A) {
    A.effects.puff = function(B) {
        return this.queue(function() {
            var F = A(this);
            var C = A.extend(true, {},
            B.options);
            var H = A.effects.setMode(F, B.options.mode || "hide");
            var G = parseInt(B.options.percent) || 150;
            C.fade = true;
            var E = {
                height: F.height(),
                width: F.width()
            };
            var D = G / 100;
            F.from = (H == "hide") ? E: {
                height: E.height * D,
                width: E.width * D
            };
            C.from = F.from;
            C.percent = (H == "hide") ? G: 100;
            C.mode = H;
            F.effect("scale", C, B.duration, B.callback);
            F.dequeue()
        })
    };
    A.effects.scale = function(B) {
        return this.queue(function() {
            var G = A(this);
            var D = A.extend(true, {},
            B.options);
            var J = A.effects.setMode(G, B.options.mode || "effect");
            var H = parseInt(B.options.percent) || (parseInt(B.options.percent) == 0 ? 0 : (J == "hide" ? 0 : 100));
            var I = B.options.direction || "both";
            var C = B.options.origin;
            if (J != "effect") {
                D.origin = C || ["middle", "center"];
                D.restore = true
            }
            var F = {
                height: G.height(),
                width: G.width()
            };
            G.from = B.options.from || (J == "show" ? {
                height: 0,
                width: 0
            }: F);
            var E = {
                y: I != "horizontal" ? (H / 100) : 1,
                x: I != "vertical" ? (H / 100) : 1
            };
            G.to = {
                height: F.height * E.y,
                width: F.width * E.x
            };
            if (B.options.fade) {
                if (J == "show") {
                    G.from.opacity = 0;
                    G.to.opacity = 1
                }
                if (J == "hide") {
                    G.from.opacity = 1;
                    G.to.opacity = 0
                }
            }
            D.from = G.from;
            D.to = G.to;
            D.mode = J;
            G.effect("size", D, B.duration, B.callback);
            G.dequeue()
        })
    };
    A.effects.size = function(B) {
        return this.queue(function() {
            var C = A(this),
            N = ["position", "top", "left", "width", "height", "overflow", "opacity"];
            var M = ["position", "top", "left", "overflow", "opacity"];
            var J = ["width", "height", "overflow"];
            var P = ["fontSize"];
            var K = ["borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom"];
            var F = ["borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight"];
            var G = A.effects.setMode(C, B.options.mode || "effect");
            var I = B.options.restore || false;
            var E = B.options.scale || "both";
            var O = B.options.origin;
            var D = {
                height: C.height(),
                width: C.width()
            };
            C.from = B.options.from || D;
            C.to = B.options.to || D;
            if (O) {
                var H = A.effects.getBaseline(O, D);
                C.from.top = (D.height - C.from.height) * H.y;
                C.from.left = (D.width - C.from.width) * H.x;
                C.to.top = (D.height - C.to.height) * H.y;
                C.to.left = (D.width - C.to.width) * H.x
            }
            var L = {
                from: {
                    y: C.from.height / D.height,
                    x: C.from.width / D.width
                },
                to: {
                    y: C.to.height / D.height,
                    x: C.to.width / D.width
                }
            };
            if (E == "box" || E == "both") {
                if (L.from.y != L.to.y) {
                    N = N.concat(K);
                    C.from = A.effects.setTransition(C, K, L.from.y, C.from);
                    C.to = A.effects.setTransition(C, K, L.to.y, C.to)
                }
                if (L.from.x != L.to.x) {
                    N = N.concat(F);
                    C.from = A.effects.setTransition(C, F, L.from.x, C.from);
                    C.to = A.effects.setTransition(C, F, L.to.x, C.to)
                }
            }
            if (E == "content" || E == "both") {
                if (L.from.y != L.to.y) {
                    N = N.concat(P);
                    C.from = A.effects.setTransition(C, P, L.from.y, C.from);
                    C.to = A.effects.setTransition(C, P, L.to.y, C.to)
                }
            }
            A.effects.save(C, I ? N: M);
            C.show();
            A.effects.createWrapper(C);
            C.css("overflow", "hidden").css(C.from);
            if (E == "content" || E == "both") {
                K = K.concat(["marginTop", "marginBottom"]).concat(P);
                F = F.concat(["marginLeft", "marginRight"]);
                J = N.concat(K).concat(F);
                C.find("*[width]").each(function() {
                    child = A(this);
                    if (I) {
                        A.effects.save(child, J)
                    }
                    var Q = {
                        height: child.height(),
                        width: child.width()
                    };
                    child.from = {
                        height: Q.height * L.from.y,
                        width: Q.width * L.from.x
                    };
                    child.to = {
                        height: Q.height * L.to.y,
                        width: Q.width * L.to.x
                    };
                    if (L.from.y != L.to.y) {
                        child.from = A.effects.setTransition(child, K, L.from.y, child.from);
                        child.to = A.effects.setTransition(child, K, L.to.y, child.to)
                    }
                    if (L.from.x != L.to.x) {
                        child.from = A.effects.setTransition(child, F, L.from.x, child.from);
                        child.to = A.effects.setTransition(child, F, L.to.x, child.to)
                    }
                    child.css(child.from);
                    child.animate(child.to, B.duration, B.options.easing,
                    function() {
                        if (I) {
                            A.effects.restore(child, J)
                        }
                    })
                })
            }
            C.animate(C.to, {
                queue: false,
                duration: B.duration,
                easing: B.options.easing,
                complete: function() {
                    if (G == "hide") {
                        C.hide()
                    }
                    A.effects.restore(C, I ? N: M);
                    A.effects.removeWrapper(C);
                    if (B.callback) {
                        B.callback.apply(this, arguments)
                    }
                    C.dequeue()
                }
            })
        })
    }
})(jQuery);
