(function ($) { //지역변수 var _arrDatePickerStorage = []; //달력 플러그인 $.fn.calendar = function (opt) { if( $(this).length < 1 ) return; var $wrap = null; var $info = null; var $contents = null; var _obj = this; var _opt = opt; var _scroll_y = false; var _topGap = _opt.topGap || 5; //#20525 해외패키지 관련 var _resState = _opt.resState || false; var _fixday = _opt.fixDay || null; var _startday = _opt.startDay || null; var _waitingday = _opt.waitingDay || null; //#24414(열어두기, 다중 선택) var _isOpen = _opt.isOpen || false; var _isMultiple = _opt.isMultiple || false; var _dateList = _opt.dateList || null; var Fn = { Init: function () { Fn.Draw(); //날짜설정 if (typeof (_opt.initCallback) == 'function') { $(_obj).val(_opt.date); _opt.initCallback(_opt.date); } else { $(_obj).val(_opt.date); } //읽기전용 설정 $(_obj).attr('readonly', 'readonly'); //#24414(열어두기) if(_isOpen === true){ Fn.Opened(); } else { //달력클릭 jQuery(_obj).on('click', function (e) { Fn.Open(); }); } }, Draw: function () { if ($wrap == null) { var html = ''; html += '
'; if ($('mcalendar-' + _obj.attr('id')).length == 0) { if (_opt.parent == null || _opt.parent == undefined) { $('body').append(html); } else { $(_opt.parent).append(html); } } $wrap = $('#mcalendar-' + _obj.attr('id')); $info = $wrap.find('.datepicker-container > .this-month-wrap'); $contents = $wrap.find('.datepicker-container > .contents'); if (_opt.inline != undefined && _opt.inline == true) { $wrap.addClass('datepicker-inline'); } Fn.Event(); } }, Event: function () { $info.on('click', '#date-prev', function (e) { e.preventDefault(); if($wrap.find('table').eq(1).is(":animated")) { return; } var year = parseInt($info.attr('year')); var month = parseInt($info.attr('month')) - 1; //var l = $wrap.width(); var l = '100%'; $wrap.find('table').stop(); Fn.Change(year, month); $wrap.find('table').eq(0).animate({ left: 0 }); $wrap.find('table').eq(1).animate({ left: l }, function () { //$info.attr('t_start_w', ''); //touchmove $(this).next().remove(); //$wrap.find('.contents').prepend(Fn.DrawMonth(year, month - 1, -$wrap.width())); $wrap.find('.contents').prepend(Fn.DrawMonth(year, month - 1, '-100%')); }); }); $info.on('click', '#date-next', function (e) { e.preventDefault(); if($wrap.find('table').eq(1).is(":animated")) { return; } var year = parseInt($info.attr('year')); var month = parseInt($info.attr('month')) + 1; //var l = -$wrap.width(); var l = '-100%'; $wrap.find('table').stop(); Fn.Change(year, month); $wrap.find('table').eq(1).animate({ left: l }); $wrap.find('table').eq(2).animate({ left: 0 }, function () { //$info.attr('t_start_w', ''); //touchmove $wrap.find('table').eq(0).remove(); //$wrap.find('.contents').append(Fn.DrawMonth(year, month + 1, $wrap.width())); $wrap.find('.contents').append(Fn.DrawMonth(year, month + 1, '100%')); }); }); $wrap.on('click', 'tr > td > a', function (e) { e.preventDefault(); //#24414(다중 선택) if(_isMultiple === true){ if(!$(this).hasClass('no') && !$(this).closest('td').hasClass('disable')){ var date = $(this).attr('date'); if($(this).closest('td').hasClass('current')){ $(this).closest('td').removeClass('current'); SetDateListDelete(date); } else { $(this).closest('td').addClass('current'); SetDateListAdd(date); } } } else{ if (!$(this).hasClass('no')) { if(_obj.attr("chk_fix_date") != 'Y') _obj.attr("chk_fix_date", "Y"); var date = $(this).attr('date'); $('#' + $info.attr('obj')).val(date); $('#' + $info.attr('obj')).trigger('change'); $(this).closest('tbody').find('tr > td').removeClass('current'); $(this).closest('td').addClass('current'); if (typeof (_opt.sCallback) == 'function') { _opt.sCallback(date); } Fn.Close(); } } }); //#24414(월 전체 선택) if(_isMultiple === true){ $wrap.on('click', '.btn-all-month', function (e) { if($wrap.find('table').eq(1).is(":animated")) { return; } var target = $wrap.find('table').eq(1); var lastIndex = target.find('tbody > tr > td').length - 1; var currentCnt = 0; target.find('tbody > tr > td').each(function(index){ if(!$(this).find('a').hasClass('no') && !$(this).hasClass('disable') && !$(this).hasClass('current')){ currentCnt++; $(this).addClass('current'); var date = $(this).find('a').attr('date'); SetDateListAdd(date); } if(index == lastIndex && currentCnt == 0){ target.find('.current').each(function(){ var date = $(this).find('a').attr('date'); SetDateListDelete(date); $(this).removeClass('current'); }); } }); }); } $wrap.on('click', '.close_datepicker', function () { Fn.Close(); }); /* $contents.on('touchmove', function (e) { e.preventDefault(); var t_start_w = $info.attr('t_start_w'); var t_now_w = e.originalEvent.touches[0].pageX; if (t_start_w == '' || t_start_w == undefined) { t_start_w = t_now_w; $info.attr('t_start_w', t_now_w); } var l = $wrap.width(); var m = t_now_w - t_start_w; var t_start_s = $info.attr('t_start_s'); if (t_start_s == '' || t_start_s == undefined) { t_start_s = $('body').scrollTop(); $info.attr('t_start_s', t_start_s); } var t_now_h = e.originalEvent.touches[0].screenY; var t_start_h = $info.attr('t_start_h'); if (t_start_h == '' || t_start_h == undefined) { t_start_h = t_now_h; $info.attr('t_start_h', t_now_h); } //if ((Math.abs(parseInt(t_start_h) - t_now_h) > ($contents.height() * 1 / 3)) && !_scroll_y) { _scroll_y = true; //} if (Math.abs(m) > ($contents.height() * 1 / 4)) { $wrap.find('table').eq(0).css({ left: -l + m }); $wrap.find('table').eq(1).css({ left: 0 + m }); $wrap.find('table').eq(2).css({ left: l + m }); } else { $('body').scrollTop(parseInt(t_start_s) + (parseInt(t_start_h) - t_now_h)); } $info.attr('t_now_w', t_now_w); $info.attr('t_now_h', t_now_h); }); $contents.on('touchend', function (e) { var l = $wrap.width(); var v = parseInt($wrap.find('table').eq(1).css('left')); var w = parseInt($wrap.width() / 3); _scroll_y = false; $info.attr('t_start_s', ''); $info.attr('t_start_h', ''); if (w > Math.abs(v)) { $wrap.find('table').eq(0).animate({ left: -l }); $wrap.find('table').eq(1).animate({ left: 0 }); $wrap.find('table').eq(2).animate({ left: l }); } else { if (v < 0) { $info.find('#date-next').trigger('click'); } else { $info.find('#date-prev').trigger('click'); } } }); */ }, Opened: function () { // #30254(_obj.attr("min") 값이 없으면 _opt.min 값을 찾는다 결국 2군데 값이 존재 <- attr은 값이 수정 될 수가 있다) var max = null, min = null; if( _obj.attr("min") != null){ min = GetDate(_obj.attr("min")); } else{ if (_opt.min != null) { min = (typeof (_opt.min) == 'object') ? GetDate($(_opt.min).val()) : ((typeof (_opt.min) == 'string') ? GetDate(_opt.min) : null); } } if( _obj.attr("max") != null){ max= GetDate(_obj.attr("max")); } else{ if (_opt.max != null) { max = (typeof (_opt.max) == 'number') ? AddDay(GetDate($(_opt.min).val()), _opt.max) : GetDate(_opt.max); } } $info.attr('obj', _obj.attr('id')); $info.attr('min', GetDateStr(min)); // #30254(최종 $info.attr("min") 값이 담긴다) $info.attr('max', GetDateStr(max)); // #30254(최종 $info.attr("max") 값이 담긴다) var date = GetDate(_obj.val()); var year = date.getFullYear(); var month = date.getMonth() + 1; Fn.Change(year, month); Fn.BeforeDraw(year, month); $wrap.show(1,function () { $wrap.attr('state', 'o'); }); }, Open: function () { if ($info.attr('obj') != _obj.attr('id') && $wrap.css('display') == 'none') { Fn.Close(); $wrap.stop(); // #30254(_obj.attr("min") 값이 없으면 _opt.min 값을 찾는다 결국 2군데 값이 존재 <- attr은 값이 수정 될 수가 있다) var max = null, min = null, enableDays = null; var chk_disp_date1 = null, chk_disp_date2 =null, chk_disp_date3 =null, chk_disp_date4 =null; if( _obj.attr("min") != null){ min = GetDate(_obj.attr("min")); } else{ if (_opt.min != null) { min = (typeof (_opt.min) == 'object') ? GetDate($(_opt.min).val()) : ((typeof (_opt.min) == 'string') ? GetDate(_opt.min) : null); } } if( _obj.attr("max") != null){ max= GetDate(_obj.attr("max")); } else{ if (_opt.max != null) { max = (typeof (_opt.max) == 'number') ? AddDay(GetDate($(_opt.min).val()), _opt.max) : GetDate(_opt.max); } } if( _obj.attr("chk_disp_date1") != null){ chk_disp_date1 = GetDate(_obj.attr("chk_disp_date1")); } else{ if (_opt.chk_disp_date1 != null) { chk_disp_date1 = (typeof (_opt.chk_disp_date1) == 'object') ? GetDate($(_opt.chk_disp_date1).val()) : ((typeof (_opt.chk_disp_date1) == 'string') ? GetDate(_opt.chk_disp_date1) : null); } } if( _obj.attr("chk_disp_date2") != null){ chk_disp_date2= GetDate(_obj.attr("chk_disp_date2")); } else{ if (_opt.chk_disp_date2 != null) { chk_disp_date2 = (typeof (_opt.chk_disp_date2) == 'number') ? AddDay(GetDate($(_opt.chk_disp_date2).val()), _opt.chk_disp_date2) : GetDate(_opt.chk_disp_date2); } } if( _obj.attr("chk_disp_date3") != null){ chk_disp_date3= GetDate(_obj.attr("chk_disp_date3")); } else{ if (_opt.chk_disp_date3 != null) { chk_disp_date3 = (typeof (_opt.chk_disp_date3) == 'number') ? AddDay(GetDate($(_opt.chk_disp_date3).val()), _opt.chk_disp_date3) : GetDate(_opt.chk_disp_date3); } } if( _obj.attr("chk_disp_date4") != null){ chk_disp_date4= GetDate(_obj.attr("chk_disp_date4")); } else{ if (_opt.chk_disp_date4 != null) { chk_disp_date4 = (typeof (_opt.chk_disp_date4) == 'number') ? AddDay(GetDate($(_opt.chk_disp_date4).val()), _opt.chk_disp_date4) : GetDate(_opt.chk_disp_date4); } } if( _obj.attr("enableDays") != null){ enableDays = _obj.attr("enableDays"); } else{ if (_opt.enableDays != null) { enableDays = ((typeof (_opt.enableDays) == 'string') ? _opt.enableDays : null); } } $info.attr('obj', _obj.attr('id')); $info.attr('min', GetDateStr(min)); // #30254(최종 $info.attr("min") 값이 담긴다) $info.attr('max', GetDateStr(max)); // #30254(최종 $info.attr("max") 값이 담긴다) $info.attr('chk_disp_date1', GetDateStr(chk_disp_date1)); $info.attr('chk_disp_date2', GetDateStr(chk_disp_date2)); $info.attr('chk_disp_date3', GetDateStr(chk_disp_date3)); $info.attr('chk_disp_date4', GetDateStr(chk_disp_date4)); $info.attr('enableDays', enableDays); var date = GetDate(_obj.val()); var year = date.getFullYear(); var month = date.getMonth() + 1; //console.log(date+','+year+','+month) //강조표시 클래스 적용 if (_opt.activeClass != null) { $(_obj).addClass(_opt.activeClass); } Fn.Change(year, month); Fn.BeforeDraw(year, month); Fn.Show(); } else{ Fn.Close(); } }, Close: function () { $info.attr('obj', ''); $info.attr('min', ''); $info.attr('max', ''); $info.attr('enableDays', ''); _obj.closest('lable').removeClass('activate'); //강조표시 클래스 삭제 if (_opt.activeClass != null) { $(_obj).removeClass(_opt.activeClass); } /* $wrap.slideUp(200, function () { $wrap.find('table').remove(); $wrap.attr('state', 'c'); }); */ $wrap.hide(1, function () { $wrap.find('table').remove(); $wrap.attr('state', 'c'); }); $('#'+_obj.attr('id')).parents('.input.on').removeClass('on'); }, Show: function () { var top = _obj.offset().top; var inputH = _obj.height(); var top_result = (_opt.inline) ? 0 : top + inputH + 5; var inputTop = $('#'+_obj.attr('id')).parents('.input').offset().top; $wrap.css('top', top_result).show(1,function () { $wrap.attr('state', 'o'); //달력 외 클릭시 닫기 $(document).one('click', function (e) { e.stopPropagation(); var calendar = $(e.target).closest('.datepicker-wrap'); if (calendar.length == 0 && calendar.attr('state') != 'c') { Fn.Close(); } }); }); $('html,body').animate({ scrollTop : inputTop - _topGap },400); /*$wrap.css('top', top_result).slideDown(400, function () { $wrap.attr('state', 'o'); //달력 외 클릭시 닫기 $(document).one('click', function (e) { e.stopPropagation(); var calendar = $(e.target).closest('.datepicker-wrap'); if (calendar.length == 0 && calendar.attr('state') != 'c') { Fn.Close(); } }); });*/ _obj.closest('lable').removeClass('activate'); for( var i = 0; i < _arrDatePickerStorage.length; i++ ){ if( _arrDatePickerStorage[i] !== Fn ){ _arrDatePickerStorage[i].Close(); } } $('#'+_obj.attr('id')).parent('.input').addClass('on'); }, Change: function (year, month) { var info = GetMonth(year, month); var min = GetDate($info.attr('min')); var max = GetDate($info.attr('max')); $info.find('.this-month').text(info.year + '.' + ((info.month < 10) ? ('0' + info.month) : info.month)); $info.attr('year', info.year); $info.attr('month', info.month); //#25837 // #30254(최종 $info.attr("min") 값을 가져와서 좌,우 버튼 컨트롤) //min if (min != null) { if(year <= min.getFullYear() && month <= min.getMonth()+1){ $info.find('#date-prev').addClass('off'); } else{ $info.find('#date-prev').removeClass('off'); } } //max if (max != null) { if(year >= max.getFullYear() && month >= max.getMonth()+1){ $info.find('#date-next').addClass('off'); } else{ $info.find('#date-next').removeClass('off'); } } }, BeforeDraw: function (year, month) { if (_opt.title != null) { if( _obj.attr("title") != null){ _opt.title = _obj.attr("title"); } $wrap.find('.datepicker-header .h_title').text(_opt.title); } /*$wrap.find('.contents').append(Fn.DrawMonth(year, month - 1, -$wrap.width())); $wrap.find('.contents').append(Fn.DrawMonth(year, month, 0)); $wrap.find('.contents').append(Fn.DrawMonth(year, month + 1, $wrap.width()));*/ $wrap.find('.contents').append(Fn.DrawMonth(year, month - 1, '-100%')); $wrap.find('.contents').append(Fn.DrawMonth(year, month, 0)); $wrap.find('.contents').append(Fn.DrawMonth(year, month + 1, '100%')); }, DrawMonth: function (year, month, left) { var info = GetMonth(year, month); var s_date = GetDate($('#' + $info.attr('obj')).val()); var start = 1 - new Date(info.year, info.month - 1, 1).getDay(); var end = new Date(info.year, info.month, 0).getDate(); if (start == 1) { start = start - 7; } var html = ''; html += 'Su | '; html += 'Mo | '; html += 'Tu | '; html += 'We | '; html += 'Th | '; html += 'Fr | '; html += 'Sa | '; html += '
---|