/*global jQuery, IAD, Cookie, document, Date, getParameter, dcsMultiTrack, alert
*/

// Initialize IAD and IAD.travel namespaces
var IAD = IAD || {};
IAD.travel = IAD.travel || {};



IAD.travel.air_search_form = function ($) {
    var info, text, urls;

    var form = {
        initialize: function (data) {
            info = data.info;
            text = data.text;
            urls = data.urls;
            if (! this.is_part_of_search_box()) {
                this.populate_with_default_values();
            }
            if (this.datepickers_are_missing()) {
                IAD.travel.datepickers.initialize(info);
            }
            this.setup_oneway_or_roundtrip_flight_form_toggling();
            this.setup_child_age_dropdowns_toggling();
            this.setup_form_validation();
            this.setup_location_autocompletion();
            this.add_wt_tracking();
            this.setup_new_search_button_if_any();
            this.set_default_focus();
        }
    };

    form.is_part_of_search_box = function () {
        return $("#search-tabs #air-search").length > 0;
    };

    form.datepickers_are_missing = function () {
        return $("#air-search img.datepicker_trigger").length === 0;
    };

    function my(field) {
        return $("#air-search ." + field); // shortcut to get fields within my form only
    }

    function load_cookie() {
        //Remove expired cookie before loading a new one
        var expCookie = new Cookie(document, "reise", 2400, "/");
        expCookie.remove();
        
        var cookie = new Cookie(document, "travel", 2400, "/");
        cookie.load();
        return cookie;
    }

    function is_roundtrip_flight() {
        return my("roundTrip").attr("checked");
    }

    function to_date(string) {
        return Date.parseString(string, info.date_format);
    }

    function selected_departure_date() {
        return to_date(my('depDate').val());
    }

    function selected_return_date() {
        return to_date(my('retDate').val());
    }

    function today() {
        var today = new Date();
        today.setHours(0);
        today.setMinutes(0);
        today.setSeconds(0);
        today.setMilliseconds(0);
        return today;
    }

    function departure_date_is_set() {
        return selected_departure_date() instanceof Date;
    }

    function return_date_is_set() {
        return selected_return_date() instanceof Date;
    }

    function departure_date_is_in_the_future() {
        return selected_departure_date() >= today();
    }

    function dates_are_in_chronological_order() {
        return selected_return_date() >= selected_departure_date();
    }

    function children_age_dropdowns() {
        return $("#childrens-ages:visible select:visible");
    }

    form.set_default_focus = function () {
        var new_air_search_link = $("#new-air-search-link:visible");
        if (info.no_focus != "true") {
            if (new_air_search_link.length > 0) {
                new_air_search_link.focus();
            } else {
                $("#from-field input:text:visible").focus();
            }
        }
    };

    form.setup_new_search_button_if_any = (function () {
        function show_search_form() {
            $("#new-air-search-link").hide();
            $("#searchdetails").hide();
            $("#new-air-search-form").show();
            form.set_default_focus();
            return false;
        }

        return function () {
            $("#new-air-search-link").click(show_search_form);
        };
    }());

    form.store_cookie = function () {
        function this_value() {
            return $(this).val();
        }

        function childrens_ages() {
            return children_age_dropdowns().map(this_value).get();
        }

        return function () {
            var cookie = load_cookie();
            cookie.oN = my("locOriginName").val();
            cookie.oC = my("locOriginCodes").val();
            cookie.dN = my("locDestinationName").val();
            cookie.dC = my("locDestinationCodes").val();
            cookie.dt1 = my('depDate').val();
            cookie.dt2 = my('retDate').val();
            cookie.nAd = my("noOfAdults").val();
            cookie.nCh = my("noOfChildren").val();
            cookie.aCh = childrens_ages().join(",");
            cookie.store();
        };
    }();

    form.verify_location_inputs = function () {
        if (my("locOriginNameHidden").val() !== my("locOriginName").val()) {
            my("locOriginCodes").val("");
        }
        if (my("locDestinationNameHidden").val() !== my("locDestinationName").val()) {
            my("locDestinationCodes").val("");
        }
    };


    form.setup_form_validation = function () {

        function number_of_adults() {
            return my("noOfAdults").val();
        }

        function this_is_an_infant() {
            var age = $(this).val();
            return age >= 0 && age < 2;
        }

        function number_of_infants() {
            return children_age_dropdowns().count_number_of(this_is_an_infant);
        }

        function create_validation_rules() {
            var origin_must_be_set = {
                is_valid: function () {
                    return my("locOriginName").val() !== "";
                },
                elements_to_highlight: function () {
                    return my("locOriginName");
                },
                error_message: text.origin_not_specified
            },
            destination_must_be_set = {
                is_valid: function () {
                    return my("locDestinationName").val() !== "";
                },
                elements_to_highlight: function () {
                    return my("locDestinationName");
                },
                error_message: text.destination_not_specified
            },
            locations_must_be_different = {
                is_valid: function () {
                    return my("locOriginName").val() !== my("locDestinationName").val();
                },
                elements_to_highlight: function () {
                    return $("#air-search .locDestinationName, #air-search .locOriginName");
                },
                error_message: text.locations_the_same
            },
            departure_date_must_be_set = {
                is_valid: departure_date_is_set,
                elements_to_highlight: function () {
                    return my("depDate");
                },
                error_message: text.departure_date + " " + text.invalid_date
            },
            departure_date_must_be_in_the_future = {
                is_valid: function () {
                    return departure_date_is_in_the_future() || ! departure_date_is_set();
                },
                elements_to_highlight: function () {
                    return my("depDate");
                },
                error_message: text.departure_date + " " + text.earlier_than_date
            },
            return_date_must_be_set_for_roundtrip_flights = {
                is_valid: function () {
                    return return_date_is_set() || ! is_roundtrip_flight();
                },
                elements_to_highlight: function () {
                    return my("retDate");
                },
                error_message: text.return_date + " " + text.invalid_date
            },
            return_date_must_be_after_departure_for_roundtrip_flights = {
                is_valid: function () {
                    return dates_are_in_chronological_order() || ! is_roundtrip_flight() || ! return_date_is_set();
                },
                elements_to_highlight: function () {
                    return my("retDate");
                },
                error_message: text.return_date + " " + text.earlier_than + " " + text.departure_date + "."
            },
            childrens_ages_must_be_set = {
                is_valid: function () {
                    return children_age_dropdowns().filter("[value=-1]").length === 0;
                },
                elements_to_highlight: function () {
                    return children_age_dropdowns().filter("[value=-1]");
                },
                error_message: text.no_age
            },
            atleast_one_adult_per_infant = {
                is_valid: function () {
                    return number_of_adults() >= number_of_infants();
                },
                elements_to_highlight: function () {
                    return my("noOfAdults");
                },
                error_message: text.no_of_children
            };

            return $([
                origin_must_be_set,
                destination_must_be_set,
                locations_must_be_different,
                departure_date_must_be_set,
                departure_date_must_be_in_the_future,
                return_date_must_be_set_for_roundtrip_flights,
                return_date_must_be_after_departure_for_roundtrip_flights,
                childrens_ages_must_be_set,
                atleast_one_adult_per_infant
            ]);
        }

        return function () {
            var rules = create_validation_rules(),
                validator = IAD.travel.form_validator(rules);
            validator.on_success_do(function() {
                form.verify_location_inputs();
                form.store_cookie();
            });
            validator.initialize("#air-search form");
        };
    }();

    form.populate_with_values_and_submit = function (originName, originCodes, destinationName, destinationCodes, departureDate, returnDate) {
        my("locOriginName").val(originName);
        my("locOriginNameHidden").val(originName);
        my("locOriginCodes").val(originCodes);

        my("locDestinationName").val(destinationName);
        my("locDestinationNameHidden").val(destinationName);
        my("locDestinationCodes").val(destinationCodes);
        
        my("depDate").val(departureDate);
        my("retDate").val(returnDate);

        $("#air-search form").submit(); 
    };


    form.populate_with_default_values = function () {
        var cookie;

        function cookie_departure_date_is_in_the_past() {
            return cookie.dt1 && to_date(cookie.dt1) < today();
        }

        function dont_use_cookie() {
            cookie = {};
        }

        function default_departure_date() {
            return getParameter("depDate") || cookie.dt1 || my("depDate").val();
        }

        function default_return_date() {
            return getParameter("retDate") || cookie.dt2 || my("retDate").val();
        }

        function origin_determined_by_parameter() {
            return !! getParameter("originAreaId");
        }

        function destination_is_set() {
            return !! my("locDestinationName").val();
        }

        function set_childrens_ages_from_cookie() {
            var ages = cookie.aCh.split(','), i, length;
            for (i = 0, length = ages.length; i < length; i = i + 1) {
                my("ageOfChild_" + i).val(ages[i]);
            }
        }

        return function () {
            cookie = load_cookie();

            if (cookie_departure_date_is_in_the_past()) {
                dont_use_cookie();
            }
            my("depDate").val(default_departure_date());
            my("retDate").val(default_return_date());

            if (! origin_determined_by_parameter()) {
                my("locOriginName").val(cookie.oN);
                my("locOriginNameHidden").val(cookie.oN);
                my("locOriginCodes").val(cookie.oC);
            }

            if (! destination_is_set()) {
                my("locDestinationName").val(cookie.dN);
                my("locDestinationNameHidden").val(cookie.dN);
                my("locDestinationCodes").val(cookie.dC);
            }

            my("noOfAdults").val(cookie.nAd);
            my("noOfChildren").val(cookie.nCh);
            if (cookie.aCh) {
                set_childrens_ages_from_cookie();
            }
        };
    }();


    form.setup_oneway_or_roundtrip_flight_form_toggling = function () {
        function toggle_oneway_or_roundtrip_flight() {
            $("#return-date").css("visibility", is_roundtrip_flight() ? "visible" : "hidden");
        }

        return function () {
            toggle_oneway_or_roundtrip_flight();
            my("roundTrip").click(toggle_oneway_or_roundtrip_flight);
            my("oneWay").click(toggle_oneway_or_roundtrip_flight);
        };
    }();



    form.setup_child_age_dropdowns_toggling = function () {

        function number_of_children() {
            return my("noOfChildren").val();
        }

        function any_children_on_flight() {
            return number_of_children() > 0;
        }

        function this_select_box_is_for_child_on_flight() {
            return number_of_children() > $(this).prevAll("select").length;
        }

        function toggle_child_age_dropdowns() {
            $("#childrens-ages").show_only_if(any_children_on_flight);
            $("#childrens-ages select").show_only_if(this_select_box_is_for_child_on_flight);
        }

        return function () {
            toggle_child_age_dropdowns();
            my("noOfChildren").change(toggle_child_age_dropdowns);
        };

    }();



    form.setup_location_autocompletion = function () {
        function autocomplete_parameters() {
            return {
                extraParams: {
                    flat: "1"
                },
                minChars: 3,
                scroll: false,
                cacheLength: 0,
                width: 400
            };
        }

        function setup_autocomplete_with_callback(element, callback) {
            $(element).
                    autocomplete(urls.location_autocomplete, autocomplete_parameters()).
                    result(callback);
        }

        function update_focus_delayed(field) {
            $.timer(50, function (timer) {
                my(field).focus_next_input_field();
                timer.stop();
            });
        }

        function update_origin_info(event, data) {
            my('locOriginCodes').val(data[1]);
            my('locOriginNameHidden').val(data[0]);
            update_focus_delayed("locOriginName");
        }

        function update_destination_info(event, data) {
            my('locDestinationCodes').val(data[1]);
            my('locDestinationNameHidden').val(data[0]);
            update_focus_delayed("locDestinationName");
        }

        return function () {
            setup_autocomplete_with_callback(my("locOriginName"), update_origin_info);
            setup_autocomplete_with_callback(my("locDestinationName"), update_destination_info);
        };
    }();



    form.add_wt_tracking = function () {

        function should_add_webtrends_tracking() {
            return $("#air-search-wt-tracking").length > 0;
        }

        function add_webtrends_tracking() {
            var tracking = $("#air-search-wt-tracking"), url = tracking.attr("data-url"), name = tracking.val();
            dcsMultiTrack('DCS.dcsuri', url, 'WT.ti', name);
        }

        return function () {
            if (should_add_webtrends_tracking()) {
                $("#air-search form").submit(add_webtrends_tracking);
            }
        };
    }();

    return form;
}(jQuery);
