/*
 * #dependsFile client/zarafa/core/KeyMapMgr.js
 */
Ext.namespace('Zarafa.calendar');

/**
 * @class Zarafa.calendar.KeyMapping
 * @extends Object
 *
 * The map of keys used in the Calendar Context.
 * @singleton
 */
Zarafa.calendar.KeyMapping = Ext.extend(Object, {
	/**
	 * @constructor
	 */
	constructor: function()
	{
		var newItemKeys = [{
			key: Ext.EventObject.A,
			ctrl: true,
			alt: true,
			shift: false,
			stopEvent: true,
			handler: this.onNewAppointment,
			scope: this,
			settingsCfg : {
				description : _('New appointment'),
				category : _('Creating an item')
			}
		},{
			key: Ext.EventObject.V,
			ctrl: true,
			alt: true,
			shift: false,
			stopEvent: true,
			handler: this.onNewMeetingRequest,
			scope: this,
			settingsCfg : {
				description : _('New meeting request'),
				category : _('Creating an item')
			}
		},{
			key: [Ext.EventObject.LEFT, Ext.EventObject.RIGHT],
			ctrl: false,
			alt: true,
			shift: false,
			stopEvent: true,
			handler: this.onSwitchRange,
			scope: this,
			settingsCfg : {
				description : _('Switch calendar range back and forth'),
				category : _('Calendar')
			}
		}];

		var mapiMessageKeys = [{
			key: Ext.EventObject.C,
			ctrl:true,
			alt: false,
			shift: false,
			stopEvent: true,
			enableGlobally : true,
			settingsCfg : {
				description : _('Copy selected item'),
				category : _('Calendar')
			},
			handler:this.onCopyItem,
			scope: this,
			basic: true
		},{
			key: Ext.EventObject.V,
			ctrl:true,
			alt: false,
			shift: false,
			stopEvent: true,
			enableGlobally : true,
			settingsCfg : {
				description : _('Paste selected item'),
				category : _('Calendar')
			},
			handler:this.onPaste,
			scope: this,
			basic: true
		}];

		Zarafa.core.KeyMapMgr.register('global', newItemKeys);
		Zarafa.core.KeyMapMgr.register('view.mapimessage', mapiMessageKeys);
	},

	/**
	 * Event handler for the keydown event of the {@link Zarafa.core.KeyMap KeyMap} when the user wants to 
	 * create a new appointment.
	 * @param {Number} key Key code
	 * @param {Ext.EventObject} event The event
	 * @param {Ext.Component} component The component on which key event is fired.
	 */
	onNewAppointment: function(key, event, component)
	{
		Zarafa.calendar.Actions.openCreateAppointmentContent(container.getContextByName('calendar').getModel());
	},

	/**
	 * Event handler for the keydown event of the {@link Zarafa.core.KeyMap KeyMap} when the user wants to 
	 * create a new meeting request.
	 * @param {Number} key Key code
	 * @param {Ext.EventObject} event The event
	 * @param {Ext.Component} component The component on which key event is fired.
	 */
	onNewMeetingRequest: function(key, event, component)
	{
		Zarafa.calendar.Actions.openCreateMeetingRequestContent(container.getContextByName('calendar').getModel());
	},

	/**
	 * Event handler for the keydown event of the {@link Zarafa.core.KeyMap KeyMap} when the user wants
	 * switch between {@link Zarafa.core.ui.MainContentTabPanel MainContentTabs} calendar ranges.
	 * @param {Number} key Key code
	 * @param {Ext.EventObject} event The event
	 * @param {Ext.Component} component The component on which key event is fired.
	 */
	onSwitchRange: function(key, event, component)
	{
		if(key === Ext.EventObject.LEFT){
			container.getContextByName('calendar').getModel().previousDate();
		} else {
			container.getContextByName('calendar').getModel().nextDate();
		}
	},

	/**
	 * Event handler for the keydown event of the {@link Zarafa.core.KeyMap KeyMap} when the user wants to
	 * copy selected appointment/meeting in calender.
	 *
	 * @param {Number} key Key code
	 * @param {Ext.EventObject} event The event
	 * @param {Ext.Component} component The component on which key event is fired.
	 */
	onCopyItem : function (key, event, component)
	{
		var records = Zarafa.common.KeyMapping.getSelectedRecords(component);
		if (!Ext.isEmpty(records)) {
			component.clipBoardData = records[0].copy();
			component.isClipBoardDataRecurring = !Ext.isEmpty(records[0].get('basedate'));
		}
	},

	/**
	 * Function which is used to open the selected calender item.
	 *
	 * @param {Ext.Component} component The component on which key event is fired.
	 * @param {Zarafa.core.data.IPMRecord} record A selected calender item in calender view.
	 * @private
	 */
	openRecord : function (component, record)
	{
		var store = container.getShadowStore();
		store.add(record);

		function openHandler(store, records)
		{
			// Remove the record from shadowStore and deregister 'open' event.
			store.remove(records, true);
			store.un('open', openHandler, this);
			component.doPaste(records);
		}
		store.on('open', openHandler, this);
		record.open();
	},

	/**
	 * Event handler for the keydown event of the {@link Zarafa.core.KeyMap KeyMap} when the user wants to
	 * paste the copied appointment/meeting in calender.
	 *
	 * @param {Number} key Key code
	 * @param {Ext.EventObject} event The event
	 * @param {Ext.Component} component The component on which key event is fired.
	 * @private
	 */
	onPaste : function (key, event, component)
	{
		if(Ext.isEmpty(component.clipBoardData)) {
			return;
		}
		var record = component.clipBoardData.copy();
		if (component.isClipBoardDataRecurring) {
			var config = {
				component : component,
				scope : this
			};
			Zarafa.calendar.Actions.copyRecurringItemContent(record, config);
		} else if(!record.isOpened()) {
			this.openRecord(component, record);
		} else {
			component.doPaste(record);
		}
	}
});

Zarafa.calendar.KeyMapping = new Zarafa.calendar.KeyMapping();
