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, currentPageIndex * 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; if (p.passenger_type !== '1') { mp.showMessagePopup("error", "亲,学生无法带着儿童上车哦"); 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 advTrainTpl = container.find("script:eq(2)").doT(); var inputObj = container.find(":text"); var queryTable = container.find(">div"); var queryErrorRow = queryTable.find("table tr:eq(4)"); var queryLoadingRow = queryTable.find("table tr:eq(2)"); var queryTipRow = queryTable.find("table tr:eq(3)"); var traindata; queryTable.find("table tr:eq(0) td").html(advTrainTpl(data.tagMap)); queryTable.find(".options-seat-type-advlink").click(function () { exports.addTrainToList($(this).text()); }); 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("span.optional-block").remove(); dropDown.find(":checkbox").prop("checked", false); if (!cp || !cp.selectedSeatType) return; container.append(listTpl({ order: cp.selectedSeatType, isSelected: function () { return false; }, isRecommand: function () { return false; }, getName: data.toSeatTypeName })); 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(">span[data-code='" + code + "']").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); }); container.on("click", "span.close", function () { exports.removeSeat(this.parentNode.dataset.code); }); 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; }); }; var init = function () { initPassengerEditor(); initTrainSelectEditor(); initDateLoop(); initSeatOrder(); initProfileOperation(); }; init(); });