function UserStateUtils() {
    this._userUtils = newObjectInStorage('UserStateUtils');

    this.setOrientationChangedFlag = function setOrientationChangedFlag() {
        log('setOrientationChangedFlag: enter');

        var userObj = this._userUtils.get();
        // get the user object from session storage

        userObj.orientationChanged = true;

        this._userUtils.set(userObj);

        log('setOrientationChangedFlag: leave');
    };

    this.getOrientationChangedFlag = function getOrientationChangedFlag() {
        log('getOrientationChangedFlag: enter');

        var userObj = this._userUtils.get();
        // get the user object from session storage

        var flag = userObj.orientationChanged;

        if (typeof flag === 'undefined') {
            flag = false;
        }

        log('getOrientationChangedFlag: flag=' + flag);
        log('getOrientationChangedFlag: leave');

        return flag;
    };

    this.clearOrientationChangedFlag = function clearOrientationChangedFlag() {
        log('clearOrientationChangedFlag: enter');

        var userObj = this._userUtils.get();
        // get the user object from session storage

        userObj.orientationChanged = false;

        this._userUtils.set(userObj);

        log('clearOrientationChangedFlag: leave');
    };

    this.setHideAlertCount = function setHideAlertCount(count) {
        log('setHideAlertCount: enter');
        log('setHideAlertCount: count=' + count);

        var userObj = this._userUtils.get();
        // get the user object from session storage

        userObj.hideAlertCount = count;

        this._userUtils.set(userObj);

        log('setHideAlertCount: leave');
    };

    this.getHideAlertCount = function getHideAlertCount() {
        log('getHideAlertCount: enter');

        var userObj = this._userUtils.get();
        // get the user object from session storage

        var count = userObj.hideAlertCount;

        if (typeof count === "undefined") {
            count = 0;
        }

        log('getHideAlertCount: count=' + count);
        log('getHideAlertCount: leave');

        return count;
    };

    this.isDateWithinHoursOfNow = function isDateWithinHoursOfNow(theDate, theHours) {

        const logHeader = 'UserStateUtils.isDateWithinHoursOfNow: ';
        log(logHeader + 'enter');
        log(logHeader + 'theDate=' + theDate);
        log(logHeader + 'theHours=' + theHours);

        const todaysDate = new Date();

        if (typeof (theDate) === "undefined") {
            log(logHeader + 'the given date is undefined, so NOT within the time period');
            log(logHeader + 'leave');
            return false;
        }

        const diffMS = Math.abs(todaysDate - theDate);
        // get elapsed time in milliseconds since the given date/time

        const periodMS = (theHours * 60 * 60 * 1000);
        // milliseconds in the target time period

        if (diffMS < periodMS) {
            // if time since previous prompt is less than the given number of hours

            log(logHeader + 'it has been less than ' + theHours + ' hours since we showed the current date/time, so we will return TRUE');

            log(logHeader + 'leave');
            return true;
        }
        else {
            // if not within the period

            log(logHeader + theHours + 'have NOT elapsed since the given date/time, so we will return FALSE');
        }

        log(logHeader + 'leave');

        return false;
    };

    this.isDateWithinMsOfNow = function isDateWithinMsOfNow(theDate, milliseconds) {

        const logHeader = 'UserStateUtils.isDateWithinMsOfNow: ';
        log(logHeader + 'enter');
        log(logHeader + 'theDate=' + theDate);
        log(logHeader + 'milliseconds=' + milliseconds);

        const todaysDate = new Date();

        if (typeof (theDate) === "undefined") {
            log(logHeader + 'the given date is undefined, so NOT within the time period');
            log(logHeader + 'leave');
            return false;
        }

        const diffMS = Math.abs(todaysDate - theDate);
        // get elapsed time in milliseconds since the given date/time

        log(logHeader + 'diffMS: ' + diffMS);

        const within = (diffMs <= milliseconds);

        log(logHeader + 'within: ' + within);
        log(logHeader + 'leave');

        return within;
    };

    this.setVideoStoppedDate = function setVideoStoppedDate(stoppedDate) {
        var userObj = this._userUtils.get();
        // get the user object from session storage

        userObj.videoStoppedDate = stoppedDate;

        this._userUtils.set(userObj);
    };

    this.getVideoStoppedDate = function getVideoStoppedDate() {

        var userObj = this._userUtils.get();
        // get the user object

        const dateStr = userObj.videoStoppedDate;

        const stoppedDate = new Date(dateStr);

        return stoppedDate;
    };

    this.setHideAlertDate = function setHideAlertDate(alertDate) {
        var userObj = this._userUtils.get();
        // get the user object from session storage

        userObj.hideAlertDate = alertDate;

        this._userUtils.set(userObj);
    };

    this.getHideAlertDate = function getHideAlertDate() {

        var userObj = this._userUtils.get();
        // get the user object

        const dateStr = userObj.hideAlertDate;

        const alertDate = new Date(dateStr);

        return alertDate;
    };

    this.setWelcomePromptDate = function setWelcomePromptDate(promptDate) {
        var userObj = this._userUtils.get();
        // get the user object from session storage

        userObj.welcomePromptDate = promptDate;

        this._userUtils.set(userObj);
    };

    this.getWelcomePromptDate = function getWelcomePromptDate() {

        var userObj = this._userUtils.get();
        // get the user object

        const promptDateStr = userObj.welcomePromptDate;

        const promptDate = new Date(promptDateStr);

        return promptDate;
    };

    this.setFullscreenDate = function setFullscreenDate(fsDate) {
        var userObj = this._userUtils.get();
        // get the user object from session storage

        userObj.fullscreenDate = fsDate;

        this._userUtils.set(userObj);
    };

    this.getFullscreenDate = function getFullscreenDate() {
        // may return undefined if no value has been stored

        var userObj = this._userUtils.get();
        // get the user object

        const dateStr = userObj.fullscreenDate;

        if (typeof dateStr === "undefined")
            return dateStr;
        // if it's undefined return undefined

        const fsDate = new Date(dateStr);

        return fsDate;
    };

    this.setSignalRUserName = function setSignalRUserName(userName) {
        var userObj = this._userUtils.get();
        // get the user object from session storage

        userObj.signalRUserName = userName;

        this._userUtils.set(userObj);
    };

    this.getSignalRUserName = function getSignalRUserName() {
        // may return undefined if no value has been stored

        var userObj = this._userUtils.get();
        // get the user object

        const userName = userObj.signalRUserName;

        return userName;
    };

    this.setSignalRPassword = function setSignalRPassword(password) {
        var userObj = this._userUtils.get();
        // get the user object from session storage

        userObj.signalRPassword = password;

        this._userUtils.set(userObj);
    };

    this.getSignalRPassword = function getSignalRPassword() {
        // may return undefined if no value has been stored

        var userObj = this._userUtils.get();
        // get the user object

        const password = userObj.signalRPassword;

        return password;
    };
}