﻿Array.prototype.remove = function(s) {
	this.splice($.inArray(s, this), 1);
};

// Create NetR namespace if it doesn't exist
if (typeof (NetR) === 'undefined') {
	var NetR = {};
};

NetR.BookingSearch = function() {
    var self = this;
    $('input[id*=season]').click(function() {
        self.seasonUpdated(false);
    });
    $('#duration').change(function() {
        if (self.currentSeason() == 'G') {
            self.updateDepartures();
        }
    });
    $('#adults').change(function() {
        if (self.currentSeason() == 'G') {
            self.updateDepartures();
        }
    });
    /* Language specific initialization of the datepicker */
    $("#departure-date-real").datepicker({
        dateFormat: 'yy-mm-dd',
        defaultDate: +0,
        firstDay: 1,
        dayNamesMin: [_('su'), _('mo'), _('tu'), _('we'), _('th'), _('fr'), _('sa')],
        monthNames: [_('january'), _('february'), _('march'), _('april'), _('may'), _('june'), _('july'), _('august'), _('september'), _('october'), _('november'), _('december')],
        monthNamesShort: [_('jan'), _('feb'), _('mar'), _('apr'), _('may'), _('jun'), _('jul'), _('aug'), _('sep'), _('oct'), _('nov'), _('dec')],
        currentText: _('today'),
        clearText: _('clear'),
        closeText: _('close'),
        prevText: _('earlier'),
        nextText: _('later'),
        buttonText: _('calendar'),
        yearRange: '-0:+5',
        showOtherMonths: false,
        buttonImage: '/i/icon-calendar.gif',
        buttonImageOnly: true,
        showOn: 'button',
        onSelect: self.updateDepartureDate,
        beforeShowDay: self.selectableDate
    });
    /* Remove the js-off class from the element containing the columns */
    $("div.control-group.js-off").removeClass('js-off');
    /* Hide the buttons and the heading that are needed when JS is off */
    $(".js-off").css({ display: 'none', visibility: 'hidden' });
    this.prepareDate();
    this.prepareDestination();
    this.seasonUpdated(true);
};

NetR.BookingSearch.prototype = {
    seasonChanged: [],
    addSpinner: function(parentId) {
        var parentElement = document.getElementById(parentId);
        var spinnerId = parentId + '-spinner';
        if ($('#' + parentId + '~img').length == 0) {
            var spinner = document.createElement('img');
            spinner.setAttribute('id', spinnerId);
            spinner.setAttribute('class', 'spinner');
            spinner.setAttribute('alt', _('loading'));
            spinner.setAttribute('src', '/i/ajax-loader.gif');
            parentElement.parentNode.appendChild(spinner);
        }
    },
    seasonUpdated: function(load) {
        var self = this;
        var currentSeason = $('input[id*=season]:checked').val();
        // Hide 3 weeks from all but Guadelope duration menus
        //		$("#duration option[value='3']").remove();
        // Show 3 weeks on Guadelope
        //		if (self.currentSeason() == "G") {
        //			$("#duration").append("<option value=\"3\">3<\/option>");
        //		} else {
        //			$("#duration option[value='3']").remove();
        //		}
        var currentDestination = $('#destination').val();
        self.seasonChanged = [];
        if (!load || document.location.search.indexOf('duration') == -1) {
            if (currentSeason == 'G') {
                $('#duration').val('2');
            } else {
                $('#duration').val('1');
            }
        }
        self.addSpinner('destination');
        $.post('/ajax/destinations.aspx', { season: currentSeason, destination: currentDestination }, function(data) {
            $('#destination').replaceWith(data);
            //			var destination = $('destination');
            //			var options = $('destination options');
            //			if ($("#destination option[value='" + currentDestination + "']") != null) {
            //				destination.val(currentDestination);
            //			} else if (options.length > 0) {
            //				destination.val = options[0].val();
            //			}

            self.prepareDestination();
            self.removeSpinner('destination');
            self.seasonChanged.push('destination');
            self.updateDeparturesFromSeason();
        });

        self.addSpinner('departure-date');
        $.post('/ajax/departuredates.aspx', { season: currentSeason }, function(data) {
            $('#departure-date').replaceWith(data);
            self.prepareDate();
            self.removeSpinner('departure-date');
            self.seasonChanged.push('date');
            self.updateDeparturesFromSeason();
        });
    },
    removeSpinner: function(parentId) {
        $('#' + parentId + '~img').remove();
    },
    prepareDestination: function() {
        var self = this;
        $('#destination').change(function() {
            self.setTripLengths(false);
            self.updateDepartures();
        });
    },
    prepareDate: function() {
        var self = this;
        self.setTripLengths(false);
        $("#departure-date").change(function() {
            $("#departure-date-real").val($(this).val());
            if ($("#duration option[value=1]").length == 0) {
                $("#duration").prepend("<option value=\"1\">1<\/option>");
            }
            self.setTripLengths(true);
        });
    },
    setTripLengths: function(updateDepartures) {
        var destination = $('#destination').val();

        if (this.currentSeason() == 'G') {
            var duration = $("#duration").val();
            $("#duration option[value=1]").remove();
            if ($("#duration option[value=2]").length == 0) {
                $("#duration").append("<option value=\"2\">2<\/option>");
            }
            $("#duration").val(duration);
            if (updateDepartures) {
                this.updateDepartures();
            }
        }
        else {
            if ($('#duration option[value=1]').length == 0) {
                $("#duration").prepend("<option value=\"1\">1<\/option>");
            }
            if ($('#duration option[value=2]').length == 0) {
                $("#duration").append("<option value=\"2\">2<\/option>");
            }
            if (destination == 'ALMIRIDA KASTRUP') {
                $('#duration option[value=2]').remove();
            }
        }
    },
    updateDeparturesFromSeason: function() {
        if (this.seasonChanged.length >= 2) {
            this.updateDepartures();
        }
    },
    updateDepartures: function() {
        var self = this;
        self.addSpinner('departure-from');
        var currentSeason = $('input[id*=season]:checked').val();
        var currentDestination = $('#destination').val();
        var currentDeparture = $('#departure-from').val() || $('#default-departure').val();
        var currentDate = $('#departure-date').val();
        var currentDuration = $('#duration').val();
        var currentLang = $('html').attr("lang");
        var currentTravellers = $('#adults').val();
        if (currentDestination && currentDestination.length > 0) {
            $.post('/ajax/departures.aspx',
				{
				    season: currentSeason,
				    destination: currentDestination,
				    date: currentDate,
				    duration: currentDuration,
				    lang: currentLang,
				    adults: currentTravellers,
				    'departure-from': $('#default-departure').val()
				},
				function(data) {
				    $('#departure-from').replaceWith(data);
				    //					$('#departure-from').change(function() {
				    //						self.updateDepartureInfo(this);
				    //					});
				    $('#departure-from').val(currentDeparture);
				    self.removeSpinner('departure-from');
				    //					if (self.currentSeason() == 'G') {
				    //						// Update the departure list to enable correct, current help text
				    //						$('#departure-from').trigger("change");
				    //					} else {
				    //						if (document.getElementById("departure-info")) {
				    //							$("#departure-info").hide().empty();
				    //						}
				    //					}
				}
			);
        } else {
            $('#departure-from').val('');
        }
        //		self.updateDepartureInfo($('#departure-from'));
    },
    /*	updateDepartureInfo: function(elm) {
    var self = this;
    if (self.currentSeason() == 'G') {
    var validInfo = $('option:selected', elm).val();
    var info = validInfo ? $('option[title]:selected', elm).attr("title") : _('choose_destination');
    if (document.getElementById("departure-info")) {
    $("#departure-info").show().html(info);
    } else {
    $(elm).parent().after('<div id="departure-info">' + info + '</div>');
    }
    } else {
    if (document.getElementById("departure-info")) {
    $("#departure-info").hide().empty();
    }
    }
    }, */
    updateDepartureDate: function(date) {
        $.datepicker.hideDatepicker();
        $('#departure-date').val(date);
        if (bookingSearch.currentSeason() == 'G') {
            bookingSearch.updateDepartures();
        }
    },
    selectableDate: function(date) {
        var y = date.getFullYear();
        var m = date.getMonth() + 1;
        var d = date.getDate();
        if (m < 10) m = '0' + m;
        if (d < 10) d = '0' + d;
        var dateStr = y + "-" + m + "-" + d;
        return [$('#departure-date').containsOption(dateStr), ''];
    },
    currentSeason: function() {
        return $('input[id*=season]:checked').val();
    }
};

$(document).ready(function() {
	bookingSearch = new NetR.BookingSearch();
});
