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

458 lines
12 KiB
JavaScript

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");
var initPassengerEditor = function () {
//UI组件
var uiEditor = $("div.passenger-selector-wrap");
var uiInput = uiEditor.find(":text");
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();
uiInput.focus(function () {
uiDlg.show();
uiDlg.addClass("loading");
uiDlg.find(".empty-indicator").hide();
sessmgr.getPassengers(function (data) {
uiDlg.removeClass("loading");
allpasseengers = data;
currentSearchKey = null;
if (!data.length) {
uiDlgList.empty();
uiDlg.find(".empty-indicator").show();
}
performSearch();
});
uiInput.select();
}).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 });
if (p)
uiInput.trigger("selectPassenger", p);
}
e.stopPropagation();
e.preventDefault();
});
var currentSearchKey = null;
var currentList = null;
var currentPageIndex = 1;
var allpasseengers = null;
var pagesize = 12;
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;
var renderList = currentList.slice((currentPageIndex - 1) * pagesize, pagesize);
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);
uiDlg.find("button.passenger-pager-next").prop("disabled", totalpage - 1 <= currentPageIndex);
};
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) {
if (exports.addPassengerToList(p))
p.selected = true;
});
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();
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;
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);
exports.addPassengerToList = function (p) {
var cp = sessmgr.currentProfile;
if (!cp)
return false;
cp.passengers = cp.passengers || [];
if (_.findWhere(cp.passengers, { key: p.key }))
return false;
if (cp.passengers.length >= 5) {
mp.showMessagePopup("error", "只能添加五个人喔。");
return false;
}
cp.passengers.push(p);
uiList.append(uiListTpl([p]));
sessmgr.save();
return true;
};
};
var initTrainSelectEditor = function () {
var container = $(".options-train-selectorwarp");
var listTpl = container.find("script:eq(1)").doT();
var queryTpl = container.find("script:first").doT();
var inputObj = container.find(":text");
var queryTable = container.find(">div");
var queryErrorRow = queryTable.find("table tr:eq(3)");
var queryLoadingRow = queryTable.find("table tr:eq(1)");
var queryTipRow = queryTable.find("table tr:eq(2)");
var traindata;
var currentKey = null;
var showDropDown = function () {
queryErrorRow.hide();
queryLoadingRow.hide();
queryTipRow.hide();
var cp = sessmgr.currentProfile;
if (!cp)
return;
var checkKey = cp.fromCode + cp.toCode + cp.depDate + cp.studentTicket;
if (checkKey != currentKey) {
//需要重新查询
currentKey = checkKey;
queryErrorRow.nextAll().remove();
if (!cp.fromCode || !cp.toCode || !cp.depDate) {
queryTipRow.show();
return;
}
queryLoadingRow.show();
queryErrorRow.hide();
query.queryTicket(cp.fromCode, cp.toCode, cp.depDate, cp.studentTicket, true)
.done(function () {
traindata = this;
if (!this.original.length) {
queryErrorRow.show();
} else {
queryErrorRow.after(queryTpl(this.original));
}
}).fail(function () {
queryErrorRow.show();
}).always(function () {
queryLoadingRow.hide();
});
}
queryTable.show();
};
var initialLoad = function () {
var cp = sessmgr.currentProfile;
container.find(">span").remove();
if (cp && cp.selectedTrain) {
container.append(listTpl(cp.selectedTrain));
}
};
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 = "";
}
});
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;
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();
});
exports.addTrainToList = function (t) {
var cp = sessmgr.currentProfile;
if (!cp)
return;
cp.selectedTrain = cp.selectedTrain || [];
if (_.indexOf(cp.selectedTrain, t) != -1)
return;
cp.selectedTrain.push(t);
container.append(listTpl([t]));
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)));
}
};
exports.addDateToLoopList = function (d) {
if (!d) return;
cp.dateloop = cp.dateloop || [];
if (_.indexOf(cp.dateloop, d) !== -1)
return;
cp.dateloop.push(d);
sessmgr.save();
//add to list
container.append(tpl([d]));
};
exports.removeDateFromLoopList = function (d) {
if (!cp || !cp.dateloop)
return;
var idx = _.indexOf(cp.dateloop, d);
if (idx == -1)
return;
cp.dateloop.splice(idx, 1);
sessmgr.save();
container.find(">span[data-date='" + d + "']").remove();
};
input.change(function () {
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");
dropDown.mousedown(function (e) {
e.stopPropagation();
e.preventDefault();
}).click(function () {
input[0].focus();
});
};
var initProfile = function () {
cp = sessmgr.currentProfile;
container.find(">label>:checkbox").parent().remove();
if (!cp || !cp.selectedSeatType)
return;
container.append(listTpl({
order: cp.selectedSeatType,
isSelected: function () { return false; },
isRecommand: function () { return false; },
getName: data.toSeatTypeName
}));
dropDown.find(":checkbox").prop("checked", false);
cp.selectedSeatType.forEach(function(code) {
dropDown.find(":checkbox[value='" + code + "']").prop("checked", true);
});
};
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);
if (idx == -1)
return;
cp.selectedSeatType.splice(idx, 1);
sessmgr.save();
container.find(">label>input[value='" + code + "']").parent().remove();
dropDown.find(":checkbox[value='" + code + "']").prop("checked", false);
};
container.on("change", ":checkbox", function () {
if (this.checked)
exports.addSeat(this.value);
else exports.removeSeat(this.value);
});
input.focus(function () {
dropDown.show();
}).blur(function () {
dropDown.hide();
});
initDropDown();
initProfile();
sessmgr.on("sessionChanged", initProfile);
sessmgr.on("currentProfileChanged", initProfile);
};
var initProfileOperation = function () {
$("#btnResetOptions").click(function () {
var session = sessmgr.current;
if (!session)
return;
sessmgr.currentProfile = null;
});
};
exports.init = function () {
initPassengerEditor();
initTrainSelectEditor();
initDateLoop();
initSeatOrder();
initProfileOperation();
};
});