Light12306/Web12306/js/ui/widget_datedropdown.js

143 lines
4.7 KiB
JavaScript
Raw Normal View History

2014-05-05 19:34:47 +08:00
define(function (require, exports, module) {
var param = require("../data.js");
2014-12-01 02:17:13 +08:00
var utility = require("../utility.js");
2014-05-05 19:34:47 +08:00
var getCurDate = function () {
var now = new Date();
//now = new Date(Math.floor(now.getTime() / 86400000) * 86400000);
now = new Date(now.getFullYear(), now.getMonth(), now.getDate());
return now;
};
var getDateString = function (date) {
return date.getFullYear() + "-" + (date.getMonth() < 9 ? "0" : "") + (date.getMonth() + 1) + "-" + (date.getDate() < 10 ? "0" : "") + date.getDate();
2014-05-05 19:34:47 +08:00
};
2014-08-19 23:29:14 +08:00
var options = {
maxSellDays: 19,
selectDate: [],
minDate: getCurDate()
};
2014-05-05 19:34:47 +08:00
2014-12-01 02:17:13 +08:00
var renderCalendar = function (container, monthStart) {
2014-05-05 19:34:47 +08:00
var weekdayOfFirstDay = monthStart.getDay();
var calendarBegin = new Date(monthStart.getTime() + 86400000 * weekdayOfFirstDay * -1);
var cells = container.find("td");
var thismonth = monthStart.getMonth();
var currentDate = getCurDate();
var dateTmp = calendarBegin;
var minTime = param.minDate.getTime();
var maxTime = param.maxDate.getTime();
2014-08-30 01:32:27 +08:00
for (var i = 0; i < 42; i++) {
2014-05-05 19:34:47 +08:00
var cell = cells.eq(i);
cell.html(dateTmp.getDate());
2014-12-01 02:17:13 +08:00
cell.removeClass();
if (dateTmp.getMonth() !== thismonth || dateTmp.getTime() < minTime) {
2014-05-05 19:34:47 +08:00
cell.addClass("date-notavailable");
2014-12-01 02:17:13 +08:00
}else if (dateTmp.getTime() === currentDate.getTime()) {
2014-05-05 19:34:47 +08:00
cell.addClass("date-current");
2014-12-01 02:17:13 +08:00
} else if (dateTmp.getTime() <= maxTime) {
cell.addClass("date-commonavailable");
2014-05-05 19:34:47 +08:00
}
cell.attr("data-date", getDateString(dateTmp));
dateTmp = new Date(dateTmp.getTime() + 86400000);
}
//显示时间
container.find("header").html(monthStart.getFullYear() + "年" + (monthStart.getMonth() + 1) + "月");
};
2014-12-01 02:17:13 +08:00
var showPopup = function (ele, showDate) {
2014-08-19 23:29:14 +08:00
var selected = ele.data("selectedDate") || [];
2014-12-01 02:17:13 +08:00
var curDate = utility.toDate(ele.val());
2014-08-19 23:29:14 +08:00
//如果日历已经创建了,则不变。
if (curDate)
2014-12-01 02:17:13 +08:00
selected.push(getDateString(curDate));
else curDate = getCurDate();
showDate = showDate || curDate;
var now = getCurDate();
var dateDom = $("#dateSelector");
2014-05-05 19:34:47 +08:00
2014-12-01 02:17:13 +08:00
var dayStart = new Date(showDate.getFullYear(), showDate.getMonth(), 1);
var maxShowDay = new Date(dayStart.getTime() + 86400 * 1000 * options.maxSellDays * 2);
2014-05-05 19:34:47 +08:00
2014-08-19 23:29:14 +08:00
if (dateDom.prop("data-month") !== getDateString(dayStart)) {
2014-12-01 02:17:13 +08:00
renderCalendar(dateDom.find(">.month-first"), dayStart);
renderCalendar(dateDom.find(">.month-second"), utility.addMonths(dayStart, 1));
2014-08-19 23:29:14 +08:00
dateDom.prop("data-month", getDateString(dayStart));
}
2014-05-05 19:34:47 +08:00
2014-08-19 23:29:14 +08:00
//确定有标记
2014-08-30 01:32:27 +08:00
dateDom.find("td").removeClass("date-selected").filter(selected.map(function (e) { return "[data-date='" + e + "']:not(.date-notavailable)"; }).join(",")).addClass("date-selected");
2014-08-19 23:29:14 +08:00
dateDom.data("date-target", ele);
2014-05-05 19:34:47 +08:00
2014-08-19 23:29:14 +08:00
//显示
var offset = ele.offset();
2014-08-30 01:32:27 +08:00
var left = (offset.left - dateDom.width() / 2);
2014-12-01 02:17:13 +08:00
if (left < 1) left = 0;
2014-08-30 01:32:27 +08:00
dateDom.css({ left: left + "px", top: (offset.top + ele.height()) + "px" });
2014-08-19 23:29:14 +08:00
dateDom.show();
2014-05-05 19:34:47 +08:00
};
2014-08-19 23:29:14 +08:00
var init = function () {
2014-05-05 19:34:47 +08:00
var date_classes = ["month-first", "month-second"];
var dom = ['<div id="dateSelector">'];
_.each(date_classes, function (e) {
var cls = e + '';
2014-12-01 02:17:13 +08:00
dom.push('<div class="' + cls + '"><section class="date-selector"><nav><span class="month-prev"><i class="fa fa-arrow-left"></i></span><span class="month-next"><i class="fa fa-arrow-right"></i></span><header></header></nav><table><tr><th>日</th><th>一</th><th>二</th><th>三</th><th>四</th><th>五</th><th>六</th></tr>');
2014-08-30 01:32:27 +08:00
for (var i = 0; i < 6; i++) {
2014-05-05 19:34:47 +08:00
dom.push("<tr>");
for (var j = 0; j < 7; j++) {
dom.push("<td></td>");
}
dom.push("</tr>");
}
dom.push("</table></section></div>");
});
$("body").append(dom.join(""));
2014-08-19 23:29:14 +08:00
$("#dateSelector").mousedown(function (e) {
var target = $("#dateSelector").data("date-target");
if (!target || !target.length)
2014-12-01 02:17:13 +08:00
return false;
2014-05-05 19:34:47 +08:00
2014-08-19 23:29:14 +08:00
if (target[0].dataset.keepopen === "true") {
e.stopPropagation && e.stopPropagation();
e.preventDefault && e.preventDefault();
}
2014-05-05 19:34:47 +08:00
2014-08-19 23:29:14 +08:00
var et = $(e.target);
if (et.is("#dateSelector td")) {
if (et.hasClass("date-notavailable")) return;
2014-05-05 19:34:47 +08:00
2014-08-19 23:29:14 +08:00
target.val(et.attr("data-date")).change();
et.toggleClass("date-selected");
2014-05-05 19:34:47 +08:00
2014-12-01 02:17:13 +08:00
return true;
2014-08-19 23:29:14 +08:00
}
2014-12-01 02:17:13 +08:00
var dt = utility.toDate($("#dateSelector").prop("data-month"));
if (et.is(".month-prev") || et.is(".month-prev .fa-arrow-left")) {
dt = utility.addMonths(dt, -2);
showPopup(target, dt);
}
if (et.is(".month-next") || et.is(".month-next .fa-arrow-right")) {
dt = utility.addMonths(dt, 2);
showPopup(target, dt);
}
return false;
2014-08-19 23:29:14 +08:00
});
2014-08-13 00:14:00 +08:00
};
init();
2014-08-19 23:29:14 +08:00
var selector = "input.ui-date";
$(document).on("focus", selector, function () {
showPopup($(this));
}).on("blur", selector, function () {
$("#dateSelector").hide().removeData("date-target");
});
2014-04-30 19:20:58 +08:00
});