/*
 * #dependsFile client/zarafa/contact/data/SearchFields.js
 */
Ext.namespace('Zarafa.contact.ui');

/**
 * @class Zarafa.contact.ui.ContactMainPanel
 * @extends Zarafa.common.ui.ContextMainPanel
 * @xtype zarafa.contactmainpanel
 *
 * this class will be containing all the views that will be created for contacts folder.
 */
Zarafa.contact.ui.ContactMainPanel = Ext.extend(Zarafa.common.ui.ContextMainPanel, {
	// Insertion points for this class
	/**
	 * @insert context.contact.toolbar.item
	 * Insertion point for populating contact context's main toolbar.
	 * This item is only visible when this context is active.
	 * @param {Zarafa.contact.ui.ContactMainPanel} panel This panel
	 */
	/**
	 * @insert context.contact.toolbar.paging
	 *
	 * Insertion point for populating contact context's toolbar with extra
	 * pagination buttons. This can be used to replace the default {@link Ext.PagingToolbar}
	 * with an alternative. Note that by default all paging toolbars will be visible, and
	 * hiding a particular toolbar is the responsibility of the new pagers.
	 * @param {Zarafa.contact.ui.ContactMainPanel} panel This panel
	 */
	/**
	 * @insert context.contact.views
	 * Insertion point for adding views within the main panel of contact context.
	 * This insertion point should be used in combination with 'main.maintoolbar.view.contact'
	 * insertion point, and also view should set its store in the config object, the reference of
	 * {@link Zarafa.contact.ContactContextModel ContactContextModel} is passed as parameter of this
	 * insertion point.
	 * @param {Zarafa.contact.ui.ContactMainPanel} mainpanel This mainpanel
	 * @param {Zarafa.contact.ContactContext} context The context for this panel
	 */

	/**
	 * The main panel in which the various views are located.
	 * @property
	 * @type Zarafa.core.ui.SwitchViewContentContainer
	 */
	viewPanel : undefined,

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

		Ext.applyIf(config, {
			xtype : 'zarafa.contactmainpanel',
			layout: 'fit',
			items: [{
				xtype: 'zarafa.switchviewcontentcontainer',
				ref: 'viewPanel',
				layout : 'card',
				lazyItems : this.initViews(config.context)
			}],
			tbar : {
				xtype: 'zarafa.contextmainpaneltoolbar',
				defaultTitle : _('Contacts'),
				paging : container.populateInsertionPoint('context.contact.toolbar.paging', this),
				items : container.populateInsertionPoint('context.contact.toolbar.item', this),
				context : config.context
			}
		});

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

	/**
	 * Function will initialize all views associated with contact context
	 * it will also get views added through 3rd party plugins and add it here
	 * @param {Zarafa.contact.ContactContextModel} model data part of contact context
	 * @return {Array} array of config objects of different views
	 * @private
	 */
	initViews : function(context)
	{
		// add the standard available views
		var allViews = [{
			xtype : 'zarafa.contactgrid',
			id    : 'contact-gridview',
			context : context
		}, {
			xtype : 'zarafa.contactcardpanel',
			id    : 'contact-cardview',
			context : context
		}];

		var additionalViewItems = container.populateInsertionPoint('context.contact.views', this, context);
		allViews = allViews.concat(additionalViewItems);

		return allViews;
	},

	/**
	 * Function called by Extjs when the panel has been {@link #render rendered}.
	 * At this time all events can be registered.
	 * @private
	 */
	initEvents : function()
	{
		if (Ext.isDefined(this.context)) {
			this.mon(this.context, 'viewchange', this.onViewChange, this);
			this.topToolbar.mon(this.topToolbar.pagesToolbar, 'beforechange', this.onBeforeChange, this);

			this.onViewChange(this.context, this.context.getCurrentView());
		}
	},

	/**
	 * Event handler triggered when navigational buttons of {@link Zarafa.common.ui.PagingToolbar PagingToolbar}
	 * was clicked. function is used to append the search restriction in params object if it was
	 * added during the last load.
	 *
	 * @param {Zarafa.common.ui.PagingToolbar} pagesToolbar which trigger this event.
	 * @param {Object} params The params contains restriction related information also it may
	 * contains search restriction which used to retrieve next batch of records from server.
	 * @return {boolean} return true
	 */
	onBeforeChange : function (pagesToolbar, params)
	{
		var store = pagesToolbar.store;
		var restriction = store.lastOptions.params.restriction;

		if(restriction.search) {
			Ext.applyIf(params.restriction, {
				search : restriction.search
			});
		}
		return true;
	},

	/**
	 * Event handler which is fired when the currently active view inside the {@link #context}
	 * has been updated. This will update the call
	 * {@link #viewPanel}#{@link Zarafa.core.ui.SwitchViewContentContainer#switchView}
	 * to make the requested view active.
	 *
	 * @param {Zarafa.contact.ContactContext} context The context which fired the event
	 * @param {Zarafa.contact.data.Views} newView The ID of the selected view
	 * @param {Zarafa.contact.data.Views} oldView The ID of the previously selected view
	 * @private
	 */
	onViewChange : function(context, newView, oldView)
	{
		switch(newView) {
			case Zarafa.contact.data.Views.ICON:
				this.viewPanel.switchView('contact-cardview');
				break;
			case Zarafa.contact.data.Views.LIST:
			case Zarafa.contact.data.Views.SEARCH:
				this.viewPanel.switchView('contact-gridview');
				break;
		}
	}
});

Ext.reg('zarafa.contactmainpanel', Zarafa.contact.ui.ContactMainPanel);