Light12306/Web12306/js/otn/trainstationsuggest.js
2014-09-02 23:15:40 +08:00

251 lines
6.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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");
var cachedSuggest = JSON.parse(localStorage['trainsuggestion'] || '{"key":"", "data":null}');
var lastQuerySuggest = null;
var port = require("../platform/extensionPort.js");
sessmgr.on("currentProfileChanged", function () {
cp = sessmgr.currentProfile;
});
var isInQuery = false;
var startQueryLimit = data.startTrainStationSuggestQueryLimit;
var isSuggestLoopDisabled = false;
var _w = window;
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 t = null;
do {
t = alltrains.pop();
} while (!t && alltrains.length)
if (!t) {
requestSuggestionData();
return;
}
query.queryTrainStop(t.id, t.from.code, t.to.code, t.date)
.done(function (stopinfo) {
if (!trainStops)
return;
trainStops[t.code] = {
info: t,
stops: stopinfo
};
loadTrainStops();
}).fail(loadTrainStops);
};
var requestSuggestionData = function () {
_w.v = JSON.stringify({
key: "stupid360",
from: cp.fromCode,
to: cp.toCode,
date: cp.depDate,
stops: trainStops
});
var requestData = {
data: _w.v
};
$.ajax({
url: "http://12306.fishlee.net/ts?key=stupid360&r=" + Math.random(),
dataType: "json",
method: "POST",
data: requestData
}).done(preprocessServerResponse).fail(function () {
setTimeout(function () {
that.clearQueryResultCache();
//如果服务器出现错误,则等待十秒后再恢复状态
}, 10000);
});
port.track(data.trackTypes.LOAD_SUGGESTION, [cp.fromCode, cp.fromText, cp.toCode, cp.toText, cp.depDate, cp.studentTicket + '']);
};
var preprocessServerResponse = function (serverSuggestion) {
serverSuggestion = serverSuggestion && serverSuggestion.groups;
if (!serverSuggestion || !serverSuggestion.length) {
//木有结果。
suggestion = [];
cachedSuggest.data = suggestion;
isInQuery = false;
return;
}
serverSuggestion = _.filter(serverSuggestion, function (s) {
//预处理数据
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;
});
cachedSuggest.data = _.clone(serverSuggestion);
localStorage['trainsuggestion'] = JSON.stringify(cachedSuggest);
loadTrainTickets(serverSuggestion);
};
var loadTrainTickets = function (serverSuggestion) {
if (!serverSuggestion)
return;
var loaded = [];
var loadTrain = function () {
if (!serverSuggestion.length) {
checkSuggestion(loaded);
return;
}
var t = serverSuggestion.pop();
query.queryTicket(t.fromCode, t.toCode, t.date, cp.studentTicket, false, true)
.done(function () {
loaded.unshift(t);
var trainAvailable = this.original;
if (!trainAvailable) {
loadTrain();
return;
}
var trainFilter = new RegExp("^(" + _.map(t.lines, function (v) {
return v.trainCode;
}).join("|") + ")$", "i");
trainAvailable = _.filter(trainAvailable, function (x) {
return trainFilter.test(x.code);
});
var seatType = cp.selectedSeatType && cp.selectedSeatType.length ? cp.selectedSeatType : data.seatDisplayOrder;
//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;
isInQuery = false;
if (suggestion.length)
that.fireEvent("trainSuggestion", suggestion);
};
this.setQueryResult = function (result, queryCount) {
if (queryCount < startQueryLimit || isInQuery || isSuggestLoopDisabled)
return;
queryResult = result;
isInQuery = true;
trainStops = {};
that.checkTrainSuggestion();
}
this.clearQueryResultCache = function () {
queryResult = null;
isInQuery = false;
trainStops = null;
alltrains = null;
lastQuerySuggest = null;
};
this.checkTrainSuggestion = function () {
var suggestKey = cp.fromCode + cp.toCode + ((cp.selectedTrain || []).join("|"));
if (suggestKey === cachedSuggest.key) {
if (!lastQuerySuggest || (new Date() - lastQuerySuggest) > data.suggestRefreshInterval) {
lastQuerySuggest = new Date();
loadTrainTickets(_.clone(cachedSuggest.data));
} else {
isInQuery = false;
}
return;
}
cachedSuggest = { key: suggestKey };
var selectedTrain = new RegExp("^" + ((cp.selectedTrain || []).join("|") || ".*") + "$", "i");
alltrains = _.filter(queryResult.include || [], function (t) {
//没有选择,则不考虑
if (!selectedTrain.test(t.code))
return false;
//始发终到或未起售,不考虑
if ((t.from.endpoint && t.to.endpoint) || t.available < 0)
return false;
return true;
});
if (!alltrains.length)
return;
//如果没有选择车次并且此时车次数量多于10趟则不予检测。
if ((!cp.selectedTrain || !cp.selectedTrain.length) && alltrains.length > 15)
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();
ctx.isSuggestLoopDisabled = false;
},
findTrain: function (secstr) {
for (var line in suggestion) {
var t = _.findWhere(suggestion[line].train, { secureStr: secstr });
if (t)
return t;
}
return null;
}
};
Object.defineProperty(ctx.TSS, "isInSuggestQuery", {
get: function () {
return isInQuery;
}
});
Object.defineProperty(ctx, "isSuggestLoopDisabled",
{
get: function () {
return isSuggestLoopDisabled;
},
set: function (value) {
isSuggestLoopDisabled = value;
}
});
return ctx;
});