Light12306/Web12306/js/otn/trainstationsuggest.js
2014-08-27 23:05:50 +08:00

199 lines
5.0 KiB
JavaScript

define(function (require, exports, module) {
var data = require("../data.js");
var sessmgr = require("../account/sessionMgr.js");
var EventObject = require("../platform/EventObject.js");
var cp = sessmgr.currentProfile;
var query = require("../otn/queryticket.js");
var suggestion = null;
var utility = require("../utility.js");
sessmgr.on("currentProfileChanged", function () {
cp = sessmgr.currentProfile;
});
var isInQuery = false;
var startQueryLimit = data.startTrainStationSuggestQueryLimit;
var isFullyQualifiedTrainCode = function (code) {
return /^[A-Z]?\d+$/.test(code);
};
function TSS() {
EventObject.apply(this);
var that = this;
var queryResult = null;
var alltrains = null;
var trainStops = null;
var loadTrainStops = function () {
if (!alltrains || !alltrains.length) {
requestSuggestionData();
return;
}
var tcode, t;
do {
tcode = alltrains.pop();
t = _.findWhere(queryResult.original, { code: tcode });
} while (!t && alltrains.length)
if (!t) {
requestSuggestionData();
return;
}
query.queryTrainStop(t.id, t.from.code, t.to.code, t.date)
.done(function (stopinfo) {
trainStops[t.code] = {
info: t,
stops: stopinfo
};
loadTrainStops();
}).fail(loadTrainStops);
};
var requestSuggestionData = function () {
var requestData = {
data: JSON.stringify({
key: "stupid360",
from: cp.fromCode,
to: cp.toCode,
date: cp.depDate,
stops: trainStops
})
};
$.ajax({
url: "/getsuggestion.ashx?key=stupid360",
dataType: "json",
method: "POST",
data: requestData
}).done(loadTrainTickets).fail(function () {
setTimeout(function () {
that.clearQueryResultCache();
//如果服务器出现错误,则等待十秒后再恢复状态
}, 10000);
});
};
var loadTrainTickets = function (serverSuggestion) {
if (!serverSuggestion || !serverSuggestion.length) {
//木有结果。
suggestion = {};
isInQuery = false;
}
serverSuggestion = _.filter(serverSuggestion, function (s) {
//预处理数据
s.key = s.key.split('-');
s.fromText = s.key[0];
s.toText = s.key[1];
s.fromCode = data.citynameMap[s.fromText];
s.toCode = data.citynameMap[s.toText];
if (!s.toCode || !s.fromCode)
return false;
s.toCode = s.toCode.c;
s.fromCode = s.fromCode.c;
return true;
});
var loaded = [];
var loadTrain = function () {
if (!serverSuggestion.length) {
checkSuggestion(loaded);
return;
}
var t = serverSuggestion.pop();
query.queryTicket(t.fromCode, t.toCode, cp.depDate, cp.studentTicket, false, true)
.done(function () {
loaded.unshift(t);
var trainAvailable = this.original;
if (!trainAvailable) {
loadTrain();
return;
}
var trainFilter = new RegExp("^(" + _.map(t.value, function (v) {
return v.trainCode;
}).join("|") + ")$", "i");
trainAvailable = _.filter(trainAvailable, function (x) {
return trainFilter.test(x.code);
});
var seatType = cp.selectedSeatType || data.seatOrder;
//seatType=['O']
var count = Math.max(!cp.partialSubmitEnabled && cp.passengers ? cp.passengers.length : 0, 1);
var selectedTrain = _.filter(trainAvailable, function (x) {
if (x.available !== 1)
return false;
return _.some(seatType, function (s) {
return x.ticketMap[s] && x.ticketMap[s].count >= count;
});
});
if (selectedTrain.length)
t.train = selectedTrain;
loadTrain();
}).fail(loadTrain);
};
loadTrain();
};
var checkSuggestion = function (suggestData) {
suggestion = suggestData;
if (suggestion.length)
that.fireEvent("trainSuggestion", suggestion);
};
this.setQueryResult = function (result, queryCount) {
if (queryCount < startQueryLimit || isInQuery || suggestion)
return;
isInQuery = true;
queryResult = result;
trainStops = {};
that.checkTrainSuggestion();
}
this.clearQueryResultCache = function () {
queryResult = null;
isInQuery = false;
trainStops = null;
alltrains = null;
suggestion = null;
};
this.checkTrainSuggestion = function () {
alltrains = _.filter(cp.selectedTrain || [], function (code) {
if (!isFullyQualifiedTrainCode(code))
return false;
var t = _.findWhere(queryResult.original, { code: code });
//始发终到、未起售的车不考虑
if (!t || (t.from.endpoint && t.to.endpoint) || t.available < 0)
return false;
return true;
});
if (!alltrains.length)
return;
loadTrainStops();
};
}
TSS.prototype = Object.create(EventObject);
TSS.constructor = TSS;
var ctx = {
TSS: new TSS(),
setQueryResult: function (result, queryCount) {
ctx.TSS.setQueryResult(result, queryCount);
},
clearQueryResultCache: function () {
ctx.TSS.clearQueryResultCache();
}
};
Object.defineProperty(ctx.TSS, "isInSuggestQuery", {
get: function () {
return isInQuery;
}
});
return ctx;
});