Mini Kabibi Habibi

Current Path : C:/Users/Public/Documents/DXTREME 13.1 Demos/DXTravel/DXTravel.Web/Views/
Upload File :
Current File : C:/Users/Public/Documents/DXTREME 13.1 Demos/DXTravel/DXTravel.Web/Views/FindFlight.js

DXTravel.FindFlight = function(params) {

    var cacheOfFlights = [],
        cacheOfFlightsFiltered = [],
        ascSort = true,
        SKIP = 0,
        TOP = 10,
        STEP = 10,
        MIN_COST = 0,
        MIN_LEAVE_TIME = 0,
        MAX_LEAVE_TIME = 24,
        MIN_RETURN_TIME = 0,
        MAX_RETURN_TIME = 24;

    var formatDate = function(date){
        return new Date(date.replace(/-/g, "/"));
    };

    var priceToFloat = function(price){
        return Number(price.replace(/[\$,\,]/g, ""));
    };

    var model = {

        flightList: ko.observableArray(),
        countFlights: ko.observableArray(),

        costStart: ko.observable(MIN_COST),
        costEnd: ko.observable(MIN_COST),
        maxCost: ko.observable(MIN_COST),

        airlines: ko.observableArray(),
        selectedAirline: ko.observable(),

        classOfSeatList: ["Economy", "Business", "First"],
        classOfSeatSelected: ko.observable(sessionStorage.getItem("cabinClass") || "Economy"),

        leaveTimeOfDayStart: ko.observable(MIN_LEAVE_TIME),
        leaveTimeOfDayEnd: ko.observable(MAX_LEAVE_TIME),

        returnTimeOfDayStart: ko.observable(MIN_RETURN_TIME),
        returnTimeOfDayEnd: ko.observable(MAX_RETURN_TIME),

        visibleMoreLink: ko.observable(),

        notResults: ko.observable(false),
        navigation: DXTravel.navigation,
        viewShowing: DXTravel.viewShowing,

        outboundDate: ko.observable(Globalize.format(formatDate(params.outboundDate), "M/d/yyyy")),
        inboundDate: ko.observable(Globalize.format(formatDate(params.inboundDate), "M/d/yyyy")),

        searchIsCompleted: DXTravel.FlightUtils.searchIsCompleted,
        leftSideBarVisible: ko.observable(false)

    };

    model.costStartFormated = ko.computed(function () {
        return Globalize.format(model.costStart(), "C");
    });

    model.costEndFormated = ko.computed(function () {
        return Globalize.format(model.costEnd(), "C");
    });

    var parseFlightsLocations = function(locations, outboundStartAirport, outboundAirportEnd, outboundConnections, inboundConnections) {
        var result = {
            from: {},
            to: {},
            outboundLocations: [],
            inboundLocations: []
        };
        $.each(locations, function(index, location) {
            if(location.code == outboundStartAirport)
                result.from = location;
            else if(location.code == outboundAirportEnd)
                result.to = location;
            else {
                if($.inArray(location.code, outboundConnections) >= 0)
                    result.outboundLocations.push(location);

                if($.inArray(location.code, inboundConnections) >= 0)
                    result.inboundLocations.push(location);
            }
        });
        
        return result;
    };

    var getCurrencyKoeff = function(currency) {
        var koeff = 1;
        if(currency == "RUB")
            koeff = 31;
        if(currency == "INR")
            koeff = 55;

        return koeff;
    };

    var setAirlines = function(flights) {
        var tmpAirlinesObj = {};

        $.each(flights, function() {
            $.each(this.airlines, function() {
                tmpAirlinesObj[this.code] = this.name;
            });
        });

        for(prop in tmpAirlinesObj) {
            model.airlines.push({
                code: prop,
                name: tmpAirlinesObj[prop]
            });
        }

        sessionStorage.setItem("airlines", JSON.stringify(model.airlines()));
    };

    var parseFlights = function(flights) {
        model.leftSideBarVisible(true);
        if(!flights.itineraries || !flights.itineraries.length) {
            model.notResults(true);
            sessionStorage.setItem("foundFlights", []);
            return;
        }

        var mappedFlights = $.map(flights.itineraries, function(item, index) {
            if(item && item.location && item.location.length > 0) {

                var outboundStartAirport = item.outboundInfo.airports[0],
                    outboundConnections = item.outboundInfo.airports.slice(1, item.outboundInfo.airports.length - 1),
                    outboundAirportEnd = item.outboundInfo.airports[item.outboundInfo.airports.length - 1],
                    inboundConnections = item.inboundInfo.airports.slice(1, item.inboundInfo.airports.length - 1);
                
                var flightLocations = parseFlightsLocations(item.location, outboundStartAirport, outboundAirportEnd, outboundConnections, inboundConnections);

                var currencyKoeff = getCurrencyKoeff(item.price.currencyCode);

                var result = {
                    id: index,
                    price: Globalize.format(item.price.totalAmount / currencyKoeff, "C"), // to USD
                    itineraryId: item.id,

                    outboundDate: Globalize.format(new Date(item.outboundInfo.departureTime), "yyyy-MM-dd"),
                    inboundDate: Globalize.format(new Date(item.inboundInfo.departureTime), "yyyy-MM-dd"),

                    from: flightLocations.from,
                    to: flightLocations.to,
                    connections: flightLocations.outboundLocations,
                    connectionsReturn: flightLocations.inboundLocations,
                    layoverInMin: item.outboundInfo.layoverInMin,
                    durationInMin: item.outboundInfo.durationInMin,
                    airlines: item.carrier,

                    hourOfLeave: new Date(item.outboundInfo.departureTime).getHours(),
                    hourOfReturn: new Date(item.inboundInfo.departureTime).getHours(),

                    bookingCode: item.bookingCode,
                    providerId: item.providerId,
                    dlfrom: params.from,
                    dlto: params.to
                };

                
                if (priceToFloat(result.price) > Number(model.maxCost())) {
                    model.maxCost(Math.ceil(priceToFloat(result.price)));
                    model.costEnd(Math.ceil(priceToFloat(result.price)));
                    sessionStorage.setItem("maxCost", Math.ceil(priceToFloat(result.price)));
                }

                return result;
            }
        });

        if(!mappedFlights.length) {
            model.notResults(true);
            sessionStorage.setItem("foundFlights", []);
            return;
        }

        cacheOfFlights = cacheOfFlightsFiltered = mappedFlights;
        sessionStorage.setItem("foundFlights", JSON.stringify(mappedFlights));

        model.visibleMoreLink(cacheOfFlights.length > TOP);
        mappedFlights = mappedFlights.slice(SKIP, TOP);

        model.flightList(mappedFlights);
        
        model.countFlights(cacheOfFlights.length);

        setAirlines(cacheOfFlights);
    };

    model.airportAutocompleteSource = DXTravel.FlightUtils.airportAutocompleteSource;
    model.fromAirport = ko.observable(params.from);
    model.toAirport = ko.observable(params.to);

    model.fromAirportLocation = sessionStorage.getItem("fromAirportLocation") || params.from;
    model.toAirportLocation = sessionStorage.getItem("toAirportLocation") || params.to;

    model.fromAirportSelectCallback = function(event, ui) {
        model.fromAirport(ui.item.code);
        sessionStorage.setItem("fromAirportLocation", ui.item.value);
        DXTravel.app.navigate("FindFlight/" + ui.item.code + "/" + params.to + "/" + params.outboundDate + "/" + params.inboundDate);
    };

    model.toAirportSelectCallback = function(event, ui) {
        model.toAirport(ui.item.code);
        sessionStorage.setItem("toAirportLocation", ui.item.value);
        DXTravel.app.navigate("FindFlight/" + params.from + "/" + ui.item.code + "/" + params.outboundDate + "/" + params.inboundDate);
    };

    model.filterFlights = function() {
        if(!cacheOfFlights.length)
            return;

        cacheOfFlightsFiltered = $.grep(cacheOfFlights, function(flight, index) {
            var trueCost = (priceToFloat(flight.price) >= Number(model.costStart()) && priceToFloat(flight.price) <= Number(model.costEnd()));

            var trueLeaveTime = (flight.hourOfLeave >= model.leaveTimeOfDayStart() && flight.hourOfLeave <= model.leaveTimeOfDayEnd());
            var trueReturnTime = (flight.hourOfReturn >= model.returnTimeOfDayStart() && flight.hourOfReturn <= model.returnTimeOfDayEnd());

            var trueAirline = false;

            if(!model.selectedAirline())
                trueAirline = true;
            else {
                $.each(flight.airlines, function() {
                    if(this.code == model.selectedAirline().code) {
                        trueAirline = true;
                        return false;
                    }
                });
            }
            return trueCost && trueLeaveTime && trueReturnTime && trueAirline;
        });

        model.countFlights(cacheOfFlightsFiltered.length);
        model.visibleMoreLink(cacheOfFlightsFiltered.length > TOP);
        model.flightList(cacheOfFlightsFiltered.slice(0, TOP));
        model.notResults(!model.flightList().length);
    };

    model.classOfSeatSelected.subscribe(function(value) {
        var newParams = $.extend(params, { cabinClass: value });
        model.flightList([]);
        model.airlines([]);
        model.notResults(false);
        DXTravel.FlightUtils.searchFlight(newParams, parseFlights);
        sessionStorage.setItem("cabinClass", value);
    });

    model.sortClass = ko.observable("");

    model.sortByPrice = function() {
        var sortFn = function (a, b) {
            if (priceToFloat(a.price) < priceToFloat(b.price))
                return (ascSort ? -1 : 1);
            if (priceToFloat(a.price) > priceToFloat(b.price))
                return (ascSort ? 1 : -1);
            return 0;
        };

        cacheOfFlightsFiltered.sort(sortFn);
        cacheOfFlights.sort(sortFn);

        model.flightList(cacheOfFlightsFiltered.slice(0, TOP));

        model.sortClass(ascSort ? "asc" : "desc");
        ascSort = (ascSort ? false : true);
    };

    model.changeCost = function(event, ui) {
        model.costStart(ui.values[0]);
        model.costEnd(ui.values[1]);
    };

    model.leaveTimeFormat12First = ko.observable("12 AM");
    model.leaveTimeFormat12Last = ko.observable("12 PM");

    model.returnTimeFormat12First = ko.observable("12 AM");
    model.returnTimeFormat12Last = ko.observable("12 PM");

    model.changeLeaveTimeOfDay = function(event, ui) {

        model.leaveTimeFormat12First(Globalize.format(new Date("12/12/2012 " + (ui.values[0] != 24 ? ui.values[0] : 12) + ":00"), "hh tt"));
        model.leaveTimeFormat12Last(Globalize.format(new Date("12/12/2012 " + (ui.values[1] != 24 ? ui.values[1] : 12) + ":00"), "hh tt"));

        model.leaveTimeOfDayStart(ui.values[0]);
        model.leaveTimeOfDayEnd(ui.values[1]);
    };

    model.changeReturnTimeOfDay = function(event, ui) {

        model.returnTimeFormat12First(Globalize.format(new Date("12/12/2012 " + (ui.values[0] != 24 ? ui.values[0] : 12) + ":00"), "hh tt"));
        model.returnTimeFormat12Last(Globalize.format(new Date("12/12/2012 " + (ui.values[1] != 24 ? ui.values[1] : 12) + ":00"), "hh tt"));

        model.returnTimeOfDayStart(ui.values[0]);
        model.returnTimeOfDayEnd(ui.values[1]);
    };

    model.selectedAirline.subscribe(function(value) {
        model.filterFlights();
    });

    model.showMoreFlights = function() {
        SKIP = TOP;
        TOP = TOP + STEP;
        model.visibleMoreLink(cacheOfFlightsFiltered.length > TOP);

        var updateFlightList = model.flightList().concat(cacheOfFlightsFiltered.slice(SKIP, TOP))

        model.flightList(updateFlightList);
    };

    model.outboundDate.subscribe(function(value) {
        var newLeavingDate = Globalize.format(new Date(value), "yyyy-MM-dd");
        DXTravel.app.navigate("FindFlight/" + params.from + "/" + params.to + "/" + newLeavingDate + "/" + params.inboundDate);
    });

    model.inboundDate.subscribe(function(value) {
        var newReturningDate = Globalize.format(new Date(value), "yyyy-MM-dd");
        DXTravel.app.navigate("FindFlight/" + params.from + "/" + params.to + "/" + params.outboundDate + "/" + newReturningDate);
    });

    var requestSearchCriteria = {
        from: params.from,
        to: params.to,
        inboundDate: params.inboundDate,
        outboundDate: params.outboundDate
    };

    var currentSearchCriteria = $.parseJSON(sessionStorage.getItem("searchCriteria"));

    if(currentSearchCriteria &&
        currentSearchCriteria.from == requestSearchCriteria.from &&
        currentSearchCriteria.to == requestSearchCriteria.to &&
        currentSearchCriteria.inboundDate == requestSearchCriteria.inboundDate &&
        currentSearchCriteria.outboundDate == requestSearchCriteria.outboundDate) {

        cacheOfFlights = cacheOfFlightsFiltered = $.parseJSON(sessionStorage.getItem("foundFlights")) || [];

        model.leftSideBarVisible(true);

        model.visibleMoreLink(cacheOfFlights.length > TOP);

        model.flightList(cacheOfFlightsFiltered.slice(SKIP, TOP));

        model.countFlights(cacheOfFlights.length);

        model.airlines($.parseJSON(sessionStorage.getItem("airlines")));
        
        model.maxCost(Number(sessionStorage.getItem("maxCost")));
        model.costEnd(Number(sessionStorage.getItem("maxCost")));
        
        if(!model.flightList.length)
            model.notResults(true);
    }
    else {
        sessionStorage.setItem("searchCriteria", JSON.stringify(requestSearchCriteria));
        currentSearchCriteria = requestSearchCriteria;

        DXTravel.FlightUtils.searchFlight(currentSearchCriteria,  parseFlights);
    }
    return model;
};