/**
 * @defgroup js_controllers_grid_queries
 */
/**
 * @file js/controllers/grid/queries/ReadQueryHandler.js
 *
 * Copyright (c) 2014-2021 Simon Fraser University
 * Copyright (c) 2000-2021 John Willinsky
 * Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
 *
 * @class ReadQueryHandler
 * @ingroup js_controllers_grid_queries
 *
 * @brief Handler for a "read query" modal
 *
 */
(function($) {

	/** @type {Object} */
	$.pkp.controllers.grid.queries =
			$.pkp.controllers.grid.queries || { };



	/**
	 * @constructor
	 *
	 * @extends $.pkp.classes.Handler
	 *
	 * @param {jQueryObject} $containerElement The HTML element encapsulating
	 *  the carousel container.
	 * @param {Object} options Handler options.
	 */
	$.pkp.controllers.grid.queries.ReadQueryHandler =
			function($containerElement, options) {

		this.fetchNoteFormUrl_ = options.fetchNoteFormUrl;
		this.fetchParticipantsListUrl_ = options.fetchParticipantsListUrl;

		$containerElement.find('.openNoteForm a').click(
				this.callbackWrapper(this.showNoteFormHandler_));

		$containerElement.bind('dataChanged',
				this.callbackWrapper(this.reloadParticipantsList_));

		$containerElement.bind('user-left-discussion', function() {
			$containerElement.parent().trigger('modalFinished');
		});

		this.loadParticipantsList();
	};
	$.pkp.classes.Helper.inherits(
			$.pkp.controllers.grid.queries.ReadQueryHandler,
			$.pkp.classes.Handler);


	//
	// Private properties
	//
	/**
	 * The URL to be called to fetch a new note form for a query.
	 * @private
	 * @type {string?}
	 */
	$.pkp.controllers.grid.queries.ReadQueryHandler.
			prototype.fetchNoteFormUrl_ = null;


	/**
	 * The URL to be called to fetch a list of participants.
	 * @private
	 * @type {string?}
	 */
	$.pkp.controllers.grid.queries.ReadQueryHandler.
			prototype.fetchParticipantsListUrl_ = null;


	//
	// Public methods
	//
	/**
	 * Load the participants list.
	 */
	$.pkp.controllers.grid.queries.ReadQueryHandler.prototype.
			loadParticipantsList = function() {
		$.get(this.fetchParticipantsListUrl_,
				this.callbackWrapper(this.showFetchedParticipantsList_), 'json');
	};


	//
	// Private methods
	//
	/**
	 * Event handler that is called when the "new note" button is clicked.
	 * @param {HTMLElement} element The checkbox input element.
	 * @private
	 */
	$.pkp.controllers.grid.queries.ReadQueryHandler.prototype.
			showNoteFormHandler_ = function(element) {
		$(element).parents('.queryEditButtons').addClass('is_loading');
		$.get(this.fetchNoteFormUrl_,
				this.callbackWrapper(this.showFetchedNoteForm_), 'json');
	};


	/**
	 * Event handler that is called when the new note form is ready.
	 * @param {Object} ajaxContext The AJAX request context.
	 * @param {Object} jsonData A parsed JSON response object.
	 * @private
	 */
	$.pkp.controllers.grid.queries.ReadQueryHandler.prototype.
			showFetchedNoteForm_ = function(ajaxContext, jsonData) {

		var processedJsonData = this.handleJson(jsonData),
				$noteFormContainer = $('#newNotePlaceholder', this.getHtmlElement()),
				$queryEditButtons = $('.queryEditButtons.is_loading',
						this.getHtmlElement());

		this.unbindPartial($queryEditButtons);
		$queryEditButtons.remove();
		this.unbindPartial($noteFormContainer);
		$noteFormContainer.html(processedJsonData.content);
	};


	/**
	 * Event handler that is called when the participants list fetch is complete.
	 * @param {Object} ajaxContext The AJAX request context.
	 * @param {Object} jsonData A parsed JSON response object.
	 * @private
	 */
	$.pkp.controllers.grid.queries.ReadQueryHandler.prototype.
			showFetchedParticipantsList_ = function(ajaxContext, jsonData) {

		var processedJsonData = this.handleJson(jsonData),
				$participantsListContainer = $('#participantsListPlaceholder',
						this.getHtmlElement()),
				$leaveQueryButton = $('.leaveQueryForm', this.getHtmlElement());

		if (processedJsonData.showLeaveQueryButton) {
			$leaveQueryButton.show();
		} else {
			$leaveQueryButton.hide();
		}

		this.unbindPartial($participantsListContainer);
		$participantsListContainer.children().remove();
		$participantsListContainer.append(processedJsonData.content);
	};


	/**
	 * Handler to update the participants list on change.
	 * @param {HTMLElement} sourceElement The element that issued the
	 * "dataChanged" event.
	 * @param {Event} event The "dataChanged" event.
	 * @param {HTMLElement} triggerElement The element that triggered
	 * the "dataChanged" event.
	 * @private
	 */
	$.pkp.controllers.grid.queries.ReadQueryHandler.prototype.
			reloadParticipantsList_ = function(sourceElement, event, triggerElement) {
		this.loadParticipantsList();
	};
}(jQuery));
