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; });