var RunQuery = { init: function() { if ($('#runquery_page').length == 0) { return false; } var maxDay = (new Date()).addDays(19); Public.formatString = 'M月d日'; Public.setDate(maxDay); Public.calendar.checkCallback = RunQuery.dateChangeCallback; Public.checkLogin(RunQuery.run, RunQuery.run, RunQuery.run); $('#filter_ok').on('click', function() { Public.hideInnerPage('filter'); $('#query_form [name=filters]').val($('#filter_form').serialize()); RunQuery.setFilterCond(); RunQuery.hisUpdata(); }); $('#check_left,#check_right').on('click', function() { RunQuery.hisUpdata(); }); $('#filter_cancel').on('click', function() { Public.hideInnerPage('filter'); var bak = $('#query_form [name=filters]').val(), querys = bak.split('&'); Query.setFilter(querys); }); $('#filter_btn').on('click', function() { Public.showInnerPage('filter'); }); $('#filter_cancel').on('click', function() { Public.hideInnerPage(); }); $('[data-fn="buy"]').live('click', function() { var train = $(this).attr('data-traincode'), seat = $(this).attr('data-seatcode'); if (seat == '0' && $('[data-traincode="' + train + '"][data-seatcode="' + seat + '"]').length > 0) { seat = '1'; } sessionStorage.setItem(Public.user + 'curBuy', JSON.stringify(RunQuery.trainData.trainMap[train])); sessionStorage.setItem(Public.user + 'curBuySeat', seat); if (Public.isLogin) { location.href = 'perfect.html'; } else { Public.alert('还未登录,请登陆后购票', function() { location.href = 'login.html?t=submitorder'; }); } }); $('#autoTipBtn').live('click', function() { if (Public.isLogin) { RunQuery.startRef(); } else { window.location.href = 'login.html'; } }); $('#refresh_end').live('click', function() { RunQuery.refStop(); }); }, run: function() { Query.getPassenger(); RunQuery.getQueryData(); if (!RunQuery.curData) { window.location.href = 'query.html'; return false; } RunQuery.setFilter(); RunQuery.queryTicket(); Query.filterBind(); }, curData: null, getQueryData: function() { if (!!Public.his.queryObjs[Public.his.querys[0][0]]) { RunQuery.curData = Public.his.queryObjs[Public.his.querys[0][0]]; } }, setFilter: function() { Query.setFilter(RunQuery.curData['filters'].split('&')); $('.station_title strong').html(RunQuery.curData['startname'] + '→' + RunQuery.curData['endname']); $('#query_form [name=startname]').val(RunQuery.curData['startname']); $('#query_form [name=startcode]').val(RunQuery.curData['startcode']); $('#query_form [name=endname]').val(RunQuery.curData['endname']); $('#query_form [name=endcode]').val(RunQuery.curData['endcode']); $('#query_form [name=type]').val(RunQuery.curData['type']); $('#query_form [name=filters]').val(RunQuery.curData['filters']); var date = new Date(RunQuery.curData['start_date'].replace(/\-/g, '/')); $('#start_date').html(date.format('M月d日') + ' ' + date.day(3)); $('#start_date_val').val(date.format('yyyy-MM-dd')); Public.calendar.setCurDate(date); RunQuery.setFilterCond(); }, queryTicket: function() { var loading = Public.showLoading('正在查票'), data = { "leftTicketDTO.train_date": RunQuery.curData.start_date, "leftTicketDTO.from_station": RunQuery.curData.startcode, "leftTicketDTO.to_station": RunQuery.curData.endcode, "purpose_codes": RunQuery.curData.type == "2" ? "0X00" : "ADULT" }; // (url, returnType, postdata, refer, headers) // bootStrap.get("leftTicket/queryT", "json", data, "leftTicket/init").done(function(json) { // Public.hideLoading(loading); // if (json["status"] == true && json["httpstatus"] == 200) { // if (json['data'].length > 0) { // RunQuery.formatJson(json); // RunQuery.formatList(); // } // } else if (!json["status"] && !!json["messages"]) { // Public.alert(json["messages"][0] || '未知错误'); // } else { // Public.alert('未知错误'); // } // }).fail(function(xhr, type) { // console.log(xhr, type); // Public.hideLoading(loading); // }); cn12306.queryTicket(data,function(json) { Public.hideLoading(loading); if (json["status"] == true && json["httpstatus"] == 200) { if (json['data'].length > 0) { RunQuery.formatJson(json); RunQuery.formatList(); } } else if (!json["status"] && !!json["messages"]) { Public.alert(json["messages"][0] || '未知错误'); } else { Public.alert('未知错误'); } },function(xhr, type) { console.log(xhr, type); Public.hideLoading(loading); }); }, formatList: function() { // var lists = RunQuery.trainData.trainMap, var lists = RunQuery.trainData.train, html = '', obj = {}; if (RunQuery.trainData['isMaintain']) { lists = RunQuery.trainData.trainMap; } for (var k in lists) { obj = lists[k]; html += '
  • '; /*第1行*/ html += '
    '; html += '' + obj["code"] + ''; html += '' + obj["from"]["time"] + ''; html += ''; if (obj["from"]["code"] == obj["start"]["code"]) { html += ''; } html += obj["from"]["name"] + ''; html += '
    '; /*第2行*/ html += '
    '; ls = obj["elapsedTime"]['total'].split(':'); html += '' + (!!ls[0] ? ls[0] + '小时' : '') + (!!ls[1] ? ls[1] + '分' : '0分') + ''; html += ''; html += obj["to"]["time"] + ''; html += '' if (obj["to"]["code"] == obj["end"]["code"]) { html += ''; } html += obj["to"]["name"] + ''; html += '
    '; /*输出席别*/ for (var i = 0; i < obj['ticketMapSort'].length; i++) { if (obj['ticketMapSort'][i]["count"] == 0 && !RunQuery.trainData['isMaintain']) { continue; } html += '
    '; if (obj['ticketMapSort'][i]["count"] == '有') { html += ''; } else { html += '' + obj['ticketMapSort'][i]["count"] + ''; html += ''; } if (!RunQuery.trainData['isMaintain']) { html += '抢票'; } else { html += '维护'; } html += ''; html += '' + obj['ticketMapSort'][i]['name'] + ''; html += '' + (obj['ticketMapSort'][i]['price'] / 10) + '元'; html += '
    '; }; html += '
  • '; }; $('#train_list').html(html); $('.station_title span').html('共 ' + $('#train_list li').length + ' 趟列车'); if (!RunQuery.trainData['isMaintain'] && Object.keys(RunQuery.trainData.train).length == 0) { RunQuery.showRefresh(); } else if (!RunQuery.trainData['isMaintain'] && RunQuery.refresh) { Client.refreshSuccess(); RunQuery.refStop(); RunQuery.autoSubmit(); } else { $('#autoTip').hide(); } }, autoSubmit: function() { $('#train_list li [data-fn="buy"]').eq(0).click(); }, getTicketInfo: function(v) { var data = [], info = v.indexOf("#") === -1 ? v : /getSelected\(['"](.*?)['"]\)/i.exec(v)[1].split('#')[11], match = info.match(/([A-Z\d])0*?([\*\d]{5})0*?(\d{4})/gi); for (var j in match) { var m = /([A-Z\d])0*?([\*\d]{5})0*?(\d{4})/i.exec(match[j]); var sc = m[1]; var sp = m[2][0] == '*' ? null : parseInt(m[2], 10); var st = parseInt(m[3], 10); var seat = { code: sc, name: Util.toSeatTypeName(sc), price: sp }; if (st < 3000) { seat.count = st; //TODO 二等软座提交是否和二等座一样都用的MO? //一等软座 7, 二等软座 8 if (sc === "7") { data.push({ code: 'M', name: Util.toSeatTypeName('M'), price: sp, count: st }); } else if (sc === "8") { data.push({ code: 'O', name: Util.toSeatTypeName('O'), price: sp, count: st }); } else { data.push(seat); } } else { seat.count = st - 3000; seat.code = '0'; seat.name = "无座"; data.push(seat); } }; return data; }, trainData: null, formatJson: function(data) { if (!Array.isArray(data['data']) && !data['data'].length) { return null; } var lists = data['data'], train, kp, selltimem, trainData = { raw: data, rawTrainMap: {}, trainMap: {}, codeMap: {}, auto: null, nextTime: null }; for (var i = 0; i < lists.length; i++) { t = lists[i]; 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, "date": t["queryLeftNewDTO"]['start_train_date'].replace(/(\d{4})(\d{2})(\d{2})/, "$1-$2-$3"), "form_train_date": RunQuery.curData.start_date, "limitSellInfo": t['buttonTextInfo'] && t['buttonTextInfo'].indexOf("暂售") != -1 ? t['buttonTextInfo'].replace(/<[^>]+>/i, "") : null }; kp = RunQuery.getTicketInfo(t["queryLeftNewDTO"]['yp_info']); train.tickets = kp; train.ticketMap = Util.mapObject(kp, function(e) { return e.code; }); train.ticketMapSort = Util.sortType(train.ticketMap); // for (var i = 0; i < train.ticketMapSort.length; i++) { // if(train.ticketMapSort[i]['count'] == 0){ // train.ticketMapSort.splice(i,1); // i--; // } // }; // //起售时间 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.codeMap[train['code']] = t; trainData.trainMap[train['id']] = train; }; if (lists.length > 0) { trainData["isMaintain"] = lists[0]['buttonTextInfo'].indexOf("系统维护时间") != -1 } RunQuery.trainData = trainData; if (typeof RunQuery.filterCond.train != 'undefined') { for (var i = 0; i < RunQuery.filterCond.train.length; i++) { if (typeof trainData.codeMap[RunQuery.filterCond.train[i]] == 'undefined') { RunQuery.filterCond.train.splice(i, 1); i--; } } } RunQuery.filterJson(); }, filterCond: {}, setFilterCond: function() { RunQuery.filterCond = {}; var arr = $('#filter_form').serializeArray(); for (var i = 0; i < arr.length; i++) { if (!RunQuery.filterCond[arr[i]['name']]) { RunQuery.filterCond[arr[i]['name']] = []; } RunQuery.filterCond[arr[i]['name']].push(arr[i]['value']); }; if (!!RunQuery.filterCond['train_type']) { RunQuery.filterCond['train_type'] = RunQuery.filterCond['train_type'].join('|').split('|'); } }, hasTrains: function(list) { var obj = {}, b = false; for (var k in list) { b = false; for (var i = 0; i < list[k]['ticketMapSort'].length; i++) { if (list[k]['ticketMapSort'][i]['count'] > 0) { b = true; break; } } if (b) { obj[k] = list[k]; } }; return obj; }, trainsFilter: function(list) { var obj = {}; if (typeof RunQuery.filterCond.train == 'undefined' || RunQuery.filterCond.train.length == 0) { return list; } for (var k in list) { if (RunQuery.filterCond.train.indexOf(list[k]['code']) != -1) { obj[k] = list[k]; } }; return obj; }, trainsType: function(list) { if (typeof RunQuery.filterCond['train_type'] == 'undefined' || RunQuery.filterCond['train_type'][0] == 'all') { return list; } var obj = {}; for (var k in list) { if (RunQuery.filterCond['train_type'].indexOf(list[k]['code'][0]) != -1 || (!isNaN(list[k]['code'][0]) && RunQuery.filterCond['train_type'].indexOf('QT') != -1)) { obj[k] = list[k]; } }; return obj; }, trainsSeat: function(list) { if (typeof RunQuery.filterCond['train_seat'] == 'undefined' || RunQuery.filterCond['train_seat'][0] == 'all') { return list; } var obj = {}, b = false; for (var k in list) { b = false; for (var i = 0; i < RunQuery.filterCond['train_seat'].length; i++) { if (typeof list[k].ticketMap[RunQuery.filterCond['train_seat'][i]] != 'undefined' && list[k].ticketMap[RunQuery.filterCond['train_seat'][i]]['count'] > 0) { b = true; break; }; }; if (b) { obj[k] = list[k]; } }; return obj; }, filterJson: function() { var date = {}; RunQuery.trainData.hasTrains = RunQuery.hasTrains(RunQuery.trainData.trainMap); RunQuery.trainData.train = RunQuery.trainsFilter(RunQuery.trainData.hasTrains); RunQuery.trainData.trainsType = RunQuery.trainsType(RunQuery.trainData.train); RunQuery.trainData.trainsSeat = RunQuery.trainsSeat(RunQuery.trainData.trainsType); RunQuery.trainData.train = RunQuery.trainData.trainsSeat; }, dateChangeCallback: function(date) { var time = date.date.getTime(); if (time >= Public.calendar.minDate.date.getTime() && time <= Public.calendar.maxDate.date.getTime()) { $('#date_tip').hide(); Public.hideInnerPage('date_box'); $('#start_date').html(Public.calendar.curDate.format(Public.formatString) + ' ' + Public.calendar.curDate.day(3)); $('#start_date_val').val(Public.calendar.curDate.format('yyyy-MM-dd')); RunQuery.hisUpdata(); } else { var offset = $('a.cur', Public.calendar.wrap).offset(); $('#date_tip').css({ 'left': offset.left, 'top': offset.top, 'display': 'block' }).html('

    ' + date.format('M月d日') + '不在预售期

    预约提醒'); if (offset.left / window.innerWidth > 0.75) { $('#date_tip').attr('class', 'tip_small tip_right'); } else if (offset.left / window.innerWidth < 0.15) { $('#date_tip').attr('class', 'tip_small tip_left'); } else { $('#date_tip').attr('class', 'tip_small'); } } }, hisUpdata: function() { Public.setHisQuery($('#startStationCode').val() + '-' + $('#endStationCode').val(), $('#query_form').serialize()); Public.setHis(); RunQuery.getQueryData(); RunQuery.queryTicket(); }, showRefresh: function() { if (RunQuery.refresh) { return; } if (Public.isLogin) { $('#autoTip p').html('暂时无票!
    没有符合你要求的车次和席别'); } else { $('#autoTip p').html('暂时无票!
    登录后可以自动刷票'); } $('#autoTip').show(); }, refCount: 0, startDate: null, refDate: null, refresh: false, refTimer: null, startRef: function() { if (RunQuery.refresh) { return; } Client.refreshStart(); RunQuery.startDate = (new Date()).getTime(); RunQuery.refDate = RunQuery.startDate; RunQuery.refresh = true; $('#refresh_train').show(); $('#autoTip').hide(); RunQuery.queryTicket(); RunQuery.refCount = 1; RunQuery.refGo(); }, refGo: function() { if (RunQuery.refresh) { var now = (new Date()).getTime(); var useTime = RunQuery.formatTime(now - RunQuery.startDate); var surplus = ((5000 - (now - RunQuery.refDate)) / 1000).toFixed(1); if (surplus <= 0) { surplus = 0; } $('#refresh_train .rf_desc').html('已刷 ' + RunQuery.refCount + ' 次,用时 ' + useTime + '
    距下次刷票还有 ' + surplus + ' 秒 ...'); if (surplus == 0) { RunQuery.refDate = now; RunQuery.refCount++; RunQuery.queryTicket(); } RunQuery.refTimer = setTimeout(RunQuery.refGo, 100); } }, refStop: function() { Client.refreshEnd(); clearTimeout(RunQuery.refTimer); RunQuery.refresh = false; $('#refresh_train').hide(); // RunQuery.queryTicket(); if (RunQuery.trainData.train.length == 0) { RunQuery.showRefresh(); } }, formatTime: function(t) { var m = parseInt(t / 60000); var s = parseInt(t % 60000 / 1000); return m + '分' + s + '秒'; } }