$(function(){
    product.init();
});

var product = {
    init: function(){
        product.addEventHandlers();
        $('a.lightbox').lightBox({fixedNavigation:true});
    },
    addToBasket: function(){
        if (validateDates())
        {
        serializedData = $('#order_form').serialize();
        date_from = $('#datepicker_from').val();
        date_to = $('#datepicker_to').val();
 
        $.ajax({url: $('#add_to_basket').attr('href'),
                dataType: 'json',
                data: serializedData + '&date_from=' + date_from + '&date_to=' + date_to,
                success: function(response)
                {
                    $(response.selected).each(function(key, value)
                    {
                        if($('#product_line_'+value).length > 0)
                        {
                            $('#product_line_'+value).replaceWith('In Basket');
                        }
                    });
                    
                    $('#basket_summary span').html(response.count);   
                }
        });
        }
        else
        {
            return false;
        }
    },
    addEventHandlers: function(){
        $('#add_to_basket').click(function(e){
            e.preventDefault();
            product.addToBasket();
        });

        $('#order_form').submit(function(e){
            e.preventDefault();
            product.addToBasket();
        });
    }
}

function rentalPeriodSelected()
{
    period = $('input:radio:checked').val();

    // Get all the WEEKLY line prices, in order
    itemPrices = Array();
    $("td.line_item_week_price").each(function() 
    {
        var $this = $(this);
        itemPrices.push($this.text());
    });

    // Date range?
    if (period == 'date_range')
    {
        $("#datepicker_container").slideDown();
        
        // Change column heading
        $("#period_heading").html('Rate');
        
        var exploded_from = $("#datepicker_from").val().split('/');
        var exploded_to = $("#datepicker_to").val().split('/');

        from_date = new Date();
        to_date = new Date();

        from_date.setFullYear(exploded_from[2], exploded_from[1] -1, exploded_from[0]);
        to_date.setFullYear(exploded_to[2], exploded_to[1] -1, exploded_to[0]);
        
        days = calcDays(from_date, to_date);
        weekDays = calcBusinessDays(from_date, to_date);
        
        count = 0;
        $("td.line_rate").each(function()
        {
            weeklyRate = itemPrices[count];
            rate = getRateByDateRange(days, weekDays, weeklyRate);
            var $this = $(this);
            $this.html('&pound;'+rate.toFixed(2));
            count++;
        });

        count = 0;
        $("input[id*='line_price_update']").each(function()
        {
            weeklyRate = itemPrices[count];
            rate = getRateByDateRange(days, weekDays, weeklyRate);

            var $this = $(this);
            $this.val(rate.toFixed(2));
            count++;
        });
 
    }
    else
    {
        $("#datepicker_container").slideUp();
        
        // Change column heading
        $("#period_heading").html(period+' Rate');
    
        // Update line rates using above
        count = 0;
        $("td.line_rate").each(function() 
        { 
            var $this = $(this);
            $this.html('&pound;'+calculatePrice(period, itemPrices[count]));
            count++;
        });

        count = 0;
        $("input[id*='line_price_update']").each(function()
        { 
            var $this = $(this);
            $this.val(calculatePrice(period, itemPrices[count]));
            count++;
        });        

    }
}


function calculatePrice(period, weeklyRate)
{
    weeklyRate = parseFloat(weeklyRate);

    if (period == 'week')    
    {      
        return weeklyRate.toFixed(2);
    }
    else if (period == 'weekend')
    {
        weekendRate = getRateByDays(2, weeklyRate);
        return weekendRate.toFixed(2);
    }
    else if (period == 'day')
    {
        dailyRate = getRateByDays(1, weeklyRate)
        return dailyRate.toFixed(2);
    }
}

function getRateByDateRange(days, weekDays, weeklyRate)
{
    if (weekDays == 1)
    {
        return weeklyRate * 0.50
    }
    else if (weekDays == 2)
    {
        return weeklyRate * 0.60
    }
    else if (weekDays == 3)
    {
        return weeklyRate * 0.80
    }
    else if (weekDays == 4)
    {
        return weeklyRate * 1
    }
    else if (weekDays == 5)
    {
        return weeklyRate * 1
    }
    else
    {
        return Math.abs((0.2 * weekDays) * weeklyRate);
    }
}

function getRateByDays(days, weeklyRate)
{  

    if (days == 1)
    {
        return weeklyRate * 0.50
    } 
    else if (days == 2)
    {
        return weeklyRate * 0.60
    }
    else
    {
        multiplier = 0.60 + ((days -2) * 0.20);
        return weeklyRate * (multiplier.toFixed(2));
    }
}

function validateDates()
{
    period = $('input:radio:checked').val();

    if (period = 'date_range')
    {
        var exploded_from = $("#datepicker_from").val().split('/');
        var exploded_to = $("#datepicker_to").val().split('/');
 
        from_date = new Date();
        to_date = new Date();

        from_date.setFullYear(exploded_from[2], exploded_from[1] -1, exploded_from[0]);
        to_date.setFullYear(exploded_to[2], exploded_to[1] -1, exploded_to[0]);

        if (to_date < from_date)
        {
            alert('ERROR: To date is greater than from date. Product not added to basket');
            return false;
        }

    }
    return true;
    
}

function calcBusinessDays(dDate1, dDate2) // input given as Date objects
{
  var iWeeks, iDateDiff, iAdjust = 0;

  if (dDate2 < dDate1) return -1;                 // error code if dates transposed

  var iWeekday1 = dDate1.getDay();                // day of week
  var iWeekday2 = dDate2.getDay();

  iWeekday1 = (iWeekday1 == 0) ? 7 : iWeekday1;   // change Sunday from 0 to 7
  iWeekday2 = (iWeekday2 == 0) ? 7 : iWeekday2;

  if ((iWeekday1 > 5) && (iWeekday2 > 5)) iAdjust = 1;  // adjustment if both days on weekend

  iWeekday1 = (iWeekday1 > 5) ? 5 : iWeekday1;    // only count weekdays
  iWeekday2 = (iWeekday2 > 5) ? 5 : iWeekday2;

  // calculate differnece in weeks (1000mS * 60sec * 60min * 24hrs * 7 days = 604800000)
  iWeeks = Math.floor((dDate2.getTime() - dDate1.getTime()) / 604800000)

  if (iWeekday1 <= iWeekday2) {
    iDateDiff = (iWeeks * 5) + (iWeekday2 - iWeekday1)
  } else {
    iDateDiff = ((iWeeks + 1) * 5) - (iWeekday1 - iWeekday2)
  }

  iDateDiff -= iAdjust                            // take into account both days on weekend

  return (iDateDiff + 1);                         // add 1 because dates are inclusive
}

function calcDays(dDate1, dDate2) // input given as Date objects
{
  var oneDay = 24*60*60*1000;
  var diffDays = Math.abs((dDate1.getTime() - dDate2.getTime())/(oneDay));
  return diffDays + 1;
}


