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 passenger = require("../otn/passenger.js"); require("./widget_modalDialog.js"); var initPassengerEditor = function () { //UI组件 var uiEditor = $("div.passenger-selector-wrap"); var uiInput = $("#passenger-selector-id"); 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(); var refrshPasList = function () { uiDlg.addClass("loading"); uiDlg.find(".empty-indicator").hide(); sessmgr.getPassengers(function (plist) { uiDlg.removeClass("loading"); allpasseengers = plist; currentSearchKey = null; if (!plist || !plist.length) { uiDlgList.empty(); uiDlg.find(".empty-indicator").show(); } performSearch(); }).fail(function (msg) { mp.showMessagePopup("error", "加载联系人失败:" + msg); uiDlg.removeClass("loading"); }); }; uiInput.focus(function () { uiDlg.show(); refrshPasList(); uiInput.select(); if (sessmgr.isLogined) { $(".passenger-selector-add, .passenger-selector-refresh").show(); } else { $(".passenger-selector-add, .passenger-selector-refresh").hide(); } }).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); if (p.selected) $(e.target).addClass("selected"); else { $(e.target).removeClass("selected"); } } } e.stopPropagation(); e.preventDefault(); }); uiDlg.find("label>:checkbox").click(function (e) { e.stopPropagation(); }); 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; }); 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); }; var showAddPassengerUi = function () { if (!sessmgr.isLogined) { mp.showMessagePopup("error", "您还没有登录哦!"); return; } $("#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 } ] }); }; uiDlg.find("button.passenger-selector-add").click(showAddPassengerUi); uiDlg.find(".passenger-selector-refresh").click(function () { sessmgr.reloadPassengers(); refrshPasList(); }); 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) { p.selected = exports.addPassengerToList(p); }); 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); sessmgr.on("addPassenger", function () { performSearch(); }); exports.addPassengerToList = function (p, noui) { var cp = sessmgr.currentProfile; if (!cp) { return noui ? "未登录" : false; } cp.passengers = cp.passengers || []; var tmpObj = _.findWhere(cp.passengers, { key: p.key }); if (tmpObj) { uiList.find(".optional-block[data-id='" + p.key + "']").remove(); _.removeFromArray(cp.passengers, tmpObj); return noui ? "已经从联系人列表中删除" : false; } if (cp.passengers.length >= 5) { if (!noui) mp.showMessagePopup("error", "只能添加五个人喔。"); return noui ? "只能添加五个人喔" : false; } cp.passengers.push(p); uiList.append(uiListTpl([p])); sessmgr.save(); return noui ? null : 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 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"); }); }; 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 + (cp.trainTypes || []).join(""); 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(filterTrainNormal(this.original))); } hightlightSelected(); }).fail(function () { queryErrorRow.show(); }).always(function () { queryLoadingRow.hide(); }); } queryTable.show(); hightlightSelected(); }; var initialLoad = function () { var cp = sessmgr.currentProfile; container.find(">span").remove(); if (cp && cp.selectedTrain) { container.append(listTpl(cp.selectedTrain)); } }; var filterList = function () { 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(); }); }; 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 = ""; } }).on("input", function () { filterList(); }); 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; tr.toggleClass("selected"); 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 || []; 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])); } 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))); } input.data("selectedDate", (cp && cp.dateloop) || []); }; exports.addDateToLoopList = function (d) { if (!d) return; cp.dateloop = cp.dateloop || []; var idx = _.indexOf(cp.dateloop, d); if (idx !== -1) { //已经有了则删除 cp.dateloop.splice(idx, 1); container.find(">span[data-date='" + d + "']").remove(); sessmgr.save(); 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 (e) { 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(); });