var calendarWidget = {
    currencyCode: '',
    ajaxUrl: '/ajax/check-availability/id/',
    availableArrivalDate: null,
    ratesPeriods: null,
    ajaxRequest: {},
    currentShift: 0,
    startDateShift: 0,
    monthsCount: 3,
    afterShowPriceBlock: null,
    isDiscount: 0,

    chooseDate: function (obj) {
        var dateYmd = $('th:first', $(obj).parents('.calendar')).attr('rel') + '-' + $(obj).html();
        try {
            var date = $.datepicker.parseDate( 'yy-mm-d', dateYmd);
        }
        catch(err) {
            alert( lang('An error occurred. Try again later.') );
            return;
        }
        $('#arrival').datepicker('setDate', dateYmd);

        calendarWidget.checkAvailability (dateYmd, $('#duration').val() );
    },

    switchDuration: function(e){
        calendarWidget.checkAvailability ( $('#arrival').val(), $(e.target).val() );
    },

    stepFuture: function(e){
        e.preventDefault();
        calendarWidget.loadCalendar(1);
    },
    stepPast: function(e){
        e.preventDefault();
        calendarWidget.loadCalendar(-1);
    },

    loadCalendar: function(shift){
        calendarWidget.currentShift += shift;

        if (!empty($('#arrival').val()) && calendarWidget.currentShift == calendarWidget.startDateShift) {
            calendarWidget.checkAvailability($('#arrival').val(), $('#duration').val());
            return
        }

        calendarWidget.switchCalendar();
    },

    switchCalendar: function(){
        calendarWidget.showLoader();
        calendarWidget.hideErrors();

        var duration = calendarWidget.monthsCount;
        var shift = calendarWidget.currentShift*duration;
        var url = '/ajax/avail-calendar/id/'+propertyId;
        
        $.getJSON(url, {'shift': shift, 'arrival': $('#arrival').val(), 'd': duration}, function (data, status) {
            calendarWidget.hideLoader();
            if ( 'success' != status ) return;
            $('#calendarContainer').html( data.calendar );
            ratesPeriods = data.ratesPeriods;
            $('#calendarPanelContainer').css( 'display', '' );
        });
    },

    showLoader: function(){
        globalLoader.show();
        $('#availabilityButton').hide();
        $('#customBookingError, #bookedPeriod').hide();
    },

    hideLoader: function(){
        globalLoader.hide();
        $('#aLoader').hide();
        $('#availabilityButton').show();
    },

    doAvailabilityRequest: function(ajaxUrl, date, period, currency_code){
        typeof calendarWidget.ajaxRequest.abort === "function" && calendarWidget.ajaxRequest.abort();
        calendarWidget.ajaxRequest=$.ajax({url: ajaxUrl,
            type: 'GET',
            dataType: 'json',
            data: {
                'arrival': date,
                'duration': period,
                'd': calendarWidget.monthsCount,
                'currency': currency_code},
            success: function(d,s){
                calendarWidget.parseAvailResponse(d,s);
            },
            error: calendarWidget.handleAjaxError
        });
    },

    handleAjaxError: function(request, status, error){
        alert(lang('Error has occured. Try again later.'));
    },

    hideErrors: function(){
        $('.calendar-error', '#bookError').hide().removeClass('hidden');
//        $('.booking-error').slideUp();
    },

    showNearestMessage: function(data){
        $('#naArrival').html(data.arrivalText);
        $('#naArrivalContainer').slideDown();
    },
    
    showDurationMessage: function(data){
        $('#naDuration').html(data.period);
        $('#naDurationContainer').slideDown();
    },

    showOnRequestMessage: function(data){
        $('#onRequestContainer').show();
    },

    showCustomErrorMessage: function(data){
        $('#customBookingError').html(data.error.message).show();
    },

    hideLinks: function(){
      $('.bookNowLinkRef, .sendEnquiryLink', '#priceInfo').hide();
    },

    showPriceBlock: function(data){
        
        $('#bArrival').html( data.arrivalText);
        $('#bDeparture').html( data.departureText);
        $('#bPeriod').html( data.period);
        $('#selectionPrice').html( data.priceText );
        $('#discountPrice').html( data.discountPriceText );
        $('#priceInfo').removeClass('hidden').show();

        if(data.discount_price>0 && data.discount_price != data.price){
            $('#priceInfo').addClass('discount');
            calendarWidget.isDiscount = 1;
        }else{
            $('#priceInfo').removeClass('discount');
            calendarWidget.isDiscount = 0;
        }

        var bookNowLinks = $('.bookNowLinkRef');
        $('.sendEnquiryLink').show().removeClass('hidden');
        if(data.available == 1){
            //show booknow
            bookNowLinks.attr('href', '/book/index/id/'+propertyId+'/?a='+data.arrival+'&p='+ data.periodInDays);
            if(bookNowLinks.parents('.bookingPages').length == 0){
                bookNowLinks.show().removeClass('hidden');
            }
        }else{
            if(bookNowLinks.parents('.bookingPages').length == 0){
                $('.sendEnquiryLink').show().removeClass('hidden');
            }
            //hide booknow, show booknow error
            bookNowLinks.hide();
            calendarWidget.showOnRequestMessage(data);
        }
        
        if(typeof calendarWidget.afterShowPriceBlock === 'function'){
            calendarWidget.afterShowPriceBlock();
        }
    },

    parseAvailResponse: function(data, status){
        if ($('#tabsHolderInner').length != 0) {
            $('#tabsHolderInner').tabs().tabs('select',5);
        }

        calendarWidget.hideLoader();
        calendarWidget.hideErrors();
        calendarWidget.hideLinks();

        if(typeof data.error != 'undefined'){
            calendarWidget.showCustomErrorMessage(data);
            return;
        }

        if(data.periodFound == 0){
            //show period not found
            console.log('period not found');
            return;
        }

        calendarWidget.ratesPeriods = data.ratesPeriods;
        
        if (data.exact == 1) {
            //found exaxt match
        }else{
            if(data.nearest == 1){
                // start date not found
                calendarWidget.showNearestMessage(data);
            }else{
                // duration not matched
                calendarWidget.showDurationMessage(data);
            }
        }

        //apply start date
        $('#arrival').val(data.arrival);
        $('#duration').val(data.periodInDays);

        calendarWidget.showPriceBlock(data);
        
        $('select.calendar-duration').removeAttr('disabled');
        //set durations
        calendarWidget.setDurationsByStart(data.tArrival, data.periodInDays);
        calendarWidget.startDateShift = calendarWidget.currentShift;
        
        $('#calendarContainer').html( data.calendar);

        return;
    },

    setDurationsByStart: function(date, sPeriod){
        var list = [];
        for (var i = 0; i < calendarWidget.ratesPeriods.length; i++) {
            if (calendarWidget.ratesPeriods [i].tStart == date) {
                if(-1 == $.inArray(calendarWidget.ratesPeriods[i].length, list)){
                    list.push(calendarWidget.ratesPeriods[i].length);
                }
            }
        }
        var html = '';
        for (key in list) {
            var period = list [key];
            var selected = '';
            if(period == sPeriod){
                selected = ' selected="selected" ';
            }
            if(7 == period){
                html += '<option value="7"'+selected+'>1 '+ lang('week')+'</option>';
            }else{
                if(-1 != $.inArray(period, ['14', '21', '28'])){
                    html += '<option value="'+period+'"'+selected+'>'+((period)/7)+' '+ lang('weeks')+'</option>';
                }else{
                    html += '<option value="'+period+'"'+selected+'>'+period+' '+ lang('nights')+'</option>';
                }
            }
        }
        $('select.calendar-duration').html(html).val(sPeriod);
    },

    checkAvailability: function (dateYmd, period) {
        var ajaxUrl = calendarWidget.ajaxUrl + propertyId;
        if (empty (dateYmd)){
            return;
        }

        calendarWidget.hideErrors();
        calendarWidget.showLoader();
        calendarWidget.currentShift = 0;
        calendarWidget.doAvailabilityRequest(ajaxUrl, dateYmd, period, calendarWidget.currencyCode);
        
    },
    addHighLight: function(){
         $('.cD.startDate', '#calendarContainer').live('mouseover', function(){
            //hover
            var idx = $('.cD', '#calendarContainer').index(this);
            var duration = $('#duration').val() - 1;
            $(this).addClass('selected2');
            if(duration > 0){
                var unAvailIdx = $('.cD', '#calendarContainer').index($('.cD:gt('+idx+')', '#calendarContainer')
                    .filter(':not(.startDate)').filter(':not(.nonArrival):first'));
                if(Math.abs(unAvailIdx-idx)<duration && unAvailIdx != -1) {
                    duration = Math.abs(unAvailIdx - idx);
                }
                $('.cD:gt('+idx+')', '#calendarContainer').filter(':lt('+duration+')').addClass('selected2');
            }
        }).live('mouseout', function(){
            //out
            $('.cD.selected2', '#calendarContainer').removeClass('selected2');
        });
    },

    addSelectDate: function(){
        $('.cD.startDate','#calendarContainer').live('click', function (e){
            e.preventDefault();
            calendarWidget.chooseDate(this);
        });
    },

    addSwithcDuration: function(){
        $('.calendar-duration').change(calendarWidget.switchDuration);
    },

    reset: function(){
        $('#arrival').val(0);
        $('#duration').val(0);
        $('select.calendar-duration').val(0);
    },

    init: function(monthsCount){
        if(calendarWidget.currencyCode == ''){
            calendarWidget.currencyCode = currencyCode;
        }
        if(calendarWidget.currencySign == ''){
            calendarWidget.currencySign = currencySign;
        }
        calendarWidget.monthsCount = monthsCount;
        calendarWidget.addHighLight();
        calendarWidget.addSelectDate();
        calendarWidget.addSwithcDuration();
        $('select.calendar-duration').filter(function(){return ($(this).val() == 0);}).attr('disabled', 'disabled');
        $('.calendar-past').click(calendarWidget.stepPast);
        $('.calendar-future').click(calendarWidget.stepFuture);
    }
};



var datepickerWidget = {
    element: null,
    cache:{},
    ajax: null,

    beforeShowDay: function(date){
        var d = $.datepicker.formatDate('dd', date);
        var ym = $.datepicker.formatDate('yy-m', date);
        if(typeof datepickerWidget.cache[ym] !== 'undefined'
            && typeof datepickerWidget.cache[ym][d] !== 'undefined'){
            if(datepickerWidget.cache[ym][d] == 'u'){
                return [false, ''];
            }
            if(datepickerWidget.cache[ym][d] == 's'){
                return [true, ''];
            }
            if(datepickerWidget.cache[ym][d] == 'a'){
                return [false, 'ui-state-default-nonarival'];
            }
        }else{
            return [false, ''];
        }
    },

    onChangeMonthYear: function(y,m,inst){
        if(typeof datepickerWidget.cache[''+y+'-'+m] === 'undefined'
          || typeof datepickerWidget.cache[''+y+'-'+(m+1)] === 'undefined'){
            datepickerWidget.ajax = $.ajax({
                url:'/ajax/get-start-dates',
                data: {id: propertyId, year:y, month:m},
                success: datepickerWidget.onResponse,
                dataType: 'json'
            });
        }
    },

    onDateSelect: function(){
        calendarWidget.checkAvailability ($('#calTimestamp').val(), 0);
    },

    onResponse:function(data, status){
        datepickerWidget.cache = $.extend(true,datepickerWidget.cache, data.starts);

        datepickerWidget.element.datepicker('refresh');
    },

    addLegend: function(){
        if($('.datepicker-description', '#ui-datepicker-div').length == 0){
            $('#ui-datepicker-div').append('<div class="c">&nbsp;</div>').append($('.datepicker-description:first').clone());
        }
    },

    init: function(){
        datepickerWidget.element = $('#start_date');
        datepickerWidget.element.datepicker({dateFormat: "d M, yy",
            altField: '#calTimestamp', altFormat: 'yy-mm-dd',
            numberOfMonths:2,
            beforeShowDay:datepickerWidget.beforeShowDay,
            onChangeMonthYear:datepickerWidget.onChangeMonthYear,
            onSelect:datepickerWidget.onDateSelect
        });
        datepickerWidget.element.example(datepickerWidget.element.attr('title'));
        datepickerWidget.element.focus(datepickerWidget.addLegend);
        var da = new Date();
        datepickerWidget.onChangeMonthYear(da.getFullYear(), da.getMonth()+1, null);
        $('.calendar-link').click(function(e){e.preventDefault(); $('#start_date').datepicker('show');});
    }
};

var bubbleHtml = '<div class="bubble_placer" id="bubbleInfo"><div class="bubble_holder"><div class="bubble_bottom"><div class="bubble_inner">INNER</div></div></div><div class="bubble_shadow"></div></div>';

function showExtrasPopup () {
    $("#backShadow").show();
    fixPosition($(".extrasPopUp"));
    $(".extrasPopUp").show();
}

function saveExtras () {
    var checkedExtras = getCheckedExtras ();
    $('.butGradBlue', $('.extrasPopUp')).hide();
    globalLoader.show();
    $.post ('/book/extras-save/id/'+propertyId, {'extras[]': checkedExtras}, function (data, status) {
        if (status == 'success' && data.error == 0) {
            $('.bookingDetails').replaceWith (data.detailsHtml);
            $('.butGradBlue', $('.extrasPopUp')).show();
            $('.extrasPopUp').hide();
            globalLoader.hide();
            $("#backShadow").hide();
        }
    }, 'json');
}

function getCheckedExtras () {
    var checkedExtras = [];
    $('.extrasPopUp:first input[type=checkbox]:checked').each (function () {
        if (!$(this).attr ('disabled')) {
            checkedExtras.push ($(this).attr ('id'));
        }
    });
    
    return checkedExtras;
}

function setAsDefaultPhoto (photo_id) {
    var url = '/owner/property/default-image/id/'+propertyId;
    $.get (url, {'image_id':photo_id}, function (data, status) {
        if (status == 'success') {
            //$('#defaultLinkContainer'+photo_id).html( 'Primary photo');
            $('#mainPhotoBadge').remove ();
            var badge = '<span class="mainPhoto" id="mainPhotoBadge"><img alt="Main Photo" src="/images/i/mainphoto.gif"/></span>';
            $('#imageContainer'+photo_id).html( badge + $('#imageContainer'+photo_id).html( ));
        }
    },
    'html');
}

function talkToOwner(id, key){
    var text = jQuery.trim( $('#talk-respond').val() );
    if( '' ==  text ) { 
        alert(lang('Please type your reply'));
        $('#talk-respond').focus();
        return false;
    }
    $('#talk-respond, #talk-submit').attr('disabled', 1);
    $('#ajax-loader-talk-to-owner').show();
    var url = '/property/enquiry-guest-reply';
    $.getJSON(url, {'id':id, 'key':key, 'text': text}, function (data) {
        if( !data || !data.ok || !data.html ) return alert(lang('An error occurred. Try again later.'));
        $('.enquiryMessage:last').before(data.html);
        $('#ajax-loader-talk-to-owner').fadeOut('fast');
        $('#talk-respond, #talk-submit').attr('disabled', 0);
        $('#talk-respond').val('');
    });
}

var Enquiry = {
    showForm: function(isBasic) {
        if( !empty($('#arrival').val()) && !empty($('#duration').val())) {
            $('#start_alt').val($('#arrival').val());
            $('#start').datepicker('setDate',  $.datepicker.parseDate( 'yy-mm-dd', $('#arrival').val() ) );
            $('#stay_period').val( $('#duration').val() );
        }
        if( !$('#tabsHolderInner').length) {
            return true;
        }
        $('#tabsHolderInner').tabs().tabs('select', isBasic ? 6 : 7);
        return false;
    }
};

