Current File : /home/jvzmxxx/wiki/extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.labelview.js
( function( $, mw, wb ) {
	'use strict';

	var PARENT = $.ui.EditableTemplatedWidget;

/**
 * Displays and allows editing of a `wikibase.datamodel.Term` acting as an `Entity`'s label.
 * @since 0.5
 * @class jQuery.wikibase.labelview
 * @extends jQuery.ui.EditableTemplatedWidget
 * @license GPL-2.0+
 * @author H. Snater < mediawiki@snater.com >
 *
 * @constructor
 *
 * @param {Object} options
 * @param {wikibase.datamodel.Term} options.value
 * @param {string} [options.helpMessage=mw.msg( 'wikibase-label-input-help-message' )]
 * @param {wikibase.entityChangers.LabelsChanger} options.labelsChanger
 */
$.widget( 'wikibase.labelview', PARENT, {
	/**
	 * @inheritdoc
	 * @protected
	 */
	options: {
		template: 'wikibase-labelview',
		templateParams: [
			'', // additional class
			'', // text
			'', // toolbar
			'auto', // dir
			'' // lang
		],
		templateShortCuts: {
			$text: '.wikibase-labelview-text'
		},
		value: null,
		inputNodeName: 'TEXTAREA',
		helpMessage: mw.msg( 'wikibase-label-input-help-message' ),
		showEntityId: false
	},

	/**
	 * @inheritdoc
	 * @protected
	 *
	 * @throws {Error} if a required option is not specified properly.
	 */
	_create: function() {
		if ( !( this.options.value instanceof wb.datamodel.Term )
			|| !this.options.labelsChanger
			|| this.options.inputNodeName !== 'INPUT' && this.options.inputNodeName !== 'TEXTAREA'
		) {
			throw new Error( 'Required option not specified properly' );
		}

		var self = this;

		this.element
		.on(
			'labelviewafterstartediting.' + this.widgetName
			+ ' eachchange.' + this.widgetName,
		function( event ) {
			if ( self.value().getText() === '' ) {
				// Since the widget shall not be in view mode when there is no value, triggering
				// the event without a proper value is only done when creating the widget. Disabling
				// other edit buttons shall be avoided.
				// TODO: Move logic to a sensible place.
				self.element.addClass( 'wb-empty' );
				return;
			}

			self.element.removeClass( 'wb-empty' );
		} );

		PARENT.prototype._create.call( this );

		if ( this.$text.text() === '' ) {
			this.draw();
		}
	},

	/**
	 * @inheritdoc
	 */
	destroy: function() {
		if ( this.isInEditMode() ) {
			var self = this;

			this.element.one( this.widgetEventPrefix + 'afterstopediting', function( event ) {
				PARENT.prototype.destroy.call( self );
			} );

			this.cancelEditing();
		} else {
			PARENT.prototype.destroy.call( this );
		}
	},

	/**
	 * @inheritdoc
	 */
	draw: function() {
		var self = this,
			deferred = $.Deferred(),
			languageCode = this.options.value.getLanguageCode(),
			labelText = this.options.value.getText();

		if ( labelText === '' ) {
			labelText = null;
		}

		this.element.toggleClass( 'wb-empty', !labelText );

		if ( !this.isInEditMode() && !labelText ) {
			this.$text.text( mw.msg( 'wikibase-label-empty' ) );
			// Apply lang and dir of UI language
			// instead language of that row
			var userLanguage = mw.config.get( 'wgUserLanguage' );
			this.element
			.attr( 'lang', userLanguage )
			.attr( 'dir', $.util.getDirectionality( userLanguage ) );
			return deferred.resolve().promise();
		}

		this.element
		.attr( 'lang', languageCode )
		.attr( 'dir', $.util.getDirectionality( languageCode ) );

		if ( !this.isInEditMode() ) {
			this.$text.text( labelText );
			return deferred.resolve().promise();
		}

		var $input = $( document.createElement( this.options.inputNodeName ) );

		$input
		.addClass( this.widgetFullName + '-input' )
		// TODO: Inject correct placeholder via options
		.attr( 'placeholder', mw.msg(
				'wikibase-label-edit-placeholder-language-aware',
				wb.getLanguageNameByCode( languageCode )
			)
		)
		.attr( 'lang', languageCode )
		.attr( 'dir', $.util.getDirectionality( languageCode ) )
		.on( 'keydown.' + this.widgetName, function( event ) {
			if ( event.keyCode === $.ui.keyCode.ENTER ) {
				event.preventDefault();
			}
		} )
		.on( 'eachchange.' + this.widgetName, function( event ) {
			self._trigger( 'change' );
		} );

		if ( labelText ) {
			$input.val( labelText );
		}

		if ( $.fn.inputautoexpand ) {
			$input.inputautoexpand( {
				expandHeight: true,
				suppressNewLine: true
			} );
		}

		this.$text.empty().append( $input );

		return deferred.resolve().promise();
	},

	/**
	 * @inheritdoc
	 * @protected
	 */
	_save: function() {
		var deferred = $.Deferred();

		this.options.labelsChanger.setLabel( this.value() )
		.done( function( label ) {
			deferred.resolve();
		} )
		.fail( deferred.reject );

		return deferred.promise();
	},

	/**
	 * @inheritdoc
	 * @protected
	 */
	_afterStopEditing: function( dropValue ) {
		if ( dropValue && this.options.value.getText() === '' ) {
			this.$text.children( '.' + this.widgetFullName + '-input' ).val( '' );
		}
		return PARENT.prototype._afterStopEditing.call( this, dropValue );
	},

	/**
	 * @inheritdoc
	 */
	isValid: function() {
		return true;
	},

	/**
	 * @inheritdoc
	 */
	isInitialValue: function() {
		if ( !this.isInEditMode() ) {
			return true;
		}

		return this.value().equals( this.options.value );
	},

	/**
	 * @inheritdoc
	 * @protected
	 *
	 * @throws {Error} when trying to set the widget's value to something other than a
	 *         `wikibase.datamodel.Term` instance.
	 */
	_setOption: function( key, value ) {
		if ( key === 'value' && !( value instanceof wb.datamodel.Term ) ) {
			throw new Error( 'Value needs to be a wb.datamodel.Term instance' );
		}

		var response = PARENT.prototype._setOption.call( this, key, value );

		if ( key === 'disabled' && this.isInEditMode() ) {
			this.$text.children( '.' + this.widgetFullName + '-input' ).prop( 'disabled', value );
		}

		return response;
	},

	/**
	 * @inheritdoc
	 *
	 * @param {wikibase.datamodel.Term} [value]
	 * @return {wikibase.datamodel.Term|undefined}
	 */
	value: function( value ) {
		if ( value !== undefined ) {
			return this.option( 'value', value );
		}

		if ( !this.isInEditMode() ) {
			return this.options.value;
		}

		return new wb.datamodel.Term(
			this.options.value.getLanguageCode(),
			$.trim( this.$text.children( '.' + this.widgetFullName + '-input' ).val() )
		);
	},

	/**
	 * @inheritdoc
	 */
	focus: function() {
		if ( this.isInEditMode() ) {
			this.$text.children( '.' + this.widgetFullName + '-input' ).focus();
		} else {
			this.element.focus();
		}
	}

} );

}( jQuery, mediaWiki, wikibase ) );