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, tt: cp.selectedTrain || [], ts: cp.selectedSeatType || [], 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("|")) + ((cp.selectedSeatType || []).join("|")); if (suggestKey === cachedSuggest.key && cachedSuggest.data) { 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) return false; //如果设置了席别,并且设置的席别都没有,则不考虑 if (cp.selectedSeatType && cp.selectedSeatType.length) { if (!cp.selectedSeatType.some(function (x) { return t.ticketMap[x] || false; })) return false; } return true; }); if (!alltrains.length) return; //如果没有选择车次并且此时车次数量多于10趟,则不予检测。 if ((!cp.selectedTrain || !cp.selectedTrain.length) && alltrains.length > 30) 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; });