/*
* @插件名 dateSelect
* @作者 小白
* @日期 2015-06-27
* @Version 1.0
* */
$.fn.dateSelect = function(options) {
var date_config = {
offTop:40,
format:"yyyy-MM-dd"
}
var settings = $.extend({}, date_config, options);
var obj = this;
var elem_id = $(obj).attr("id");
var isShow = false;
var _shown = false;
var pos=getElementPos(elem_id);
var top = pos.y;
var left = pos.x;
var tz_y, tz_m, tz_d, tz_y_s, tz_y_e;
var input_y,input_m,input_d;
var con_min_hieght;
var _dateBody = "
" +
"
<" +
"
6月- 一月
- 二月
- 三月
- 四月
- 五月
- 六月
" +
"- 七月
- 八月
- 九月
- 十月
- 十一
- 十二
" +
"
2015> " +
"
" +
"
清空日期
" +
"
";
$(_dateBody).appendTo("body");
$("#datepicker_" + elem_id).css({
"left": left,
"top": top + settings.offTop
});
$(obj).next("span").click(function(){
var pos=getElementPos(elem_id);
var top = pos.y;
var left = pos.x;
$("#datepicker_" + elem_id).css({
"left": left,
"top": top + settings.offTop
});
var d =getFocusDate($(obj).val());
tz_m = d.getMonth() + 1;
tz_y = d.getFullYear();
tz_d = d.getDate();
input_m = d.getMonth() + 1;
input_y = d.getFullYear();
input_d = d.getDate();
$("#mlist_"+elem_id).prev("span").text(tz_m+"月");
$("#ylist_"+elem_id).prev("span").text(tz_y);
dayListReload();
hideYearmonth(); //隐藏年月选择
if(_shown)
{
$("#datepicker_" + elem_id).slideUp("noraml",function(){
_shown = false;
$(".content").css({"height": ""});
});
}
else
{
$("#datepicker_" + elem_id).slideDown("noraml",function(){
_shown = true;;
con_min_hieght = $(".content").height();
if(top + settings.offTop + 234 - 61 - 60> con_min_hieght)
{
$(".content").css({"height": top + settings.offTop + 234 - 61 + 10});
}
});
}
var d =getFocusDate($(obj).val());
$(obj).focus();
$(this).addClass("span-ex").removeClass("span-col");
isShow = true;
});
$(obj).click(function(){
//点击时获取控件位置
var pos=getElementPos(elem_id);
var top = pos.y;
var left = pos.x;
$("#datepicker_" + elem_id).css({
"left": left,
"top": top + settings.offTop
});
var d =getFocusDate($(this).val());
tz_m = d.getMonth() + 1;
tz_y = d.getFullYear();
tz_d = d.getDate();
input_m = d.getMonth() + 1;
input_y = d.getFullYear();
input_d = d.getDate();
$("#mlist_"+elem_id).prev("span").text(tz_m+"月");
$("#ylist_"+elem_id).prev("span").text(tz_y);
dayListReload();
hideYearmonth(); //隐藏年月选择
if(_shown)
{
$("#datepicker_" + elem_id).slideUp("noraml",function(){
_shown = false;
$(".content").css({"height": ""});
});
}
else
{
$("#datepicker_" + elem_id).slideDown("noraml",function(){
_shown = true;
con_min_hieght = $(".content").height();
if(top + settings.offTop + 234 - 61 - 60> con_min_hieght)
{
$(".content").css({"height": top + settings.offTop + 234 - 61 + 10});
}
});
}
isShow = true;
});
$(obj).blur(function(){
$(obj).next("span").addClass("span-col").removeClass("span-ex");
});
//点击月份
$("#datepicker_" + elem_id ).on("click",".month span",function(){
$(this).addClass("active");
$(this).next(".month-list").slideToggle("normal");
$("#ylist_"+elem_id).slideUp("fast");
$("#ylist_"+elem_id).prev("span").removeClass("active");
});
//选择月
$("#datepicker_" + elem_id ).on("click",".month li",function(){
tz_m = parseInt($(this).attr("data-id"));
$("#datepicker_" + elem_id).find(".month span").text(tz_m+"月");
dayListReload();
$(this).addClass("active").siblings("li").removeClass("active");
$(this).parents(".month-list").slideUp("fast");
$(this).parents(".month-list").prev("span").removeClass("active");
});
//点击年
$("#datepicker_" + elem_id ).on("click",".year .span-year",function(){
var c_y = $(this).text();
tz_y_s = parseInt(c_y.substring(0,3) + "0");
tz_y_e = tz_y_s + 9;
$("#datepicker_" + elem_id + " .year-list li").remove();
for(tz_y_s; tz_y_s <= tz_y_e; tz_y_s++)
{
var y_a="";
(parseInt(c_y) == tz_y_s)?y_a = "active" : y_a = "";
$("#datepicker_" + elem_id + " .year-list ul").append(""+tz_y_s+"");
}
$(this).addClass("active");
$(this).next(".year-list").slideToggle("normal");
$("#mlist_"+elem_id).slideUp("fast");
$("#mlist_"+elem_id).prev("span").removeClass("active");
});
//选择年
$("#datepicker_" + elem_id ).on("click",".year li",function(){
tz_y = parseInt($(this).text());
$(this).parents(".year-list").prev("span").text(tz_y);
dayListReload();
$(this).addClass("active").siblings("li").removeClass("active");
$(this).parents(".year-list").slideUp("fast");
$(this).parents(".year-list").prev("span").removeClass("active");
});
//切换年
$("#datepicker_" + elem_id ).on("click",".year-change span",function(){
if($(this).hasClass("year-left"))
{
tz_y_s = tz_y_e - 19;
}
else if($(this).hasClass("year-right"))
{
tz_y_s = tz_y_e + 1;
}
else
{
return;
}
tz_y_e = tz_y_s + 9;
$("#datepicker_" + elem_id + " .year-list li").remove();
for(tz_y_s; tz_y_s <= tz_y_e; tz_y_s++)
{
var y_a="";
(input_y == tz_y_s)?y_a = "active" : y_a = "";
$("#datepicker_" + elem_id + " .year-list ul").append(""+tz_y_s+"");
}
});
//选择天
$("#datepicker_" + elem_id +" .day").on("click","li",function(){
tz_d = parseInt($(this).attr("data-id"));
var tz_m_str,tz_d_str;
(tz_m < 10 ) ? tz_m_str = "0" + tz_m : tz_m_str = tz_m;
(tz_d < 10 ) ? tz_d_str = "0" + tz_d : tz_d_str = tz_d;
var date_sel = tz_y + "-" + tz_m_str + "-" + tz_d_str;
$(obj).val(date_sel);
$(this).parents("#datepicker_" + elem_id).slideUp("noraml",function(){
_shown = false;
$(".content").css({"height": ""});
});
});
//减一月
$("#datepicker_" + elem_id+" .left").click(function(){
tz_m = parseInt(tz_m);
tz_m -- ;
if(tz_m == 0)
{
tz_m = 12;
tz_y --;
}
$("#datepicker_" + elem_id+" .month span").text(tz_m+"月");
$("#datepicker_" + elem_id+" .year .span-year").text(tz_y);
dayListReload();
});
//加一月
$("#datepicker_" + elem_id+" .right").click(function(){
tz_m = parseInt(tz_m);
tz_m = tz_m + 1;
if(tz_m == 13)
{
tz_m = 1;
tz_y ++;
}
$("#datepicker_" + elem_id+" .month span").text(tz_m+"月");
$("#datepicker_" + elem_id+" .year .span-year").text(tz_y);
dayListReload();
});
$("#datepicker_" + elem_id).on("click",".action span",function(){
$(obj).val("");
$("#datepicker_" + elem_id).slideUp("normal");
});
//加载天
function dayListReload()
{
var days = getDaysOfMonth(tz_m,tz_y);
var dayOfWeek = new Date(tz_y+"/"+tz_m+"/01").getDay();
$("#datepicker_" + elem_id +" .day li").remove();
for(var i=1;i<=days;i++)
{
var a_str ="";
if(tz_y == input_y && tz_m == input_m && tz_d == i)
{
a_str = "active";
}
$("#datepicker_" + elem_id +" .day ul").append(""+i+"");
}
$("#datepicker_" + elem_id +" .day li").first().css({"margin-left":30*dayOfWeek});
}
//获取每个月多少天
function getDaysOfMonth(m,y)
{
switch(m)
{
case 1:
return 31;
case 2:
if(y%4 == 0)
{
return 29;
}
else
{
return 28;
}
case 3:
return 31;
case 4:
return 30;
case 5:
return 31;
case 6:
return 30;
case 7:
return 31;
case 8:
return 31;
case 9:
return 30;
case 10:
return 31;
case 11:
return 30;
case 12:
return 31;
}
}
//隐藏年、月显示
function hideYearmonth()
{
$("#ylist_"+elem_id).slideUp("fast");
$("#ylist_"+elem_id).prev("span").removeClass("active");
$("#mlist_"+elem_id).slideUp("fast");
$("#mlist_"+elem_id).prev("span").removeClass("active");
}
//获取选中时间
function getFocusDate(date)
{
if(date == "")
{
return new Date();
}
else
{
try
{
return new Date(date);
}
catch (e)
{
return new Date();
}
}
}
// 点击div外面关闭列表
$(document).bind("click", function(event) {
var e = event || window.event;
var elem = e.srcElement || e.target;
if (elem.id == "datepicker_" + elem_id || $(elem).parent()[0].id == "datepicker_" + elem_id || $(elem).parent().parent()[0].id == "datepicker_" + elem_id) {
return;
}
else if(elem.id == "ym"+elem_id || $(elem).parent()[0].id == "ym"+elem_id || $(elem).parent().parent()[0].id == "ym"+elem_id)
{
return;
}
else if(elem.id == "mlist_"+elem_id || $(elem).parent()[0].id == "mlist_"+elem_id || $(elem).parent().parent()[0].id == "mlist_"+elem_id)
{
return;
}
else if(elem.id == "ylist_"+elem_id || $(elem).parent()[0].id == "ylist_"+elem_id || $(elem).parent().parent()[0].id == "ylist_"+elem_id)
{
return;
}
else {
if(isShow)
{
isShow = false;
return;
}
$("#datepicker_" + elem_id).slideUp("normal",function(){
_shown = false;
$(".content").css({"height": ""});
});
}
});
//返回一个元素相对于整个文档左上角的坐标
function getElementPos(elementId) {
var ua = navigator.userAgent.toLowerCase();
var isOpera = (ua.indexOf('opera') != -1);
var isIE = (ua.indexOf('msie') != -1 && !isOpera); // not opera spoof
var el = document.getElementById(elementId);
if (el.parentNode === null || el.style.display == 'none') {
return false;
}
var parent = null;
var pos = [];
var box;
if (el.getBoundingClientRect) //IE
{
box = el.getBoundingClientRect();
var scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop);
var scrollLeft = Math.max(document.documentElement.scrollLeft, document.body.scrollLeft);
return {
x : box.left + scrollLeft,
y : box.top + scrollTop
};
} else if (document.getBoxObjectFor) // gecko
{
box = document.getBoxObjectFor(el);
var borderLeft = (el.style.borderLeftWidth) ? parseInt(el.style.borderLeftWidth) : 0;
var borderTop = (el.style.borderTopWidth) ? parseInt(el.style.borderTopWidth) : 0;
pos = [box.x - borderLeft, box.y - borderTop];
} else // safari & opera
{
pos = [el.offsetLeft, el.offsetTop];
parent = el.offsetParent;
if (parent != el) {
while (parent) {
pos[0] += parent.offsetLeft;
pos[1] += parent.offsetTop;
parent = parent.offsetParent;
}
}
if (ua.indexOf('opera') != -1 || (ua.indexOf('safari') != -1 && el.style.position == 'absolute')) {
pos[0] -= document.body.offsetLeft;
pos[1] -= document.body.offsetTop;
}
}
if (el.parentNode) {
parent = el.parentNode;
} else {
parent = null;
}
while (parent && parent.tagName != 'BODY' && parent.tagName != 'HTML') { // account for any scrolled ancestors
pos[0] -= parent.scrollLeft;
pos[1] -= parent.scrollTop;
if (parent.parentNode) {
parent = parent.parentNode;
} else {
parent = null;
}
}
return {
x : pos[0],
y : pos[1]
};
}
}