jQuery.noConflict();
(function ($, window) {
    "use strict";

    var VisibilityController = function (element, onOpen, onClose) {
        this.element = $(element);
        this.onOpen  = onOpen;
        this.onClose = onClose;
    }, menuItem = function (text, showArrow) {
        var li = $('<li class="ui-corner-all" />').append('<a href="#">' + text + '</a>');
        if (showArrow) {
            li.addClass('ui-helper-clearfix')
                .prepend('<span class="ui-icon ui-icon-triangle-1-e" />');
        }
        return li;
    }, buildDateRange = function (text, parent, onClick, index, highlight) {
        return menuItem(text, true)
            .addClass('ui-daterangepicker-calendar')
            .addClass(highlight ? 'ui-state-highlight' : '')
            .addClass('preset_' + index)
            .appendTo(parent)
            .click(onClick);
    }, getDate = function (element) {
        var pattern = /_selectDay\('#\w+',(\d+),(\d+),/,
            matches = pattern.exec($(element).parent().attr('onclick'));
        return new Date(matches[2], matches[1], $(element).text());
    }, setDate = function (object, date) {
        // IE7 workaround (http://bugs.jqueryui.com/ticket/5419)
        object.datepicker('disable');
        object.datepicker('setDate', date);
        object.datepicker('enable');
    }, thWeek = function (date) {
        if (!date) {
            return null;
        }
        date = Date.parse(date);
        var dayOfWeek = date.getDay(),
            firstDayOfWeek = parseInt($.datepicker.firstDayOfWeek, 10);
        if (dayOfWeek === firstDayOfWeek) {
            return date;
        } else {
            return date.add(((dayOfWeek + 7 - firstDayOfWeek) % 7) * -1).days(); // last "Friday"
        }
    }, activateWeek = function (datePicked, datePicker) {
        var weekStart = thWeek(datePicked),
            weekEnd,
            daysToSelect;
        if (!weekStart) { return; }
        weekEnd = new Date(weekStart).add(6).days();

        if (!weekStart.equals(datePicker.datepicker('getDate'))) {
            setDate(datePicker, weekStart);
        }

        datePicker.find('.ui-datepicker-calendar a').each(function () {
            var day = getDate(this),
                dayToAdd;
            if (day.between(weekStart, weekEnd)) {
                dayToAdd = $(this).parent();
                daysToSelect = daysToSelect ? daysToSelect.add(dayToAdd) : dayToAdd;
            }
        });

        if (daysToSelect) { daysToSelect.find('a').addClass('ui-state-active'); }
    }, weekMouseover = function (e) {
        if (e.target.nodeName !== 'A' || e.target.parentNode.nodeName !== 'TD') { return; }
        var daysToHover = $(e.target),
            firstDay,
            lastDay,
            weeks;

        $(this).find('a').removeClass('ui-state-hover');

        weeks = daysToHover.closestByTagName('tr');
        weeks = weeks
            .add(weeks.next())
            .add(weeks.prev());
        firstDay = thWeek(getDate(daysToHover));
        lastDay = new Date(firstDay).add(6).days();

        weeks.find('a').each(function () {
            var day = getDate(this);
            if (day.between(firstDay, lastDay)) {
                daysToHover = daysToHover.add(this);
            }
        });

        daysToHover.addClass('ui-state-hover');
    }, weekMouseout = function (e) {
        if (e.target.nodeName !== 'A' || e.target.parentNode.nodeName !== 'TD') { return; }
        $(e.target)
            .closestByTagName('table')
            .find('a')
            .removeClass('ui-state-hover');
    }, parseDate = function (s) {
        return Date.parseExact(s, 'yyyyMMdd HH:mm:ss') || Date.parse(s);
    }, datepickerPrototype = Object.getPrototypeOf
        ? Object.getPrototypeOf($.datepicker)
        : $.datepicker.constructor.prototype,
        originalClearDate         = datepickerPrototype._clearDate,
        originalGotoToday         = datepickerPrototype._gotoToday,
        originalSetDateDatepicker = datepickerPrototype._setDateDatepicker,
        originalUpdateDatepicker  = datepickerPrototype._updateDatepicker;

    createNamespace('Rtk.ThIntl.Option.Daterangepicker');
    Rtk.ThIntl.Option.Daterangepicker.activateWeek  = activateWeek;
    Rtk.ThIntl.Option.Daterangepicker.parseDate     = parseDate;
    Rtk.ThIntl.Option.Daterangepicker.setDate       = setDate;
    Rtk.ThIntl.Option.Daterangepicker.thWeek        = thWeek;
    Rtk.ThIntl.Option.Daterangepicker.weekMouseout  = weekMouseout;
    Rtk.ThIntl.Option.Daterangepicker.weekMouseover = weekMouseover;

    $.extend(datepickerPrototype, {
        _updateDatepicker_: originalUpdateDatepicker,
        _updateDatepicker: function (inst) {
            var result = this._updateDatepicker_(inst),
                datePicker = inst.dpDiv.parent(),
                currentDate,
                matches,
                pattern;

            if ($.datepicker.state === 'week') {
                currentDate = this._getDate(inst);

                activateWeek(currentDate, datePicker);
                datePicker
                    .bind('mouseover.weeks', weekMouseover)
                    .bind('mouseout.weeks', weekMouseout);
            } else {
                datePicker.unbind();
            }

            if ($.datepicker.state === 'month') {
                datePicker.find('.ui-datepicker-calendar').hide();
            }
            datePicker.find('.ui-datepicker-current').removeClass('ui-priority-secondary');

            if (inst.settings.showButtonPanel) {
                if ($.datepicker.enableShowAll) {
                    pattern = /(DP_$_\d+\.datepicker\.)_hideDatepicker/;
                    matches = pattern.exec(datePicker.find('.ui-datepicker-close').attr('onclick'));

                    datePicker
                        .find('.ui-datepicker-close')
                        .attr('onclick', matches[1] + "_clearDate('#" + inst.id + "');");
                } else {
                    datePicker.find('.ui-datepicker-close').hide();
                }
            }

            return result;
        },

        _setDateDatepicker_: originalSetDateDatepicker,
        _setDateDatepicker: function (target, date) {
            var result     = this._setDateDatepicker_(target, date),
                inst       = this._getInst(target),
                datePicker = inst.dpDiv.parent(),
                brother    = datePicker.siblings('.range-start, .range-end'),
                minDate    = $.datepicker._defaults.minDate,
                maxDate    = $.datepicker._defaults.maxDate,
                option,
                restrictedDate;

            if (typeof date === 'string') { date = parseDate(date); }

            if ($.datepicker.state === 'range') {
                if (datePicker.is('.range-start')) {
                    option = 'minDate';
                    restrictedDate = date.isBefore(minDate) ? minDate : date;
                    datePicker.datepicker('option', 'minDate', minDate);
                } else {
                    option = 'maxDate';
                    restrictedDate = date.isAfter(maxDate) ? maxDate : date;
                    datePicker.datepicker('option', 'maxDate', maxDate);
                }
                brother.datepicker('option', option, restrictedDate);
            } else {
                datePicker.add(brother).datepicker('option', {
                    minDate: minDate,
                    maxDate: maxDate
                });
            }
            return result;
        },

        _gotoToday_: originalGotoToday,
        _gotoToday: function (id) {
            this._gotoToday_(id);
            var target = $(id),
                inst   = this._getInst(target[0]),
                month  = inst.selectedMonth,
                year   = inst.selectedYear,
                day    = inst.dpDiv.find('.ui-datepicker-today')[0];
            this._selectDay(id, month, year, day);
            target.blur();
        },

        _clearDate_: originalClearDate,
        _clearDate: function (id) {
            this._clearDate_(id);
            window.calendarWidget.jqOption.val('ALL');
        }
    });


    VisibilityController.prototype = {
        show: function (target) {
            if ($(this.element).data('state') !== 'show') { return; }

            $(this.element).parent().css({
                left: target.offset().left,
                top: target.offset().top + target.outerHeight()
            });

            $(this.element).fadeIn(300);
            $(this.element).data('state', 'hide');
            this.onOpen();
        },
        hide: function () {
            if ($(this.element).data('state') !== 'hide') { return; }
            $(this.element).fadeOut(300);
            $(this.element).data('state', 'show');
            this.onClose();
        },
        toggle: function (target) {
            this[$(this.element).data('state')](target);
        },
        is_visible: function () {
            return $(this.element).is(':visible');
        }
    };

    $.DateRange = function (highlight, text, option, begin, end) {
        this.highlight = highlight;
        this.text      = text;
        this.option    = option;
        this.beginDate = begin;
        this.endDate   = end;
    };
    $.DateRange.prototype = {
        render: function (parent, inputs, format) {
            function normalizeDate(d) {
                if (d instanceof Date) {
                    return d;
                } else if (typeof d === 'string') {
                    return parseDate(d);
                } else {
                    return d();
                }
            }

            var option = this.option,
                begin  = normalizeDate(this.beginDate),
                end    = normalizeDate(this.endDate),
                item;

            item = menuItem(this.text)
                .addClass('ui-daterangepicker-range')
                .addClass(this.highlight ? 'ui-state-highlight' : '')
                .appendTo(parent)
                .click(function () {
                    var dateRangePicker = $('.ui-daterangepicker');

                    parent.parent().parent()
                        .find('.ui-state-active')
                        .not('a')
                        .removeClass('ui-state-active');

                    dateRangePicker.find('.ui-state-highlight').removeClass('ui-state-highlight');
                    dateRangePicker.find('.ui-state-active').not('a').removeClass('ui-state-active')
                        .add(this).addClass('ui-state-highlight');

                    dateRangePicker.find('div:visible').not('.ranges div, .shrinkwrap').hide();

                    inputs.eq(1).val(begin ? begin.toString(format) : '');
                    inputs.eq(2).val(end   ? end.toString(format)   : '');
                    inputs.eq(1).change();
                    inputs.eq(2).change();
                    inputs.eq(0).val(option);
                    inputs.eq(0).change();
                });
            if (this.highlight) {
                item.click();
            }
            return item;
        }
    };

    $.DateRangeGroup = function (highlight, text, elements) {
        this.highlight = highlight;
        this.text      = text;
        this.elements  = elements;
    };
    $.DateRangeGroup.prototype = {
        render: function (parent, inputs, format) {
            var parentMenu = parent.closestByTagName('div').parent('.ui-daterangepicker-group'),
                rangePicker = parent.parent('.ui-daterangepicker'),
                list = $('<ul />')
                    .addClass('ui-widget-content')
                    .addClass('ui-helper-clearfix')
                    .addClass('ui-corner-all'),
                container = $('<div class="ui-daterangepicker-group" />')
                    .css({ float: 'left' })
                    .appendTo(!!parentMenu.length ? parentMenu : rangePicker)
                    .append($('<div class="shrinkwrap" />').append(list))
                    .hide();

            $.each(this.elements, function () { this.render(list, inputs, format); });

            return menuItem(this.text, true)
                .addClass('ui-daterangepicker-group')
                .addClass(this.highlight ? 'ui-state-highlight' : '')
                .appendTo(parent)
                .click(function () {
                    var currentlyOpen = rangePicker.find('div:visible').not('.ranges div, .shrinkwrap');

                    if (container.is('div:visible')) {
                        container.add(container.find('div:visible').not('.shrinkwrap')).hide(400);
                    } else if (parentMenu.is('div:visible')) {
                        parentMenu.find('div:visible').not('.ranges div, .shrinkwrap').hide(400);
                        container.show(400);
                    } else if (!currentlyOpen.length || parentMenu.is('div:visible')) {
                        parentMenu.find('div:visible').not('.shrinkwrap').hide(400);
                        container.show(400);
                    } else if (currentlyOpen.is('.ranges')) {
                        currentlyOpen.find('button').hide();
                        currentlyOpen.find('.range-start:visible, .range-end:visible')
                            .hide(400, function () {
                                currentlyOpen.hide();
                                container.show(400);
                            });
                    } else {
                        currentlyOpen.hide(400, function () { container.show(400); });
                    }

                    return false;
                });
        }
    };

    $.DateRange.Single = function (text, highlight) { this.text = text; this.highlight = highlight; };
    $.DateRange.Range  = function (text, highlight) { this.text = text; this.highlight = highlight; };
    $.DateRange.Week   = function (text, highlight) { this.text = text; this.highlight = highlight; };
    $.DateRange.Month  = function (text, highlight) { this.text = text; this.highlight = highlight; };

    $.DateRange.Single.prototype = {
        render: function (parent, inputs, format, index) {
            var rangePicker = parent.parent('.ui-daterangepicker'),
                title = this.text,
                highlight = this.highlight,
                callback = function () {
                    var previousState = $.datepicker.state || '',
                        rangeStart = rangePicker.find('.range-start'),
                        show = function () {
                            var already_visible = rangePicker.find('.ranges').is(':visible');

                            rangePicker.find('.ranges').show();
                            if (previousState === 'month' && already_visible) {
                                rangeStart.find('.ui-datepicker-calendar').show('blind', 400);
                            }
                            rangeStart.show(400, function () {
                                rangeStart.find('.ui-datepicker-calendar').show(400);
                                rangePicker.find('button').fadeIn(400);
                            });
                            rangePicker.find('.range-end').hide(400);
                        };

                    $.datepicker.state = 'single';

                    rangeStart.find('.title-start').text(title);
                    setDate(rangeStart, parseDate(inputs.eq(1).val() || Date.today()));

                    rangePicker.find('button').data('behavior', function () {
                        rangePicker.find('.ui-state-highlight').removeClass('ui-state-highlight');
                        rangePicker.find('.ui-state-active').not('a').removeClass('ui-state-active')
                            .addClass('ui-state-highlight');

                        inputs.eq(1).val(rangeStart.datepicker('getDate').toString(format));
                        inputs.eq(2).val(rangeStart.datepicker('getDate').toString(format));
                        inputs.change();
                    });


                    if (rangePicker.find('div.ui-daterangepicker-group').is(':visible')) {
                        rangePicker.find('div.ui-daterangepicker-group:visible').hide(400, show);
                    } else {
                        show();
                    }
                    return false;
                };

            return buildDateRange(this.text, parent, callback, index, highlight);
        }
    };

    $.DateRange.Range.prototype = {
        render: function (parent, inputs, format, index) {
            var rangePicker = parent.parent('.ui-daterangepicker'),
                highlight = this.highlight,
                callback = function () {
                    var previousState = $.datepicker.state || '',
                        rangeStart = rangePicker.find('.range-start'),
                        rangeEnd   = rangePicker.find('.range-end'),
                        show = function () {
                            var already_visible = rangePicker.find('.ranges').is(':visible');
                            rangePicker.find('.ranges').show();
                            if (previousState === 'month' && already_visible) {
                                rangeStart.find('.ui-datepicker-calendar').show('blind', 400);
                            }
                            rangePicker.find('.range-start, .range-end').show(400, function () {
                                rangePicker.find('button').fadeIn(400);
                            });
                        };


                    $.datepicker.state = 'range';

                    rangeStart.find('.title-start').text(rangeStart.data('defaultTitle'));
                    rangeEnd.find('.title-end').text(rangeEnd.data('defaultTitle'));

                    setDate(rangeStart, parseDate(inputs.eq(1).val() || Date.today()));
                    setDate(rangeEnd, parseDate(inputs.eq(2).val() || Date.today()));

                    rangeStart.add(rangeEnd)
                        .datepicker('option', 'onSelect', function (selectedDate) {
                            setDate($(this), selectedDate);
                        });

                    rangePicker.find('button').data('behavior', function () {
                        rangePicker.find('.ui-state-highlight').removeClass('ui-state-highlight');
                        rangePicker.find('.ui-state-active').not('a').removeClass('ui-state-active')
                            .addClass('ui-state-highlight');

                        inputs.eq(1).val(rangeStart.datepicker('getDate').toString(format));
                        inputs.eq(2).val(rangeEnd.datepicker('getDate').toString(format));
                        inputs.eq(1).change();
                        inputs.eq(2).change();
                        inputs.eq(0).change();
                    });


                    if (rangePicker.find('div.ui-daterangepicker-group').is(':visible')) {
                        rangePicker.find('div.ui-daterangepicker-group:visible').hide(400); show();
                    } else {
                        show();
                    }
                    return false;
                };

            return buildDateRange(this.text, parent, callback, index, highlight);
        }
    };

    $.DateRange.Week.prototype = {
        render: function (parent, inputs, format, index) {
            var rangePicker = parent.parent('.ui-daterangepicker'),
                title = this.text,
                highlight = this.highlight,
                callback = function () {
                    var previousState = $.datepicker.state || '',
                        rangeStart = rangePicker.find('.range-start'),
                        show = function () {
                            var already_visible = rangePicker.find('.ranges').is(':visible');
                            rangePicker.find('.ranges').show();
                            if (previousState === 'month' && already_visible) {
                                rangeStart.find('.ui-datepicker-calendar').show('blind', 400);
                            }
                            rangeStart.show(400, function () {
                                rangeStart.find('.ui-datepicker-calendar').show(400);
                                rangePicker.find('button').fadeIn(400);
                            });
                            rangePicker.find('.range-end').hide(400);
                        };

                    $.datepicker.state = 'week';

                    rangeStart.find('.title-start').text(title);

                    setDate(rangeStart, parseDate(inputs.eq(1).val() || Date.today()));

                    rangePicker.find('button').data('behavior', function () {
                        var weekStart = rangeStart.datepicker('getDate'),
                            weekEnd = new Date(weekStart).add(6).days();

                        rangePicker.find('.ui-state-highlight').removeClass('ui-state-highlight');
                        rangePicker.find('.ui-state-active').not('a').removeClass('ui-state-active')
                            .addClass('ui-state-highlight');

                        inputs.eq(1).val(weekStart.toString(format));
                        inputs.eq(2).val(weekEnd.toString(format));
                        inputs.eq(1).change();
                        inputs.eq(2).change();
                        inputs.eq(0).val(weekStart.toString('yyyyMMdd') + ' 00:00:00');
                        inputs.eq(0).change();
                    });


                    if (rangePicker.find('div.ui-daterangepicker-group').is(':visible')) {
                        rangePicker.find('div.ui-daterangepicker-group:visible').hide(400, show);
                    } else {
                        show();
                    }
                    return true;
                };

            return buildDateRange(this.text, parent, callback, index, highlight);
        }
    };

    $.DateRange.Month.prototype = {
        render: function (parent, inputs, format, index) {
            var rangePicker = parent.parent('.ui-daterangepicker'),
                title = this.text,
                highlight = this.highlight,
                callback = function () {
                    var previousState = $.datepicker.state || '',
                        rangeStart = rangePicker.find('.range-start'),
                        show = function () {
                            var already_visible = rangePicker.find('.ranges').is(':visible');
                            if (!already_visible) {
                                rangePicker.find('.ranges').show();
                            }
                            rangeStart.show(400, function () {
                                if (previousState && previousState !== 'month' && already_visible) {
                                    rangeStart.find('.ui-datepicker-calendar').hide('blind', 400);
                                }
                                rangePicker.find('button').fadeIn(400);
                            });
                            rangePicker.find('.range-end').hide(400);
                        },
                        today = (parseDate(inputs.eq(1).val() || Date.today())).moveToFirstDayOfMonth();

                    $.datepicker.state = 'month';

                    rangeStart.find('.title-start').text(title);

                    setDate(rangeStart, today);

                    rangePicker.find('button').data('behavior', function () {
                        var month = rangeStart.find('.ui-datepicker-month :selected').val(),
                            year  = rangeStart.find('.ui-datepicker-year  :selected').val(),
                            monthStart,
                            monthEnd;

                        setDate(rangeStart, new Date(year, month, 1));
                        monthStart = rangeStart.datepicker('getDate');
                        monthEnd   = new Date(monthStart).moveToLastDayOfMonth();

                        rangePicker.find('.ui-state-highlight').removeClass('ui-state-highlight');
                        rangePicker.find('.ui-state-active').not('a').removeClass('ui-state-active')
                            .addClass('ui-state-highlight');

                        inputs.eq(1).val(monthStart.toString(format));
                        inputs.eq(2).val(monthEnd.toString(format));
                        inputs.change();
                        inputs.eq(0).val(monthStart.toString('yyyyMMdd') + ' 00:00:00');
                    });


                    if (rangePicker.find('div.ui-daterangepicker-group').is(':visible')) {
                        rangePicker.find('div.ui-daterangepicker-group:visible').hide(400, show);
                    } else {
                        show();
                    }

                    return true;
                };

            return buildDateRange(this.text, parent, callback, index, highlight);
        }
    };

    $.fn.dateRangePicker = function (target, options) {
        var inputs = $(this),
            mouseIn  = function () { $(this).addClass('ui-state-hover'); },
            mouseOut = function () { $(this).removeClass('ui-state-hover'); },
            datepickerOptions = { dateFormat: 'mm/dd/yy' },
            rangeStart,
            rangeEnd,
            rangePicker;

        target = $(target);

        options = $.extend({
            appendTo: 'body',
            dateFormat: 'MM/dd/yyyy',
            doneText: 'Done',
            rangeStartTitle: 'Start Date',
            rangeEndTitle: 'End Date',
            firstDayOfWeek: 5,
            ranges: [
                new $.DateRange('Today', 'today', 'today'),
                new $.DateRange('Last 7 Days', 'today - 7 days', 'today'),
                new $.DateRange('Last 4 Weeks', 'today - 4 weeks', 'today'),
                new $.DateRange('Month to Date', function () {
                    return Date.today().set({day: 1});
                }, 'today'),
                new $.DateRange('Year to Date',  function () {
                    return Date.today().set({month: 0, day: 1});
                }, 'today'),
                new $.DateRange('The Previous Month',
                    function () { return Date.last().month().set({day: 1});      },
                    function () { return Date.today().set({day: 1}).addDays(-1); })
            ],
            groups: [
                new $.DateRangeGroup('Months', [
                    new $.DateRange('January 2009',   '01/01/2009', '01/31/2009'),
                    new $.DateRange('February 2009',  '02/01/2009', '01/28/2009'),
                    new $.DateRange('March 2009',     '03/01/2009', '03/31/2009'),
                    new $.DateRange('April 2009',     '04/01/2009', '04/30/2009'),
                    new $.DateRange('May 2009',       '05/01/2009', '05/31/2009'),
                    new $.DateRange('June 2009',      '06/01/2009', '06/30/2009'),
                    new $.DateRange('July 2009',      '07/01/2009', '07/31/2009'),
                    new $.DateRange('August 2009',    '08/01/2009', '08/31/2009'),
                    new $.DateRange('September 2009', '09/01/2009', '09/30/2009'),
                    new $.DateRange('October 2009',   '10/01/2009', '10/31/2009'),
                    new $.DateRange('November 2009',  '11/01/2009', '11/30/2009'),
                    new $.DateRange('December 2009',  '12/01/2009', '12/31/2009')
                ])
            ],
            calendars: [
                new $.DateRange.Single('Specific Date'),
                new $.DateRange.Range('Date Range')
            ],
            onOpen:  function () { },
            onClose: function () { }
        }, options);


        $.datepicker.firstDayOfWeek = options.firstDayOfWeek;

        $.extend(datepickerOptions, options.datepickerOptions);

        rangeStart = $('<div class="range-start"><span class="title-start"></span></div>')
            .data('defaultTitle', options.rangeStartTitle)
            .datepicker(datepickerOptions)
            .hide();

        rangeEnd = $('<div class="range-end"><span class="title-end"></span></div>')
            .data('defaultTitle', options.rangeEndTitle)
            .hide()
            .datepicker(datepickerOptions);

        rangePicker = $('<div class="ui-daterangepicker ui-widget"></div>')
            .appendTo($(options.appendTo))
            .wrap('<div class="ui-daterangepickercontain"></div>')
            .data('state', 'show')
            .append(
                $('<div class="ranges ui-widget-header" />')
                    .addClass('ui-helper-clearfix')
                    .addClass('ui-corner-all')
                    .hide()
                    .append(rangeStart)
                    .append(rangeEnd)
                    .append(
                        $('<button class="btnDone">' + options.doneText + '</button>')
                            .addClass('ui-state-default')
                            .addClass('ui-corner-all')
                            .hover(mouseIn, mouseOut)
                            .data('behavior', function () { })
                            .click(function () { $(this).hide().data('behavior')(); })
                            .hide()
                    )
            )
            .hide();

        (function () {
            var list = $('<ul />')
                .addClass('ui-widget-content ui-helper-clearfix ui-corner-all')
                .prependTo(rangePicker);

            $.each([ options.ranges, options.groups, options.calendars ], function () {
                $.each(this, function (index) {
                    this.render(list, inputs, options.dateFormat, index);
                });
            });

            list.wrap('<div class="shrinkwrap" />');

            rangePicker.find('li, button')
                .hover(mouseIn, mouseOut)
                .click(function () {
                    if (this.nodeName === 'LI') {
                        $(this).closestByTagName('div')
                            .parent()
                            .find('.ui-state-active')
                            .not('a')
                            .not(this)
                            .removeClass('ui-state-active');
                    }
                });

            rangePicker.find('li.ui-daterangepicker-range, button')
                .click(function () {
                    rangePicker.children('div').not('.shrinkwrap').find('.range-start, .range-end').andSelf().hide();
                });

            rangePicker.find('li.ui-daterangepicker-group, li.ui-daterangepicker-calendar')
                .click(function () { $(this).addClass('ui-state-active'); });
        }());

        (function () {
            var view = new VisibilityController(rangePicker, options.onOpen, options.onClose);
            rangePicker.find('li.ui-daterangepicker-range, button').click(function () {
                view.hide(); return false;
            });
            $(target).unbind('click').click(function () {
                view.toggle($(this)); return false;
            });
            $(document).click().unbind('click').click(function (event) {
                if (view.is_visible() && !inputs.is(event.target)) { view.hide(); }
            });
            rangePicker.click(function () { return false; });
            rangePicker.find('.ui-datepicker-inline').show();
        }());

        return this;
    };
}(jQuery, this));

