Current File : /home/jvzmxxx/wiki1/extensions/MobileFrontend/resources/mobile.search/MobileWebSearchLogger.js
( function ( M, mw ) {
	/**
	 * Coordinates the logging of MobileWebSchema events.
	 * Implements schema defined at https://meta.wikimedia.org/wiki/Schema:MobileWebSearch
	 *
	 * @class
	 */
	function MobileWebSearchLogger() {
		this.userSessionToken = null;
		this.searchSessionToken = null;
	}

	MobileWebSearchLogger.prototype = {
		/**
		 * Sets the internal state required to deal with logging user session
		 * data.
		 *
		 * @private
		 */
		_newUserSession: function () {
			this.userSessionToken = mw.user.generateRandomSessionId();
		},

		/**
		 * Sets the internal state required to deal with logging search session
		 * data.
		 *
		 * @private
		 */
		_newSearchSession: function () {
			this.searchSessionToken = mw.user.generateRandomSessionId();
			this.searchSessionCreatedAt = new Date().getTime();
		},

		/**
		 * Handles the 'search-show' event.
		 */
		onSearchShow: function () {
			this._newUserSession();
		},

		/**
		 * Handles the 'search-start' event.
		 */
		onSearchStart: function () {
			this._newSearchSession();
			mw.track( 'mf.schemaMobileWebSearch', {
				action: 'session-start',
				userSessionToken: this.userSessionToken,
				searchSessionToken: this.searchSessionToken,
				timeOffsetSinceStart: 0
			} );
		},

		/**
		 * Handles the 'search-results' event.
		 *
		 * @param {Object} event with property {Object[]} event.results
		 */
		onSearchResults: function ( event ) {
			var timeOffsetSinceStart =
				new Date().getTime() - this.searchSessionCreatedAt;

			mw.track( 'mf.schemaMobileWebSearch', {
				action: 'impression-results',
				resultSetType: 'prefix',
				numberOfResults: event.results.length,
				userSessionToken: this.userSessionToken,
				searchSessionToken: this.searchSessionToken,
				// FIXME: Unless I'm mistaken, the timeToDisplayResults
				// property isn't necessary.
				timeToDisplayResults: timeOffsetSinceStart,
				timeOffsetSinceStart: timeOffsetSinceStart
			} );
		},

		/**
		 * Handles the 'search-result-click' event.
		 *
		 * @param {Object} event with property {number} event.index The zero-based index of the result in the
		 *  set of results
		 */
		onSearchResultClick: function ( event ) {
			var timeOffsetSinceStart =
				new Date().getTime() - this.searchSessionCreatedAt;

			mw.track( 'mf.schemaMobileWebSearch', {
				action: 'click-result',
				// NOTE: clickIndex is 1-based.
				clickIndex: event.resultIndex + 1,
				userSessionToken: this.userSessionToken,
				searchSessionToken: this.searchSessionToken,
				timeOffsetSinceStart: timeOffsetSinceStart
			} );
		}
	};

	/**
	 * Convenience function that wires up an instance of the
	 * MobileWebSearchLogger class to the search-* events emitted by the
	 * search overlay.
	 */
	MobileWebSearchLogger.register = function () {
		var logger = new MobileWebSearchLogger();

		M.on( 'search-show', logger.onSearchShow.bind( logger ) );
		M.on( 'search-start', logger.onSearchStart.bind( logger ) );
		M.on( 'search-results', logger.onSearchResults.bind( logger ) );
		M.on( 'search-result-click', logger.onSearchResultClick.bind( logger ) );
	};

	M.define( 'mobile.search/MobileWebSearchLogger', MobileWebSearchLogger );

}( mw.mobileFrontend, mw ) );