/** * JTSage-DateBox * @fileOverview Provides the slidebox mode * @author J.T.Sage <jtsage+datebox@gmail.com> * @author {@link https://github.com/jtsage/jtsage-datebox/contributors|GitHub Contributors} * @license {@link https://github.com/jtsage/jtsage-datebox/blob/master/LICENSE.txt|MIT} * @version 5.2.0 */ mergeOpts({ slideHighToday : true, slideHighPick : true, slideUsePickers : false, slideNoHeader : false, slideYearPickMin : -6, slideYearPickMax : 6, slideYearPickRelative : true, highDays : false, highDates : false, highDatesRec : false, highDatesAlt : false, enableDates : false, slideDateList : false, slideShowDateList : false }); /** * @typedef {Object} _slide_ThemeDate_Return * @property {string} theme Theme class to use */ /** * Apply theme information for a date * * @param {object} javascript Date Object * @return {_slide_ThemeDate_Return} Theme information */ JTSageDateBox._slide_ThemeDate = function( testDate ) { var w = this, o = this.options, itt, done = false, returnObject = { theme : o.theme_slide_Default }, dateThemes = [ [ "selected", "theme_slide_Selected" ], [ "today" , "theme_slide_Today" ], [ "highDates", "theme_slide_DateHigh" ], [ "highDatesAlt", "theme_slide_DateHighAlt" ], [ "highDatesRec", "theme_slide_DateHighRec" ], [ "highDays", "theme_slide_DayHigh" ] ]; w.realToday = new w._date(); for ( itt = 0; itt < dateThemes.length && !done; itt++ ) { if ( w._ThemeDateCK[ dateThemes[ itt ][0] ].call( w, testDate ) ) { returnObject.theme = o[ dateThemes[ itt ][1] ]; done = true; } } return returnObject; }; /** * Build the slidebox * * @memberOf JTSageDateBox._build * @this JTSageDateBox */ JTSageDateBox._build.slidebox = function () { var w = this, o = this.options, // Today's real date, not based on selection date_realToday = new w._date(), // The month ( of the middle date ) date_displayMonth = w.theDate.get(1), // The year ( of the middle date ) date_displayYear = w.theDate.get(0), // Working date. date_working = ( w.theDate.copy( false, [ 0, 0, 0, 12, 1, 1, 1 ] ) ).adj( 2, -3 ), // This holds the grid temporarily calContent = "", calCntlRow = "", // Control variables. cntlCol, cntlObj = {}; if ( typeof w.d.intHTML !== "boolean" ) { w.d.intHTML.remove(); w.d.intHTML = null; } // slide dates are always ok, handle disabled set logic elsewhere w.dateOK = true; w.d.headerText = w._grabLabel( w.__( "titleDateDialogLabel" ) ); w.d.intHTML = $( "<span>" ); w.d.intHTML.addClass( o.theme_spanStyle ); // Internal header (not the widget master header, a header for the calendar) // // Expects a ".dbSlideNext" and ".dbSlidePrev" for prev/next button events. if ( o.slideNoHeader === false ) { w.style_pnHead( w._formatter( w.__( "calHeaderFormat"), w.theDate ), o.theme_slide_PrevBtn, o.theme_slide_NextBtn, "dbSlidePrev", "dbSlideNext" ).appendTo( w.d.intHTML ); w.d.intHTML .on( o.clickEvent, ".dbSlideNext", function(e) { e.preventDefault(); e.stopPropagation(); if ( w.theDate.getDate() > 28 ) { w.theDate.setDate(1); } w._offset( "m", 1 ); return false; }) .on( o.clickEvent, ".dbSlidePrev", function(e) { e.preventDefault(); e.stopPropagation(); if ( w.theDate.getDate() > 28 ) { w.theDate.setDate(1); } w._offset( "m", -1 ); return false; }); } // Picker controls, if enabled. if ( o.slideUsePickers !== false ) { w.style_picker( w._pickRanges( date_displayMonth, date_displayYear, date_realToday.get(0), o.slideYearPickRelative ), o.theme_slide_Pickers, "dbSlidePickMonth", "dbSlidePickYear" ).appendTo( w.d.intHTML ); w.d.intHTML.on( "change", "#dbSlidePickMonth, #dbSlidePickYear", function() { if ( w.theDate.get(2) > 28 ) { w.theDate.setD( 2, 1 ); //Set first of month if over the 28th. } w.theDate.setD( 1, $( "#dbSlidePickMonth" ).val() ); // Set choosen month w.theDate.setD( 0, $( "#dbSlidePickYear" ).val() ); // Set choosen year w.refresh(); }); } // The actual grid system. calContent = $( w.style_slideGrid() ).appendTo( w.d.intHTML ).find( ".dbSlideGrid" ).first(); calCntlRow = w.style_slideRow(); calCntlRow.append( w.style_slideCtrl( "dbSlideWkPrev", ( w.__( "isRTL" ) === true ) ? o.theme_slide_NextDateBtn : o.theme_slide_PrevDateBtn ) ); for ( cntlCol = -3; cntlCol <= 3; cntlCol++ ) { cntlObj = Object.assign( w._newDateChecker( date_working ), w._slide_ThemeDate( date_working ) ); cntlObj.htmlObj = w.style_slideBtn( cntlObj ); // Add data object to event object cntlObj.eventObj = cntlObj.htmlObj.find( ".dbEventS" ).first(); cntlObj.eventObj.data( cntlObj ); calCntlRow.append( cntlObj.htmlObj ); date_working.adj( 2, 1 ); } calCntlRow.append( w.style_slideCtrl( "dbSlideWkNext", ( w.__( "isRTL" ) === true ) ? o.theme_slide_PrevDateBtn : o.theme_slide_NextDateBtn ) ); // Deal with RTL languages (flex is easiest) if ( w.__( "isRTL" ) === true ) { calCntlRow.children().each( function ( i, item ) { calCntlRow.prepend( item ); }); } // Add row to grid. calCntlRow.appendTo( calContent ); // Quick Date Picker if turned on. if ( o.slideShowDateList !== false && o.slideDateList !== false ) { w.style_dateList( w.__( "calDateListLabel" ), o.slideDateList, o.theme_slide_DateList, "dbSlidePickList" ).appendTo(w.d.intHTML); w.d.intHTML.on( "change", "#dbSlidePickList", function() { var iPut = $( this ).val().split( "-" ); w.theDate = new w._date( iPut[0], iPut[1] - 1, iPut[2], 12, 1, 1, 1 ); w._t( { method : "doset" } ); w._t( { method : "dorefresh" } ); w._t( { method : "close" } ); }); } // Bottom Buttons w.d.intHTML.append( w._doBottomButtons.call( w, false ) ); // Each date event loop, swipe and mouse events. w.d.intHTML .on( o.clickEvent, ".dbEventS", function(e) { e.preventDefault(); if ( $( this ).data( "good" ) ) { w.theDate = $( this ).data( "dateObj" ).copy(); w._t( { method : "set", value : w._formatter( w.__fmt(),w.theDate ), date : w.theDate } ); w._t( { method : "close" } ); if ( o.displayMode === "inline" ) { w._t( { method : "dorefresh" } ); } } }) .on( o.clickEvent, ".dbSlideWkNext", function(e) { e.preventDefault(); e.stopPropagation(); w._offset( "d", 7 ); return false; }) .on( o.clickEvent, ".dbSlideWkPrev", function(e) { e.preventDefault(); e.stopPropagation(); w._offset( "d", -7 ); return false; }) .on( w.wheelEvent, function(e,d) { e.preventDefault(); d = ( typeof d === "undefined" ) ? Math.sign(e.originalEvent.wheelDelta) : d; w._offset( "d", ( d > 0 ) ? 7 : -7 ); }); };