Mini Kabibi Habibi
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;
};