﻿var bookingArrivalItem;
var bookingDepartureItem;
var allDays;
var allDaysArray;
var allDayDatesArray;

function BookingItem(date, item)
{
    this.date = date;
    this.item = item;
    
    this.setDate = function(date)
    {
        this.date = date;
    }
    
    this.setItem = function(item)
    {
        this.item = item;
    }
    
    this.getDate = function()
    {
        return this.date;
    }
    
    this.getItem = function()
    {
        return this.item;
    }
}

$(function()
{
    // Image browser
    $('#photoBox .photos img').click(function()
    {
        // Show the full-size version in the zoom box
        var url = new String($(this).attr('src'));
        var bigImageUrl = url.substring(0, url.indexOf('.jpg') - 1) + '3.jpg';
        $('#photoZoomImage').attr('src', bigImageUrl);
    });
    
    // Booking calendar
    allDays = $('#bookingCalendar div.bookingDay');
    allDaysArray = new Array(allDays.length);
    allDayDatesArray = new Array(allDays.length);
    for (var i = 0; i < allDays.length; i++)
    {
        allDaysArray[i] = $(allDays.get(i));
        allDayDatesArray[i] = Date.fromString(allDaysArray[i].attr('title'));    
    }
    allDays.click(function()
    {
        var item = $(this);
    
        // If the item is not bookable, do nothing
        if (item.hasClass('booked') || item.hasClass('booked_booked')) return;
        
        // Get clicked date
        var date = Date.fromString(item.attr('title'));
        if (date == false) alert('Could not parse date from string ' + item.attr('title'));
        var newItem = new BookingItem(date, item);
        
        // Determine arrival and departure dates and items
        var newArrivalItem = bookingArrivalItem;
        var newDepartureItem = bookingDepartureItem;
        if (newArrivalItem == undefined) newArrivalItem = newItem;
        else if (newDepartureItem == undefined) newDepartureItem = newItem;
        else if (bookingArrivalItem != undefined && newItem.getDate().getTime() == bookingArrivalItem.getDate().getTime()) newArrivalItem = undefined;
        else if (bookingDepartureItem != undefined && newItem.getDate().getTime() == bookingDepartureItem.getDate().getTime()) newDepartureItem = undefined;
        else newDepartureItem = newItem;
        
        // Make sure the items are in the right order
        if (newArrivalItem != undefined && newDepartureItem != undefined && newArrivalItem.getDate().getTime() > newDepartureItem.getDate().getTime())
        {
            var temp = newDepartureItem;
            newDepartureItem = newArrivalItem;
            newArrivalItem = temp;
        }

        var item, itemDate;
        if (newArrivalItem != undefined && newDepartureItem != undefined)
        {
            for (var i = 0; i < allDaysArray.length; i++)
            {
                item = allDaysArray[i];
                itemDate = allDayDatesArray[i];
                if (itemDate.getTime() >= newArrivalItem.getDate().getTime() && itemDate.getTime() <= newDepartureItem.getDate().getTime() && item.hasClass('booked'))
                {
                    newArrivalItem = newItem;
                    newDepartureItem = undefined;
                    break;
                }
            }
        }
        
        // Set item classes && summarize price
        var prevItem, nextItemm, price = 0;
        for (var i = 0; i < allDaysArray.length; i++)
        {
            item = allDaysArray[i];
            itemDate = allDayDatesArray[i];
            prevItem = i == 0 ? undefined : $(allDaysArray[i - 1]);
            nextItem = i == allDays.length - 1 ? undefined : $(allDaysArray[i + 1]);
        
            // Borders
            if (newArrivalItem != undefined && item.attr('title') == newArrivalItem.getDate().asString())
            {
                // Add price
                price += Number(item.attr('price'));
                        
                if (prevItem != undefined && prevItem.hasClass('booked'))
                    item.attr('class', 'bookingDay booked_booking');
                else if (prevItem != undefined && (prevItem.hasClass('bookable') || prevItem.hasClass('booking')))
                    item.attr('class', 'bookingDay bookable_booking');
                else
                    item.attr('class', 'bookingDay booking');
            }
            else if (newDepartureItem != undefined && item.attr('title') == newDepartureItem.getDate().asString())
            {
                // Add price
                price += Number(item.attr('price'));
            
                if (nextItem != undefined && nextItem.hasClass('booked'))
                    item.attr('class', 'bookingDay booking_booked');
                else if (nextItem != undefined && (nextItem.hasClass('bookable') || nextItem.hasClass('booking') ))
                    item.attr('class', 'bookingDay booking_bookable');
                else
                    item.attr('class', 'bookingDay booking');
            }
            // Middle
            else if (newArrivalItem != undefined && newDepartureItem != undefined && itemDate.getTime() > newArrivalItem.getDate().getTime() && itemDate.getTime() < newDepartureItem.getDate().getTime())
            {
                // Add price
                price += Number(item.attr('price'));
            
                item.attr('class', 'bookingDay booking');
            }
            // Others
            else if (!item.hasClass('booked') && !item.hasClass('booked_booked'))
            {
                if (nextItem != null && nextItem.hasClass('booked')) item.attr('class', 'bookingDay bookable_booked');
                else if (prevItem != null && prevItem.hasClass('booked')) item.attr('class', 'bookingDay booked_bookable');
                else item.attr('class', 'bookingDay bookable');
            }
        }
        
        // Save arrival and departure dates to global variables
        bookingArrivalItem = newArrivalItem;
        bookingDepartureItem = newDepartureItem;
    
        // Set price total
        $('#bookingPrice').text(price);
        
        // Set the contact forms field
        if (bookingArrivalItem != undefined)
            $('#contactArrival').attr('value', bookingArrivalItem.getDate().getDate() + '/' + (bookingArrivalItem.getDate().getMonth() == 0 ? 12 : bookingArrivalItem.getDate().getMonth()) + '/' + bookingArrivalItem.getDate().getFullYear());
        if (bookingDepartureItem != undefined)
            $('#contactDeparture').attr('value', bookingDepartureItem.getDate().getDate() + '/' + (bookingDepartureItem.getDate().getMonth() == 0 ? 12 : bookingDepartureItem.getDate().getMonth()) + '/' + bookingDepartureItem.getDate().getFullYear());
    });
    
    // Booking form
    $('#bookingForm form').submit(function()
    {
        var price = Number($('#bookingPrice').text());
        if (price < 300)
        {
            alert('We are sorry, booking for this apartement is limited to minimum 300 Euro');
            return false;
        }
        else return true;
    });
});
