/* Plugin for pricing calendar */
$.fn.pricingCalWidget = function (options) {

  var defaults = {
  }
  var opts = $.extend(defaults, options);


  return this.each(function () {

    var self = this;
    //var $self = $(this);
    
    var $matrixMonths               = $('div.rb-mm ul>li', self);
    var $matrixMonthDivWithCal      = $('div.rb-mm', self).not('.rb-mm-nocal');
    var $matrixValidDayCell         = $('div.matrix-cal table.calendar td.mc-valid', self);
    var $matrixEmptyFutureDayCell   = $('div.matrix-cal table.calendar td.mc-empty-future', self);
    var $matrixSummary              = $('div.matrix-summary', self);
    var $matrixIntro                = $('div.matrix-intro', self);
    var $matrixCalendars            = $('div.matrix-cal', self);
    var $noPricingDialog            = opts.noPricingDialog;
    
    var $mmCycle                    = $('div.rb-mm-cal-menu', self);
    var currentMMIndex              = 0;
    
    var calEnabled                  = ($matrixCalendars.length>0);

    
    function monthClick(event, autoClick) {
        
            var $month = $(this);
        
            // Get clicked month availability
            var clickedPrices = $month.attr('prices');
            if(!autoClick && clickedPrices == 0) {
                $noPricingDialog.dialog('open');
                return;
            }
            
            // Unselect any previously selected day
            $matrixValidDayCell.add($matrixEmptyFutureDayCell).removeClass('matrix-day-not-selected matrix-day-selected');
                        
            // Hide boxes
            $matrixSummary.hide();
            $matrixIntro.hide();
            
            // Set all months as unselected
            $matrixMonths.removeClass('rb-mm-selected');
            
            // Set style on selected month
            $month.addClass('rb-mm-selected');
            
            if(calEnabled)
            {                
                // Hide all calendars
                $matrixCalendars.hide();
             
                // Get clicked month
                var clickedMonth = $month.attr('month');
                
                // Show calendar for clicked month
                $('div.matrix-cal-'+clickedMonth, self).fadeIn('slow');
                
                // Show matrix-intro box
                $matrixIntro.show();
            }
    }
    
    function dayClick(e) {
        
        var $day = $(this);
        
        // Hide boxes
        $matrixSummary.hide();
        $matrixIntro.hide();
        
        // Remove selected style from all cells in current calendar
        // Give all cells not-selected style (eg: half opacity)
        $matrixValidDayCell.add($matrixEmptyFutureDayCell).removeClass('matrix-day-selected').addClass('matrix-day-not-selected');
        
        // Add selected style to clicked cell
        $day.addClass('matrix-day-selected');
        
        // Get destination fields
        var $matrixSummaryPrice = $matrixSummary.find('span.matrix-price');
        var $matrixSummaryDate  = $matrixSummary.find('span.matrix-date');
        
        // Get and set clicked price
        var clickedPrice = $day.find('span.mc-price').html();
        $matrixSummaryPrice.html(clickedPrice);
        
        // Get and set clicked date
        var clickedDate = $day.find('div.mc-day').attr('date');
        $matrixSummaryDate.text(clickedDate);
        
        $matrixSummary.fadeIn('slow');
    }
    
    function initMonths() {
        
        /* DEFINE MONTH EVENTS */
        
        $matrixMonths.bind('mouseover', function() {
            $(this).addClass('rb-mm-highlight');
        }).bind('mouseout', function() {
            $(this).removeClass('rb-mm-highlight');
        }).bind('click', monthClick);
        
    }
    
    function initCalendar() {
        
            /* DEFINE CALENDAR DAY CELL EVENTS */
            
            $('div.matrix-cal table td.mc-valid', self).bind('mouseover', function() {
                $(this).addClass('matrix-day-highlight');
            }).bind('mouseout', function() {
                $(this).removeClass('matrix-day-highlight');
            }).bind('click', dayClick);
        
            /* DEFINE CALENDAR NEXT LINK */ 
    
            $('div.matrix-cal a.calendar-next', self).not('.ui-state-disabled').bind('click', function() {
                
                // Get matrix summary box for current holiday package
                var nextMonth = $(this).closest('div.matrix-cal').attr('nextmonth');
        
                // Trigger click on next month
                var $nextMonth = $matrixMonths.filter("[month='"+nextMonth+"']").trigger('click', [true]);
                
                // Ensure months are on correct page
                var page = $nextMonth.closest('div.rb-mm-slide').attr('mmpage');
                if(page != currentMMIndex)
                {
                    $mmCycle.cycle(parseInt(page));
                }
        
                return false;
            });
            
            /* DEFINE CALENDAR PREV LINK */
            
            $('div.matrix-cal a.calendar-prev', self).not('.ui-state-disabled').bind('click', function() {
        
                // Get matrix summary box for current holiday package
                var prevMonth = $(this).closest('div.matrix-cal').attr('prevmonth');
        
                // Trigger click on previous month
                var $prevMonth = $matrixMonths.filter("[month='"+prevMonth+"']").trigger('click', [true]);
                
                // Ensure months are on correct page
                var page = $prevMonth.closest('div.rb-mm-slide').attr('mmpage');
                if(page != currentMMIndex)
                {
                    $mmCycle.cycle(parseInt(page));
                }
                
                return false;
            });
            
    }
    
    function initMonthPaging() {
        
            /* MONTHS MENU PAGING */

            var $mmNext = $('.mm-next', self);
            var $mmPrev = $('.mm-prev', self);
            
            $mmCycle.cycle({
                timeout: 0,
                fx: 'scrollHorz',
                next: $mmNext,
                prev: $mmPrev,
                nowrap: true,
                after: function (curr, next, opts) {
                    var index = opts.currSlide;
                    $mmPrev.css('visibility', (index == 0 ) ?  'hidden' : 'visible');
                    $mmNext.css('visibility', (index == opts.slideCount - 1 ) ? 'hidden' : 'visible');
                    currentMMIndex = index;
                }
            });
    
            // Select first month on matrix and ensure on right page
            var $firstMonth = $matrixMonthDivWithCal.find("li[prices='1']:first");
            var page = $firstMonth.closest('div.rb-mm-slide').attr('mmpage');
            if(page != currentMMIndex)
            {
                $mmCycle.cycle(parseInt(page));
            }
            $firstMonth.trigger('click', [true]);
            
    }
    
    
    function activate() {
      
        initMonths();
        
        if(calEnabled)
        {            
            initCalendar();
            initMonthPaging();
        }
            
    }

    activate();

  });

}

