'use strict';

/**
 * Licensed Materials - Property of IBM
 * IBM Cognos Products: BI Cloud (C) Copyright IBM Corp. 2015, 2018
 * US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
 */

define(['jquery', '../lib/@waca/core-client/js/core-client/ui/core/Class'], function ($, Class) {

	var ScrollBarUtil = null;
	ScrollBarUtil = Class.extend({

		/**
   * Initialize the utility with the specified models
   *
   * @param {JQuery|HTMLElement} inner - Inner DOM element
   * @param {JQuery|HTMLElement} outer - Outer DOM element
   * @param event
   */
		init: function init(inner, outer, event) {
			ScrollBarUtil.inherited('init', this, arguments);

			this.inner = inner || null;
			this.outer = outer || null;
			this.event = event || null;
		},

		/**
   * Check if the DOM element has a vertical scroll bar
   *
   * @param {JQuery|HTMLElement} inner - Inner DOM element
   * @param {JQuery|HTMLElement} outer - Outer DOM element
   */
		doesHaveVerticalScrollBar: function doesHaveVerticalScrollBar(inner, outer) {
			inner = inner || this.inner;
			outer = outer || this.outer;

			inner = inner instanceof $ ? inner.get(0) : inner;
			outer = outer instanceof $ ? outer : $(outer);

			return this._getScrollHeight(inner) > outer.height();
		},

		/**
   * Check if the DOM element has a horizontal scroll bar
   *
   * @param {JQuery|HTMLElement} inner - Inner DOM element
   * @param {JQuery|HTMLElement} outer - Outer DOM element
   */
		doesHaveHorizontalScrollBar: function doesHaveHorizontalScrollBar(inner, outer) {
			inner = inner || this.inner;
			outer = outer || this.outer;

			inner = inner instanceof $ ? inner.get(0) : inner;
			outer = outer instanceof $ ? outer : $(outer);

			return this._getScrollWidth(inner) > outer.width();
		},
		/**
   * Check if the event fired on the vertical scroll bar
   *
   * @param event
   */
		isEventOnVerticalScrollBar: function isEventOnVerticalScrollBar(event) {
			event = event || this.event;
			var target = $(event.target);
			var isInScrollRange = target.offset().left + this._getContextClientWidth(target) - event.pageX <= 0;
			return isInScrollRange;
		},

		/**
   * Check if the event fired on the vertical scroll bar
   *
   * @param event
   */
		isEventOnHorizontalScrollBar: function isEventOnHorizontalScrollBar(event) {
			event = event || this.event;

			var target = $(event.target);
			var isInScrollRange = target.offset().top + this._getContextClientHeight(target) - event.pageY <= 0;
			return isInScrollRange;
		},

		/**
   * Check if element has a scroll bar and the event was fired on the scroll bar
   *
   * @param {JQuery|HTMLElement|Event} inner
   * @param {JQuery|HTMLElement} outer
   * @param event
   */
		isOnScrollBar: function isOnScrollBar(inner, outer, event) {
			// Useful when the inner and outer DOM objects were sent into the constructor
			if (arguments.length === 1) {
				event = inner || this.event;
				inner = this.inner;
				outer = this.outer;
			} else {
				inner = inner || this.inner;
				outer = outer || this.outer;
				event = event || this.event;
			}

			return this.doesHaveVerticalScrollBar(inner, outer) && this.isEventOnVerticalScrollBar(event) || this.doesHaveHorizontalScrollBar(inner, outer) && this.isEventOnHorizontalScrollBar(event);
		},

		/**
   * Return the scroll height for element
   *
   * @param {HTMLElement} element
   */
		_getScrollHeight: function _getScrollHeight(element) {
			return element.scrollHeight;
		},

		/**
   * Return the scroll width for element
   *
   * @param {HTMLElement} element
   */
		_getScrollWidth: function _getScrollWidth(element) {
			return element.scrollWidth;
		},

		/**
   * @param {JQuery} element - DOM element
   */
		_getContextClientWidth: function _getContextClientWidth(element) {
			var clientWidth = element[0].clientWidth;
			if (clientWidth === element.width()) {
				// On mac, the client width does not exclude the scrollbar.. remove 30px to approximate the the scrollbar value
				clientWidth -= 30;
			}
			return clientWidth;
		},
		/**
   * @param {JQuery} element - DOM element
   */
		_getContextClientHeight: function _getContextClientHeight(element) {
			var clientHeight = element[0].clientHeight;
			if (clientHeight === element.height()) {
				// On mac, the client width does not exclude the scrollbar.. remove 30px to approximate the the scrollbar value
				clientHeight -= 30;
			}
			return clientHeight;
		}
	});

	return ScrollBarUtil;
});
//# sourceMappingURL=ScrollBarUtil.js.map