define(function (require, exports, module) { var session = null; var ev = require("../platform/EventObject.js"); var ajax = require("../platform/webRequest.js"); var storage = require("../platform/storage.js"); var keepAlive = require("../account/keepalive.js"); var passengers = null; var currentuser = sessionStorage["_currentuser"] || undefined; var currentuserName = sessionStorage["_currentuserName"] || undefined; var parser = require("../platform/parser.js"); var data = require("../data.js"); var utility = require("../utility.js"); if (sessionStorage["_passenger"]) passengers = JSON.parse(sessionStorage["_passenger"]); var SessionMgr = function () { var that = this; var _passengerInLoad = null; ev.apply(this, arguments); var loadPassengers = function (callback) { if (!that.isLogined) { if (callback) callback([]); var def = new $.Deferred(); def.reject("您尚未登录"); return def.promise(); } if (_passengerInLoad) { _passengerInLoad.done(callback); return _passengerInLoad.promise(); } _passengerInLoad = new $.Deferred(); _passengerInLoad.done(callback); sessionStorage.removeItem("notValidPassengerFound"); ajax.sendPost("confirmPassenger/getPassengerDTOs", "leftTicket/init", null, "json", function () { var result = this.model; if (!result || !result.data || !result.data.normal_passengers) { passengers = null; that.fireEvent("passengerLoadFailed"); that.fireEvent("passengerLoaded", passengers); _passengerInLoad.reject(result.data && result.data.exMsg); } else { var p1 = result.data.normal_passengers; passengers = _.filter(p1, parser.canPassageAddToOrder); //对联系人数据进行预处理 parser.processPassenger(passengers); if (p1.length !== passengers.length) { that.fireEvent("notValidPassengerFound"); sessionStorage['hasUnverifiedPassenger'] = 1; document.dispatchEvent(new Event("notValidPassengerFound")); } sessionStorage["_passenger"] = JSON.stringify(passengers); that.fireEvent("passengerLoaded", passengers); _passengerInLoad.resolve(passengers); } _passengerInLoad = null; }, function () { passengers = null; _passengerInLoad.reject("网络错误"); sessionStorage.removeItem("_passenger"); that.fireEvent("passengerLoadFailed"); that.fireEvent("passengerLoaded", passengers); }); return _passengerInLoad.promise(); }; that.savePassengers = function () { if (!passengers) return; sessionStorage["_passenger"] = JSON.stringify(passengers); }; that.reloadPassengers = function () { sessionStorage.removeItem("_passenger"); passengers = null; }; that.checkLoginState = function (callback) { ajax.sendGet("modifyUser/initQueryUserInfo", "", null, "text", function () { if (this.text.indexOf("登录名:") !== -1) { sessionStorage.removeItem("_currentuser"); sessionStorage.removeItem("_currentuserName"); callback({ logined: false }); } else { var m = /姓名:.*[\r\n]+]+>([^<]+)<\/div>/i.exec(this.text) && RegExp.$1; var status = /核验状态:[\w\W]+?>([^<>]+?)<\/div>/.exec(this.text) && RegExp.$1; var un = /userDTO\.loginUserDTO\.user_name.*?value=['"]([^'"]+)['"]/.exec(this.text) && RegExp.$1; sessionStorage["_currentuser"] = un; sessionStorage["_currentuserName"] = m; if (!m || !status) callback({ logined: false }); else { callback({ logined: true, realName: m, status: status, isChecked: status === '已通过', username: un }); } } }, function () { callback({ logined: false }); }); }; that.loadProfile = function (dispname, checkData, username) { //备份当前的查询,并取代为默认的查询 var cp = that.currentProfile; if (cp) { cp.passengers = null; //不保留乘客 } var profile = storage.obj("12306_user_" + dispname) || { hasNotVerifyedPassenger: false, dispname: dispname, passengers: [], savedProfile: { list: [] }, currentProfile: {}, rawPassenger: [], options: { soundPrompt: true } }; profile.currentProfile = $.extend({}, _.clone(that.defaultProfile), profile.currentProfile, cp); if (!profile.currentProfile.autoRefreshDelay) profile.currentProfile.autoRefreshDelay = 5; if (username) profile.username = username; //有预置参数?加载 if (location.hash && location.hash.indexOf("#ALARM-") === 0) { try { var predata = JSON.parse(decodeURIComponent(location.hash.substr(7))); profile.currentProfile = _.extend(profile.currentProfile, predata); } catch (e) { console.log("unable to restore parameter: " + e); } } //fix passenger issue profile.currentProfile.passengers = _.filter(profile.currentProfile.passengers || [], function (p) { return p.passenger_name || false; }); that.current = profile; if (dispname) { if (checkData) { that.current.dispname = checkData.realName; that.current.username = checkData.username; that.fireEvent("userInfoUpdated"); if (!checkData.isChecked) that.fireEvent("userNotChecked"); } else { that.checkLoginState(function (data) { if (!data.logined) { //被强退了 that.loadProfile(""); that.fireEvent("loginInvalid"); } else { that.current.dispname = data.realName; that.current.username = data.username; that.fireEvent("userInfoUpdated"); if (!data.isChecked) that.fireEvent("userNotChecked"); } }); } } that.save(); }; that.resetProfile = function () { sessionStorage.removeItem("_currentuser"); sessionStorage.removeItem("_currentuserName"); that.loadProfile(""); }; that.save = function () { if (!that.current) return; var key = "12306_user_" + that.current.dispname; storage.put(key, that.current); that.fireEvent("save"); }; that.getPassengers = function (callback) { if (!that.isLogined) { callback && callback([]); var def = new $.Deferred(); def.reject("您尚未登录"); return def.promise(); } var d1; if (passengers) { callback && callback(passengers); d1 = new $.Deferred(); d1.resolve(passengers); } else { //that.once("passengerLoaded", function () { // callback(passengers); //}); d1 = loadPassengers(callback); } return d1; }; this.ensureLogined = function (callback) { if (!that.isLogined) { that.fireEvent("requireLogin", callback); } else { callback(that.current); } }; this.defaultProfile = { autoRefreshDelay: 5, hideNotInListTrain: false, hideNoTicket: false, autoWaitToSell: false, selectSeatFirst: true, tryBottomSeat: true, autoSubmitEnabled: true, partialSubmitEnabled: false, depDate: utility.formatDate(data.defaultDate), submitStuAsCommon: false, selectedSeatType: [], selectedTrain: [], dateloop: [], passengers: [], hideNoSeat: false }; this.forceProfile = { autoSubmitEnabled: true, autoWaitToSell: false }; Object.defineProperty(this, "current", { get: function () { return session; }, set: function (v) { if (session === v) return; if (v) { if (v.username !== currentuser) { sessionStorage["_currentuser"] = v.username; sessionStorage["_currentuserName"] = v.dispname; sessionStorage.removeItem("_passenger"); passengers = null; } if (!v.options) v.options = {}; session = v; } else { that.resetProfile(); } that.fireEvent("sessionChanged"); that.fireEvent("currentProfileChanged"); if (that.isLogined) { //获得用户json att ajax.sendPost("login/checkUser", "login/init", null, "json", function () { var m = this.model; if (!m && !m.status && !m.data && m.data.flag) { ajax.userAtts = m.data.attributes; } }, function () { }); keepAlive.start(); } else { keepAlive.stop(); } } }); Object.defineProperty(this, "isLogined", { get: function () { return session && session.username || false; } }); Object.defineProperty(this, "currentProfile", { get: function () { return session && session.currentProfile; }, set: function (value) { session.currentProfile = $.extend({}, JSON.parse(JSON.stringify(that.defaultProfile)), value, JSON.parse(JSON.stringify(that.forceProfile))); that.fireEvent("currentProfileChanged"); that.save(); } }); Object.defineProperty(this, "recentStations", { get: function () { return (that.current.recentStations || []).map(function (c) { return data.cities[c]; }); }, set: function (value) { var clist = that.current.recentStations || []; if (clist[0] && clist[0] == value) return; for (var i = 0; i < clist.length; i++) { if (clist[i] == value) { clist.splice(i, 1); break; } clist.unshift(value); that.current.recentStations = value; that.fireEvent("recentCityChanged"); that.save(); } } }); document.addEventListener("loginInvalid", function () { if (that.isLogined) { document.dispatchEvent(new CustomEvent("userForcedOut")); that.fireEvent("userForcedOut"); } that.resetProfile(); }); //主动检测 if (typeof (currentuserName) === "undefined") { that.checkLoginState(function (data) { if (data.logined) { that.loadProfile(data.realName, data); } else { that.loadProfile(""); } }); } else this.loadProfile(currentuserName || ""); return this; }; SessionMgr.prototype = Object.create(ev); SessionMgr.constructor = SessionMgr; module.exports = new SessionMgr(); });