Source: baseObject.js

/* jshint unused: false */

/**
 * JTSage-DateBox
 * @fileOverview Base options object and options getters / setters.
 * @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
 */

/**
 * DateBox widget
 * 
 * @kind class
 */
var JTSageDateBox = {},

	/* exported mergeOpts */
	/**
	 * Merge options together. Deliberatly shallow merge.
	 *
	 * @param {Object} newOpts
	 */
	mergeOpts = function (newOpts) {
		for (var attrname in newOpts) {
			JTSageDateBox.options[attrname] = newOpts[attrname];
		}
	};


/**
 * Selector to auto-enhance
 * 
 * @type {string}
 */
JTSageDateBox.initSelector = "input[data-role='datebox']";

/**
 * Widget Options
 * 
 * @type {Object}
 */
JTSageDateBox.options = {
	// All widget options, including some internal runtime details

	mode                    : false,

	hideInput               : false,

	lockInput               : true,
	safeEdit                : true,

	controlWidth            : "290px",
	/* Set to "!important" if the framework needs it */
	controlWidthImp         : "",
	breakpointWidth         : "567px",
	zindex                  : "1100",
	clickEvent              : "click",
	disableWheel            : false,

	useKinetic              : true,
	flipSizeOverride        : false,

	defaultValue            : false,
	showInitialValue        : false,

	linkedField             : false,
	linkedFieldFormat       : "%J",

	/* One of dropdown, inline, blind, or modal */
	displayMode             : "dropdown",

	/* For dropdown, position string.  *
	*  Valid : topRight, topMiddle, topLeft
	*          bottomRight, bottomMiddle, bottomLeft
	*          centerRight, centerMiddle, centerLeft
	*/
	displayDropdownPosition : "bottomRight",

	/* For inline display   : left, right, center (defaults center) */
	displayInlinePosition   : "center",

	/* Expects [ top, left ] in px */
	displayForcePosition    : false,

	dismissOutsideClick     : true,
	dismissOnEscape         : false,

	useHeader               : true,
	useImmediate            : false,

	useButton               : true,
	buttonIcon              : false,
	useFocus                : false,
	
	useSetButton            : true,
	useCancelButton         : false,
	useTodayButton          : false,
	closeTodayButton        : false,
	useTomorrowButton       : false,
	closeTomorrowButton     : false,
	useClearButton          : false,
	useCollapsedBut         : false,
	
	usePlaceholder           : false,
	headerFollowsPlaceholder : true,
	headerFollowsTitle       : true,
	headerFollowsLabel       : true,

	beforeOpenCallback      : false,
	beforeOpenCallbackArgs  : [],
	openCallback            : false,
	openCallbackArgs        : [],
	closeCallback           : false,
	closeCallbackArgs       : [],
	runOnBlurCallback       : false,

	startOffsetYears        : false,
	startOffsetMonths       : false,
	startOffsetDays         : false,
	afterToday              : false,
	beforeToday             : false,
	notToday                : false,
	maxDate                 : false,
	minDate                 : false,
	maxDays                 : false,
	minDays                 : false,
	maxYear                 : false,
	minYear                 : false,
	blackDates              : false,
	blackDatesRec           : false,
	blackDatesPeriod        : false,
	blackDays               : false,
	whiteDates              : false,
	enableDates             : false,
	validHours              : false,
	minHour                 : false,
	maxHour                 : false,
	minTime                 : false,
	maxTime                 : false,
	maxDur                  : false,
	minDur                  : false,
	minuteStep              : 1,
	minuteStepRound         : 0,
	twoDigitYearCutoff      : 38,

	flipboxLensAdjust       : false,

	rolloverMode : {
		"m"   : true,
		"d"   : true,
		"h"   : true,
		"i"   : true,
		"s"   : true
	},

	useLang : "default",
	lang : {
		"default" : {
			setDateButtonLabel     : "Set Date",
			setTimeButtonLabel     : "Set Time",
			setDurationButtonLabel : "Set Duration",
			todayButtonLabel       : "Jump to Today",
			tomorrowButtonLabel    : "Jump to Tomorrow",
			titleDateDialogLabel   : "Set Date",
			titleTimeDialogLabel   : "Set Time",
			daysOfWeek : [
				"Sunday", "Monday", "Tuesday",
				"Wednesday", "Thursday", "Friday",
				"Saturday"
			],
			daysOfWeekShort : ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
			monthsOfYear : [
				"January", "February", "March", "April", "May", "June",
				"July", "August", "September", "October", "November", "December"
			],
			monthsOfYearShort : [
				"Jan", "Feb", "Mar", "Apr", "May", "Jun",
				"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
			],
			durationLabel      : ["Days", "Hours", "Minutes", "Seconds"],
			durationDays       : ["Day", "Days"],
			timeFormat         : 24,
			headerFormat       : "%A, %B %-d, %Y",
			tooltip            : "Open Date Picker",
			nextMonth          : "Next Month",
			prevMonth          : "Previous Month",
			dateFieldOrder     : ["m", "d", "y"],
			timeFieldOrder     : ["h", "i", "a"],
			datetimeFieldOrder : ["y", "m", "d", "h", "i", "s", "a"],
			slideFieldOrder    : ["y", "m", "d"],
			dateFormat         : "%Y-%m-%d",
			datetimeFormat     : "%Y-%m-%dT%k:%M:%S",
			useArabicIndic     : false,
			isRTL              : false,
			calStartDay        : 0,
			clearButton        : "Clear",
			cancelButton       : "Cancel",
			durationOrder      : ["d", "h", "i", "s"],
			meridiem           : ["AM", "PM"],

			// 12HR = "%l:%M %p"
			// 24HR = "%k:%M"
			timeOutput         : "%k:%M",
			durationFormat     : "%Dd %DA, %Dl:%DM:%DS",
			calDateListLabel   : "Other Dates",
			calHeaderFormat    : "%B %Y"
		}
	}
};

/*jshint -W101,-W108 */
/* eslint-disable quotes,max-len*/
// Line width check disabled for these only, or it's a mess.
/**
 * Widget Icons
 * 
 * @type {Object}
 * @property {string} next Next Chevron
 * @property {string} prev Previous Chevron
 * @property {string} plus Plus Sign
 * @property {string} minus Minus Sign
 * @property {string} check Check Mark
 * @property {string} cancel X Mark, Cancel, Close
 * @property {string} goto Goto symbol
 * @property {string} clear Trash Can
 * @property {string} clock Clock
 * @property {string} calendar Calendar
 * @property {function} getIcon Retrieve an icon by name (override with SVG)
 */
JTSageDateBox.icons = {
	getIcon  : function ( name ) {
		var w    = this,
			icnF = w.options.iconFactory;
		// Empty argument?  Do nothing.
		// If the icon name starts with a tag, it's svg.
		// However, if o.iconFactory is a function, return that instead.

		if ( name === false ) { return false; }

		if ( typeof icnF === "function" ) {
			return icnF.call( w, name );
		}

		if ( name.substr(0,4) === "<svg" ) { return name; }

		if ( typeof w.icons[name] !== "undefined" ) { return w.icons[name]; }

		return w.icons.cancel;
	},
	next     : '<svg width="12" height="12" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M9.8 6L4 11.8l-1.8-1.7L6.6 6 2.2 2 4 .1 9.8 6z" clip-rule="evenodd" fill-rule="evenodd"/></svg>',
	prev     : '<svg width="12" height="12" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M2.2 6L8 .2l1.8 1.7L5.4 6l4.4 4L8 11.9 2.2 6z" clip-rule="evenodd" fill-rule="evenodd"/></svg>',
	plus     : '<svg width="12" height="12" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M0 5v2h12V5H0z" fill="currentColor"/><path fill-rule="evenodd" clip-rule="evenodd" d="M7 0H5v12h2V0z" fill="currentColor"/></svg>',
	minus    : '<svg width="12" height="12" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M0 5v2h12V5H0z" clip-rule="evenodd" fill-rule="evenodd"/></svg>',
	check    : '<svg width="12" height="12" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M12 2.8l-8 8-4-4 1.5-1.5L4 7.8l6.5-6.5L12 2.6z" clip-rule="evenodd" fill-rule="evenodd"/></svg>',
	cancel   : '<svg width="12" height="12" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M11 2.5L9.4 1 1.1 9.5 2.5 11l8.4-8.4z" clip-rule="evenodd" fill-rule="evenodd"/><path fill="currentColor" d="M2.5 1L1 2.6l8.4 8.4L11 9.5 2.5 1.1z" clip-rule="evenodd" fill-rule="evenodd"/></svg>',
	goto     : '<svg width="12" height="12" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M7 3.3C3.8 3.6.4 5.9.4 11.7c2-4.3 4-5 6.8-5v2.9l4.6-4.7L7.1.3v3z" fill-rule="evenodd"/></svg>',
	clear    : '<svg width="12" height="12" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M9.8 1H8.1c0-.5-.4-1-.8-1H4.7C4.3 0 4 .6 4 1H2.2c-.4 0-.8.3-.8.8v.8c0 .5.4.8.8.8V11c0 .5.4.9.9.9H9c.4 0 .8-.4.8-.9V3.4c.5 0 .8-.3.8-.8v-.8c0-.5-.3-.9-.8-.9zM9 11H3V3.6H4v6.7h.8V3.5h.9v6.7h.8V3.5h.9v6.7H8V3.5h.8V11zm.8-8.4H2.2v-.8h7.6v.8z" fill="currentColor"/></svg>',
	clock    : '<svg width="12" height="12" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M6.8 6h2.5v1.7H5.9a.8.8 0 0 1-.8-.8V2.6h1.7V6zM6 1.2a4.8 4.8 0 1 1 0 9.6 4.8 4.8 0 0 1 0-9.6zM6 .1a6 6 0 0 0-6 6 6 6 0 0 0 6 6 6 6 0 0 0 6-6 6 6 0 0 0-6-6z" clip-rule="evenodd" fill-rule="evenodd"/></svg>',
	calendar : '<svg width="12" height="12" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M10.5 1h-.8v1.3c0 .2-.2.4-.4.4H7.6a.4.4 0 0 1-.4-.4V1H4.7v1.3c0 .2-.2.4-.4.4H2.6a.4.4 0 0 1-.4-.4V1h-.8c-.5 0-.8.4-.8.8V11c0 .5.4.8.8.8h9.3c.5 0 .8-.4.8-.8V1.8c0-.5-.4-.8-.8-.8zm0 10.1H1.2V3.5h9.3v7.6zM3.7 1.9h-.8V.2h.8v1.7zm5.1 0H8V.2h.8v1.7zM4.5 5.3h-.8v-.8h.8v.8zm1.7 0h-.8v-.8h.8v.8zm1.7 0h-.8v-.8h.8v.8zm1.7 0h-.8v-.8h.8v.8zM2.8 7H2v-.8h.8V7zm1.7 0h-.8v-.8h.8V7zm1.7 0h-.8v-.8h.8V7zm1.7 0h-.8v-.8h.8V7zm1.7 0h-.8v-.8h.8V7zM2.8 8.7H2v-.8h.8v.8zm1.7 0h-.8v-.8h.8v.8zm1.7 0h-.8v-.8h.8v.8zm1.7 0h-.8v-.8h.8v.8zm1.7 0h-.8v-.8h.8v.8zm-6.8 1.7H2v-.8h.8v.8zm1.7 0h-.8v-.8h.8v.8zm1.7 0h-.8v-.8h.8v.8zm1.7 0h-.8v-.8h.8v.8z"/></svg>',
};
/*jshint +W101,+W108 */
/* eslint-enable quotes,max-len */

/**
 * Create actual HTML controls per framework
 *
 * @type Object
 * @memberof JTSageDateBox
 * @namespace JTSageDateBox.styleFunctions
 */
JTSageDateBox.styleFunctions = {};
	
/**
 * Get the "long" version of the options from the input
 *
 * @param {Object} element - jQuery object, original input element
 * @returns {Object} Found elements, shallow object
 */
JTSageDateBox._getLongOptions = function( element ) {
	// Pull "long" options from the element, i.e.
	// data-datebox-mode="datebox" --> options.mode
	var key, temp,
		returnObj    = {},
		prefix       = "datebox",
		prefixLength = 7;

	for ( key in element.data() ) {
		if ( key.substr( 0, prefixLength ) === prefix && key.length > prefixLength ) {
			temp = key.substr( prefixLength );
			temp = temp.charAt( 0 ).toLowerCase() + temp.slice( 1 );
			if ( temp !== "options" ) {
				returnObj[ temp ] = element.data( key );
			}
		}
	}
	return returnObj;
};

/**
 * Set an option, then refresh display
 *
 * @param {string} Option Name
 * @param {string} Option Value
 */
JTSageDateBox._setOption = function() {
	$.Widget.prototype._setOption.apply( this, arguments );
	this.refresh();
};

/**
 * Get the value of an option, auto-search the i18n values (first)
 *
 * @param {string} opt - Option name
 * @returns {string} Option value
 */
JTSageDateBox.getOption = function( opt ) {
	// Provide a PUBLIC function to get a defined option or i18n member
	var i18nTester = this.__(opt);
	if ( i18nTester !== "Err:NotFound" ) {
		return i18nTester;
	} else {
		return this.options[ opt ];
	}
};