Ext.namespace('Zarafa.contact.ui');

/**
 * @class Zarafa.contact.ui.MemberBoxField
 * @extends Zarafa.common.recipientfield.ui.RecipientField
 * @xtype zarafa.memberboxfield
 *
 * Special {@link Zarafa.common.ui.BoxField boxfield} which is used
 * for displaying Distllist Member records. This works similar to the
 * {@link Zarafa.common.recipientfield.ui.RecipientField} regarding
 * resolving, but it will mark any non-distlist member user as invalid.
 *
 * If the {@link Zarafa.core.plugins.RecordComponentUpdaterPlugin} is installed
 * in the {@link #plugins} array of this component, this component will automatically
 * load the {@link Zarafa.core.data.IPMRecipientStore RecipientStore} into the component.
 * Otherwise the user of this component needs to call {@link #setRecipientStore}.
 */
Zarafa.contact.ui.MemberBoxField = Ext.extend(Zarafa.common.recipientfield.ui.RecipientField, {
	/**
	 * @cfg {Zarafa.core.mapi.RecipientType} defaultRecipientType
	 * @hide
	 */

	/**
	 * @cfg {Zarafa.core.mapi.RecipientType} filterRecipientType
	 * @hide
	 */

	/**
	 * @constructor
	 * @param config Configuration object
	 */
	constructor : function(config)
	{
		config = config || {};

		Ext.applyIf(config, {
			boxType : 'zarafa.memberbox',
			enableComboBox: false,
			editable: true,
			height: 30
		});

		Ext.apply(config, {
			defaultRecipientType : undefined,
			filterRecipientType : undefined
		});

		Zarafa.contact.ui.MemberBoxField.superclass.constructor.call(this, config);
	},

	/**
	 * Set the store on this field. See {@link #setBoxStore}.
	 * @param {Zarafa.contact.DistlistMemberStore} store The store to set on this field
	 */
	setMemberStore: function(store)
	{
		return this.setBoxStore.apply(this, arguments);
	},

	/**
	 * Get the store attached to this field. See {@link #getBoxStore}.
	 * @return {Zarafa.contact.DistlistMemberStore} store
	 */
	getMemberStore: function()
	{
		return this.getBoxStore();
	},

	/**
	 * Update the components with the given record.
	 *
	 * @param {Zarafa.core.data.MAPIRecord} record The record to update in this component
	 * @param {Boolean} contentReset force the component to perform a full update of the data.
	 */
	update : function(record, contentReset)
	{
		if (record && record instanceof Zarafa.core.data.MAPIRecord) {
			// In case the recordcomponentupdaterplugin is installed
			// we have a special action to update the component.
			if (contentReset && record.isOpened()) {
				this.setMemberStore(record.getMemberStore());
			}
		} else {
			// The recordcomponentupdaterplugin is not installed and the
			// caller really wants to perform the update() function. Probably
			// a bad move, but lets not disappoint the caller.
			Zarafa.contact.ui.MemberBoxField.superclass.update.apply(this, arguments);
		}
	},

	/**
	 * Called by {@link #filterRecords} to check if the given record
	 * must be visible in the field or not. For the recipientfield, we check
	 * the {@link filterRecipientType} property and prevent that the
	 * {@link Zarafa.core.data.IPMRecipientRecord#isMeetingOrganizer meeting organizer}
	 * are visible in the box.
	 * @param {Ext.data.Record} record The record to filter
	 * @return {Boolean} True if the record should be visible, false otherwise
	 * @protected
	 */
	filterRecord : function(record)
	{
		return true;
	},

	/**
	 * Called to handle the input when the user presses the handleInputKey or another trigger makes 
	 * this component need to handle the input. Has to be overwritten to implement the desired 
	 * behavior and the creation of the correct type of record.
	 * @param {String} value The value from the input field
	 */ 
	handleInput : function(value)
	{
		// FIXME: Disallow typing in HTML formatting...
		var splitted = value.split(this.delimiterCharacter);
		var newRecords = [];

		for (var i = 0; i < splitted.length; i++) {
			var str = splitted[i].trim();
			if (!Ext.isEmpty(str)) {
				var record = this.boxStore.parseMember(str);
				newRecords.push(record);
			}
		}

		if(newRecords.length > 0){
			this.boxStore.add(newRecords);
		}
	},

	/**
	 * Event handler when a Box has been double-clicked.
	 * @param {Zarafa.common.recipientfield.ui.RecipientField} field This field to which the box belongs
	 * @param {Zarafa.common.recipientfield.ui.RecipientBox} box The box for which was double-clicked
	 * @param {Zarafa.core.data.IPMRecipientRecord} record The record which is attached to the box
	 * @private
	 */
	onBoxDblClick : function(field, box, record)
	{
		if (box.isValidRecord(record)) {
			Zarafa.contact.Actions.openDistlistMember(record);
		}
	},

	/**
	 * Event handler when the contextmenu is requested for a Box.
	 * @param {Zarafa.common.recipientfield.ui.RecipientField} field This field to which the box belongs
	 * @param {Zarafa.common.recipientfield.ui.RecipientBox} box The box for which the contextmenu is requested
	 * @param {Zarafa.core.data.IPMRecipientRecord} record The record which is attached to the box
	 * @private
	 */
	onBoxContextMenu : Ext.emptyFn
});

Ext.reg('zarafa.memberboxfield', Zarafa.contact.ui.MemberBoxField);