/** * jquery.rangecalendar.js v 1.0.2 * Copyright 2013, Angelo Libero Mangieri * Email: angelo@afreeux.com * * jquery.rangecalendar.js v 1.1.0 * Copyright 2017, José Luis Uc * Email: ucp.jose@gmail.com * */ ( function( $, window ) { $.fn.rangeCalendar = function(options) { var defaults = { lang: "en", theme: "default-theme", themeContext: this, startDate: moment(), endDate: moment().add('months', 12), start : "+7", startRangeWidth : 3, minRangeWidth: 1, maxRangeWidth: 14, weekends: true, autoHideMonths: false, visible: true, trigger: null, changeRangeCallback : function( el, cont, dateProp ) { return false; }, //Define el minimo, maximo y rango de la linea del tiempo startTimeRangeWidth: 2, minTimeRangeWidth: 2, maxTimeRangeWidth: 4 }; this.each(function(i, el) { var obj = el, $el = $(el), settings = $.extend( true, {},defaults, options ); obj.options = settings; obj.showCalendar = function(animate) { var calPos = obj.calendarObj.position(); var lastItemPos = obj.calendarObj.find(".cell").last().position(); var lastItemRight = (lastItemPos.left + obj.calendarObj.find(".cell").last().outerWidth() ); var selectedItemPos = obj.calendarObj.find(".cell").eq(0).position(); $el.slideDown((animate ? 300 : 0), function() { var windowWidth = $(window).outerWidth(); $(obj.calendarObj).css({left: windowWidth }); $(obj.monthsObj).css({left: windowWidth }); $(obj.timeObj).css({left: windowWidth}); obj._placeElement(obj.calendarObj,(!selectedItemPos ? 0 : selectedItemPos.left) ); obj._placeElement(obj.monthsObj); obj._placeElement(obj.timeObj); }); obj.visible = true; }; obj.hideCalendar = function() { $el.slideUp(50); obj.visible = false; }; obj.toggleCalendar = function () { if(obj.visible) obj.showCalendar(); else obj.hideCalendar(); }; obj.rangeWidth = function(){ var cellWidth = obj.calendarObj.find(".cell").outerWidth(); var rangeWidth = parseInt(obj.calendarObj.find('.range-bar').outerWidth()/cellWidth); obj._rangeWidth = ( !rangeWidth ? obj._rangeWidth : rangeWidth) ; return obj._rangeWidth; }; //Define rangeWidth para la linea del tiempo obj.timeRangeWidth = function () { var cellWidth = obj.timeObj.find(".cell").outerWidth(); var rangeWidth = parseInt(obj.timeObj.find('.time-range-bar').outerWidth()/cellWidth); obj._timeRangeWidth = ( !rangeWidth ? obj._timeRangeWidth : rangeWidth); return obj._timeRangeWidth; }; obj.setRangeWidth = function(rangeWidth) { var cellWidth = obj.calendarObj.find(".cal-cell").eq(0).outerWidth(); var rangeWidth = parseInt(!rangeWidth || rangeWidth < obj.minRangeWidth ? obj.minRangeWidth : rangeWidth); $el.find(".range-bar").width(cellWidth*rangeWidth); $el.find(".range-bar").trigger("resize"); }; //Define setRangeWidth para la linea del tiempo obj.setTimeRangeWidth = function (rangeWidth) { var cellWidth = obj.timeObj.find(".time-cell").eq(0).outerWidth(); var rangeWidth = parseInt(!rangeWidth || rangeWidth < obj.minTimeRangeWidth ? obj.minTimeRangeWidth : rangeWidth); $el.find(".time-range-bar").width(cellWidth*rangeWidth); $el.find(".time-range-bar").trigger("resize"); }; obj.range = function() { var startDateIndex = obj.calendarObj.find('.cell.selected:eq(0)').index(); var startDate = moment(obj.startDate.format()).add('days', startDateIndex); var endDate = moment(obj.startDate.format()).add('days', startDateIndex); //Obtiene la hora de inicio y final seleccionado var startTime = obj.timeObj.find('.cell.selected:eq(0)')[0].textContent; var endTime = obj.timeObj.find('.cell.selected').last()[0].textContent; var startTimeSplit = startTime.split(':'); var startTimeMinutes = (+startTimeSplit[0]) * 60 + (+startTimeSplit[1]); var endTimeSplit = endTime.split(':'); var endTimeMinutes = (+endTimeSplit[0]) * 60 + (+endTimeSplit[1]); var start = startDate.add('m', startTimeMinutes); var end = endDate.add('m', endTimeMinutes); var startFormatted = start.format(); var endFormatted = end.format(); var range = $.data(obj, 'range', { start: startFormatted, end: endFormatted }); return range; }; obj.setStartDate = function(startDate) { var date = moment(startDate); var fullYear = date.format("YYYY"); var monthNumber = date.format("MM"); var dayNumber = date.format('D'); var dateId = fullYear+monthNumber+dayNumber; var monthId = fullYear+monthNumber; var dateCell = obj.calendarObj.find('.cell[date-id="'+dateId+'"]').eq(0); dateCell.trigger("click"); var monthCell = obj.monthsObj.find('.cell[month-id="'+monthId+'"]').eq(0); monthCell.trigger("click"); }; obj.lang = function (){ return obj.lang; }; obj.setTheme = function (themeName){ var _themeName = $(obj.themeContext).attr("theme"); if(_themeName) $(obj.themeContext).removeClass(_themeName); $(obj.themeContext).attr("theme",""+themeName+""); $(obj.themeContext).addClass(""+themeName+""); obj.theme = themeName; }; obj.update = function() { moment.lang(obj.lang); obj.setTheme(obj.theme); obj._generateView(); }; //EVENTS obj.didResizeBar = function() { var prevRangeWidth = obj.rangeWidth(); var rangeWidth = prevRangeWidth; var resizeBarPos = obj.calendarObj.find('.range-bar').position(); var resizeBarWidth = obj.calendarObj.find('.range-bar').outerWidth(); var resizeBarRight = resizeBarPos.left+resizeBarWidth; var cellWidth = $(obj).find(".cell").first().outerWidth(); var lastCellPos = $(obj).find(".cell").last().position(); var deltaWidth = 0; var objWidth = (lastCellPos.left+cellWidth); if(resizeBarRight > objWidth){ deltaWidth = objWidth-resizeBarWidth; prevRangeWidth = (resizeBarWidth-deltaWidth)/cellWidth; } obj.calendarObj.find('.cell').removeClass("selected"); obj.calendarObj.find('.cell').removeClass("last"); obj.calendarObj.find('.cell.start').addClass("selected"); obj.calendarObj.find('.cell.start').nextAll().slice(0, (!rangeWidth ? obj.minRangeWidth-1 : rangeWidth-1)).addClass('selected'); obj.calendarObj.find('.cell.selected').last().addClass("last"); }; //Define didResizeBar para la linea del tiempo obj.didResizeTimeBar = function () { var prevRangeWidth = obj.timeRangeWidth(); var rangeWidth = prevRangeWidth; var resizeBarPos = obj.timeObj.find('.time-range-bar').position(); var resizeBarWidth = obj.timeObj.find('.time-range-bar').outerWidth(); var resizeBarRight = resizeBarPos.left+resizeBarWidth; var cellWidth = $(obj).find(".cell").first().outerWidth(); var lastCellPos = $(obj).find(".cell").last().position(); var deltaWidth = 0; var objWidth = (lastCellPos.left+cellWidth); if(resizeBarRight > objWidth){ deltaWidth = objWidth-resizeBarWidth; prevRangeWidth = (resizeBarWidth-deltaWidth)/cellWidth; } obj.timeObj.find('.cell').removeClass("selected"); obj.timeObj.find('.cell').removeClass("last"); obj.timeObj.find('.cell.start').addClass("selected"); obj.timeObj.find('.cell.start').nextAll().slice(0, (!rangeWidth ? obj.minTimeRangeWidth-1 : rangeWidth-1)).addClass('selected'); obj.timeObj.find('.cell.selected').last().addClass("last"); obj._dispatchEvent(obj.changeRangeCallback,obj.range(),obj); }; obj.didSelectMonth = function(e) { if(obj.isDragging || $(obj.lastTarget).is(obj.monthsObj) ){ delete obj.lastTarget; return; } var currentMonthId = $(this).attr("month-id"); var currentCellMonth = obj.calendarObj.find('.cell[month-id="'+currentMonthId+'"].selected').eq(0); var monthPosition = (!currentCellMonth.length ? obj.calendarObj.find('.cell[month-id="'+currentMonthId+'"]').eq(0).position() : currentCellMonth.position()); var calendarViewWidth = $($el).outerWidth(); //Recupera los dias del mes que se deshabilitaran $.ajax({ url: 'demo.json', success: function(result){ //Recorre los dias para deshabilitarlos var days = obj.calendarObj.find('.cell[month-id="'+currentMonthId+'"]'); for(var i = 0; i < days.length; i++){ var dayDate = days[i].attributes[1].textContent; var dayYear = dayDate.substring(0,4); var dayMonth = dayDate.substring(4,6); var dayDay = dayDate.substring(6,8); for(var index = 0; index < result.length; index++){ if(result[index].day === dayDay && result[index].month === dayMonth && result[index].year === dayYear){ $(days[i]).addClass('cell-disabled'); break; } } } } }); obj.monthsObj.find('.cell').not(this).removeClass('selected'); $(this).addClass('selected'); obj._placeElement(obj.calendarObj,monthPosition); }; obj.didChangeRange = function(e,ui) { if(obj.isDragging || $(obj.lastTarget).is(obj.calendarObj)){ delete obj.lastTarget; return; } var rangeWidth = obj.rangeWidth(); var currentCalItem = $(this); var lastCalItem = obj.calendarObj.find('.cell').last(); var delta = lastCalItem.index()-currentCalItem.index(); var rightBar = currentCalItem.index()+rangeWidth-1; if(rightBar > lastCalItem.index()){ obj.calendarObj.find(' .cell').eq(currentCalItem.index()-rangeWidth+delta+1).trigger("click"); return; } obj.calendarObj.find(".start").removeClass("start"); currentCalItem.addClass("start"); obj._updateRangeBar(); obj._updateMonths(); obj._dispatchEvent(obj.changeRangeCallback,obj.range(),obj); }; //Define didChangeRange para la linea del tiempo obj.didChangeTimeRange = function (e, ui) { if(obj.isDragging || $(obj.lastTarget).is(obj.timeObj)){ delete obj.lastTarget; return; } var rangeWidth = obj.timeRangeWidth(); var currentCalItem = $(this); var lastCalItem = obj.timeObj.find('.cell').last(); var delta = lastCalItem.index()-currentCalItem.index(); var rightBar = currentCalItem.index()+rangeWidth-1; if(rightBar > lastCalItem.index()){ obj.timeObj.find(' .cell').eq(currentCalItem.index()-rangeWidth+delta+1).trigger("click"); return; } obj.timeObj.find(".start").removeClass("start"); currentCalItem.addClass("start"); obj._updateRangeBar(); obj._updateTimeRangeBar(); obj._dispatchEvent(obj.changeRangeCallback,obj.range(),obj); }; ///////////////////////////////////////////////////////* // PRIVATE METHODS obj._initRangeBar = function(){ $(window).unbind("resize"); //Prevents window.resize event triggering var rangeWidth = obj.rangeWidth() ; var cellWidth = obj.calendarObj.find(".cell").eq(0).outerWidth(); var cellHeight = obj.calendarObj.find(".cell").eq(0).outerHeight(); var selectedCell = obj.calendarObj.find(".cell.selected:eq(0)"); if(!selectedCell.length) return; obj.calendarObj.find(".range-bar").unbind( "resize"); obj.calendarObj.find(".range-bar").remove(); $(selectedCell).append('
'); if(obj.maxRangeWidth > 1){ obj.calendarObj.find(".range-bar").resizable({ grid:[cellWidth,0], maxWidth: obj.maxRangeWidth*cellWidth, minWidth: cellWidth*obj.minRangeWidth, maxHeight:cellHeight, minHeight:cellHeight, handles: "e" }); } obj.setRangeWidth(rangeWidth); obj.calendarObj.find(".range-bar").on( "resize", obj.didResizeBar); $(window).bind("resize",obj._resize); }; //Inicializa la barra para la linea del tiempo obj._initTimeRangeBar = function () { $(window).unbind("resize"); //Prevents window.resize event triggering var rangeWidth = obj.timeRangeWidth(); var cellWidth = obj.timeObj.find(".cell").eq(0).outerWidth(); var cellHeight = obj.timeObj.find(".cell").eq(0).outerHeight(); var selectedCell = obj.timeObj.find(".cell.selected:eq(0)"); if(!selectedCell.length) return; obj.timeObj.find(".time-range-bar").unbind( "resize"); obj.timeObj.find(".time-range-bar").remove(); $(selectedCell).append(' '); if(obj.maxTimeRangeWidth > 1){ obj.timeObj.find(".time-range-bar").resizable({ grid:[cellWidth,0], maxWidth: obj.maxTimeRangeWidth*cellWidth, minWidth: cellWidth*obj.minTimeRangeWidth, maxHeight:cellHeight, minHeight:cellHeight, handles: "e" }); } obj.setTimeRangeWidth(rangeWidth); obj.timeObj.find(".time-range-bar").on( "resize", obj.didResizeTimeBar); $(window).bind("resize",obj._resize); }; obj._initMonths = function() { obj.monthsObj.draggable({ axis: "x" , scrollSensitivity: 100, scrollSpeed: 100 , cursor: "move", create: function (e, ui) { obj._updateMonths(); //Mueve la barra del mes hacia el mes inicial var currentMonthId = parseInt(obj.monthsObj.find(".cell.selected").attr("month-id")); var currentMonthCell = obj.monthsObj.find('.cell[month-id="'+currentMonthId+'"]'); obj._placeElement(obj.monthsObj,currentMonthCell.position()); }, start: function (e, ui) { obj.isDragging = true; obj.monthsObj.find('.cell').unbind("click"); }, drag: function (e, ui) { }, stop: function(e, ui) { $(this).css({top: 0}); obj.lastTarget = e.target; setTimeout(function(){ obj.isDragging = false; delete obj.lastTarget; obj._placeElement(obj.monthsObj); obj.monthsObj.find('.cell').bind("click",obj.didSelectMonth); },10); } }); }; obj._initCalendar = function() { var xpos; obj.calendarObj.draggable({ axis: "x" , scrollSensitivity: 100, scrollSpeed: 100 , cursor: "move", create: function () { obj.calendarObj.find('.cell').removeClass("selected"); obj.calendarObj.find('.cell').removeClass("last"); obj.calendarObj.find(".cell").eq(obj.start-1).addClass("start"); obj.calendarObj.find(".cell").eq(obj.start-1).addClass("selected"); obj.calendarObj.find('.cell.start').nextAll().slice(0, obj._rangeWidth-1).addClass('selected'); obj.calendarObj.find('.cell').bind("click",obj.didChangeRange); obj.calendarObj.find('.cell.selected').last().addClass("last"); obj._placeElement(obj.calendarObj); }, start: function(e, ui) { xpos = ui.position.left; $(window).unbind("resize"); //Prevents window.resize event triggering obj.isDragging = true; obj.calendarObj.find('.cell').unbind("click"); }, drag: function (e, ui) { var xmove = ui.position.left - xpos; var direction = xmove >= 0 ? 'right' : 'left'; var rangeCalendarWidth = $el.outerWidth(); var calendarOffset = obj.calendarObj.position(); var monthMaxId = parseInt(obj.monthsObj.find(".cell").last().attr("month-id")); var monthMinId = parseInt(obj.monthsObj.find(".cell").first().attr("month-id")); var currentMonthId = parseInt(obj.monthsObj.find(".cell.selected").attr("month-id")); var nextMonthId = parseInt(obj.monthsObj.find(".cell.selected").next().attr("month-id")); var prevMonthId = parseInt(obj.monthsObj.find(".cell.selected").prev().attr("month-id")); if(nextMonthId && currentMonthId && nextMonthId <= monthMaxId && direction == "left") { var nextMonthsCell = obj.monthsObj.find('.cell[month-id="'+nextMonthId+'"]'); var nextMonthCalendarCell = obj.calendarObj.find('.cell[month-id="'+nextMonthId+'"]').first(); var nextMonthCalendarCellPos = nextMonthCalendarCell.position(); var nextMonthLeftCenter = (rangeCalendarWidth/2 -(nextMonthCalendarCellPos.left )) ; if( nextMonthLeftCenter >= calendarOffset.left && calendarOffset.left != 0){ obj.monthsObj.find(".cell").removeClass("selected"); $(nextMonthsCell).addClass("selected"); obj._placeElement(obj.monthsObj,nextMonthsCell.position()); } } else if(prevMonthId && currentMonthId && prevMonthId >= monthMinId && direction == "right") { var prevMonthCell = obj.monthsObj.find('.cell[month-id="'+prevMonthId+'"]'); var prevMonthCalendarCell = obj.calendarObj.find('.cell[month-id="'+prevMonthId+'"]').last(); var prevMonthCalendarCellPos = prevMonthCalendarCell.position(); var prevMonthLeftCenter = (rangeCalendarWidth/2 -(prevMonthCalendarCellPos.left )) ; if(prevMonthLeftCenter <= calendarOffset.left+prevMonthCalendarCell.outerWidth() ) { obj.monthsObj.find(".cell").removeClass("selected"); $(prevMonthCell).addClass("selected"); obj._placeElement(obj.monthsObj,prevMonthCell.position()); } } }, stop: function(e, ui) { //alert("Drag easing da inserire"); //var calendarOffset = obj.calendarObj.position(); //obj.calendarObj.animate({left: parseInt(calendarOffset.left)-100},300,'easeOutCirc'); obj.lastTarget = e.target; obj._placeElement(obj.calendarObj); setTimeout(function(){ obj.isDragging = false; delete obj.lastTarget; obj.calendarObj.find('.cell').bind("click",obj.didChangeRange); $(window).bind("resize",obj._resize); obj._placeElement(obj.monthsObj); },100); } }); }; //Inicializa la linea del tiempo obj._initTimeline = function () { var xpos; obj.timeObj.draggable({ axis: "x", scrollSensitivity: 100, scrollSpeed: 100, cursor: "move", create: function () { obj.timeObj.find('.cell').removeClass("selected"); obj.timeObj.find('.cell').removeClass("last"); obj.timeObj.find(".cell").eq(0).addClass("start"); obj.timeObj.find(".cell").eq(0).addClass("selected"); obj.timeObj.find('.cell.start').nextAll().slice(0, obj._timeRangeWidth-1).addClass('selected'); obj.timeObj.find('.cell').bind("click",obj.didChangeTimeRange); obj.timeObj.find('.cell.selected').last().addClass("last"); obj._placeElement(obj.timeObj); }, start: function (e, ui) { xpos = ui.position.left; $(window).unbind("resize"); obj.isDragging = true; obj.timeObj.find('.cell').unbind("click"); }, drag: function (e, ui) { }, stop: function (e, ui) { obj.lastTarget = e.target; obj._placeElement(obj.timeObj); setTimeout(function(){ obj.isDragging = false; delete obj.lastTarget; obj.timeObj.find('.cell').bind("click",obj.didChangeTimeRange); $(window).bind("resize",obj._resize); obj._placeElement(obj.timeObj); },100); } }); }; obj._getCalendarHTML = function(startDate,endDate) { var calendarHtml = ''; var cell; var date = moment(startDate).add('days', obj.start); var endDate = moment(endDate).add('days', obj.start); var rangeWidth = obj.rangeWidth(); for (var index = 1; (date.isBefore(endDate) || date.isSame(endDate)) ; index++){ var fullYear = date.format("YYYY"); var month = date.format("MMM"); var monthNumber = date.format("MM"); var day = date.format('ddd'); var dayNumber = date.format('D'); var isWeekend = date.day()%6==0; if(isWeekend && !obj.weekends){ date.add('days', 1); continue; } for(var monthIndex = 0; monthIndex < obj.emptyMonths.length; monthIndex++){ if(obj.emptyMonths[monthIndex].month === monthNumber && obj.emptyMonths[monthIndex].year === fullYear){ cell = '