﻿
var cals = 12;
var calendars = {};
calendars.array = [];
var visibleCalendars = [];

function cellRendered(cell) {
    if (cell.date != null) {
        cell.onclick = function() { dateClicked(this) };
    }
}

function dateClicked(cell) {
    
}

function addCalendars(month, year, count) {
    var c = null;
    var loopMonth = month;
    var loopYear = year;
    var div = $get('calendars');
    for (var i = 1; i <= count; i++) {

        c = new Calendar(loopMonth, loopYear, 'cal' + i);
        c.add_dateRendered(cellRendered);
        c.hasPrices = false;
        c.hasAvailability = false;
        c.render(div,false);
        calendars[loopYear + '-' + loopMonth] = c;
        calendars.array[calendars.array.length] = c;
        loopMonth++;
        if (loopMonth > 12) { loopMonth = 1; loopYear++; }
    }
}

function pageLoad() {
    
    addCalendars(currentMonth, currentYear, calNumber);

    currentCalendar = calendars[year + '-' + month];
    renderCalendars(month, year, 2);
    
    //fetchAvailability(month, year,2);

    $addHandler($get('previousMonth'), 'click', getPreviousCalendar);
    $addHandler($get('nextMonth'), 'click', getNextCalendar);
    $addHandler($get('main_body_ddlDuration'), 'change', changeDuration);

    $get('main_body_ddlDuration').value = duration.toString();

}

function pageUnload() {
    $clearHandlers($get('previousMonth'));
    $clearHandlers($get('nextMonth'));
    $clearHandlers($get('main_body_ddlDuration'));
}

function changeDuration(ev) {
    var ddl = ev.target;
    var nights = ddl.options[ddl.selectedIndex].value;

    for (var i = 0; i < calendars.array.length; i++)
        calendars.array[i].hasAvailability = false;
        
    var calendar = visibleCalendars[0];
    var month = visibleCalendars[0].get_month();
    var year = visibleCalendars[0].get_year();

    fetchAvailability(month, year, 2);
    
}

function renderCalendars(month, year, count) {

    var fetchMonth = null;
    var fetchYear = null;
    var fetchCount = 0;

    for (var i = 0; i < count; i++) {
        var calendar = calendars[year + '-' + month];

        if (!calendar) {
            addCalendars(month, year, 1);
            calendar = calendars[year + '-' + month];
        }
        // check if we already have availability
        if (calendar.hasAvailability == false) {
            if (!fetchMonth) {
                fetchMonth = month;
                fetchYear = year;
            }
            fetchCount++;
                
        }
        
        calendar.show();
        visibleCalendars[i] = calendar;

        var month = calendar.get_month();
        var year = calendar.get_year();

        month++;
        if (month > 12) {
            month = 1;
            year++;
        }
    }

    if (fetchCount)
        fetchAvailability(fetchMonth, fetchYear, fetchCount);
    else
        drawAvailability();

}

function renderBookingDates() {

    for (var i = 0; i < visibleCalendars.length; i++) {

        var date = 1;
        var div = $get('bookingList');

        while (visibleCalendars[i][date]) {

            if (visibleCalendars[i][date].availability.AvailableForDuration < 2) {
                var link = document.createElement('p');
                link.innerHTML = 'Book for ' + visibleCalendars[i][date].availability.Date + ' ' + visibleCalendars[i][date].availability.Price.Amount;
                div.appendChild(link);
            }
            date++;
        }
    }

}

function getPreviousCalendar(sender) {

    removeOptions();
    var calendar = visibleCalendars[0];
    var d = new Date();
    var year = calendar.get_year();
    var month = calendar.get_month();

    if (year > d.getFullYear() || (year == d.getFullYear() && d.getMonth() < (month - 1)))
    {

        for (var i = 0; i < calendars.array.length; i++)
            calendars.array[i].hide();

            var year = calendar.get_year();
        var month = calendar.get_month();
            month--;
            if (month < 1) {
                month = 12;
                year--;
            }
            renderCalendars(month, year, 2);
    }
}

function getNextCalendar(sender) {
    removeOptions();
    for (var i = 0; i < calendars.array.length; i++)
        calendars.array[i].hide();

    var calendar = visibleCalendars[0];
    var month = calendar.get_month();
    var year = calendar.get_year();

    month++;
    if (month > 12) {
        month = 1;
        year++;

    }
    renderCalendars(month, year, 2);
}

function fetchAvailability(month, year, count) {
    $get('wait').style.display = 'block';
    var startDate = new Date(Date.UTC(year, month - 1, 1));
    // go back 1 day to get last day of previous month's availability
    startDate.setDate(startDate.getDate() - 1);
    
    var lastMonth = month + count;
    var lastYear = year;
    if (lastMonth > 12) { lastMonth -= 12; lastYear++; }

    var endDate = new Date(Date.UTC(lastYear, lastMonth - 1, 1));
    endDate.setDate(endDate.getDate() - 1);

    var ddl = $get('main_body_ddlDuration');
    var duration = ddl.options[ddl.selectedIndex].value;

    Sunhat.Web.ClientService.Service.GetAvailability(stockID, startDate, endDate, parseInt(duration), availGetSuccess, availGetFail);
}

function availGetSuccess(results, context) {

    var prevAvailability = results[0];
    
    for (var i = 1; i < results.length; i++) {
        var availability = results[i];
        var date = availability.Date;
        var year = date.getUTCFullYear();
        var month = date.getUTCMonth() + 1;
        var day = date.getUTCDate();

        if (day == 1)
            calendars[year + '-' + month].prevAvailability = prevAvailability;

        calendars[year + '-' + month].hasAvailability = true;
        calendars[year + '-' + month][day].availability = availability;
        prevAvailability = availability;
    }

    drawAvailability();
    $get('wait').style.display = 'none';
}

function availGetFail(err) {
    $get('wait').style.display = 'none';
}

function drawAvailability() {

    for (var i = 0; i < visibleCalendars.length; i++) {
        var cal = visibleCalendars[i];

        var prevAvailability = cal.prevAvailability;
        var j = 1;
        var today = new Date();
        while (d = cal[j]) {
            var a = d.availability;

            var date = a.Date;

            if (date < today) {
                d.className += ' key-past';
                d.onclick = null;
            }
            else {
                switch (a.AvailableForDate) {
                    case 0:
                        d.className = 'key-av';
                        break;
                    case 1:
                        d.className = 'key-av';
                        break;
                    case 2:
                        d.className = 'key-un';
                        break;
                    case 3:
                        d.className = 'key-op';
                        break;
                }
                if (prevAvailability != null) {
                    switch (prevAvailability.AvailableForDate) {
                        case 0:
                            d.className += ' key-av-prev';
                            break;
                        case 1:
                            d.className += ' key-av-prev';
                            break;
                        case 2:
                            d.className += ' key-un-prev';
                            break;
                        case 3:
                            d.className += ' key-op-prev';
                            break;
                    }
                }
                prevAvailability = a;

                if (d.availability.AvailableForDuration < 2 && d.availability.BookableByRules) {
                    d.date = date;
                    d.className += ' bookable';
                    d.onclick = showOptions;
                    d.setAttribute('title', 'You can book this date. Click for options.');
                }
                else {
                    $(d).removeClass('bookable');
                    d.onclick = null;
                    d.setAttribute('title', '');
                }
            }
            j++;
        }
    }

}

function showOptions(event) {
    var evt = window.event ? window.event : event;
    var target = evt.srcElement ? evt.srcElement : evt.target;
    $('#main_modals_bookingOverlay_ddlDuration')[0].value = $('#main_body_ddlDuration')[0].value;
    $('#main_modals_bookingOverlay_bookdate')[0].value = target.date.format('dd/MM/yyyy');
    $('#overlay').show(); $('#booknow').show(); $('#pw').hide();
    checkAvailability();
}
/*
function showOptions(event) {
    var evt = window.event ? window.event : event;

    var x = evt.pageX || evt.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
    var y = evt.pageY || evt.clientY + document.body.scrollTop + document.documentElement.scrollTop;

    var target = evt.srcElement ? evt.srcElement : evt.target;

    removeOptions();

    div = document.createElement('div');
    div.style.top = y + 'px';
    div.style.left = x + 'px';
    div.calendarCell = target;
    div.innerHTML = '<img src="/images/wait.gif" /><div>Loading Prices...</div>'
    div.id = 'enquiryDiv';

    document.body.appendChild(div);

    var ddl = $get('main_body_ddlDuration');
    var duration = ddl.options[ddl.selectedIndex].value;
    
    Sunhat.Web.ClientService.Service.GetStockPriceSummary(stockID, target.date, parseInt(duration), priceGetSuccess, availGetFail); 
}
*/

function priceGetSuccess(result) {
    var div = document.getElementById('enquiryDiv');

    var priceValue = parseFloat(result.Price.substring(1));
    
    div.innerHTML = '<h5>' + result.Name + '</h5><p><strong>' + result.Date + '</strong> for <strong>' + result.Duration + '</strong> nights</p>';
    if (result.Bookable) {
        if (priceValue != 0)
            div.innerHTML += '<p class="price">' + result.Price + '</p>';
        else
            div.innerHTML += '<p><strong>No pricing currently</strong></p><p>Please call +44(0)1522 889450';

        var ul = '<ul>';

        if (priceValue != 0)
            ul += '<li><a href="https://www.sun-hat-villas.com/booking.aspx?step=1&amp;b=' + result.BookingHash + '">Book now</a></li>';
        ul += '<li><a href="#" onclick="addToShortlist(this,' + result.ID + ');">Add property to shortlist<a/></li>';
        ul += '<li><a href="/contact.aspx?pid=' + result.ID + '&amp;dd=' + escape(result.Date) + '&amp;du=' + result.Duration + '">Enquire about this date/duration</a></li>';

        ul += '</ul>';
        div.innerHTML += ul;
    }
    else
        div.innerHTML += '<p class="price">Sorry, you cannot book for this date/duration</p>';
    
}

function removeOptions() {
    var div = document.getElementById('enquiryDiv');
    if (div != null)
        document.body.removeChild(div);
}
