Light12306/Web12306/js/ui/ui-autosubmitform.js

672 lines
18 KiB
JavaScript
Raw Normal View History

2014-07-08 20:11:31 +08:00
define(function (require, exports, module) {
var sessmgr = require("../account/sessionMgr.js");
var mp = require("./widget_message_popup.js");
var query = require("../otn/queryticket.js");
var data = require("../data.js");
2014-08-20 20:58:24 +08:00
var passenger = require("../otn/passenger.js");
2014-09-02 23:15:40 +08:00
var port = require("../platform/extensionPort.js");
2014-12-04 23:31:06 +08:00
var login = require("./ui-login.js");
2014-09-02 23:15:40 +08:00
2014-08-26 21:29:58 +08:00
require("./widget_modalDialog.js");
2014-07-08 20:11:31 +08:00
var initPassengerEditor = function () {
//UI组件
var uiEditor = $("div.passenger-selector-wrap");
2014-08-19 23:29:14 +08:00
var uiInput = $("#passenger-selector-id");
2014-07-08 20:11:31 +08:00
var uiDlg = uiEditor.find("section");
var uiDlgTpl = uiDlg.find("script").doT();
var uiDlgList = uiDlg.find("ul");
var uiList = uiEditor.parent();
var uiListTpl = uiList.find(">script").doT();
2014-08-26 21:29:58 +08:00
var refrshPasList = function () {
2014-07-08 20:11:31 +08:00
uiDlg.addClass("loading");
uiDlg.find(".empty-indicator").hide();
2014-08-26 21:29:58 +08:00
2014-08-19 23:29:14 +08:00
sessmgr.getPassengers(function (plist) {
2014-07-08 20:11:31 +08:00
uiDlg.removeClass("loading");
2014-08-19 23:29:14 +08:00
allpasseengers = plist;
2014-07-08 20:11:31 +08:00
currentSearchKey = null;
2014-08-26 21:29:58 +08:00
if (!plist || !plist.length) {
uiDlgList.empty();
2014-07-08 20:11:31 +08:00
uiDlg.find(".empty-indicator").show();
}
performSearch();
2014-08-30 01:32:27 +08:00
}).fail(function (msg) {
mp.showMessagePopup("error", "加载联系人失败:" + msg);
2014-12-04 23:31:06 +08:00
if (msg.indexOf("登录") !== -1) {
login.showLoginDialog();
}
2014-08-30 01:32:27 +08:00
uiDlg.removeClass("loading");
2014-07-08 20:11:31 +08:00
});
2014-08-26 21:29:58 +08:00
};
uiInput.focus(function () {
uiDlg.show();
refrshPasList();
2014-07-08 20:11:31 +08:00
uiInput.select();
2014-08-26 21:29:58 +08:00
if (sessmgr.isLogined) {
$(".passenger-selector-add, .passenger-selector-refresh").show();
} else {
$(".passenger-selector-add, .passenger-selector-refresh").hide();
}
2014-07-08 20:11:31 +08:00
}).blur(function () {
uiDlg.hide();
});
uiDlg.mousedown(function (e) {
if (e.target && e.target.tagName === "LI") {
//选定
var id = e.target.dataset.id;
var p = _.findWhere(allpasseengers, { key: id });
2014-08-19 23:29:14 +08:00
if (p) {
2014-07-08 20:11:31 +08:00
uiInput.trigger("selectPassenger", p);
2014-08-19 23:29:14 +08:00
if (p.selected)
$(e.target).addClass("selected");
else {
$(e.target).removeClass("selected");
}
}
2014-07-08 20:11:31 +08:00
}
e.stopPropagation();
e.preventDefault();
});
2014-08-30 01:32:27 +08:00
uiDlg.find("label>:checkbox").click(function (e) {
e.stopPropagation();
});
2014-08-20 20:58:24 +08:00
uiDlg.find("label").click(function (e) {
//设置
var ele = $(e.target);
var ck = ele.find(":checkbox");
if (ck.length) {
ck[0].checked = !ck[0].checked;
ck.change();
}
var rad = ele.find(":radio");
if (rad.length) {
rad[0].checked = true;
rad.change();
}
e.preventDefault();
e.stopPropagation();
return false;
});
2014-07-08 20:11:31 +08:00
var currentSearchKey = null;
var currentList = null;
var currentPageIndex = 1;
var allpasseengers = null;
2014-09-09 14:55:30 +08:00
var pagesize = 15;
2014-07-08 20:11:31 +08:00
var totalpage = 0;
var performSearch = function (key) {
key = key || uiInput.val();
if (key !== currentSearchKey) {
currentSearchKey = key.toUpperCase();
currentList = currentSearchKey ? _.filter(allpasseengers, function (p) { return p.key.indexOf(currentSearchKey) != -1 || p.first_letter.indexOf(currentSearchKey) != -1; }) : allpasseengers;
currentPageIndex = 1;
totalpage = Math.ceil(currentList.length / pagesize);
}
renderPage();
};
var renderPage = function () {
if (currentPageIndex > totalpage)
currentPageIndex = totalpage;
else if (currentPageIndex < 1)
currentPageIndex = 1;
2014-07-31 21:30:48 +08:00
var renderList = currentList.slice((currentPageIndex - 1) * pagesize, currentPageIndex * pagesize);
2014-07-08 20:11:31 +08:00
uiDlgList.html(uiDlgTpl(renderList, {
isSelected: function (p) {
return sessmgr.currentProfile && sessmgr.currentProfile && _.findWhere(sessmgr.currentProfile.passengers, { key: p.key }) || false;
}
}));
uiDlg.find("button.passenger-pager-prev").prop("disabled", currentPageIndex < 2);
2014-07-31 21:30:48 +08:00
uiDlg.find("button.passenger-pager-next").prop("disabled", totalpage - 1 < currentPageIndex);
2014-07-08 20:11:31 +08:00
};
2014-08-26 21:29:58 +08:00
var showAddPassengerUi = function () {
2014-08-20 20:58:24 +08:00
if (!sessmgr.isLogined) {
mp.showMessagePopup("error", "您还没有登录哦!");
return;
}
2014-08-26 21:29:58 +08:00
$("#passenger_editor").find(":text").val("");
$("#passenger_editor").showModalDialog({
title: "新增联系人",
buttons: [
{
text: "确定",
callback: function (e) {
var inputs = this.find("input, select");
var name = inputs.eq(0).val();
var idtype = inputs.eq(1).val();
var id = inputs.eq(2).val();
var type = inputs.eq(3).val();
if (!name || !id) {
mp.showMessagePopup("error", "请输入完整哦!");
return;
}
var tip = new mp.MessagePopup("loading", "正在添加联系人, 请稍等哦亲...");
tip.show();
var def = passenger.fastAddPassenger(type, name, idtype, id, "CN");
def.fail(function (msg) {
tip.setState("error", "失败:" + msg);
tip.delayClose();
e.hide();
});
def.done(function (p) {
var msg = exports.addPassengerToList(p, true);
if (!msg) {
tip.setState("ok", "联系人已经添加成功!");
} else {
tip.setState("error", "联系人添加成功,但是无法添加到列表中:" + msg);
}
tip.delayClose();
e.hide();
});
},
icon: "plus",
type: "primary"
},
{
text: "取消",
cancel: true
}
]
2014-08-20 20:58:24 +08:00
});
};
2014-08-26 21:29:58 +08:00
uiDlg.find("button.passenger-selector-add").click(showAddPassengerUi);
uiDlg.find(".passenger-selector-refresh").click(function () {
sessmgr.reloadPassengers();
2014-08-30 01:32:27 +08:00
refrshPasList();
2014-08-26 21:29:58 +08:00
});
2014-07-08 20:11:31 +08:00
uiDlg.find("button.passenger-pager-prev").click(function () {
currentPageIndex--;
renderPage();
});
uiDlg.find("button.passenger-pager-next").click(function () {
currentPageIndex++;
renderPage();
});
uiInput.keyup(function () {
performSearch();
});
uiInput.on("selectPassenger", function (e, p) {
2014-08-19 23:29:14 +08:00
p.selected = exports.addPassengerToList(p);
2014-07-08 20:11:31 +08:00
});
uiList.on("click", ".optional-block .close", function (e) {
var span = $(this).closest(".optional-block");
var key = span[0].dataset.id;
var cpl = sessmgr.currentProfile.passengers;
for (var i = 0; i < cpl.length; i++) {
if (cpl[i].key === key) {
cpl.splice(i, 1);
sessmgr.save();
break;
}
}
span.remove();
2014-07-08 20:11:31 +08:00
e.stopPropagation();
}).on("click", ".optional-block", function (e) {
//添加儿童票
var span = $(this).closest(".optional-block");
var key = span[0].dataset.id;
var cpl = sessmgr.currentProfile.passengers;
var p = _.findWhere(cpl, { key: key });
if (!p)
return;
2014-08-01 21:54:26 +08:00
if (p.passenger_type !== '1') {
2014-09-01 20:24:57 +08:00
mp.showMessagePopup("error", "亲,只能为成人票乘客添加儿童票哦");
2014-08-01 21:54:26 +08:00
return;
}
2014-07-08 20:11:31 +08:00
p = _.clone(p);
p.passenger_type = 2;
p.key += "$" + (Math.random() + '').substr(3, 4);
exports.addPassengerToList(p);
});
var resetList = function () {
uiList.find(">span").remove();
if (sessmgr.currentProfile.passengers) {
uiList.append(uiListTpl(sessmgr.currentProfile.passengers));
}
};
if (sessmgr.currentProfile) {
resetList();
}
sessmgr.on("sessionChanged", resetList);
sessmgr.on("currentProfileChanged", resetList);
2014-08-26 21:29:58 +08:00
sessmgr.on("addPassenger", function () {
performSearch();
});
2014-07-08 20:11:31 +08:00
2014-08-26 21:29:58 +08:00
exports.addPassengerToList = function (p, noui) {
2014-07-08 20:11:31 +08:00
var cp = sessmgr.currentProfile;
2014-08-26 21:29:58 +08:00
if (!cp) {
return noui ? "未登录" : false;
}
2014-07-08 20:11:31 +08:00
cp.passengers = cp.passengers || [];
2014-08-19 23:29:14 +08:00
var tmpObj = _.findWhere(cp.passengers, { key: p.key });
if (tmpObj) {
uiList.find(".optional-block[data-id='" + p.key + "']").remove();
_.removeFromArray(cp.passengers, tmpObj);
2014-08-26 21:29:58 +08:00
return noui ? "已经从联系人列表中删除" : false;
2014-08-19 23:29:14 +08:00
}
2014-07-08 20:11:31 +08:00
if (cp.passengers.length >= 5) {
2014-08-26 21:29:58 +08:00
if (!noui)
mp.showMessagePopup("error", "只能添加五个人喔。");
return noui ? "只能添加五个人喔" : false;
2014-07-08 20:11:31 +08:00
}
cp.passengers.push(p);
uiList.append(uiListTpl([p]));
sessmgr.save();
2014-09-02 23:15:40 +08:00
//report
port.track(data.trackTypes.PROFILE_AUTO_ADDPAS);
2014-08-26 21:29:58 +08:00
return noui ? null : true;
2014-07-08 20:11:31 +08:00
};
};
var initTrainSelectEditor = function () {
var container = $(".options-train-selectorwarp");
var listTpl = container.find("script:eq(1)").doT();
var queryTpl = container.find("script:first").doT();
2014-07-29 21:19:06 +08:00
var advTrainTpl = container.find("script:eq(2)").doT();
2014-07-08 20:11:31 +08:00
var inputObj = container.find(":text");
var queryTable = container.find(">div");
2014-07-29 21:19:06 +08:00
var queryErrorRow = queryTable.find("table tr:eq(4)");
var queryLoadingRow = queryTable.find("table tr:eq(2)");
var queryTipRow = queryTable.find("table tr:eq(3)");
2014-07-08 20:11:31 +08:00
var traindata;
2014-07-29 21:19:06 +08:00
queryTable.find("table tr:eq(0) td").html(advTrainTpl(data.tagMap));
2014-08-01 21:54:26 +08:00
queryTable.find(".options-seat-type-advlink").click(function () {
2014-07-29 21:19:06 +08:00
exports.addTrainToList($(this).text());
});
2014-07-08 20:11:31 +08:00
var currentKey = null;
2014-08-19 23:29:14 +08:00
var filterTrainNormal = function (list) {
var filter = sessmgr.currentProfile && sessmgr.currentProfile.trainTypes;
if (!filter || !filter.length)
return list;
return _.filter(list, function (t) {
var code = t.code[0];
if (_.indexOf(filter, code) !== -1)
return true;
if (_.indexOf(filter, '1') !== -1) {
if (code === 'L' || /\d/.test(code))
return true;
}
return false;
});
};
var hightlightSelected = function () {
var rows = queryErrorRow.nextAll().removeClass("selected");
var trains = sessmgr.currentProfile && sessmgr.currentProfile.selectedTrain;
if (!trains || !trains.length)
return;
rows.each(function () {
var code = $.trim($(this).find("td:eq(0)").text());
if (_.indexOf(trains, code) !== -1)
$(this).addClass("selected");
});
};
2014-07-08 20:11:31 +08:00
var showDropDown = function () {
queryErrorRow.hide();
queryLoadingRow.hide();
queryTipRow.hide();
var cp = sessmgr.currentProfile;
if (!cp)
return;
2014-08-19 23:29:14 +08:00
var checkKey = cp.fromCode + cp.toCode + cp.depDate + cp.studentTicket + (cp.trainTypes || []).join("");
if (checkKey !== currentKey) {
2014-07-08 20:11:31 +08:00
//需要重新查询
currentKey = checkKey;
queryErrorRow.nextAll().remove();
if (!cp.fromCode || !cp.toCode || !cp.depDate) {
queryTipRow.show();
return;
}
queryLoadingRow.show();
queryErrorRow.hide();
2014-09-13 15:58:20 +08:00
query.queryTicket(cp.fromCode, cp.fromText, cp.toCode, cp.toText, cp.depDate, cp.studentTicket, cp.resign || false, true)
2014-07-08 20:11:31 +08:00
.done(function () {
traindata = this;
if (!this.original.length) {
queryErrorRow.show();
} else {
2014-08-19 23:29:14 +08:00
queryErrorRow.after(queryTpl(filterTrainNormal(this.original)));
2014-07-08 20:11:31 +08:00
}
2014-08-19 23:29:14 +08:00
hightlightSelected();
2014-07-08 20:11:31 +08:00
}).fail(function () {
queryErrorRow.show();
}).always(function () {
queryLoadingRow.hide();
});
}
queryTable.show();
2014-08-19 23:29:14 +08:00
hightlightSelected();
2014-07-08 20:11:31 +08:00
};
var initialLoad = function () {
var cp = sessmgr.currentProfile;
container.find(">span").remove();
if (cp && cp.selectedTrain) {
container.append(listTpl(cp.selectedTrain));
}
};
2014-08-20 20:58:24 +08:00
var filterList = function () {
2014-08-19 23:29:14 +08:00
var key = inputObj.val();
if (!key) {
queryErrorRow.nextAll().show();
return;
}
var rows = queryErrorRow.nextAll().hide();
var test = new RegExp(key, "i");
rows.each(function () {
var code = $.trim($(this).find("td:eq(0)").text());
if (test.test(code))
$(this).show();
});
};
2014-07-08 20:11:31 +08:00
initialLoad();
sessmgr.on("sessionChanged", initialLoad);
sessmgr.on("currentProfileChanged", initialLoad);
inputObj.focus(function () {
showDropDown();
}).blur(function () {
queryTable.hide();
}).keydown(function (e) {
if (e.keyCode == 13) {
var s = this.value;
if (s)
exports.addTrainToList(s);
this.value = "";
}
2014-08-20 20:58:24 +08:00
}).on("input", function () {
2014-08-19 23:29:14 +08:00
filterList();
2014-07-08 20:11:31 +08:00
});
queryTable.mousedown(function (e) {
e.preventDefault();
e.stopPropagation();
}).on("click", "tr[data-id] td", function () {
var tr = $(this).closest("tr");
var id = tr[0].dataset.id;
var t = _.findWhere(traindata.original, { id: id });
if (!t)
return;
2014-08-19 23:29:14 +08:00
tr.toggleClass("selected");
2014-07-08 20:11:31 +08:00
exports.addTrainToList(t.code);
});
container.on("click", ".optional-block", function () {
var obj = $(this).closest("span[data-code]");
exports.removeTrainFromList(obj[0].dataset.code);
obj.remove();
2014-07-08 20:11:31 +08:00
});
exports.addTrainToList = function (t) {
var cp = sessmgr.currentProfile;
if (!cp)
return;
cp.selectedTrain = cp.selectedTrain || [];
2014-08-19 23:29:14 +08:00
var idx = _.indexOf(cp.selectedTrain, t);
if (idx !== -1) {
cp.selectedTrain.splice(idx, 1);
container.find("span.optional-block[data-code='" + t + "']").remove();
} else {
cp.selectedTrain.push(t);
container.append(listTpl([t]));
2014-09-02 23:15:40 +08:00
//report
port.track(data.trackTypes.PROFILE_AUTO_ADDTRAIN, [t]);
2014-08-19 23:29:14 +08:00
}
2014-07-08 20:11:31 +08:00
sessmgr.save();
};
exports.removeTrainFromList = function (t) {
var cp = sessmgr.currentProfile;
if (!cp || !cp.selectedTrain)
return;
for (var i = 0; i < cp.selectedTrain.length; i++) {
if (cp.selectedTrain[i] === t) {
cp.selectedTrain.splice(i, 1);
sessmgr.save();
break;
}
}
};
};
var initDateLoop = function () {
//UI
var container = $("#date_loop_editor");
var tpl = container.find(">script").doT();
var input = container.find("input");
var cp = sessmgr.currentProfile;
sessmgr.on("sessionChanged", function () {
cp = sessmgr.currentProfile;
initProfile();
});
sessmgr.on("currentProfileChanged", function () {
cp = sessmgr.currentProfile;
initProfile();
});
var initProfile = function () {
container.find(">span").remove();
if (cp && cp.dateloop) {
var filteredDate = _.filter(cp.dateloop, data.isValidDate);
if (filteredDate.length !== cp.dateloop.length) {
cp.dateloop = filteredDate;
sessmgr.save();
}
container.append(tpl(_.filter(cp.dateloop, data.isValidDate)));
2014-07-08 20:11:31 +08:00
}
2014-08-19 23:29:14 +08:00
input.data("selectedDate", (cp && cp.dateloop) || []);
2014-07-08 20:11:31 +08:00
};
exports.addDateToLoopList = function (d) {
if (!d) return;
cp.dateloop = cp.dateloop || [];
2014-08-19 23:29:14 +08:00
var idx = _.indexOf(cp.dateloop, d);
if (idx !== -1) {
//已经有了则删除
cp.dateloop.splice(idx, 1);
container.find(">span[data-date='" + d + "']").remove();
sessmgr.save();
2014-07-08 20:11:31 +08:00
return;
2014-08-19 23:29:14 +08:00
}
2014-07-08 20:11:31 +08:00
cp.dateloop.push(d);
sessmgr.save();
//add to list
container.append(tpl([d]));
2014-09-02 23:15:40 +08:00
//report
port.track(data.trackTypes.PROFILE_AUTO_ADDDL, [d]);
2014-07-08 20:11:31 +08:00
};
exports.removeDateFromLoopList = function (d) {
if (!cp || !cp.dateloop)
return;
var idx = _.indexOf(cp.dateloop, d);
2014-12-04 23:31:06 +08:00
if (idx === -1)
2014-07-08 20:11:31 +08:00
return;
cp.dateloop.splice(idx, 1);
sessmgr.save();
container.find(">span[data-date='" + d + "']").remove();
};
2014-08-19 23:29:14 +08:00
input.change(function (e) {
2014-07-08 20:11:31 +08:00
if (this.value)
exports.addDateToLoopList(this.value);
this.value = "";
});
container.on("click", ">span[data-date]", function () {
exports.removeDateFromLoopList(this.dataset.date);
});
initProfile();
};
var initSeatOrder = function () {
var seatDisplayOrder = "O319PM6420".split('');
var recommand = ["O", "3", "1"];
var container = $("dd.options-seat-type");
var ddTpl = container.find(">script:eq(0)").doT();
var input = container.find(":text");
var listTpl = container.find(">script:eq(1)").doT();
var dropDown = null;
var cp = null;
var initDropDown = function () {
container.append(ddTpl({
order: seatDisplayOrder,
isSelected: function () { return false; },
isRecommand: function (seat) { return _.indexOf(recommand, seat) != -1; },
getName: data.toSeatTypeName
}));
dropDown = container.find("ul");
2014-07-11 18:34:59 +08:00
dropDown.mousedown(function (e) {
2014-07-08 20:11:31 +08:00
e.stopPropagation();
e.preventDefault();
2014-07-11 18:34:59 +08:00
}).click(function () {
2014-07-08 20:11:31 +08:00
input[0].focus();
2014-12-04 23:31:06 +08:00
}).append($("<li></li>").append($("#opt_seat_first, #opt_seat_tb").show()));
2014-07-08 20:11:31 +08:00
};
var initProfile = function () {
cp = sessmgr.currentProfile;
2014-07-29 21:19:06 +08:00
container.find("span.optional-block").remove();
2014-12-04 23:31:06 +08:00
dropDown.find(":checkbox:not([data-profile-key])").prop("checked", false);
2014-07-11 18:34:59 +08:00
if (!cp || !cp.selectedSeatType)
2014-07-08 20:11:31 +08:00
return;
container.append(listTpl({
order: cp.selectedSeatType,
isSelected: function () { return false; },
isRecommand: function () { return false; },
getName: data.toSeatTypeName
}));
2014-08-01 21:54:26 +08:00
cp.selectedSeatType.forEach(function (code) {
dropDown.find(":checkbox[value='" + code + "']").prop("checked", true);
});
2014-07-08 20:11:31 +08:00
};
exports.addSeat = function (code) {
if (!code || !cp)
return;
cp.selectedSeatType = cp.selectedSeatType || [];
var idx = _.indexOf(cp.selectedSeatType, code);
if (idx != -1)
return;
cp.selectedSeatType.push(code);
sessmgr.save();
container.append(listTpl({
order: [code],
isSelected: function () { return false; },
isRecommand: function () { return false; },
getName: data.toSeatTypeName
}));
dropDown.find(":checkbox[value='" + code + "']").prop("checked", true);
};
exports.removeSeat = function (code) {
if (!code || !cp)
return;
var idx = _.indexOf(cp.selectedSeatType, code);
2014-12-04 23:31:06 +08:00
if (idx === -1)
2014-07-08 20:11:31 +08:00
return;
cp.selectedSeatType.splice(idx, 1);
sessmgr.save();
2014-07-29 21:19:06 +08:00
container.find(">span[data-code='" + code + "']").remove();
2014-07-08 20:11:31 +08:00
dropDown.find(":checkbox[value='" + code + "']").prop("checked", false);
};
2014-12-04 23:31:06 +08:00
container.on("change", ":checkbox:not([data-profile-key])", function () {
2014-07-08 20:11:31 +08:00
if (this.checked)
exports.addSeat(this.value);
else exports.removeSeat(this.value);
2014-09-02 23:15:40 +08:00
//跟踪
if (this.checked) {
port.track(data.trackTypes.PROFILE_AUTO_SELECTSEAT, [this.value]);
}
2014-07-08 20:11:31 +08:00
});
2014-07-29 21:19:06 +08:00
container.on("click", "span.close", function () {
exports.removeSeat(this.parentNode.dataset.code);
});
2014-07-08 20:11:31 +08:00
input.focus(function () {
dropDown.show();
}).blur(function () {
dropDown.hide();
});
initDropDown();
initProfile();
sessmgr.on("sessionChanged", initProfile);
sessmgr.on("currentProfileChanged", initProfile);
};
2014-07-11 18:34:59 +08:00
var initProfileOperation = function () {
$("#btnResetOptions").click(function () {
var session = sessmgr.current;
if (!session)
return;
2014-09-02 21:41:17 +08:00
$("#from_city, #to_city").attr("data-code", "");
2014-07-11 18:34:59 +08:00
sessmgr.currentProfile = null;
2014-09-02 21:41:17 +08:00
sessmgr.save();
2014-09-02 23:15:40 +08:00
//report
port.track(data.trackTypes.PROFILE_AUTO_RESET);
2014-07-11 18:34:59 +08:00
});
};
2014-08-13 00:14:00 +08:00
var init = function () {
2014-07-08 20:11:31 +08:00
initPassengerEditor();
initTrainSelectEditor();
initDateLoop();
initSeatOrder();
2014-07-11 18:34:59 +08:00
initProfileOperation();
2014-07-08 20:11:31 +08:00
};
2014-08-13 00:14:00 +08:00
init();
2014-07-08 20:11:31 +08:00
});