Skip to content
Snippets Groups Projects
Detail.js 106 KiB
Newer Older
Prasad's avatar
Prasad committed
/*+***********************************************************************************
 * The contents of this file are subject to the vtiger CRM Public License Version 1.0
 * ("License"); You may not use this file except in compliance with the License
 * The Original Code is: vtiger CRM Open Source
 * The Initial Developer of the Original Code is vtiger.
 * Portions created by vtiger are Copyright (C) vtiger.
 * All Rights Reserved.
 *************************************************************************************/

Vtiger.Class("Vtiger_Detail_Js",{

	detailInstance : false,
	PreAjaxSaveEvent : 'PreAjaxSaveEvent',
	PostAjaxSaveEvent : 'PostAjaxSaveEvent',
Prasad's avatar
Prasad committed
	getInstance: function(){
		if( Vtiger_Detail_Js.detailInstance == false ){
			var module = app.getModuleName();
			var view = app.view;
			var moduleClassName = module+"_"+view+"_Js";
			var fallbackClassName = Vtiger_Detail_Js;
			if(typeof window[moduleClassName] != 'undefined'){
				var instance = new window[moduleClassName]();
			}else{
				var instance = new fallbackClassName();
			}
			Vtiger_Detail_Js.detailInstance = instance;
		}
		return Vtiger_Detail_Js.detailInstance;
	},

		getInstanceByModuleName : function(moduleName){
		if(typeof moduleName == "undefined"){
			moduleName = app.getModuleName();
		}
		var parentModule = app.getParentModuleName();
		if(parentModule == 'Settings'){
			var moduleClassName = parentModule+"_"+moduleName+"_Detail_Js";
			if(typeof window[moduleClassName] == 'undefined'){
				moduleClassName = moduleName+"_Detail_Js";
			}
			var fallbackClassName = parentModule+"_Vtiger_Detail_Js";
			if(typeof window[fallbackClassName] == 'undefined') {
				fallbackClassName = "Vtiger_Detail_Js";
			}
		} else {
			moduleClassName = moduleName+"_Detail_Js";
			fallbackClassName = "Vtiger_Detail_Js";
		}
		if(typeof window[moduleClassName] != 'undefined'){
			var instance = new window[moduleClassName]();
		}else{
			var instance = new window[fallbackClassName]();
		}
		return instance;
	},

	triggerSendSms: function(detailActionUrl, module) {
		var self = this.getInstance();
		self.sendSMS(detailActionUrl,module);
	},

	 deleteRelatedActivity : function(e) {
		 var thisInstance = this;
		  var currentElement = jQuery(e.currentTarget);
		  var id = currentElement.data('id');
Prasad's avatar
Prasad committed
		var recurringEnabled = currentElement.data('recurringEnabled');
		var postData = {'related_record_list' : [id]};
		if(recurringEnabled) {
			app.helper.showConfirmationForRepeatEvents().then(function(params) {
				jQuery.extend(postData, params);
				thisInstance.deleteActivityRelation(postData);
			},
			function(error, err) {
			});
		} else {
			var message = app.vtranslate('JS_LBL_ARE_YOU_SURE_YOU_WANT_TO_DELETE');
			app.helper.showConfirmationBox({'message' : message}).then(function(data) {
				thisInstance.deleteActivityRelation(postData);
			},
			function(error,err) {
			});	
		}
Prasad's avatar
Prasad committed
	deleteActivityRelation : function(customParams) {
		var params = {
			'module'			: app.getModuleName(),
			'related_module'	: 'Calendar',
			'action'			: 'RelationAjax',
			'mode'				: 'deleteRelation',
			'src_record'		: jQuery('#recordId').val()
Prasad's avatar
Prasad committed
		};
		params = jQuery.extend(params, customParams);
Prasad's avatar
Prasad committed
		app.request.post({data: params}).then(function(err, data) {
			if(data) {
				params = {
					'record'	: jQuery('#recordId').val(),
					'view'		: 'Detail',
					'module'	: app.getModuleName(),
					'mode'		: 'getActivities'
Prasad's avatar
Prasad committed
				};
				app.request.get({data: params}).then(function(err, result) {
					jQuery('#relatedActivities').html(result);
					Vtiger_Detail_Js.getInstance().registerEventForActivityWidget();
				});
			}
		});
	},


	showUpdates : function(element){
		jQuery(".historyButtons").find("button").removeAttr("disabled").removeClass("btn-success");
		var currentElement = jQuery(element);
		currentElement.attr("disabled","disabled").addClass("btn-success");

		var params = [];
		var recordId = jQuery('#recordId').val();
		params.url = "index.php?view=Detail&module="+app.getModuleName()+"&mode=showRecentActivities&record="+recordId;

		app.helper.showProgress();
		app.request.get(params).then(function(error,response){
			app.helper.hideProgress();
			jQuery(".HistoryContainer").find(".data-body").html(response);
		});
	},


	checkSMSStatus: function(url) {
		app.request.post({url: url}).then(
				function(err, data) {
					var status = data['status'];
					if(status == 'Failed'){
						var message = data['message'];
						app.helper.showErrorNotification({title: status, message: message});
					}
					else if (status == null) {
						app.helper.showErrorNotification({title: 'Error', message: 'Failed to send SMS.'});
					}
					else {
						var message = data['message'];
						app.helper.showErrorNotification({title:status, message:message});
					}
				});
	},

	/*
Prasad's avatar
Prasad committed
	 * function to trigger delete record action
	 * @params: delete record url.
	 */
	deleteRecord : function(deleteRecordActionUrl) {
		var detailInstance = window.app.controller();
		detailInstance.remove(deleteRecordActionUrl);
	},


	/**
	 * Function to trigger Transfer Ownership
	 * @param {type} massActionUrl
	 * @returns {undefined}
	 */
	triggerTransferOwnership : function(massActionUrl){
Prasad's avatar
Prasad committed
		var thisInstance = this;
		var params = app.convertUrlToDataParams(massActionUrl);
		app.helper.showProgress();
Prasad's avatar
Prasad committed
		app.request.post({data:params}).then(
			function(error, data) {
				app.helper.hideProgress();
				app.helper.showModal(data);
				var form = jQuery('form#changeOwner');
				var isFormExists = form.length;
				if(isFormExists){
					thisInstance.transferOwnershipSave(form);
				}
Prasad's avatar
Prasad committed
			}
		);
	},

	/**
	 * Saving transfer ownership 
	 * @param {type} form
	 * @returns {undefined}
	 */
	transferOwnershipSave : function (form){
		 form.on("click","button[name='saveButton']",function(e){
			e.preventDefault();
			var rules = {};
			rules["related_modules"] = {'required' : true};
			rules["transferOwnerId"] = {'required' : true};
			var params = {
				rules : rules,
				submitHandler: function(form) {
					// to Prevent submit if already submitted
					jQuery(form).find("button[name='saveButton']").attr("disabled","disabled");
					if(this.numberOfInvalids() > 0) {
						return false;
					}
					var transferOwner = jQuery('#transferOwnerId').val();
					var relatedModules = jQuery('#related_modules').val();
					var recordId = jQuery('#recordId').val();
					var reqParams = {
						'module': app.getModuleName(),
						'action' : 'TransferOwnership',
						'record':recordId,
						'transferOwnerId' : transferOwner,
						'related_modules' : relatedModules
					};
					app.request.post({data:reqParams}).then(
						function(error,data) {
							if(error === null){
								app.helper.hideModal();
								app.helper.showAlertBox({'message':app.vtranslate('JS_RECORDS_TRANSFERRED_SUCCESSFULLY')});
							}
						}
					);
				}
			};
			validateAndSubmitForm(form,params);
		 });
	},

	/*
Prasad's avatar
Prasad committed
	 * function to trigger send Email
	 * @params: send email url , module name.
	 */
	triggerSendEmail : function(detailActionUrl, module){
		var currentInstance = window.app.controller();
		var parentRecord = new Array();
		var params = {};
		parentRecord.push(currentInstance.getRecordId());
		var urlParams = app.convertUrlToDataParams(detailActionUrl);
		urlParams['selected_ids'] = parentRecord;
		Vtiger_Index_Js.showComposeEmailPopup(urlParams);
	},

Prasad's avatar
Prasad committed
	/**
	 * Function to show the content of a file in an iframe
	 * @param {type} e
	 * @param {type} recordId
	 * @returns {undefined}
	 */
	previewFile: function (e, recordId,attachmentId) {
		Vtiger_Index_Js.previewFile(e, recordId,attachmentId);
	}
Prasad's avatar
Prasad committed
},{

	detailViewSummaryTabLabel : 'LBL_RECORD_SUMMARY',
Prasad's avatar
Prasad committed
	detailViewDetailTabLabel : 'LBL_RECORD_DETAILS',
	detailViewHistoryTabLabel : 'LBL_HISTORY',
	detailViewRecentCommentsTabLabel : 'ModComments',
	detailViewRecentActivitiesTabLabel : 'Activities',
	detailViewRecentDocumentsLabel : 'Documents',
	widgetPostLoad : 'Vtiger.Widget.PostLoad',
	_moduleName : false,
	targetPicklistChange : false,
	targetPicklist : false,
	sourcePicklistname : false,

	getModuleName : function() {
		if(this._moduleName != false){
			return this._moduleName;
		}
		return app.module();
	},

	setModuleName : function(module){
		this._moduleName = module;
		return this;
	},

		registerOverlayEditEvents: function(module, container) {
				var editInstance = Vtiger_Edit_Js.getInstanceByModuleName(module);
				editInstance.setModuleName(module);
				var editContainer = container.find('.overlayEdit');
				editInstance.setEditViewContainer(editContainer);
				editInstance.registerEvents(false);
		},

		setContentHolder: function(container){
			this.detailViewContentHolder = container;
		},

		overlayMode: false,
		setOverlayDetailMode: function(option){
			this.overlayMode = option;
		},
		getOverlayDetailMode: function(){
			return this.overlayMode;
		},

		registerRelatedRecordSave: function(){
			var thisInstance = this;
			app.event.on('post.overLayEditView.loaded',function(e, container){
				jQuery('#EditView').vtValidate({
					submitHandler : function(form){
Prasad's avatar
Prasad committed
						window.onbeforeunload = null;
						var e = jQuery.Event(Vtiger_Edit_Js.recordPresaveEvent);
						app.event.trigger(e);
						if(e.isDefaultPrevented()) {
							return false;
						}
						var formData = new FormData(form);
						var postParams = {
							data: formData,
							contentType: false,
							processData: false
						};
						app.helper.showProgress();
						app.request.post(postParams).then(function(err,data){
							app.helper.hideProgress();
							app.helper.hidePageContentOverlay();
							var relatedModuleName = formData.module;
Prasad's avatar
Prasad committed
							if(relatedModuleName == 'Events') {
								relatedModuleName = 'Calendar';
							}
							var relatedController = thisInstance.getRelatedController(relatedModuleName);
							relatedController.loadRelatedList();
					});
					return false;
					}
Prasad's avatar
Prasad committed
				});
Prasad's avatar
Prasad committed
				jQuery('#EditView').find('.saveButton').on('click', function(e){
					window.onbeforeunload = null;
				});
			});
		},

	referenceFieldNames : {
Prasad's avatar
Prasad committed
		'Accounts' : 'parent_id',
		'Contacts' : 'contact_id',
		'Leads' : 'parent_id',
		'Potentials' : 'parent_id',
		'HelpDesk' : 'parent_id',
		'Project'  : 'projectid'
	},

	init : function() {
		this.addComponents();
	},

	addComponents : function() {
		var emailPreviewClassName = 'Vtiger_EmailPreview_Js';
Prasad's avatar
Prasad committed
	this.addIndexComponent();
		this.addComponent(emailPreviewClassName);
		this.addComponent('Vtiger_Tag_Js');
	},



Prasad's avatar
Prasad committed
	addIndexComponent : function() {
		this.addModuleSpecificComponent('Index','Vtiger',app.getParentModuleName());
	},
Prasad's avatar
Prasad committed
	 * Function which will give the detail view form
	 * @return : jQuery element
	 */
	detailViewForm : false,
Prasad's avatar
Prasad committed
	getForm : function() {
		if(this.detailViewForm == false) {
			this.detailViewForm = jQuery('#detailView');
		}
		return this.detailViewForm;
	},

	detailViewContainer : false,
	getDetailViewContainer : function(){
		if(this.detailViewContainer === false){
Prasad's avatar
Prasad committed
			this.detailViewContainer = jQuery('.detailViewContainer');
		}
		return this.detailViewContainer;
	},
	setDetailViewContainer : function(container){
		this.detailViewContainer = container;
	},

	detailViewContentHolder : false,
	getContentHolder : function() {
Prasad's avatar
Prasad committed
		if(this.detailViewContentHolder == false) {
			this.detailViewContentHolder = jQuery('div.details');
		}
		return this.detailViewContentHolder;
	},

	/**
	 * Function to load related list
	 */
	loadRelatedListRecords : function(urlParams) {
		var self = this;
		var aDeferred = jQuery.Deferred();
		var defParams = self.getDefaultParams();
		urlParams = jQuery.extend(defParams, urlParams);
		app.helper.showProgress();
		app.request.get({data:urlParams}).then(function(err, res){
			aDeferred.resolve(res);
			var container = jQuery('.relatedContainer');
Prasad's avatar
Prasad committed
			container.html(res);
			app.helper.hideProgress();
			app.event.trigger("post.relatedListLoad.click",container.find(".searchRow"));
		});
		return aDeferred.promise();
	},
	sendSMS: function(detailActionUrl, module){
		var self = this;
		app.helper.checkServerConfig(module).then(function(data) {
			if (data == true) {
				var cb = function(container) {
					$('#phoneFormatWarningPop').popover();
				}
				self.sendSMSAction(detailActionUrl, cb);
			} else {
				app.helper.showAlertBox({message:app.vtranslate('JS_SMS_SERVER_CONFIGURATION')})
			}
		});
	},
	sendSMSAction: function(detailActionUrl, callBackFunction) {
		var self = this;
		var selectedIds = new Array();
		selectedIds.push(self.getRecordId());
		var postData = {
			"selected_ids": JSON.stringify(selectedIds)
		};
		app.request.post({url:detailActionUrl, data:postData, dataType:"html"}).then(
				function(err, data) {
					if (data) {
						app.helper.showModal(data);
						if (typeof callBackFunction == 'function') {
							callBackFunction(data);
						}
					}
				});
	},

	/**
	 * Function to fetch default params 
	 */
	getDefaultParams : function() {
Prasad's avatar
Prasad committed
		var module = app.module();

		var activeModule = jQuery(".related-tabs li.active");
		var relatedModule = activeModule.attr("data-module")
		var label = activeModule.attr("data-label-key");
		var relationId = activeModule.attr("data-relation-id");
		var orderBy = jQuery('#orderBy').val();
Prasad's avatar
Prasad committed
		var sortOrder = jQuery("#sortOrder").val();
		var pageNumber = jQuery('#pageNumber').val();

		var recordId = jQuery('#recordId').val();
Prasad's avatar
Prasad committed
		var params = {
			'module': module,
			'relatedModule': relatedModule,
Prasad's avatar
Prasad committed
			'view' : "Detail",
			'record' : recordId,
			'page' : pageNumber,
Prasad's avatar
Prasad committed
			'mode' : 'showRelatedList',
			'relationId' : relationId,
			'tab_label' : label,
			'orderby' : orderBy,
Prasad's avatar
Prasad committed
			'sortorder' : sortOrder
		};
		params.search_params = JSON.stringify(this.getRelatedListSearchParams());
		params.nolistcache = (jQuery('#noFilterCache').val() == 1) ? 1 : 0;
		return params;
	},

	/**
	 * Function to fetch search params
	 */
	getRelatedListSearchParams : function() {
		var detailViewContainer = this.getDetailViewContainer();
		var relatedListTable = detailViewContainer.find('.searchRow');
		var searchParams = [];
		var currentSearchParams = [];
		if(jQuery('#currentSearchParams').val()) {
			currentSearchParams = JSON.parse(jQuery('#currentSearchParams').val());
		}
		relatedListTable.find('.listSearchContributor').each(function(index,domElement){
			var searchInfo = [];
			var searchContributorElement = jQuery(domElement);
			var fieldName = searchContributorElement.attr('name');
			var fieldInfo = related_uimeta.field.get(fieldName);

			if(fieldName in currentSearchParams) {
				delete currentSearchParams[fieldName];
			}

			var searchValue = searchContributorElement.val();

			if(typeof searchValue == "object") {
				if(searchValue == null) {
					searchValue = "";
				}else{
					searchValue = searchValue.join(',');
				}
			}
			searchValue = searchValue.trim();
			if(searchValue.length <=0 ) {
				//continue
				return true;
			}
			var searchOperator = 'c';
			if(fieldInfo.type == "date" || fieldInfo.type == "datetime") {
				searchOperator = 'bw';
			}else if (fieldInfo.type == 'percentage' || fieldInfo.type == "double" || fieldInfo.type == "integer"
				|| fieldInfo.type == 'currency' || fieldInfo.type == "number" || fieldInfo.type == "boolean" ||
				fieldInfo.type == "picklist") {
				searchOperator = 'e';
			}
			var storedOperator = searchContributorElement.parent().parent().find('.operatorValue').val();
			if(storedOperator) {
				searchOperator = storedOperator;
				storedOperator = false;
			}
			searchInfo.push(fieldName);
			searchInfo.push(searchOperator);
			searchInfo.push(searchValue);
			searchInfo.push(fieldInfo.type);
			searchParams.push(searchInfo);
		});
		for(var i in currentSearchParams) {
			var fieldName = currentSearchParams[i]['fieldName'];
			var searchValue = currentSearchParams[i]['searchValue'];
			var searchOperator = currentSearchParams[i]['comparator'];
			if(fieldName== null || fieldName.length <=0 ){
				continue;
			}
			var searchInfo = [];
			searchInfo.push(fieldName);
			searchInfo.push(searchOperator);
			searchInfo.push(searchValue);
			searchParams.push(searchInfo);
		}
		var params = [];
		params.push(searchParams);
		return params;
	},

	getTabContainer : function(){
Prasad's avatar
Prasad committed
		return jQuery('div.related-tabs');
	},

	getRecordId : function(){
Prasad's avatar
Prasad committed
		return app.getRecordId();
	},

	getRelatedTabs : function() {
Prasad's avatar
Prasad committed
		return this.getTabContainer().find('li');
	},

	deSelectAllrelatedTabs : function() {
Prasad's avatar
Prasad committed
		this.getRelatedTabs().removeClass('active');
	},

	markRelatedTabAsSelected : function(tabElement){
Prasad's avatar
Prasad committed
		tabElement.addClass('active');
	},

	/*
	 * Function to register the submit event for Send Sms
	 */
	registerSendSmsSubmitEvent: function() {
		var thisInstance = this;
		jQuery('body').on('submit', '#massSave', function(e) {
			var form = jQuery(e.currentTarget);
Prasad's avatar
Prasad committed
			form.vtValidate({onsubmit : false});
			if(!form.valid()) {
				return false;
			}
			var smsTextLength = form.find('#message').val().length;
			if (smsTextLength > 160) {
				app.helper.showErrorNotification({message:app.vtranslate('LBL_SMS_MAX_CHARACTERS_ALLOWED')});
				return false;
			}
			var submitButton = form.find(':submit');
			submitButton.attr('disabled', 'disabled');
			thisInstance.SendSmsSave(form);
			e.preventDefault();
		});
	},
	/*
	 * Function to Save and sending the Sms and hide the modal window of send sms
	 */
	SendSmsSave: function(form) {
		app.helper.showProgress();
		var formData = form.serializeFormData();
		app.request.post({data: formData}).then(
				function(err, data) {
					app.helper.hideProgress();
					app.helper.hideModal();
					if(err){
						app.helper.showErrorNotification({message:app.vtranslate('JS_PHONEFORMAT_ERROR')});
						return;
					}
Prasad's avatar
Prasad committed
					var statusDetails = data.statusdetails;
					var status = statusDetails.status;
					if(status == 'Failed') {
						var errorMsg = statusDetails.statusmessage+'<br>'+app.vtranslate('JS_PHONEFORMAT_ERROR');
						app.helper.showErrorNotification({'title' : status, 'message' : errorMsg});
					} else {
						var msg = statusDetails.statusmessage;
						app.helper.showSuccessNotification({'title' : status, 'message' : msg});
					}
				}
		);
	},
	/**
	 * To load Related List Contents
	 * @returns {undefined}
	 */
	registerEventForRelatedTabClick : function(){
		var self = this;
		var detailViewContainer = this.getDetailViewContainer();
		jQuery('.related-tabs', detailViewContainer).on('click', 'li.tab-item a', function(e, urlAttributes) {
			e.preventDefault();
		});
		jQuery('.related-tabs', detailViewContainer).on('click', 'li.more-tab a', function(e, urlAttributes) {
			e.preventDefault();
		});
		jQuery('.related-tabs', detailViewContainer).on('click', 'li.more-tab', function(e,urlAttributes){
			if(jQuery('.moreTabElement').length != 0){
				jQuery('.moreTabElement').remove();
			}
			var moreTabElement = jQuery(e.currentTarget).clone();
			moreTabElement.find('.content').text('');
			moreTabElement.addClass('moreTabElement');
			moreTabElement.addClass('active');
			var moreElementTitle = moreTabElement.find('a').attr('displaylabel')
			moreTabElement.attr('title',moreElementTitle);
			moreTabElement.find('.tab-icon').removeClass('textOverflowEllipsis');
			jQuery('.related-tab-more-element').before(moreTabElement);
			self.loadSelectedTabContents(moreTabElement, urlAttributes);
			self.registerQtipevent(moreTabElement);
		});
		jQuery('.related-tabs', detailViewContainer).on('click', 'li.tab-item', function(e,urlAttributes){
			var tabElement = jQuery(e.currentTarget);
			self.loadSelectedTabContents(tabElement, urlAttributes);
		});
	},

	loadSelectedTabContents: function(tabElement, urlAttributes){
			var self = this;
			var detailViewContainer = this.getDetailViewContainer();
			var url = tabElement.data('url');
			self.loadContents(url,urlAttributes).then(function(data){
				self.deSelectAllrelatedTabs();
				self.markRelatedTabAsSelected(tabElement);
				var container = jQuery('.relatedContainer');
				app.event.trigger("post.relatedListLoad.click",container.find(".searchRow"));
				// Added this to register pagination events in related list
				var relatedModuleInstance = self.getRelatedController();
				//Summary tab is clicked
				if(tabElement.data('linkKey') == self.detailViewSummaryTabLabel) {
					self.registerSummaryViewContainerEvents(detailViewContainer);
Prasad's avatar
Prasad committed
					self.registerEventForPicklistDependencySetup(self.getForm());
Prasad's avatar
Prasad committed

				//Detail tab is clicked
				if(tabElement.data('linkKey') == self.detailViewDetailTabLabel) {
					self.triggerDetailViewContainerEvents(detailViewContainer);
Prasad's avatar
Prasad committed
					self.registerEventForPicklistDependencySetup(self.getForm());
				}

				// Registering engagement events if clicked tab is History
				if(tabElement.data('labelKey') == self.detailViewHistoryTabLabel){
					var engagementsContainer = jQuery(".engagementsContainer");
					if(engagementsContainer.length > 0){
						app.event.trigger("post.engagements.load");
					}
				}

Prasad's avatar
Prasad committed
				relatedModuleInstance.initializePaginationEvents();
				//prevent detail view ajax form submissions
				jQuery('form#detailView').on('submit', function(e) {
					e.preventDefault();
				});
			});
	},
Prasad's avatar
Prasad committed

	triggerDetailViewContainerEvents: function(detailViewContainer) {
	},

	registerRollupCommentsSwitchEvent : function() {
		var self = this;
		var commentsRelatedContainer = jQuery('.commentsRelatedContainer');
		if(jQuery('#rollupcomments').length > 0 && commentsRelatedContainer.length) {
			app.helper.hideProgress();
			commentsRelatedContainer.off('switchChange.bootstrapSwitch')
			.on('switchChange.bootstrapSwitch','#rollupcomments', function(e){
				app.helper.showProgress();
				self.toggleRollupComments(e);
			});
			if(jQuery('#rollupcomments').attr('rollup-status') == 1) {
				jQuery('#rollupcomments').bootstrapSwitch('state', true, true);

			}else{
				jQuery('#rollupcomments').bootstrapSwitch('state', false, true);
			}
		}
	},

	/**
Prasad's avatar
Prasad committed
	 * To handle related record delete confirmation message
	 */
	getDeleteMessageKey : function() {
		return 'LBL_DELETE_CONFIRMATION';
	},

	/**
	 * Funtion to register Related List Events
	 * @returns {undefined}
	 */
	registerEventsForRelatedList : function(){
		var self = this;
		var detailContentsHolder = this.getContentHolder();
		this.registerRelatedRecordEdit();

		this.registerEventForRelatedTabClick();
		this.registerRelatedListSearch();
		this.registerRelatedListSort();
		this.registerRemoveRelatedListSort();
		this.registerEventForEmailsRelatedRecord();
		this.registerRelatedListPageNavigationEvents();
		this.registerEventForAddingRelatedRecord();
		this.registerEventForSelectingRelatedRecord();
		self.registerScrollForRollupEvents();

		app.event.on("post.relatedListLoad.click",function(event, container){
			vtUtils.applyFieldElementsView(container);
			vtUtils.enableTooltips();
			var vtigerInstance = Vtiger_Index_Js.getInstance();
			vtigerInstance.registerMultiUpload();
			//For Rollup Comments
Prasad's avatar
Prasad committed
			self.registerRollupCommentsSwitchEvent();
			//END
Prasad's avatar
Prasad committed
		var vtigerInstance = Vtiger_Index_Js.getInstance();
		vtigerInstance.registerMultiUpload();

		detailContentsHolder.on('click', 'a.relationDelete', function(e){
Prasad's avatar
Prasad committed
			e.stopImmediatePropagation();
			var element = jQuery(e.currentTarget);
			var key = self.getDeleteMessageKey();
			var message = app.vtranslate(key);
			var relatedModuleName = self.getRelatedModuleName();
			var row = element.closest('tr');
			var relatedRecordid = row.data('id');
			var relatedController = self.getRelatedController();
			if(relatedController){
			if(relatedModuleName == 'Calendar' && row.data('recurringEnabled')) {
				app.helper.showConfirmationForRepeatEvents().then(function(customParams) {
					relatedController.deleteRelation([relatedRecordid], customParams).then(function(response){
						relatedController.loadRelatedList().then(function() {
							relatedController.triggerRelationAdditionalActions();
						});
					});
				},
				function(error, err) {
				});
			} else {
				app.helper.showConfirmationBox({'message' : message}).then(
					function(e) {
						if(relatedModuleName == 'Emails') {
							var parentId = row.find('.parentId').data('parent-id');
							if(typeof parentId != 'undefined')
							relatedController.parentId = parentId;
						}
						relatedController.deleteRelation([relatedRecordid]).then(function(response){
							relatedController.loadRelatedList().then(function() {
								relatedController.triggerRelationAdditionalActions();
							});
						});
					},
					function(error, err){
					}
				);
			}
		}
		});
	},

	registerEventForEmailsRelatedRecord : function(){
Prasad's avatar
Prasad committed
		var detailContentsHolder = this.getContentHolder();
		var parentId = this.getRecordId();

		var params = {};
		params['module'] = "Emails";
		params['view'] = "ComposeEmail";
		params['parentId'] = parentId;
		params['relatedLoad'] = true;

Prasad's avatar
Prasad committed
		detailContentsHolder.on('click','[name="emailsRelatedRecord"], [name="emailsDetailView"]',function(e){
			e.stopPropagation();
			var element = jQuery(e.currentTarget);
			var recordId = element.data('id');
			if(element.data('emailflag') == 'SAVED') {
				var mode = 'emailEdit';
			} else {
				mode = 'emailPreview';
				params['parentModule'] = app.getModuleName();
Prasad's avatar
Prasad committed
			}
			params['mode'] = mode;
			params['record'] = recordId;
			app.helper.showProgress();
			app.request.post({data:params}).then(function(err,data){
				app.helper.hideProgress();
				if(err === null){
Prasad's avatar
Prasad committed
					var dataObj = jQuery(data);
					var descriptionContent = dataObj.find('#iframeDescription').val();
					app.helper.showModal(data,{cb:function(){
Prasad's avatar
Prasad committed
						if(mode === 'emailEdit'){
							var editInstance = new Emails_MassEdit_Js();
							editInstance.registerEvents();
						}else {
							app.event.trigger('post.EmailPreview.load',null);
Prasad's avatar
Prasad committed
						}
						jQuery('#emailPreviewIframe').contents().find('html').html(descriptionContent);
						jQuery("#emailPreviewIframe").height(jQuery('.email-body-preview').height());
Prasad's avatar
Prasad committed
						jQuery('#emailPreviewIframe').contents().find('html').find('a').on('click', function(e) {
							e.preventDefault();
							var url = jQuery(e.currentTarget).attr('href');
							window.open(url, '_blank');
						});
						//jQuery("#emailPreviewIframe").height(jQuery('#emailPreviewIframe').contents().find('html').height());
					}});
Prasad's avatar
Prasad committed
		})

		detailContentsHolder.on('click','[name="emailsEditView"]',function(e){
Prasad's avatar
Prasad committed
			e.stopPropagation();
			var module = "Emails";
			app.helper.checkServerConfig(module).then(function(data){
				if(data == true){
					var element = jQuery(e.currentTarget);
					var closestROw = element.closest('tr');
					var recordId = closestROw.data('id');
					var parentRecord = new Array();
					parentRecord.push(parentId);
Prasad's avatar
Prasad committed
					params['mode'] = "emailEdit";
					params['record'] = recordId;
					params['selected_ids'] = parentRecord;
					app.helper.showProgress();
					app.request.post({'data':params}).then(function(err,data){
						app.helper.hideProgress();
						if(err === null){
							app.helper.showModal(data);
							var editInstance = new Emails_MassEdit_Js();
							editInstance.registerEvents();
						}
					});
Prasad's avatar
Prasad committed
				} else {
					app.helper.showErrorMessage(app.vtranslate('JS_EMAIL_SERVER_CONFIGURATION'));
				}
			})
		})
	},

	/**
	* To Delete Record from detail View
	* @param {type} deleteRecordActionUrl
	* @returns {undefined}
	*/
	remove : function(deleteRecordActionUrl){
		var message = app.vtranslate('LBL_DELETE_CONFIRMATION');
Prasad's avatar
Prasad committed
		app.helper.showConfirmationBox({'message' : message}).then(function(data) {
				var params = app.convertUrlToDataParams(deleteRecordActionUrl+"&ajaxDelete=true");
				app.request.post({data:params}).then(
Prasad's avatar
Prasad committed
				function(err,data){
					if(err === null){
						if(typeof data !== 'object'){
							var appName = app.getAppName();
							window.location.href = data+'&app='+appName;
						}else {
							app.helper.showAlertBox({'message' : data.prototype.message});
						}
					} else {
						app.helper.showAlertBox({'message' : err});
					}
Prasad's avatar
Prasad committed
				});
			}
		);
	},

	/**
	 * Function to register the related list search event
	 */
	registerRelatedListSearch : function() {
		var thisInstance = this;
		var detailViewContainer = thisInstance.getDetailViewContainer();
		detailViewContainer.on('click','[data-trigger="relatedListSearch"]',function(e){
			var params = {'page' : '1'};
			thisInstance.getRelatedController().loadRelatedList(params);
		});
		detailViewContainer.on('keypress','input.listSearchContributor',function(e){
			if(e.keyCode == 13){
				var element = jQuery(e.currentTarget);
				var parentElement = element.closest('tr');
				var searchTriggerElement = parentElement.find('[data-trigger="relatedListSearch"]');
				searchTriggerElement.trigger('click');
			}
		});
	},

	/**
	 * Function to register the related list sort event
	 */
	registerRelatedListSort : function() {
		var thisInstance = this;
		var detailViewContainer = thisInstance.getDetailViewContainer();
		detailViewContainer.on('click','.listViewContentHeaderValues,.relatedListHeaderValues',function(e){
			var fieldName = jQuery(e.currentTarget).attr('data-fieldname');
			var sortOrderVal = jQuery(e.currentTarget).attr('data-nextsortorderval');
			if(sortOrderVal === 'ASC'){
				jQuery('i',e.currentTarget).addClass('fa-sort-asc');
			}else{
				jQuery('i',e.currentTarget).addClass('fa-sort-desc');
			}
			jQuery('#sortOrder').val(sortOrderVal);
			jQuery('#orderBy').val(fieldName);
			var params = [];
			thisInstance.getRelatedController().loadRelatedList(params);
		});
	},

	/**
	 * Function to register remove related list sorting
	 */
	registerRemoveRelatedListSort : function() {
		var thisInstance = this;
		var detailViewContainer = thisInstance.getDetailViewContainer();
		detailViewContainer.on('click','.removeSorting',function(e){
			jQuery('#sortOrder').val(null);
			jQuery('#orderBy').val(null);
			var params = [];
			thisInstance.getRelatedController().loadRelatedList(params);
		});
	},

	/**
	 * Function to register Related List View Pagination
	 * @returns {undefined}
	 */
	registerRelatedListPageNavigationEvents : function(){
		var thisInstance = this;
		var detailViewContainer = thisInstance.getDetailViewContainer();
		var urlParams = {};
		detailViewContainer.on('click','#listViewNextPageButton',function(e){
			var pageLimit = jQuery('#pageLimit').val();
			var noOfEntries = jQuery('#noOfEntries').val();
			var nextPageExist = jQuery('#nextPageExist').val();

			if(noOfEntries == pageLimit && nextPageExist){
				var pageNumber = jQuery('#pageNumber').val();
				var nextPageNumber = parseInt(parseFloat(pageNumber)) + 1;
				jQuery('#pageNumber').val(nextPageNumber);
				var params = [];
				thisInstance.loadRelatedListRecords(params);
			}
		});

		detailViewContainer.on('click','#listViewPreviousPageButton',function(e){
			var pageNumber = jQuery('#pageNumber').val();
			if(pageNumber > 1){
				var previousPageNumber = parseInt(parseFloat(pageNumber)) - 1;
				jQuery('#pageNumber').val(previousPageNumber);
				var params = [];
				thisInstance.loadRelatedListRecords(params);
			}
		});
	},

	/**
Prasad's avatar
Prasad committed
	 * Function to register event for adding related record for module
	 */
	registerEventForAddingRelatedRecord : function(){
		var thisInstance = this;
		var detailViewContainer = thisInstance.getDetailViewContainer();
Prasad's avatar
Prasad committed
		detailViewContainer.on('click','[name="addButton"]',function(e){
			var element = jQuery(e.currentTarget);
			var relatedModuleName = element.attr('module');
			var quickCreateNode = jQuery('#quickCreateModules').find('[data-name="'+ relatedModuleName +'"]');
			if(quickCreateNode.length <= 0) {
				window.location.href = element.data('url');
				return;
			}
Prasad's avatar
Prasad committed

			var relatedController = thisInstance.getRelatedController(relatedModuleName);
			if(relatedController){
				relatedController.addRelatedRecord(element);
			}
		})
	},
Prasad's avatar
Prasad committed
	 * Function to register event for selecting related record for module
	 */