/*
 * jCal calendar multi-day and multi-month datepicker plugin for jQuery
 *	version 0.3.6
 * Author: Jim Palmer
 * Released under MIT license.
 */
(function ($) {
    $.fn.jCal = function (opt) {
        $.jCal(this, opt);
    };
    $.jCal = function (target, opt) {
        opt = $.extend({
            day: new Date(),
            // date to drive first cal
            days: 4,
            // default number of days user can select
            showMonths: 1,
            // how many side-by-side months to show
            monthSelect: false,
            // show selectable month and year ranges via animated comboboxen
            dCheck: function (day) {
                return true;
            },
            // handler for checking if single date is valid or not
            callback: function (day, days) {
                return true;
            },
            // callback function for click on date
            selectedBG: 'rgb(0, 143, 214)',
            // default bgcolor for selected date cell
            defaultBG: 'rgb(255, 255, 255)',
            // default bgcolor for unselected date cell
            dayOffset: 0,
            // 0=week start with sunday, 1=week starts with monday
            forceWeek: false,
            // true=force selection at start of week, false=select days out from selected day
            dow: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
            // days of week - change this to reflect your dayOffset
            ml: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
            ms: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
            _target: target // target DOM element - no need to set extend this variable
        }, opt);
        opt.day = new Date(opt.day.getFullYear(), opt.day.getMonth(), 1);
        if (!$(opt._target).data('days')) $(opt._target).data('days', opt.days);
        $(target).stop().empty();
        for (var sm = 0; sm < opt.showMonths; sm++)
        $(target).append('<div class="jCalMo"></div>');
        opt.cID = 'c' + $('.jCalMo').length;
        $('.jCalMo', target).each( function (ind) {
            drawCalControl($(this), $.extend({}, opt, {
                'ind': ind,
                'day': new Date(new Date(opt.day.getTime()).setMonth(new Date(opt.day.getTime()).getMonth() + ind))
            }));
            drawCal($(this), $.extend({}, opt, {
                'ind': ind,
                'day': new Date(new Date(opt.day.getTime()).setMonth(new Date(opt.day.getTime()).getMonth() + ind))
            }));
        });
        if ($(opt._target).data('day') && $(opt._target).data('days')) reSelectDates(target, $(opt._target).data('day'), $(opt._target).data('days'), opt);
    };

    function drawCalControl(target, opt) {
        $(target).append('<div class="jCal">' + ((opt.ind == 0) ? '<div class="left" />' : '') + '<div class="month">' + '<span class="monthYear">' + opt.day.getFullYear() + '</span>' + '<span class="monthName">' + opt.ml[opt.day.getMonth()] + '</span>' + '</div>' + ((opt.ind == (opt.showMonths - 1)) ? '<div class="right" />' : '') + '</div>');
        if (opt.monthSelect) $(target).find('.jCal .monthName, .jCal .monthYear').bind('mouseover', $.extend({}, opt), function (e) {
            $(this).removeClass('monthYearHover').removeClass('monthNameHover');
            if ($('.jCalMask', e.data._target).length == 0) $(this).addClass($(this).attr('class') + 'Hover');
        }).bind('mouseout', function () {
            $(this).removeClass('monthYearHover').removeClass('monthNameHover');
        }).bind('click', $.extend({}, opt), function (e) {
            $('.jCalMo .monthSelector, .jCalMo .monthSelectorShadow').remove();
            var monthName = $(this).hasClass('monthName'),
                pad = Math.max(parseInt($(this).css('padding-left')), parseInt($(this).css('padding-left'))) || 2,
                calcTop = (($(this).offset()).top - ((monthName ? e.data.day.getMonth() : 2) * ($(this).height() + 0)));
            calcTop = calcTop > 0 ? calcTop : 0;
            var topDiff = ($(this).offset()).top - calcTop;
            $('<div class="monthSelectorShadow" style="' + 'top:' + $(e.data._target).offset().top + 'px; ' + 'left:' + $(e.data._target).offset().left + 'px; ' + 'width:' + ($(e.data._target).width() + (parseInt($(e.data._target).css('paddingLeft')) || 0) + (parseInt($(e.data._target).css('paddingRight')) || 0)) + 'px; ' + 'height:' + ($(e.data._target).height() + (parseInt($(e.data._target).css('paddingTop')) || 0) + (parseInt($(e.data._target).css('paddingBottom')) || 0)) + 'px;">' + '</div>').css('opacity', 0.01).appendTo($(this).parent());
            $('<div class="monthSelector" style="' + 'top:' + calcTop + 'px; ' + 'left:' + (($(this).offset()).left) + 'px; ' + 'width:' + ($(this).width() + (pad * 2)) + 'px;">' + '</div>').css('opacity', 0).appendTo($(this).parent());
            for (var di = (monthName ? 0 : -2), dd = (monthName ? 12 : 3); di < dd; di++)
            $(this).clone().removeClass('monthYearHover').removeClass('monthNameHover').addClass('monthSelect').attr('id', monthName ? (di + 1) + '_1_' + e.data.day.getFullYear() : (e.data.day.getMonth() + 1) + '_1_' + (e.data.day.getFullYear() + di)).html(monthName ? e.data.ml[di] : (e.data.day.getFullYear() + di)).css('top', ($(this).height() * di)).appendTo($(this).parent().find('.monthSelector'));
            var moSel = $(this).parent().find('.monthSelector').get(0),
                diffOff = $(moSel).height() - ($(moSel).height() - topDiff);
            $(moSel).css('clip', 'rect(' + diffOff + 'px ' + ($(this).width() + (pad * 2)) + 'px ' + diffOff + 'px 0px)').animate({
                'opacity': .92,
                'clip': 'rect(0px ' + ($(this).width() + (pad * 2)) + 'px ' + $(moSel).height() + 'px 0px)'
            }, 'fast', function () {
                $(this).parent().find('.monthSelectorShadow').bind('mouseover click', function () {
                    $(this).parent().find('.monthSelector').remove();
                    $(this).remove();
                });                               
            }).parent().find('.monthSelectorShadow').animate({
                'opacity': .1
            }, 'fast');
            $('.jCalMo .monthSelect', e.data._target).bind('mouseover mouseout click', $.extend({}, e.data), function (e) {
                if (e.type == 'click') $(e.data._target).jCal($.extend(e.data, {
                    day: new Date($(this).attr('id').replace(/_/g, '/'))
                }));
                else $(this).toggleClass('monthSelectHover');
            });
        });
        $(target).find('.jCal .left').bind('click', $.extend({}, opt), function (e) {
            if ($('.jCalMask', e.data._target).length > 0) return false;
            var mD = {
                w: 0,
                h: 0
            };
            $('.jCalMo', e.data._target).each(function () {
                mD.w += $(this).width() + parseInt($(this).css('padding-left')) + parseInt($(this).css('padding-right'));
                var cH = $(this).height() + parseInt($(this).css('padding-top')) + parseInt($(this).css('padding-bottom'));
                mD.h = ((cH > mD.h) ? cH : mD.h);
            });
            $(e.data._target).prepend('<div class="jCalMo"></div>');
            e.data.day = new Date($('div[id*=' + e.data.cID + 'd_]:first', e.data._target).attr('id').replace(e.data.cID + 'd_', '').replace(/_/g, '/'));
            e.data.day.setDate(1);
            e.data.day.setMonth(e.data.day.getMonth() - 1);
            drawCalControl($('.jCalMo:first', e.data._target), e.data);
            drawCal($('.jCalMo:first', e.data._target), e.data);
            if (e.data.showMonths > 1) {
                $('.right', e.data._target).clone(true).appendTo($('.jCalMo:eq(1) .jCal', e.data._target));
                $('.left:last, .right:last', e.data._target).remove();
            }
            $(e.data._target).append('<div class="jCalSpace" style="width:' + mD.w + 'px; height:' + mD.h + 'px;"></div>');
            $('.jCalMo', e.data._target).wrapAll('<div class="jCalMask" style="clip:rect(0px ' + mD.w + 'px ' + mD.h + 'px 0px); width:' + (mD.w + (mD.w / e.data.showMonths)) + 'px; height:' + mD.h + 'px;">' + '<div class="jCalMove"></div>' + '</div>');
            $('.jCalMove', e.data._target).css('margin-left', ((mD.w / e.data.showMonths) * -1) + 'px').css('opacity', 0.5).animate({
                marginLeft: '0px'
            }, 'fast', function () {
                $(this).children('.jCalMo:not(:last)').appendTo($(e.data._target));
                $('.jCalSpace, .jCalMask', e.data._target).empty().remove();
                if ($(e.data._target).data('day')) reSelectDates(e.data._target, $(e.data._target).data('day'), $(e.data._target).data('days'), e.data);
            });
        });
        $(target).find('.jCal .right').bind('click', $.extend({}, opt), function (e) {
            if ($('.jCalMask', e.data._target).length > 0) return false;
            var mD = {
                w: 0,
                h: 0
            };
            $('.jCalMo', e.data._target).each(function () {
                mD.w += $(this).width() + parseInt($(this).css('padding-left')) + parseInt($(this).css('padding-right'));
                var cH = $(this).height() + parseInt($(this).css('padding-top')) + parseInt($(this).css('padding-bottom'));
                mD.h = ((cH > mD.h) ? cH : mD.h);
            });
            $(e.data._target).append('<div class="jCalMo"></div>');
            e.data.day = new Date($('div[id^=' + e.data.cID + 'd_]:last', e.data._target).attr('id').replace(e.data.cID + 'd_', '').replace(/_/g, '/'));
            e.data.day.setDate(1);
            e.data.day.setMonth(e.data.day.getMonth() + 1);
            drawCalControl($('.jCalMo:last', e.data._target), e.data);
            drawCal($('.jCalMo:last', e.data._target), e.data);
            if (e.data.showMonths > 1) {
                $('.left', e.data._target).clone(true).prependTo($('.jCalMo:eq(1) .jCal', e.data._target));
                $('.left:first, .right:first', e.data._target).remove();
            }
            $(e.data._target).append('<div class="jCalSpace" style="width:' + mD.w + 'px; height:' + mD.h + 'px;"></div>');
            $('.jCalMo', e.data._target).wrapAll('<div class="jCalMask" style="clip:rect(0px ' + mD.w + 'px ' + mD.h + 'px 0px); width:' + (mD.w + (mD.w / e.data.showMonths)) + 'px; height:' + mD.h + 'px;">' + '<div class="jCalMove"></div>' + '</div>');
            $('.jCalMove', e.data._target).css('opacity', 0.5).animate({
                marginLeft: ((mD.w / e.data.showMonths) * -1) + 'px'
            }, 'fast', function () {
                $(this).children('.jCalMo:not(:first)').appendTo($(e.data._target));
                $('.jCalSpace, .jCalMask', e.data._target).empty().remove();
                if ($(e.data._target).data('day')) reSelectDates(e.data._target, $(e.data._target).data('day'), $(e.data._target).data('days'), e.data);
                $(this).children('.jCalMo:not(:first)').removeClass('');
            });
        });
        $('.jCal', target).each(

        function () {
            var width = $(this).parent().width() - ($('.left', this).width() || 0) - ($('.right', this).width() || 0);
            $('.month', this).css('width', width).find('.monthName, .monthYear').css('width', ((width / 2) - 4));
        });
        $(window).load(

        function () {
            $('.jCal', target).each(

            function () {
                var width = $(this).parent().width() - ($('.left', this).width() || 0) - ($('.right', this).width() || 0);
                $('.month', this).css('width', width).find('.monthName, .monthYear').css('width', ((width / 2) - 4));
            });
        });
    };

    function reSelectDates(target, day, days, opt) {
        var fDay = new Date(day.getTime());
        var sDay = new Date(day.getTime());
        for (var fC = false, di = 0, dC = days+1; di < dC; di++) {
            var dF = $(target).find('div[id*=d_' + (sDay.getMonth() + 1) + '_' + sDay.getDate() + '_' + sDay.getFullYear() + ']');            
            if (dF.length > 0) {
                // prepare before redraw
                dF.stop();
                // remove selectedDay invday crossess
                unNegateClass(dF, 'selectedDay_r_on_b');
                unNegateClass(dF, 'selectedDay_b_on_r');
                if($(dF).hasClass('selectedDay_r_on_b')) {
                    $(dF).removeClass('selectedDay_r_on_b');
                    $(dF).addClass('invday_end');
                }    
                if($(dF).hasClass('selectedDay_b_on_r')) {
                    $(dF).removeClass('selectedDay_b_on_r');
                    $(dF).addClass('invday_start');
                }

                // unmess oranjes
                unNegateClass(dF, 'selectedDay_b_on_o');
                unNegateClass(dF, 'selectedDay_o_on_b');
                $(dF).removeClass('selectedDay_b_on_o');
                $(dF).removeClass('selectedDay_o_on_b');
                unNegateClass(dF, 'partialDay_o_on_r');
                unNegateClass(dF, 'partialDay_r_on_o');
                unNegateClass(dF, 'partialDay_start');
                unNegateClass(dF, 'partialDay_end');
                unNegateClass(dF, 'partialDay');

                // now redraw selected
                if(di == 0) {
                    if($(dF).hasClass('invday_end') || $(dF).hasClass('partialDay_r_on_o')) {
                        $(dF).addClass('selectedDay_r_on_b');
                        $(dF).removeClass('invday_end');                    
                    } else if($(dF).hasClass('partialDay') || $(dF).hasClass('partialDay_end')) {
                        $(dF).addClass('selectedDay_o_on_b');
                    } else {                        
                        $(dF).addClass('selectedDay_start');
                    }                    
                } else if (di == dC - 1) {
                    if($(dF).hasClass('invday_start') || $(dF).hasClass('partialDay_o_on_r')) {
                        $(dF).addClass('selectedDay_b_on_r');
                        $(dF).removeClass('invday_start');
                    } else if($(dF).hasClass('partialDay') || $(dF).hasClass('partialDay_start')) {
                        $(dF).addClass('selectedDay_b_on_o');
                    } else {
                        $(dF).addClass('selectedDay_end');
                    }
                } else {
                    $(dF).addClass('selectedDay');    
                }
                
                negateClass(dF, 'partialDay')
                negateClass(dF, 'partialDay_o_on_r');
                negateClass(dF, 'partialDay_r_on_o');
                negateClass(dF, 'partialDay_start');
                negateClass(dF, 'partialDay_end');
                negateClass(dF, 'partialDay');
                
                fC = true;
            }
            sDay.setDate(sDay.getDate() + 1);
        }
        if (fC && typeof opt.callback == 'function') opt.callback(day, days);
    };

    function drawCal(target, opt) {
        for (var ds = 0, length = opt.dow.length; ds < length; ds++)
        $(target).append('<div class="dow">' + opt.dow[ds] + '</div>');
        var fd = new Date(new Date(opt.day.getTime()).setDate(1));
        var ldlm = new Date(new Date(fd.getTime()).setDate(0));
        var ld = new Date(new Date(new Date(fd.getTime()).setMonth(fd.getMonth() + 1)).setDate(0));
        var copt = {
            fd: fd.getDay(),
            lld: ldlm.getDate(),
            ld: ld.getDate()
        };
        var offsetDayStart = ((copt.fd < opt.dayOffset) ? (opt.dayOffset - 7) : 1);
        var offsetDayEnd = ((ld.getDay() < opt.dayOffset) ? (7 - ld.getDay()) : ld.getDay());
        for (var d = offsetDayStart, dE = (copt.fd + copt.ld + (7 - offsetDayEnd)); d < dE; d++)
        $(target).append(((d <= (copt.fd - opt.dayOffset)) ? 
                '<div id="' + opt.cID + 'd' + d + '" class="pday">'  + (copt.lld - ((copt.fd - opt.dayOffset) - d)) + '</div>' 
            : (
                (d > ((copt.fd - opt.dayOffset) + copt.ld)) ? 
                    '<div id="' + opt.cID + 'd' + d + '" class="aday">' + (d - ((copt.fd - opt.dayOffset) + copt.ld)) + '</div>' 
                : '<div id="' + opt.cID + 'd_' + (fd.getMonth() + 1) + '_' + (d - (copt.fd - opt.dayOffset)) + '_' + fd.getFullYear() + '" class="' + (opt.dCheck(new Date((new Date(fd.getTime())).setDate(d - (copt.fd - opt.dayOffset))))) + '">' + (d - (copt.fd - opt.dayOffset)) + '</div>')
                )
            );
        $(target).find('div[id^=' + opt.cID + 'd]:first, div[id^=' + opt.cID + 'd]:nth-child(7n+2)').before('<br style="clear:both; font-size:0.1em;" />');
        $(target).find('div[id^=' + opt.cID + 'd_]:not(.invday)').bind("mouseover mouseout click", $.extend({}, opt), function (e) {
            if ($('.jCalMask', e.data._target).length > 0) return false;

            var osDate = new Date($(this).attr('id').replace(/c[0-9]{1,}d_([0-9]{1,2})_([0-9]{1,2})_([0-9]{4})/, '$1/$2/$3'));
            if (e.data.forceWeek) osDate.setDate(osDate.getDate() + (e.data.dayOffset - osDate.getDay()));
            var sDate = new Date(osDate.getTime());
            
            // blokove cisteni 
            if (e.type == 'click') {
                var elems = $('div[id*=d_]', e.data._target);
                $.each(elems, function(index, value){
                    $(value).stop()
                    .removeClass('selectedDay').removeClass('selectedDay_start').removeClass('selectedDay_end')                
                    .removeClass('selectedDay_hidden').removeClass('selectedDay_start_hidden').removeClass('selectedDay_end_hidden')
                    .removeClass('overDay').removeClass('overDay_start').removeClass('overDay_end')
                    .removeClass('overDay_r_on_b').removeClass('overDay_b_on_r')                    
                    .removeClass('overDay_b_on_o').removeClass('overDay_o_on_b')
                    .removeClass('overDay_lb_on_db').removeClass('overDay_db_on_lb')
                    .css('backgroundColor', '');

                    unNegateClass(value, 'selectedDay_r_on_b');
                    unNegateClass(value, 'selectedDay_b_on_r');
                    if($(value).hasClass('selectedDay_r_on_b')) {
                        $(value).removeClass('selectedDay_r_on_b');
                        $(value).addClass('invday_end');
                    }
                    
                    if($(value).hasClass('selectedDay_b_on_r')) {
                        $(value).removeClass('selectedDay_b_on_r');
                        $(value).addClass('invday_start');
                    }
                    
                    // mess with oranjes :-)
                    unNegateClass(value, 'selectedDay_b_on_o');
                    unNegateClass(value, 'selectedDay_o_on_b');
                    $(value).removeClass('selectedDay_b_on_o');
                    $(value).removeClass('selectedDay_o_on_b');
                    unNegateClass(value, 'partialDay_o_on_r');
                    unNegateClass(value, 'partialDay_r_on_o');
                    unNegateClass(value, 'partialDay_start');
                    unNegateClass(value, 'partialDay_end');
                    unNegateClass(value, 'partialDay');
                    
                });
            }            
            var ok = 1;            
            // hleda jestli jsou volne dny u konce druheho mesice
            for (var di = 0, ds = $(e.data._target).data('days')+1; di < ds; di++) {
                var currDay = $(e.data._target).find('#' + e.data.cID + 'd_' + (sDate.getMonth() + 1) + '_' + sDate.getDate() + '_' + sDate.getFullYear());
                if (currDay.length == 0) {
                    ok = 0;
                    break;
                }
                sDate.setDate(sDate.getDate() + 1);
            }
            if (ok) {   
                var testForPartial = false;            
                var sDate = new Date(osDate.getTime());  
                var getOut = false;
                var justHadStart = false;          
                for (var di = 0, ds = $(e.data._target).data('days') + 1; di < ds; di++) {
                    var currDay = $(e.data._target).find('#' + e.data.cID + 'd_' + (sDate.getMonth() + 1) + '_' + sDate.getDate() + '_' + sDate.getFullYear());
                    // fix one-night case
                    if($(currDay).hasClass('invday_start') || $(currDay).hasClass('invday_start_hidden')
                        || $(currDay).hasClass('selectedDay_b_on_r') || $(currDay).hasClass('selectedDay_b_on_r_hidden')) {
                        justHadStart = true;
                    }
                    if (currDay.length == 0) {
                        break;
                    }                    
                    if($(currDay).hasClass('invday')) {
                        justHadStart = false;
                        break;
                    }
                    if(($(currDay).hasClass('invday_end') || $(currDay).hasClass('invday_end_hidden')
                        || $(currDay).hasClass('selectedDay_r_on_b') || $(currDay).hasClass('selectedDay_r_on_b_hidden')) && justHadStart) {
                        justHadStart = false;
                        break;    
                    } 
                    // hledame zda neni klikano na "invday_start", "selectedDay_b_on_r" a neni to prvni vec na testovani
                    if(di == 0 && ($(currDay).hasClass('invday_start') || $(currDay).hasClass('selectedDay_b_on_r'))) {
                        getOut = true;
                        break;
                    }                     
                    if (e.type == 'mouseover') {
                        var invday_start_detected = false;
                        if($(currDay).hasClass('invday_start') || $(currDay).hasClass('selectedDay_b_on_r')) {
                            $(currDay).addClass('overDay_b_on_r');
                            invday_start_detected = true;       
                        }
                        if (di == 0) {                                                                           
                            // special case on start: invday                            
                            if($(currDay).hasClass('invday_end') || $(currDay).hasClass('selectedDay_r_on_b') || $(currDay).hasClass('partialDay_r_on_o')) {                                
                                $(currDay).addClass('overDay_r_on_b');
                            } else if($(currDay).hasClass('partialDay') || $(currDay).hasClass('partialDay_end') || $(currDay).hasClass('selectedDay_o_on_b')) {       
                                $(currDay).addClass('overDay_o_on_b');
                            } else {
                                if($(currDay).hasClass('selectedDay') || $(currDay).hasClass('selectedDay_end') || $(currDay).hasClass('selectedDay_b_on_o')) {
                                    $(currDay).addClass('overDay_lb_on_db');
                                } else {
                                    $(currDay).addClass('overDay_start');
                                }
                            }
                        } else if(di == ds-1) {
                            // special case on end: invday
                            if(!invday_start_detected) {
                                if($(currDay).hasClass('partialDay') || $(currDay).hasClass('partialDay_start') || $(currDay).hasClass('selectedDay_b_on_o')) {
                                    $(currDay).addClass('overDay_b_on_o');            
                                } else {
                                    if($(currDay).hasClass('selectedDay') || $(currDay).hasClass('selectedDay_start') || $(currDay).hasClass('selectedDay_o_on_b')) {
                                        $(currDay).addClass('overDay_db_on_lb');
                                    } else {
                                        $(currDay).addClass('overDay_end');
                                    }
                                }
                            }                                                     
                        } else {
                            $(currDay).addClass('overDay');
                        }
                        // remove possible selected classes
                        negateClass(currDay, 'selectedDay');
                        negateClass(currDay, 'selectedDay_start');
                        negateClass(currDay, 'selectedDay_end');
                        negateClass(currDay, 'selectedDay_r_on_b');
                        negateClass(currDay, 'selectedDay_b_on_r');
                        negateClass(currDay, 'selectedDay_o_on_b');
                        negateClass(currDay, 'selectedDay_b_on_o');
                        negateClass(currDay, 'invday_start');
                        negateClass(currDay, 'invday_end');
                        negateClass(currDay, 'partialDay_start');
                        negateClass(currDay, 'partialDay_end');
                        negateClass(currDay, 'partialDay');
                        negateClass(currDay, 'partialDay_o_on_r');
                        negateClass(currDay, 'partialDay_r_on_o');
                    }
                    else if (e.type == 'mouseout') {
                        $(currDay).stop().removeClass('overDay')
                        .removeClass('overDay_start').removeClass('overDay_end')                        
                        .removeClass('overDay_r_on_b').removeClass('overDay_b_on_r')
                        .removeClass('overDay_o_on_b').removeClass('overDay_b_on_o')
                        .removeClass('overDay_db_on_lb').removeClass('overDay_lb_on_db')
                        .css('backgroundColor', '');
                        // return back possible selected classes
                        unNegateClass(currDay, 'selectedDay');
                        unNegateClass(currDay, 'selectedDay_start');
                        unNegateClass(currDay, 'selectedDay_end');
                        unNegateClass(currDay, 'selectedDay_r_on_b'); 
                        unNegateClass(currDay, 'selectedDay_b_on_r');
                        unNegateClass(currDay, 'selectedDay_o_on_b');
                        unNegateClass(currDay, 'selectedDay_b_on_o');
                        
                        // do NOT unnegate partials if selectedDay is detected! otherwise it will get very messy :-)
                        if(!($(currDay).hasClass('selectedDay') || $(currDay).hasClass('selectedDay_start') || $(currDay).hasClass('selectedDay_end')
                            || $(currDay).hasClass('selectedDay_r_on_b') || $(currDay).hasClass('selectedDay_b_on_r')
                            || $(currDay).hasClass('selectedDay_o_on_b') || $(currDay).hasClass('selectedDay_b_on_o') )) {
                        
                            unNegateClass(currDay, 'partialDay_start');
                            unNegateClass(currDay, 'partialDay_end');
                            unNegateClass(currDay, 'partialDay');
                            unNegateClass(currDay, 'partialDay_o_on_r');
                            unNegateClass(currDay, 'partialDay_r_on_o');
                        }
                        unNegateClass(currDay, 'invday_start');
                        unNegateClass(currDay, 'invday_end');
                          
                    }
                    else if (e.type == 'click' && currDay.length == 1) {                        
                        $(currDay).stop();
                        $(currDay).removeClass('selectedDay').removeClass('selectedDay_start').removeClass('selectedDay_end')
                        .removeClass('selectedDay_r_on_b').removeClass('selectedDay_b_on_r')
                        .removeClass('selectedDay_o_on_b').removeClass('selectedDay_b_on_o');                        
                        
                        var invday_start_detected = false;
                        if($(currDay).hasClass('invday_start') || $(currDay).hasClass('invday_start_hidden')) {
                            $(currDay).addClass('selectedDay_b_on_r');
                            $(currDay).removeClass('invday_start');
                            $(currDay).removeClass('invday_start_hidden');
                            invday_start_detected = true;       
                        }
                        if(di == 0) {
                            if($(currDay).hasClass('invday_end_hidden') || $(currDay).hasClass('invday_end') || $(currDay).hasClass('partialDay_r_on_o')) {
                                $(currDay).addClass('selectedDay_r_on_b');
                                $(currDay).removeClass('invday_end_hidden');                                                                
                                $(currDay).removeClass('invday_end');
                            } else if($(currDay).hasClass('partialDay') || $(currDay).hasClass('partialDay_o_on_r') || $(currDay).hasClass('partialDay_end')) {
                                $(currDay).addClass('selectedDay_o_on_b'); 
                            } else {
                                $(currDay).addClass('selectedDay_start');                                    
                            }                            
                        } else if (di == ds - 1) {
                            if(!invday_start_detected) {
                                if($(currDay).hasClass('partialDay') || $(currDay).hasClass('partialDay_start')) {
                                    $(currDay).addClass('selectedDay_b_on_o');            
                                } else {
                                    $(currDay).addClass('selectedDay_end');
                                }
                            }                            
                        } else {
                            $(currDay).addClass('selectedDay');    
                        }
                        
                        if($(currDay).hasClass('partialDay') || $(currDay).hasClass('partialDay_start') || $(currDay).hasClass('partialDay_r_on_o')) {
                            testForPartial = true;
                        }
                        
                        negateClass(currDay, 'partialDay');
                        negateClass(currDay, 'partialDay_o_on_r');
                        negateClass(currDay, 'partialDay_r_on_o');
                        negateClass(currDay, 'partialDay_start');
                        negateClass(currDay, 'partialDay_end');                                                
                    }
                    sDate.setDate(sDate.getDate() + 1);
                }
                
                
                if (e.type == 'click') {
                    if(testForPartial) {
                        if($(opt.triggerPane + ':visible').length == 0) {
                            $(opt.triggerPane).fadeIn(400);
                        }
                    } else {
                        if($(opt.triggerPane + ':visible').length) {
                            $(opt.triggerPane).fadeOut(400);
                        }
                    }
                }
                
                if (e.type == 'click' && !getOut) {
                    e.data.day = osDate;
                    e.data.callback(osDate, di-1);
                    $(e.data._target).data('day', e.data.day).data('days', di-1);
                }
            } else {
                if(e.type == 'click') {
                    $('.jCal .right').trigger('click');
                }
            }
        });
    };
    
    function negateClass(elem, className) {
        if($(elem).hasClass(className)) {
            $(elem).removeClass(className);
            $(elem).addClass(className + '_hidden');
        }        
    }
    
    function unNegateClass(elem, className) {
        if($(elem).hasClass(className + '_hidden')) {
            $(elem).removeClass(className + '_hidden');
            $(elem).addClass(className);    
        }    
    }
    
})(jQuery);
