/// /// /// var queryStatics = null, currentProfile = null; var tagOtnMap = { 9: "SWZ", "P": "TZ", "M": "ZY", "O": "ZE", "6": "GR", "4": "RW", "3": "YW", "2": "RZ", "1": "YZ", "0": "WZ", "*": "QT" }; var tagRevMap = _.invert(tagOtnMap); var seatNameMap = { "商务座": "SWZ", "特等座": "TZ", "一等座": "ZY", "二等座": "ZE", "高级软卧": "GR", "软卧": "RW", "硬卧": "YW", "软座": "RZ", "硬座": "YZ", "无座": "WZ" }; var seatNameInvMap = _.invert(seatNameMap); var $doc = $(document); var ISLOGINED = $.trim($("#regist_out").text()) != "注册"; var currentUser; //#region 切换声音 unsafeInvoke(function changeAudio() { var audio = new Audio("http://static.liebao.cn/resources/audio/music2.ogg"); audio.loop = true; window.jPlayer = function (cmd) { if (cmd === "play") audio.play(); else if (cmd === "stop") audio.pause(); }; }); //#endregion //#region 拦截事件 unsafeInvoke(function () { var w = window, q = jQuery; var dataExchange, dispatchEventBody = function (action, detail) { document.body.dispatchEvent(new CustomEvent("$_$", { detail: { action: action, detail: detail } })); }, addEventListener = function (action, callback) { document.addEventListener("$_$", function (e) { if (e && e.detail && e.detail.action && e.detail.action === action) callback.call(e.detail.detail || {}); }); }; addEventListener("dr", function () { dataExchange = this; }); addEventListener("eval", function () { dispatchEventBody("dr", eval(this.code)); }); var dataFilter = function (data) { dataExchange = null; dispatchEventBody("dd", data); data = dataExchange || data; return data; }; w.dhtmlx.modalbox.hide = (function (o) { return function () { o.apply(this, arguments); dispatchEventBody("qf"); }; })(w.dhtmlx.modalbox.hide); q(document).ajaxComplete(function (e, xhr, d) { if (d.url.indexOf("autoSubmitOrderRequest") != -1) { if (!d.data) return; var data = (function (arg) { arg = arg.split('&'); var target = {}; arg.forEach(function (s) { var x = s.split('='); target[x[0]] = x[1]; }); return target; })(d.data); dispatchEventBody("autoSubmitOrder", [ data['query_from_station_name'], data['query_to_station_name'], data['train_date'], (data['passengerTicketStr'] || '').split('_').length - 1, '', data['purpose_codes'] ]); } if (d.url.indexOf("leftTicket/query") !== -1) dispatchEventBody("qr", { opt: { url: d.url, data: d.data, type: d.type }, text: xhr.responseText, headers: xhr.getAllResponseHeaders() }); }).ajaxSend(function (e, xhr, d) { if (d.url.indexOf("leftTicket/query") !== -1) dispatchEventBody("qs", { opt: { url: d.url, data: d.data, type: d.type } }); }).ajaxError(function (e, xhr, d) { if (d.url.indexOf("leftTicket/query") !== -1) { var status = xhr.statusText; if ("timeout" == status || "No Transport" == status || "abort" == status) return; dispatchEventBody("qe", { opt: { url: d.url, data: d.data, type: d.type }, text: xhr.responseText, headers: xhr.getAllResponseHeaders() }); } }); q.ajaxSetup({ accepts: { json: "text/json, application/json" }, contents: { json: /json/ }, converters: { "text json": function () { return dataFilter(jQuery.parseJSON.apply(this, jQuery.makeArray(arguments))); } } }); w.refreshImg = (function (o) { return function (dlg, type, id) { o.apply(this, $.makeArray(arguments)); if (id === 'img_rand_code2') dispatchEventBody("autoSubmit"); else if (dlg === "login") dispatchEventBody("login"); //检测验证码 id = id || "img_rand_code"; var ele = document.getElementById(id); var fun = function () { dispatchEventBody("randCodeLoaded", id); }; if (ele) { if (ele.naturalHeight > 0) { fun(); } else { $(ele).load(function () { fun(); }); } } }; })(w.refreshImg); q(document).on("click", "#relogin_close", function () { dispatchEventBody("loginCancelled"); }); w.loginAsyn = (function (o) { return function (name) { o.apply(this, $.makeArray(arguments)); dispatchEventBody("loginSuccess", { name: name }); }; })(w.loginAsyn); q.fn.val = (function (o) { return function () { var data = $.makeArray(arguments); var result = o.apply(this, data); if ($.inArray(this.attr("id"), ['train_date', 'fromStation', 'toStation']) !== -1 && data.length > 0 && data[0]) { var e = document.createEvent("UIEvents"); e.initUIEvent("change", true, true); this.each(function () { this.dispatchEvent(e); }); } return result; }; })(q.fn.val); if (w.myJpopup) w.myJpopup.startOrHiden = (function (o) { return function () { if (!w.myJpopup.isShow()) dispatchEventBody("prompt"); else dispatchEventBody("promptDismiss"); o.apply(this, $.makeArray(arguments)); }; })(w.myJpopup.startOrHiden); if (w.renderCheckTickInfo) { w.renderCheckTickInfo = (function (o) { return function (data) { o.apply(this, $.makeArray(arguments)); dispatchEventBody("renderCheckTickInfo"); }; })(w.renderCheckTickInfo); } }); $(document).on("routePage", function () { if (sysConfig.blockVcVerify) { unsafeInvoke(function () { $.ajaxTransport("+*", function (o, oo, xhr) { if (o.url.indexOf("checkRandCodeAnsyn") != -1) { return { send: function (header, callback) { callback(200, 'ok', { json: { "validateMessagesShowId": "_validatorMessage", "status": true, "httpstatus": 200, "data": "Y", "messages": [], "validateMessages": {} } }, {}); }, abort: function () { } }; } }); }); } //if (sysConfig.blockQueueCount) { // unsafeInvoke(function () { // $.ajaxTransport("+json", function (o, oo, xhr) { // if (o.url.indexOf("getQueueCount") != -1) { // return { // send: function (header, callback) { // callback(200, 'ok', { // json: { // "validateMessagesShowId": "_validatorMessage", // "status": true, // "httpstatus": 200, // "data": { "count": "25", "ticket": oo.data.leftTicket, "op_2": "false", "countT": "0", "op_1": "true" }, // "messages": [], // "validateMessages": {} // } // }, {}); // }, // abort: function () { } // }; // } // }); // }); //} }); (function () { document.body.addEventListener(evtTag, function (e) { var detail = e.detail; if (!detail) return; $doc.trigger(detail.action, [detail.detail]); }); $(document).on("dispatch", function () { document.dispatchEvent(new CustomEvent(evtTag, { detail: { action: arguments[1], detail: arguments[2] || null } })); }).on("autoSubmitOrder", function () { msg.sendAction("autoSubmitOrder"); }); })(); //#endregion //#region 保持在线 (function () { (function () { var timer = null; $doc.on("sysConfigUpdated", function () { if (!sysConfig) return; //保持在线 if (!sysConfig.keepOnline) { if (timer) { clearInterval(timer); timer = null; } return; } else { log.print("init keep-online timer."); timer = setInterval(function () { $.post("/otn/login/checkUser"); }, 10 * 60 * 1000); } }).trigger("sysConfigUpdated"); })(); })(); //#endregion //#region 登录页面 $(document).bind(EVT_ONLOGINPAGE, function () { //登录页面,自动填充用户名和密码 msg.on("fillUserInfo", function () { if (this.name) $("#username").val(this.name); if (this.pwd) { $("#password").val(this.pwd); document.getElementById("randCode").focus(); } else { $("#password")[0].focus(); } }); chrome.runtime.sendMessage({ action: "getLastUser" }, function (m) { if (m.name) $("#username").val(m.name); if (m.pwd) { $("#password").val(m.pwd); $("#randCode")[0].focus(); } else { $("#password")[0].focus(); } }); $("#randCode").keyup(function () { if (sysConfig.autoLoginAfterVerifyCode && this.value.length >= 4) { var links = $("#loginSub, #loginSubAsyn"); if (links.length) { msg.sendAction("notify", { title: "提示", message: "已尝试自动登录,等待12306回应。如卡太久,请重试一次。", iconUrl: "/icons/icon_128.png" }); links.nativeClick(10); } } }); $("#loginSub, #loginSubAsyn").on("click", function () { var data = { tempUser: $("#username").val(), tempPwd: $("#password").val() }; if (!data.tempUser || !data.tempPwd) return; chrome.runtime.sendMessage({ action: "logTempUser", detail: data }); }); $(document).bind("login", function () { chrome.runtime.sendMessage({ action: "pageInitCall", detail: { page: "onLoginPage" } }); }).bind("loginCancelled", function () { chrome.runtime.sendMessage({ action: "pageInitCall", detail: { page: "onQueryPage", logined: false } }); }).bind("loginSuccess", function (e, data) { var name = data.name; log.print(data); chrome.runtime.sendMessage({ action: "logTempUserSuccess", detail: { name: name } }); chrome.runtime.sendMessage({ action: "pageInitCall", detail: { page: "onQueryPage", logined: true } }); ISLOGINED = true; $(document).trigger("userLogined"); $(document).trigger(EVT_ONMAINPAGE); }); }); //#endregion //#region 查询 $(document).bind(EVT_ONQUERYPAGE, function () { var suspendStationUpdate = false; var firstRun = true; var isResign = false; var newProfile = null; //检测改签 (function () { var data = evalCode.eval("[tour_flag, ClickWho]"); isResign = data[0] == 'gc'; if (!isResign) return; newProfile = {}; newProfile.fromText = $("#fromStationText").val(); newProfile.fromCode = $("#fromStation").val(); newProfile.toText = $("#toStationText").val(); newProfile.toCode = $("#toStation").val(); newProfile.depDate = $("#train_date").val(); newProfile.studentTicket = data[1] == '0X00'; })(); //用户 (function () { $(document).on("applyUser", function () { if (currentUser.rawPassenger && currentUser.rawPassenger.length) { evalCode.eval("window.passengerAll=" + JSON.stringify(currentUser.rawPassenger) + ",$.renderPassenger();"); } else { evalCode.eval("$.reloadPassenger(), $('#sel-buyer').hide();"); } if (currentUser.options.showMore) { if ($("#show_more").not(".up")) { document.getElementById("show_more").click(); } } else { if ($("#show_more").is(".up")) { document.getElementById("show_more").click(); } } }); })(); //配置文件 (function () { var processProfile = function () { currentProfile.selectedTrain = _.map(currentProfile.selectedTrain, function (e, k) { return tagMap[e] || e; }); }; $(document).on("applyProfile", function () { suspendStationUpdate = true; processProfile(); if (currentProfile.fromText) $("#fromStationText").val(currentProfile.fromText); if (currentProfile.fromCode) $("#fromStation").val(currentProfile.fromCode); if (currentProfile.toText) $("#toStationText").val(currentProfile.toText); if (currentProfile.toCode) $("#toStation").val(currentProfile.toCode); if (new Date() < new Date(currentProfile.depDate)) $("#train_date").val(currentProfile.depDate); //其它的东西初始化 //已选择车次 if (firstRun) $(document).trigger("restoreTrain", [currentProfile.selectedTrain]); //已选择席别 if (firstRun) $doc.trigger("restoreSeat", [currentProfile.selectedSeatType]); //已选择联系人 if (firstRun) $doc.trigger("restorePassenger", [currentProfile.passengers]); //已选择备选日期 if (firstRun) $doc.trigger("restoreDateLoop", [currentProfile.dateloop]); //其它选项-预选模式,自动提交 if (firstRun) $doc.trigger("restoreMisc"); suspendStationUpdate = false; }); //注册响应消息 msg.on("getStationInfo", function (response) { response({ detail: getCurrentStationInfo() }); }); //如果是首页进入的,那就保存当前状态 if (evalCode.eval("window.page_show_flag") == 'index') { chrome.runtime.sendMessage({ action: "stationInfoUpdate", detail: getCurrentStationInfo() }); } //当配置发生变化时发送消息通知。 $doc.on("change", "#fromStationText, #fromStation, #toStationText, #toStation, #train_date", function () { if (suspendStationUpdate) return; chrome.runtime.sendMessage({ action: "stationInfoUpdate", detail: getCurrentStationInfo() }); }); //回填状态 chrome.runtime.sendMessage({ action: "getCurrentUser" }, function (message) { currentUser = message.detail; currentProfile = _.extend(currentUser.currentProfile, _.omit(newProfile, "depDate")); $(document).trigger("applyUser"); $(document).trigger("applyProfile"); firstRun = false; //继续初始化 msg.on("profileChanged", function () { currentProfile = _.extend(this, _.omit(newProfile, "depDate")); currentProfile = this; processProfile(); $(document).trigger("applyProfile"); $(document).trigger("profileChanged"); }); msg.on("profileReload", function () { $("#clearAll")[0].click(); firstRun = true; currentProfile = this; processProfile(); $(document).trigger("applyProfile"); $(document).trigger("profileChanged"); }); }); })(); //备选日期 (function () { $(document).on("restoreDateLoop", function (e, dateloop) { suspendStationUpdate = true; //var html = []; $.each(dateloop, function () { //html.push("{{DATE}}".replace(/{{DATE}}/g, this)); var check = $("#date-list input[value='" + this + "']:not(:checked)"); check.length && check[0].click(); }); //$("#prior_date").find("span:gt(0)").remove().end().append(html.join("")).find("span a").click(removeHandle); $("#prior_date").find("span:gt(0) a").click(removeHandle); //evalCode.eval("window.rqChecked=[" + _.map(dateloop, function(d) { // return "'" + d + "'"; //}).join(", ") + "]"); suspendStationUpdate = false; }); //当用户选择日期时,发送消息到后台 $("#sel-date :checkbox").click(function () { if (suspendStationUpdate) return; suspendStationUpdate = true; var v = this.value; if (this.checked) { msg.sendAction("addDateLoop", v); $("#prior_date span[name=" + v + "] a").click(removeHandle); } else { msg.sendAction("removeDateLoop", v); } suspendStationUpdate = false; }); var removeHandle = function () { var span = $(this).closest("span"); var dt = span.attr("name"); msg.sendAction("removeDateLoop", dt); }; msg.on("removeDateLoop", function () { $("#prior_date span[name=" + this + "] a")[0].click(); }); msg.on("addDateLoop", function () { var check = $("#date-list input[value='" + this + "']:not(:checked)"); check.length && check[0].click(); }); })(); //候选席别 (function () { $(document).on("restoreSeat", function (e, seats) { suspendStationUpdate = true; if (seats.length > 5) { msg.sendAction("pageNotification", { id: "seatNumOutTip", title: "提示", message: "由于12306的自动刷票不支持针对5个以上的席别进行检测,因此超出的部分席别将会失效。请使用订票助手的自动刷票。" }); } $.each(seats.slice(0, 5), function () { var check = $("#sel-seat input[value='" + tagOtnMap[this] + "']:not(:checked)"); check.length && check[0].click(); }); $("#prior_seat").find("span:gt(0) a").click(removeHandle); suspendStationUpdate = false; }); //当用户选择席别时,发送消息到后台 $("#sel-seat :checkbox").click(function () { var v = this.value; var code = tagRevMap[v]; if (this.checked) { if (!suspendStationUpdate) msg.sendAction("addSeat", code); $("#prior_seat span[name='" + seatNameInvMap[v] + "'] a").click(removeHandle); } else { if (!suspendStationUpdate) msg.sendAction("removeSeat", code); } }); var removeHandle = function () { var span = $(this).closest("span"); var name = span.attr("name"); var code = tagRevMap[seatNameMap[name]]; if (!suspendStationUpdate) msg.sendAction("removeSeat", code); }; msg.on("removeSeat", function () { suspendStationUpdate = true; $("#prior_seat span[name='" + seatNameInvMap[tagOtnMap[this]] + "'] a")[0].click(); suspendStationUpdate = false; }); msg.on("addSeat", function () { if ($("#prior_seat span").length >= 6) { msg.sendAction("pageNotification", { id: "seatNumOutTip", title: "提示", message: "由于12306的自动刷票不支持针对5个以上的席别进行检测,因此超出的部分席别无法应用到12306自带刷票中。请使用订票助手的自动刷票。" }); return; } suspendStationUpdate = true; var check = $("#sel-seat input[value='" + tagOtnMap[this] + "']:not(:checked)"); check.length && check[0].click(); suspendStationUpdate = false; }); msg.on("seatReset", function () { suspendStationUpdate = true; $("#prior_seat span:gt(0) a").click(); $(document).trigger("restoreSeat", [this]); suspendStationUpdate = false; }); })(); //联系人 (function () { var addFailedTip = function () { msg.sendAction("pageNotification", { id: "addFailedTip", title: "提示", message: "添加联系人失败,请先将联系人保存到常用联系人中。" }); }; var findSpanForPassenger = function (p) { var lic = $("#buyer-list li"); var data = p.name + "(" + p.typename + ")(" + p.id + ")"; return $(_.find($.makeArray(lic), function (e) { return $.trim($(e).text()) === data; })); }; $(document).on("restorePassenger", function (e, passengers) { suspendStationUpdate = true; $.each(passengers, function () { var check = findSpanForPassenger(this).find(":checkbox"); if (check.length) { if (!check.is(":checked")) check[0].click(); } else { //没有找到?可能是新增的。。 var rawP = toRawPassenger(this); evalCode.eval("(function(){window.passengerAll.push(" + JSON.stringify(rawP) + "); $.renderPassenger();})()"); check = findSpanForPassenger(this).find(":checkbox"); if (check.length) { if (!check.is(":checked")) check[0].click(); } else { addFailedTip(); } } }); $("#setion_postion").find("span:gt(0) a.close").click(removeHandle); suspendStationUpdate = false; }); //当用户选择时,发送消息到后台 $(document).on("click", "#buyer-list :checkbox", function () { if (suspendStationUpdate) return; suspendStationUpdate = true; var li = $(this).closest("li"); var info = li.getTrimedText(); var data = /^(.*?)\(([^\)]+)\)\(([^\)]+)\)$/.exec(info); if (this.checked) { msg.sendAction("addPassenger", { name: data[1], typename: data[2], id: data[3] }); $("#setion_postion span:gt(0):last a").click(removeHandle); } else { msg.sendAction("removePassenger", { name: data[1], typename: data[2], id: data[3] }); } suspendStationUpdate = false; }); var removeHandle = function () { var span = $(this).closest("span"); var name = span.attr("name"); var data = /^(.*?)\(([^\)]+)\)\(([^\)]+)\)$/.exec(name); msg.sendAction("removePassenger", { name: data[1], typename: data[2], id: data[3] }); }; msg.on("removePassenger", function () { var data = this.name + "(" + this.typename + ")(" + this.id + ")"; $("#setion_postion span[name='" + data + "'] a.close")[0].click(); }); msg.on("addPassenger", function () { var data = this.name + "(" + this.typename + ")(" + this.id + ")"; var check = findSpanForPassenger(this).find(":checkbox"); if (check.length) { if (!check.is(":checked")) check[0].click(); } else { //没有找到?可能是新增的。。 var rawP = toRawPassenger(this); evalCode.eval("window.passengerAll.push(" + JSON.stringify(rawP) + "); $.renderPassenger();"); check = findSpanForPassenger(this).find(":checkbox"); if (check.length) { if (!check.is(":checked")) check[0].click(); } else { addFailedTip(); } } }); })(); //优选车次 (function () { var notSupportNotify = function () { //msg.sendAction("pageNotification", { id: "noRegSupport", title: "提示", message: "由于12306的自动刷票不支持高级过滤规则,因此部分车次无法添加到列表中。但是订票助手会自动帮你处理兼容性,因此刷票不会受到影响。" }); }; $(document).on("restoreTrain", function (e, trains) { suspendStationUpdate = true; var html = []; var foundExtra = false, trainFiltered = []; $.each(trains, function () { var tcode = (this + '').toUpperCase(); if (!tcode) return; if (!/^[A-Z]?\d+$/i.test(tcode)) { foundExtra = true; return; } trainFiltered.push(tcode); html.push("{{TRAIN}}".replace(/{{TRAIN}}/g, tcode)); }); $("#prior_train").find("span:gt(0)").remove().end().append(html.join("")).find("span a").click(removeHandle); evalCode.eval("window.ccSelected=[" + _.map(trainFiltered, function (d) { return "'" + d + "'"; }).join(", ") + "]"); suspendStationUpdate = false; if (foundExtra) { notSupportNotify(); } }); //当用户选择席别时,发送消息到后台 $("#add-train").click(function () { if (suspendStationUpdate) return; suspendStationUpdate = true; var box = $("#prior_train span:gt(0):last"); if (!box) return; msg.sendAction("addTrain", $.trim(box.text())); suspendStationUpdate = false; }); var removeHandle = function () { var span = $(this).closest("span"); msg.sendAction("removeTrain", $.trim(span.text())); }; var findTrainSpan = function (id) { var boxes = $.makeArray($("#prior_train span:gt(0)")); return _.find(boxes, function (b) { return $.trim($(b).text()) == id; }); }; msg.on("removeTrain", function () { var box = findTrainSpan(this); if (!box) return; $(box).find("a")[0].click(); }); msg.on("addTrain", function () { var tcode = (this + '').toUpperCase(); var box = findTrainSpan(tcode); if (box) return; if (!/^[A-Z]?\d+$/i.test(tcode)) { notSupportNotify(); return; } $("#prior_train").append("{{TRAIN}}".replace(/{{TRAIN}}/g, tcode)) .find("span:last a").click(removeHandle); evalCode.eval("window.ccSelected.push(\"" + this + "\")"); }); })(); //其它杂项 (function () { suspendStationUpdate = true; $doc.on("restoreMisc", function () { $("#_prior").val(currentProfile.selectSeatFirst ? "1" : "2"); $("#autoSubmit:enabled").prop("checked", currentProfile.autoSubmitEnabled); $("#partSubmit:enabled").prop("checked", currentProfile.partialSubmitEnabled); if (!currentProfile.studentTicket) { document.getElementById("sf1").click(); } else { document.getElementById("sf2").click(); } suspendStationUpdate = false; }); var handler = function () { suspendStationUpdate = true; var id = $(this).attr("id"); if (id === 'sf1' || id === 'sf2') { msg.sendAction("miscChanged", { key: "studentTicket", value: document.getElementById("sf2").checked }); } else if (id === '_prior') { msg.sendAction("miscChanged", { key: "selectSeatFirst", value: $(this).val() === '1' }); } else { var key = id === 'autoSubmit' ? "autoSubmitEnabled" : "partialSubmitEnabled"; var value = this.checked; msg.sendAction("miscChanged", { key: key, value: value }); } suspendStationUpdate = false; }; msg.on("miscChanged", function () { if (suspendStationUpdate) return; var id = this.key; var value = this.value; if (id === 'studentTicket') { if (value === document.getElementById("sf2").checked) return; document.getElementById("sf" + (value ? "2" : "1")).click(); } else if (id === 'selectSeatFirst') { value = value ? "1" : "2"; if ($("#_prior").val() === value) return; $("#_prior").val(value); } else if (id === 'partialSubmitEnabled' || id === 'autoSubmitEnabled') { var key = id === 'autoSubmitEnabled' ? "autoSubmit" : "partSubmit"; if (document.getElementById(key).checked === value) return; $("#" + key).prop("checked", value).change(); } }); $("#_prior, #autoSubmit, #partSubmit").change(handler); $("#sf1, #sf2").click(handler); })(); //选项展开状态 (function () { //show_more $("#show_more").click(function () { var a = $(this); msg.sendAction("userOptionChanged", { showMore: a.hasClass("up") }); }); })(); //查询 (function () { var sendStopQueryInfo = function () { msg.sendAction("queryStop", getCurrentStationInfo()); }; msg.on("startQuery", function (r) { log.print("query"); //如果使用系统自己的刷票功能,那就提示 if ($("#query_ticket.btn-disabled").length) { alert("亲,查询按钮还是灰色,咱不着急,稍安勿躁 :-)"); r({ canquery: false }); return; } log.print("正在尝试查票,时间:" + new Date()); if ($("#auto_query:not(:checked)").length && document.getElementById("autoSubmit").disabled == false && currentProfile.autoSubmitEnabled) { $("#auto_query")[0].click(); } if (!document.getElementById("autoSubmit").disabled && currentProfile.autoSubmitEnabled && !document.getElementById("autoSubmit").checked) document.getElementById("autoSubmit").checked = true; suspendStationUpdate = true; if (this.date) { $("#train_date").val(this.date); } if (!this.byAuto) { //这里不需要更新信息了 } currentProfile.byAuto = this.byAuto; var ql = $("#query_ticket"); ql[0].click(); log.print("正在尝试查票,已点击,时间:" + new Date()); var result = ql.hasClass('btn-disabled') || ql.text().indexOf("停止") != -1; r({ canquery: result, sysAuto: ql.text().indexOf("停止") != -1 }); suspendStationUpdate = false; }); msg.on("stopQuery", function () { var ql = $("#query_ticket"); if (ql.text().indexOf("停止") != -1) ql[0].click(); }); $(document).on("prompt", function () { sendStopQueryInfo(); //聚焦 var info = $("#filterRes").text(); msg.sendAction("notify", { iconUrl: "/icons/icon_128.png", title: "灰来约票!", message: "主淫,快来把票推倒啊!" + info }); msg.sendAction("attention"); }).on("autoSubmit", function () { sendStopQueryInfo(); //聚焦 msg.sendAction("notify", { iconUrl: "/icons/icon_128.png", title: "灰来约票!", message: "主淫,快来输入验证码把票推倒啊!" }); msg.sendAction("attention"); setTimeout(function () { document.getElementById("img_rand_code2").focus(); }, 100); }); $("#query_ticket").click(function () { if (suspendStationUpdate) return; var ele = $(this); if (ele.data("suspend")) { ele.removeData("suspend"); return; } $("#train_date").change(); setTimeout(function () { if (ele.text().indexOf("停止") == -1 || ele.hasClass("btn-disabled")) sendStopQueryInfo(); }, 10); }); })(); msg.sendAction("setResignMode", { profile: newProfile }); }); function getCurrentStationInfo() { if (!document.getElementById("fromStationText")) return null; var data = { fromText: $("#fromStationText").val(), fromCode: $("#fromStation").val(), toText: $("#toStationText").val(), toCode: $("#toStation").val(), depDate: $("#train_date").val() }; return data; } //车次预过滤等处理 (function () { var trainData; $doc.on("getTrainFilterData", function (e) { e.result = trainData; }); $doc.on("dd", function (e, d) { var result = d; if (!Array.isArray(result.data) || !result.data.length || !result.data[0].queryLeftNewDTO) return; trainData = { raw: result, rawTrainMap: {}, trainMap: {}, auto: null, nextTime: null }; _.each(result.data, function (t) { var train = { id: t.queryLeftNewDTO.train_no, code: t.queryLeftNewDTO.station_train_code, available: t.queryLeftNewDTO.canWebBuy === 'Y' ? 1 : 0, start: { code: t.queryLeftNewDTO.start_station_telecode, name: t.queryLeftNewDTO.start_station_name, }, from: { code: t.queryLeftNewDTO.from_station_telecode, fromStationNo: t.queryLeftNewDTO.from_station_no, name: t.queryLeftNewDTO.from_station_name, endpoint: t.queryLeftNewDTO.from_station_telecode == t.queryLeftNewDTO.start_station_telecode, time: t.queryLeftNewDTO.start_time }, to: { code: t.queryLeftNewDTO.to_station_telecode, toStationNo: t.queryLeftNewDTO.to_station_no, name: t.queryLeftNewDTO.to_station_name, endpoint: t.queryLeftNewDTO.end_station_telecode == t.queryLeftNewDTO.to_station_telecode, time: t.queryLeftNewDTO.arrive_time }, elapsedTime: { days: t.queryLeftNewDTO.day_difference, total: t.queryLeftNewDTO.lishi }, end: { code: t.queryLeftNewDTO.end_station_telecode, name: t.queryLeftNewDTO.end_station_name, }, ypinfo: t.queryLeftNewDTO.yp_info, ypinfo_ex: t.queryLeftNewDTO.yp_ex, locationCode: t.queryLeftNewDTO.location_code, controlDay: t.queryLeftNewDTO.control_day, supportCard: t.queryLeftNewDTO.is_support_card, saleTime: t.queryLeftNewDTO.sale_time, secureStr: t.secretStr, selltime: null }; var kp = _.pairs(getTicketInfo(t.queryLeftNewDTO.yp_info)); train.price = _.object(_.filter(kp, function (p) { return p[0][0] === '_'; })); train.tickets = _.object(_.filter(kp, function (p) { return p[0][0] !== '_'; })); //起售时间 var selltimem = /(0*(\d+)月0*(\d+)日)?(\d+)\s*点\s*((\d+)分)?\s*起售/i.exec(t.buttonTextInfo.replace(/<.*?>/g, '')); if (selltimem) { train.available = -1; train.selltime = new Date(); train.selltime.setHours(parseInt(selltimem[4])); train.selltime.setMinutes(parseInt(selltimem[6] || "0", 10)); train.selltime.setSeconds(0); if (selltimem[1]) { //带日期 train.selltime.setMonth(parseInt(selltimem[2]) - 1); train.selltime.setDate(parseInt(selltimem[3])); if (train.selltime.getMonth() < new Date().getMonth()) { train.selltime.setFullYear(train.selltime.getFullYear() + 1); } } } trainData.rawTrainMap[train.id] = t; trainData.trainMap[train.id] = train; }); trainData.original = _.values(trainData.trainMap); trainData.available = trainData.original; trainData.trainCodes = _.pluck(trainData.original, "code"); trainData.filtered = []; trainData.include = trainData.available; //执行车次预过滤。过滤内容:出发地,目标地,时间 $(document).trigger("filterTrains", trainData); //处理车次 $(document).trigger("processTrains", trainData); //过滤数据 if (trainData.filtered && trainData.filtered.length) { //从原始数据中删除 var orgMap = _.toMap(result.data, function (e) { return e.queryLeftNewDTO.train_no; }); var filtered = _.map(trainData.filtered, function (t) { return orgMap[t.id]; }); trainData.rawDataFiltered = _.without.apply(null, [result.data].concat(filtered)); result.data = trainData.rawDataFiltered; $doc.trigger("dispatch", ["dr", result]); } //记录可能存在的车次,并按照预定列表过滤后,自动填入候选车次列表中。 if (currentProfile.selectedTrain.length) { var trains = _.pluck(trainData.include, "code"); $doc.trigger("restoreTrain", [trains]); } }); })(); (function () { $(document).bind("qr", function (e, ex) { $doc.trigger("prepareResult"); $doc.trigger("trainListComplete"); }); })(); (function () { var auto; $(document).bind("performAutoSubmit", function (e, ex) { auto = ex; if (!auto) return; evalCode.eval("submitOrderRequest(\"" + auto.data.secureStr + "\", \"" + auto.data.from.time + "\");"); }); })(); //#endregion //#region 显示实际票数 (function () { var queryData; $(document).on("prepareResult", function (e) { if (typeof sysConfig === 'undefined') { $(document).bind("sysConfigUpdated", function () { document.dispatchEvent(new CustomEvent("qr")); }); return; } //如果之前的处理失败了,那么才开始处理 //执行车次预过滤。过滤内容:出发地,目标地,时间 var je = new $.Event("getTrainFilterData"); $doc.trigger(je); if (je.result) { queryData = je.result; } else { var rows = $("#queryLeftTable tr"); queryData = { raw: null, rawTrainMap: {}, trainMap: {}, auto: null, nextTime: null }; rows.each(function () { var tr = $(this); //基本信息分解 var infodiv = tr.find("td:eq(0)>div>div"); var idinfo = infodiv.eq(0).find("a"); if (!idinfo.length) return; var idargs = idinfo.attr("id").split('_'); var tinfo = { id: idargs[0], from: { code: idargs[1] }, to: { code: idargs[2] } }; //额外信息 var exinfo = infodiv.eq(0).find(">span").attr("id").split('_'); tinfo = _.extend(tinfo, { fromStationNo: exinfo[1], toStationNo: exinfo[2], ypinfo: exinfo[3], seatTypes: exinfo[4].split("") }); //余票信息? tinfo.tickets = getTicketInfo(tinfo.ypinfo); var kp = _.pairs(getTicketInfo(tinfo.ypinfo)); tinfo.price = _.object(_.filter(kp, function (p) { return p[0][0] === '_'; })); tinfo.tickets = _.object(_.filter(kp, function (p) { return p[0][0] !== '_'; })); //发到站信息 var sinfo = infodiv.eq(1).find("strong"); tinfo.from.name = $.trim(sinfo.eq(0).text()); tinfo.from.endpoint = sinfo.eq(0).hasClass("start-s"); tinfo.to.name = $.trim(sinfo.eq(1).text()); tinfo.to.endpoint = sinfo.eq(1).hasClass("end-s"); //时间信息 var tminfo = infodiv.eq(2).find("strong"); tinfo.from.time = $.trim(tminfo.eq(0).text()); tinfo.to.time = $.trim(tminfo.eq(1).text()); //是否有效? var cb = tr.find("td:last a"); if (!cb.length) { tinfo.available = 0; var txt = $.trim(tr.find("td:last")); //起售时间 var selltimem = /(0*(\d+)月0*(\d+)日)?(\d+)\s*点\s*((\d+)分)?\s*起售/i.exec(t.buttonTextInfo.replace(/<.*?>/g, '')); if (selltimem) { tinfo.available = -1; tinfo.selltime = new Date(); tinfo.selltime.setHours(parseInt(selltimem[4])); train.selltime.setMinutes(parseInt(selltimem[6] || "0", 10)); tinfo.selltime.setSeconds(0); if (selltimem[1]) { //带日期 tinfo.selltime.setMonth(parseInt(selltimem[2]) - 1); tinfo.selltime.setDate(parseInt(selltimem[3])); if (tinfo.selltime.getMonth() < new Date().getMonth()) { tinfo.selltime.setFullYear(tinfo.selltime.getFullYear() + 1); } } } } else { tinfo.available = 1; tinfo.secureStr = /\(['"](.*?)['"]\)/.exec(cb.attr("onclick"))[1]; } tr.data("ticket", tinfo); queryData.trainMap[tinfo.id] = tinfo; }); queryData.original = _.values(queryData.trainMap); queryData.available = queryData.original; queryData.trainCodes = _.pluck(queryData.original, "code"); queryData.filtered = []; queryData.include = queryData.available; $(document).trigger("filterTrains", queryData); //处理车次 $(document).trigger("processTrains", queryData); if (queryData.filtered && queryData.filtered.length) { //从原始数据中删除 _.each(queryData.filtered, function () { var tr = $("#ticket_" + this.id); tr.remove(); }); } } if (sysConfig.showRealSeatCount) { _.each(queryData.original, function (train) { $.each(train.tickets, function (key, value) { if (key[0] === "_") return; var price = train.price["_" + key]; var td = $("#" + tagOtnMap[key] + "_" + train.id); var text = value == 0 ? "无" : value; if (value) { td.addClass("t-num"); } if (price && sysConfig.showTicketPrice) text += "
" + (sysConfig.appendPriceUnit ? "¥" : "") + (price / 10) + ""; td.html(text); }); }); } }); })(); $doc.bind(EVT_ONQUERYPAGE, function () { //randCode2 $(document).on("keyup", "#randCode2", function () { if (!this.value || this.value.length < 4 || sysConfig.otnAutoConfirmOrderDelay < 0) { return; } if ($("#qr_submit.btn92s").nativeClick(sysConfig.otnAutoConfirmOrderDelay).length) { msg.sendAction("notify", { title: "提示", message: "已自动提交,等待12306回应。如卡太久,请重试一次。", iconUrl: "/icons/icon_128.png" }); } }).bind("autoSubmit", function () { setTimeout(function () { $("#randCode2").nativeFocus(); }, 500); }); }); //#endregion //#region 提交页面 $doc.on("renderCheckTickInfo", function () { if (sysConfig.otnAutoConfirmOrderDelay >= 0) { setTimeout(function () { if ($("#qr_submit_id.btn92s").nativeClick().length) { msg.sendAction("notify", { title: "提示", message: "已自动提交,等待12306回应。如卡太久,请重试一次。", iconUrl: "/icons/icon_128.png" }); } else { msg.sendAction("notify", { title: "提示", message: "未能帮你自动提交,请尽快手动提交。", iconUrl: "/icons/icon_128.png" }); } }, sysConfig.otnAutoConfirmOrderDelay); } }); $(document).bind(EVT_ONSUBMITPAGE, function () { var stat = null; var enableSubmitOrder = false; var info = evalCode.eval("window.ticketInfoForPassengerForm"); unsafeInvoke(function up() { // $.fn.query_passenger = (function (o) { // return function () { // o.apply(this, $.makeArray(arguments)); // document.dispatchEvent(new CustomEvent("query_passenger")); // return this; // }; // })($.fn.query_passenger); //document.addEventListener("sf", function () { // $("div.tj_btn button:last")[0].click(); // }); $(document).ajaxComplete(function (e, xhr, s) { var x = new CustomEvent("ajax", { detail: { url: s.url, status: xhr.status, resp: xhr.responseText, data: s.data, type: s.type } }); document.dispatchEvent(x); }); }); //是否有学生票? var pas, hasStudent, canStudent; var initPassengerSelect = function () { pas = (stat && stat.auto && stat.auto.passengers) || (currentProfile && currentProfile.passengers); if (!pas) return; hasStudent = _.findWhere(pas, { type: "3" }); canStudent = _.findWhere(info.limitBuySeatTicketDTO.ticket_type_codes, { id: "3" }); _.each(pas, function (e) { e.key = e.name + "_" + e.idtype + "_" + e.id; }); if (!canStudent) { _.each(pas, function (e) { e.type = "1"; }); hasStudent = false; } selectPassenger(); }; var selectPassenger = function () { if ((info.purpose_codes == "0X00" || (hasStudent && canStudent)) && !$("#normal_passenger_id li").length) { //还没有添加成功 var x = setInterval(function () { if ($("#normal_passenger_id li").length) { clearInterval(x); selectPassenger(); } }, 300); } else { //选择 if (info.tour_flag != 'gc') { if (info.purpose_codes === "0X00" || hasStudent) { $("#show_more_passenger_id")[0].click(); $.each(pas, function () { $("input:checkbox[id^='normalPassenger_" + this.key + "']")[0].click(); }); } else { var needAdd = false; $.each(pas, function () { //if (this.save) { //手动加的 if (needAdd) $("div.add-per > span")[0].click(); else { needAdd = true; } var tr = $("#ticketInfo_id tr:not(.tips):last"); tr.find("td:eq(2) select").val(this.type); tr.find("td:eq(3) input").val(this.name); tr.find("td:eq(4) select").val(this.idtype); tr.find("td:eq(5) input").val(this.id); tr.find("td:last :checkbox").prop("checked", this.save); //} else { // var ck = $("#" + this.name + this.idtype + this.id + " :checkbox"); // if (!ck.length) return; // ck.click(); //} }); } } //选择席别 if (stat && stat.auto) $("select[id^=seatType_]").val(stat.auto.seat === '0' ? '1' : stat.auto.seat); if (pas && pas.length) { setTimeout(function () { document.getElementById("randCode").focus(); }, 500); } } }; //自动提交? msg.on("enableSubmitOrder", function () { enableSubmitOrder = true; $("#randCode").keyup(); }); $("#randCode").keyup(function () { if (!enableSubmitOrder) return; if (sysConfig.autoSubmitAfterVerifyCode && this.value.length >= 4) { if ($("#submitOrder_id").nativeClick(1).length) { msg.sendAction("notify", { title: "提示", message: "已自动提交,等待12306回应。如卡太久,请重试一次。", iconUrl: "/icons/icon_128.png" }); } } }); $("#submitOrder_id").click(function () { sysConfig.autoSubmitAfterVerifyCode && $("#qr_submit_id:visible").nativeClick(1); }); document.addEventListener("ajax", function (e) { var i = e.detail; if (i.url.indexOf("method=getQueueCount") === -1) return; setTimeout(function () { var btns = parent.$("#queue_note").closest(".ui-dialog").find("button"); for (var j = 0; j < btns.length; j++) { if ($.trim(btns.eq(j).text()).replace(/\s/g, "") === "确定") { btns[j].click(); } } }, 1000); }); //报告车次参数 (function () { var data = { date: new Date(info.orderRequestDTO.train_date.time).format("yyyy-MM-dd"), from: info.orderRequestDTO.from_station_telecode, to: info.orderRequestDTO.to_station_telecode, td: info.orderRequestDTO.train_no, code: info.purpose_codes, tcode: info.station_train_code }; chrome.runtime.sendMessage({ action: "reportSubmitInfo", detail: data }); })(); var getLastAuto = function () { chrome.runtime.sendMessage({ action: "getLastAutoData" }, function (m) { stat = m; initPassengerSelect(); }); }; var getCurrentUser = function () { chrome.runtime.sendMessage({ action: "getCurrentUser" }, function (message) { currentProfile = message.detail.currentProfile; getLastAuto(); }); }; getCurrentUser(); }); //#endregion //#region 路由函数 $doc.bind("routePage", function () { var path = location.pathname.slice(5); var search = location.search.slice(1); var onValidPage = false; var dispatchEvent = function (evt) { onValidPage = true; var username = ISLOGINED ? $.trim($("#login_user").text()) : ""; chrome.runtime.sendMessage({ action: "pageInitCall", detail: { page: evt, logined: ISLOGINED, username: username } }); $(document).trigger(evt); }; if (path === "login/init") { dispatchEvent(EVT_ONLOGINPAGE, true); } if (path === '' || path === 'index/init') { if (ISLOGINED) { var name = $("#login_user").getTrimedText(); chrome.runtime.sendMessage({ action: "logTempUserSuccess", detail: { name: name } }); } //dispatchEvent(EVT_ONMAINPAGE); } if (path === 'leftTicket/init') { if (!ISLOGINED) $(document).trigger(EVT_ONLOGINPAGE); dispatchEvent(EVT_ONQUERYPAGE); } if (path === "confirmPassenger/initDc" || path === "confirmPassenger/initGc" || path === "confirmPassenger/initWc") { //订单页 dispatchEvent(EVT_ONSUBMITPAGE); } //没有操作? if (!onValidPage) { chrome.runtime.sendMessage({ action: "onUnvalidPage" }); } }); //#endregion //#region BUG (function () { var executed = false; $(function () { executed = true; }); if (document.readyState === "complete") { if (!executed) $.ready(); } else { var callback = function () { if (document.readyState !== "complete") return; clearInterval(timer); if (!executed) $.ready(); }; var timer = setInterval(callback, 100); } })(); //#endregion