Skip to content
Snippets Groups Projects
Vtiger.js 53.6 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_Index_Js', {
	files: [],
	hideNC: true,

	getInstance : function() {
		return new Vtiger_Index_Js();
	},

	/**
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) {
		e.stopPropagation();
		if (recordId) {
			var params = {
				module: 'ModComments',
				view: 'FilePreview',
				record: recordId,
				attachmentid: attachmentId
			};
			app.request.post({data:params}).then(function(err, res){
				app.helper.showModal(res);
				jQuery('.filePreview .preview-area').height(jQuery(window).height()-143);
Prasad's avatar
Prasad committed
			});
		}
	},
Prasad's avatar
Prasad committed
	 * Function to show email preview in popup
	 */
	showEmailPreview : function(recordId, parentId) {
		var popupInstance = Vtiger_Popup_Js.getInstance();
		var params = {};
		params['module'] = "Emails";
		params['view'] = "ComposeEmail";
		params['mode'] = "emailPreview";
		params['record'] = recordId;
		params['parentId'] = parentId;
		params['relatedLoad'] = true;

		var callback = function(data){
Prasad's avatar
Prasad committed
			emailPreviewClass = app.getModuleSpecificViewClass('EmailPreview','Vtiger');
			_controller = new window[emailPreviewClass]();
			_controller.registerEventsForActionButtons();
			var descriptionContent = data.find('#iframeDescription').val();
			var frameElement = jQuery("#emailPreviewIframe")[0].contentWindow.document;
			frameElement.open();
			frameElement.close();
			jQuery('#emailPreviewIframe').contents().find('html').html(descriptionContent);
			jQuery("#emailPreviewIframe").height(jQuery('#emailPreviewIframe').contents().find('html').height());
			jQuery('#emailPreviewIframe').contents().find('html').find('a').on('click', function(e) {
				e.preventDefault();
				var url = jQuery(e.currentTarget).attr('href');
				window.open(url, '_blank');
			});
Prasad's avatar
Prasad committed
		popupInstance.showPopup(params,null,callback);
	},
Prasad's avatar
Prasad committed
	 * Function to show compose email popup based on number of
	 * email fields in given module,if email fields are more than
	 * one given option for user to select email for whom mail should
	 * be sent,or else straight away open compose email popup
	 * @params : accepts params object
	 *
	 * @cb: callback function to recieve the child window reference.
	 */

	showComposeEmailPopup : function(params, cb){
		var currentModule = "Emails";
		app.helper.showProgress();
		app.helper.checkServerConfig(currentModule).then(function(data){
			if(data == true){
				app.request.post({data:params}).then(function(err,data){
					if(err === null){
						data = jQuery(data);
						var form = data.find('#SendEmailFormStep1');
						var emailFields = form.find('.emailField');
						var length = emailFields.length;
						var emailEditInstance = new Emails_MassEdit_Js();

						var prefsNeedToUpdate = form.find('#prefsNeedToUpdate').val();
						if(prefsNeedToUpdate && length > 1) {
							app.helper.hideProgress();
							app.helper.showModal(data);
							emailEditInstance.registerEmailFieldSelectionEvent();
							return true;
						}

						if(length > 1) {
							var saveRecipientPref = form.find('#saveRecipientPrefs').is(':checked');
							if(saveRecipientPref) {
								var params = form.serializeFormData();
								emailEditInstance.showComposeEmailForm(params).then(function(response) {
								jQuery(document).on('shown.bs.modal', function() {
									if (typeof cb === 'function') cb(response);
								});
							});
							}else {
								app.helper.hideProgress();
								app.helper.showModal(data);
								emailEditInstance.registerEmailFieldSelectionEvent();
							}
						}else{
							emailFields.attr('checked','checked');
							var params = form.serialize();
							emailEditInstance.showComposeEmailForm(params).then(function(response) {
								jQuery(document).on('shown.bs.modal', function() {
									if (typeof cb === 'function') cb(response);
								});
							});
						}
					}
				});
			} else {
				app.helper.showAlertBox({'message':app.vtranslate('JS_EMAIL_SERVER_CONFIGURATION')});
			}
		});
Prasad's avatar
Prasad committed
	},

	showRecipientPreferences: function (module) {
		var params = {
			module: module,
			view: "RecipientPreferences",
		};

		var callback = function (data) {
			var form = jQuery(data).find('#recipientsForm');
			if (form.find('#multiEmailContainer').height() > 300) {
				app.helper.showVerticalScroll(form.find('#multiEmailContainer'),{
Prasad's avatar
Prasad committed
					setHeight: '300px',
					autoHideScrollbar: false,
				});
			}

			form.on('submit', function (e) {
				e.preventDefault();
				form.find('.savePreference').attr('disabled', true);
				var params = form.serialize();
				app.helper.hideModal();
				app.helper.showProgress();
				app.request.post({"data":params}).then(function (err,data) {
					if (err == null) {
						app.helper.hideProgress();
						app.helper.showSuccessNotification({"message":''});
					} else {
						app.helper.showErrorNotification({"message":''});
					}
				});
			});
		}

		app.helper.showProgress();
		app.request.post({"data":params}).then(function (err,data) {
			if(err == null){
				app.helper.hideProgress();
				app.helper.showModal(data,{"cb":callback});
			}
		});
	},

	/**
	 * Function to show record address in Google Map
	 * @param {type} e
	 * @returns {undefined}
	 */
	showMap : function(e) {
		var currentElement = jQuery(e);
		var params1 = {
Prasad's avatar
Prasad committed
			'module' : 'Google',
			'action' : 'MapAjax',
			'mode' : 'getLocation',
			'recordid' : currentElement.data('record'),
			'source_module' : currentElement.data('module')
		};
		app.request.post({"data":params1}).then(function(error,response) {
			var result = JSON.parse(response);
			var address = result.address;
			var location = jQuery.trim((address).replace(/\,/g," "));
			if(location == '' || location == null) {
				app.helper.showAlertNotification({message:app.vtranslate('Please add address information to view on map')});
				return false;
			} else {
				var params = {
					'module' : 'Google',
					'view' : 'Map',
					'mode' : 'showMap',
					'viewtype' : 'detail',
					'record' : currentElement.data('record'),
					'source_module' : currentElement.data('module')
				};
				var popupInstance = Vtiger_Popup_Js.getInstance();
				popupInstance.showPopup(params, '', function(data) {
					var mapInstance = new Google_Map_Js();
					mapInstance.showMap(data);
				});
			}
		});
Prasad's avatar
Prasad committed
	 * Function registers event for Calendar Reminder popups
	 */
	registerActivityReminder : function() {
		var activityReminderInterval = app.getActivityReminderInterval();
		if(activityReminderInterval != '') {
Prasad's avatar
Prasad committed
			var cacheActivityReminder = app.storage.get('activityReminder', 0);
			var currentTime = new Date().getTime()/1000;
			var nextActivityReminderCheck = app.storage.get('nextActivityReminderCheckTime', 0);
			//If activity Reminder Changed, nextActivityReminderCheck should reset
Prasad's avatar
Prasad committed
			if(activityReminderInterval != cacheActivityReminder) {
				nextActivityReminderCheck = 0;
			}
			if(currentTime >= nextActivityReminderCheck) {
				Vtiger_Index_Js.requestReminder();
			} else {
				var nextInterval = nextActivityReminderCheck - currentTime;
				setTimeout(function() {Vtiger_Index_Js.requestReminder()}, nextInterval*1000);
			}
Prasad's avatar
Prasad committed
		}
	},

	/**
	 * Function request for reminder popups
	 */
	requestReminder : function() {
		var activityReminder = app.getActivityReminderInterval();
		if(!activityReminder);return;
Prasad's avatar
Prasad committed
		var currentTime = new Date().getTime()/1000;
		//requestReminder function should call after activityreminder popup interval
		setTimeout(function() {Vtiger_Index_Js.requestReminder()}, activityReminder*1000);
		app.storage.set('activityReminder', activityReminder);
		//setting next activity reminder check time
		app.storage.set('nextActivityReminderCheckTime', currentTime + parseInt(activityReminder));

		app.request.post({
			'data' : {
				'module' : 'Calendar',
				'action' : 'ActivityReminder',
				'mode' : 'getReminders'
			}
		}).then(function(e, res) {
			if(!res.hasOwnProperty('result')) {
				for(i=0; i< res.length; i++) {
					var record = res[i];
Prasad's avatar
Prasad committed
					if(typeof record == 'object') {
						Vtiger_Index_Js.showReminderPopup(record);
					}
Prasad's avatar
Prasad committed
	},

	/**
	 * Function display the Reminder popup
	 */
	showReminderPopup : function(record) {
		var notifyParams = {
			'title' : record.activitytype + ' - ' +
					'<a target="_blank" href="index.php?module=Calendar&view=Detail&record='+record.id+'">'+record.subject+'</a>&nbsp;&nbsp;'+
					'<i id="reminder-postpone-'+record.id+'" title="'+app.vtranslate('JS_POSTPONE')+'" class="cursorPointer fa fa-clock-o"></i>',
			'message' : '<div class="col-sm-12">'+
							'<div class="row">'+
								'<div class="col-sm-12 font13px">'+
									app.vtranslate('JS_START_DATE_TIME') + ' : ' + record.date_start+
								'</div>'+
								'<div class="col-sm-12 font13px">'+
									app.vtranslate('JS_END_DATE_TIME') + ' : ' + record.due_date+
								'</div>'+
							'</div>'+
						'</div>'
		};
		var settings = {
			'element' : 'body', 
			'type' : 'danger', 
			'delay' : 0
		};

		jQuery.notify(notifyParams, settings);
		jQuery('#reminder-postpone-'+record.id).on('click', function(e) {
Prasad's avatar
Prasad committed
			jQuery(e.currentTarget).closest('.notificationHeader').find('[data-notify="dismiss"]').trigger('click');
			app.request.post({
				'data' : {
					'module' : 'Calendar',
					'action' : 'ActivityReminder',
					'mode' : 'postpone',
					'record' : record.id
				}
			}).then(function(e,res) {});
Prasad's avatar
Prasad committed
		});
		jQuery('#reminder-postpone-'+record.id).closest('[data-notify="container"]').draggable({'containment' : 'body'});
Prasad's avatar
Prasad committed
	}
Prasad's avatar
Prasad committed
}, {
	 _SearchIntiatedEventName : 'VT_SEARCH_INTIATED',
	usernames : [],
	userList : {},
Prasad's avatar
Prasad committed
	autoFillElement : false,

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

	addComponents : function() {
		var basicSearchClassName = 'Vtiger_BasicSearch_Js';
		var textsearchClassName = 'TextSearch_BasicSearch_Js';
		if(typeof window[textsearchClassName] != "undefined") {
			this.addComponent(textsearchClassName);
		} else{
			this.addComponent(basicSearchClassName);
		}
	},

	registerListEssentialsToggleEvent : function() {
		jQuery('.main-container').on('click', '.essentials-toggle', function() {
			jQuery('.sidebar-essentials').toggleClass('hide');
			jQuery(".content-area").toggleClass("full-width");
			var params = {
				'module' : 'Users',
				'action' : 'IndexAjax',
				'mode' : 'toggleLeftPanel',
				'showPanel' : +jQuery('.sidebar-essentials').hasClass('hide')
			}
			app.request.post({data: params});
			if(jQuery('.sidebar-essentials').hasClass('hide')) {
				jQuery('.essentials-toggle-marker').removeClass('fa-chevron-left')
						.addClass('fa-chevron-right');
			} else {
				jQuery('.essentials-toggle-marker').removeClass('fa-chevron-right')
						.addClass('fa-chevron-left');
			}
			app.event.trigger("Vtiger.Post.MenuToggle");
		});
	},

	registerModuleQtips : function() {
		jQuery('.module-qtip').qtip({
			position: {
				my: 'left center',
				at: 'center right',
				adjust: {
					y: 1
				}
			},
			style: {
				classes: 'qtip-dark qtip-shadow module-name-tooltip'
			},
			show: {
				delay: 500
			}
		});
	},

	registerEvents: function() {
		this.registerMenuToggle();
		this.registerGlobalSearch();
		this.registerAppTriggerEvent();
		this.registerModuleQtips();
		this.registerListEssentialsToggleEvent();
		this.registerAdvanceSeachIntiator();
		this.registerQuickCreateEvent();
		this.registerQuickCreateSubMenus();
		this.registerPostQuickCreateEvent();
		this.registerEventForTaskManagement();
Prasad's avatar
Prasad committed
		this.registerFileChangeEvent();
		this.registerMultiUpload();
		this.registerHoverEventOnAttachment();
		//this.addBodyScroll();
		this.mentionerCallBack();
		this.modulesMenuScrollbar();
		Vtiger_Index_Js.registerActivityReminder();
		//reference preview event registeration
		this.registerReferencePreviewEvent();
Prasad's avatar
Prasad committed
	},

	addBodyScroll: function () {
		app.helper.showVerticalScroll(
				$("body"),
				{
					setHeight: $(window).height() - 92,
					theme: "inset-dark",
					alwaysShowScrollbar: 2,
					autoExpandScrollbar: true,
					live: "on",
					setTop: 0,
					scrollInertia: 70,
					mouseWheel:{ preventDefault: true }

				}
		);
	},
	registerEventForTaskManagement : function(){
		var globalNav = jQuery('.global-nav');
		globalNav.on("click",".taskManagement",function(e){
			if(jQuery("#taskManagementContainer").length > 0){
				app.helper.hidePageOverlay();
				return false;
			}

			var params = {
				'module' : 'Calendar',
				'view' : 'TaskManagement',
				'mode' : 'showManagementView'
			}
			app.helper.showProgress();
			app.request.post({"data":params}).then(function(err,data){
				if(err === null){
					app.helper.loadPageOverlay(data,{'ignoreScroll' : true,'backdrop': 'static'}).then(function(){
						app.helper.hideProgress();
						$('#overlayPage').find('.data').css('height','100vh');

						var taskManagementPageOffset = jQuery('.taskManagement').offset();
						$('#overlayPage').find(".arrow").css("left",taskManagementPageOffset.left+13);
						$('#overlayPage').find(".arrow").addClass("show");

						vtUtils.showSelect2ElementView($('#overlayPage .data-header').find('select[name="assigned_user_id"]'),{placeholder:"User : All"});
						vtUtils.showSelect2ElementView($('#overlayPage .data-header').find('select[name="taskstatus"]'),{placeholder:"Status : All"});
						var js = new Vtiger_TaskManagement_Js();
						js.registerEvents();
					});
				}else{
					app.helper.showErrorNotification({"message":err});
				}
			});
		});
	},

	registerPostQuickCreateEvent : function(){
		var thisInstance = this;

		app.event.on("post.QuickCreateForm.show",function(event,form){
			form.find('#goToFullForm').on('click', function(e) {
Prasad's avatar
Prasad committed
				window.onbeforeunload = true;
				var form = jQuery(e.currentTarget).closest('form');
				var editViewUrl = jQuery(e.currentTarget).data('editViewUrl');
				if (typeof goToFullFormCallBack != "undefined") {
					goToFullFormCallBack(form);
				}
				thisInstance.quickCreateGoToFullForm(form, editViewUrl);
			});
		});
	},

	/**
	 * Function to navigate from quickcreate to editView Fullform
	 * @param accepts form element as parameter
	 */
	quickCreateGoToFullForm: function(form, editViewUrl) {
		var formData = form.serializeFormData();
		//As formData contains information about both view and action removed action and directed to view
		delete formData.module;
		delete formData.action;
		delete formData.picklistDependency;
		var formDataUrl = jQuery.param(formData);
		var completeUrl = editViewUrl + "&" + formDataUrl;
		window.location.href = completeUrl;
	},

	registerQuickCreateSubMenus : function() {
		jQuery("#quickCreateModules").on("click",".quickCreateModuleSubmenu",function(e){
			e.preventDefault();
			e.stopImmediatePropagation();
			jQuery(e.currentTarget).closest('.dropdown').toggleClass('open');
		});
	},

	/**
	 * Function to register Quick Create Event
	 * @returns {undefined}
	 */
	registerQuickCreateEvent : function (){
		var thisInstance = this;
		jQuery("#quickCreateModules").on("click",".quickCreateModule",function(e,params){
			var quickCreateElem = jQuery(e.currentTarget);
			var quickCreateUrl = quickCreateElem.data('url');
			var quickCreateModuleName = quickCreateElem.data('name');
			if (typeof params === 'undefined') {
				params = {};
			}
			if (typeof params.callbackFunction === 'undefined') {
				params.callbackFunction = function(data, err) {
					//fix for Refresh list view after Quick create
					var parentModule=app.getModuleName();
					var viewname=app.view();
					if((quickCreateModuleName == parentModule) && (viewname=="List")){
							var listinstance = app.controller();
							listinstance.loadListViewRecords(); 
					}
				};
			}
			app.helper.showProgress();
			thisInstance.getQuickCreateForm(quickCreateUrl,quickCreateModuleName,params).then(function(data){
				app.helper.hideProgress();
Prasad's avatar
Prasad committed
				var callbackparams = {
					'cb' : function (container){
						thisInstance.registerPostReferenceEvent(container);
						app.event.trigger('post.QuickCreateForm.show',form);
						app.helper.registerLeavePageWithoutSubmit(form);
						app.helper.registerModalDismissWithoutSubmit(form);
Prasad's avatar
Prasad committed
					},
					backdrop : 'static',
					keyboard : false
					}

				app.helper.showModal(data, callbackparams);
				var form = jQuery('form[name="QuickCreate"]');
				var moduleName = form.find('[name="module"]').val();
				app.helper.showVerticalScroll(jQuery('form[name="QuickCreate"] .modal-body'), {'autoHideScrollbar': true});

				var targetInstance = thisInstance;
				var moduleInstance = Vtiger_Edit_Js.getInstanceByModuleName(moduleName);
				if(typeof(moduleInstance.quickCreateSave) === 'function'){
					targetInstance = moduleInstance;
					targetInstance.registerBasicEvents(form);
Prasad's avatar
Prasad committed
				}

				vtUtils.applyFieldElementsView(form);
				targetInstance.quickCreateSave(form,params);
				app.helper.hideProgress();
			});
		});
	},

	/**
	 * Function to register quick create tab events
	 */
	registerQuickcreateTabEvents : function(form) {
		var thisInstance = this;
		var tabElements = form.closest('.modal-content').find('.nav.nav-pills , .nav.nav-tabs').find('a');

		//This will remove the name attributes and assign it to data-element-name . We are doing this to avoid
		//Multiple element to send as in calendar
		var quickCreateTabOnHide = function(tabElement) {
			var container = jQuery(tabElement.attr('data-target'));

			container.find('[name]').each(function(index, element) {
				element = jQuery(element);
				element.attr('data-element-name', element.attr('name')).removeAttr('name');
			});
		};

		//This will add the name attributes and get value from data-element-name . We are doing this to avoid
		//Multiple element to send as in calendar
		var quickCreateTabOnShow = function(tabElement) {
			var container = jQuery(tabElement.attr('data-target'));

			container.find('[data-element-name]').each(function(index, element) {
				element = jQuery(element);
				element.attr('name', element.attr('data-element-name')).removeAttr('data-element-name');
			});
		};

		tabElements.on('shown.bs.tab', function(e) {
			var previousTab = jQuery(e.relatedTarget);
			var currentTab = jQuery(e.currentTarget);

			quickCreateTabOnHide(previousTab);
			quickCreateTabOnShow(currentTab);

			if(form.find('[name="module"]').val()=== 'Calendar') {
				var sourceModule = currentTab.data('source-module');
				form.find('[name="calendarModule"]').val(sourceModule);
				var moduleInstance = Vtiger_Edit_Js.getInstanceByModuleName('Calendar');
				moduleInstance.registerEventForPicklistDependencySetup(form);
			}

Prasad's avatar
Prasad committed
			//while switching tabs we have to show scroll bar
			//thisInstance.showQuickCreateScrollBar(form);
			//while switching tabs we have to clear the invalid fields list
			//form.data('jqv').InvalidFields = [];
		});

		//remove name attributes for inactive tab elements
		quickCreateTabOnHide(tabElements.closest('li').filter(':not(.active)').find('a'));
	},

	/**
	 * Register Quick Create Save Event
	 * @param {type} form
	 * @returns {undefined}
	 */
	quickCreateSave : function(form,invokeParams){
		var params = {
			submitHandler: function(form) {
				// to Prevent submit if already submitted
				jQuery("button[name='saveButton']").attr("disabled","disabled");
				if(this.numberOfInvalids() > 0) {
					return false;
				}
				var formData = jQuery(form).serialize();
				app.request.post({data:formData}).then(function(err,data){
					app.event.trigger("post.QuickCreateForm.save",data,jQuery(form).serializeFormData());
					if(err === null) {
						app.helper.hideModal();
						app.helper.showSuccessNotification({"message":''});
						invokeParams.callbackFunction(data, err);
Prasad's avatar
Prasad committed
						//To unregister onbefore unload event registered for quickcreate
						window.onbeforeunload = null;
					}else{
						app.helper.showErrorNotification({"message":err});
					}
				});
			},
			validationMeta: quickcreate_uimeta
		};
		form.vtValidate(params);
	},

	/**
	 * Function to get Quick Create Form
	 * @param {type} url
	 * @param {type} moduleName
	 * @returns {unresolved}
	 */
	getQuickCreateForm: function(url, moduleName, params) {
		var aDeferred = jQuery.Deferred();
		var requestParams = app.convertUrlToDataParams(url);
		jQuery.extend(requestParams, params.data);
		app.request.post({data:requestParams}).then(function(err,data) {
			aDeferred.resolve(data);
		});
		return aDeferred.promise();
	},

	registerMenuToggle : function(){
		jQuery("#menu-toggle").on('click', function(e) {
			e.preventDefault();
			$("#modnavigator").toggleClass('hide');
			$(".content-area").toggleClass("full-width");
			var params = {
				'module' : 'Users',
				'action' : 'IndexAjax',
				'mode' : 'toggleLeftPanel',
				'showPanel' : +jQuery("#modnavigator").hasClass('hide')
			}
			app.request.post({data: params});
			app.event.trigger("Vtiger.Post.MenuToggle");
		});
	},

	registerAppTriggerEvent : function() {
		jQuery('.app-menu').removeClass('hide');
		var toggleAppMenu = function(type) {
			var appMenu = jQuery('.app-menu');
			var appNav = jQuery('.app-nav');
			appMenu.appendTo('#page');
			appMenu.css({
				'top' : appNav.offset().top + appNav.height(),
				'left' : 0
			});
			if(typeof type === 'undefined') {
				type = appMenu.is(':hidden') ? 'show' : 'hide';
			}
			if(type == 'show') {
				appMenu.show(200, function() {});
			} else {
				appMenu.hide(200, function() {});
			}
		};

		jQuery('.app-trigger, .app-icon, .app-navigator').on('click',function(e){
			e.stopPropagation();
			toggleAppMenu();
		});

		jQuery('html').on('click', function() {
			toggleAppMenu('hide');
		});

		jQuery(document).keyup(function (e) {
			if (e.keyCode == 27) {
				if(!jQuery('.app-menu').is(':hidden')) {
					toggleAppMenu('hide');
				}
			}
		});

		jQuery('.app-modules-dropdown-container').hover(function(e) {
			var dropdownContainer = jQuery(e.currentTarget);
			jQuery('.dropdown').removeClass('open');
			if(dropdownContainer.length) {
				if(dropdownContainer.hasClass('dropdown-compact')) {
					dropdownContainer.find('.app-modules-dropdown').css('top', dropdownContainer.position().top - 8);
				} else {
					dropdownContainer.find('.app-modules-dropdown').css('top', '');
				}
				dropdownContainer.addClass('open').find('.app-item').addClass('active-app-item');
			}
		}, function(e) {
			var dropdownContainer = jQuery(e.currentTarget);
			dropdownContainer.find('.app-item').removeClass('active-app-item');
			setTimeout(function() {
				if(dropdownContainer.find('.app-modules-dropdown').length && !dropdownContainer.find('.app-modules-dropdown').is(':hover') && !dropdownContainer.is(':hover')) {
					dropdownContainer.removeClass('open');
				}
			}, 500);

		});

		jQuery('.app-item').on('click', function() {
			var url = jQuery(this).data('defaultUrl');
			if(url) {
				window.location.href = url;
			}
		});

Prasad's avatar
Prasad committed
		jQuery(window).resize(function() {
			jQuery(".app-modules-dropdown").mCustomScrollbar("destroy");
			app.helper.showVerticalScroll(jQuery(".app-modules-dropdown").not('.dropdown-modules-compact'), {
				setHeight: $(window).height(),
				autoExpandScrollbar: true
			});
			jQuery('.dropdown-modules-compact').each(function() {
				var element = jQuery(this);
				var heightPer = parseFloat(element.data('height'));
				app.helper.showVerticalScroll(element, {
					setHeight: $(window).height()*heightPer - 3,
					autoExpandScrollbar: true,
					scrollbarPosition: 'outside'
				});
			});
		});
		app.helper.showVerticalScroll(jQuery(".app-modules-dropdown").not('.dropdown-modules-compact'), {
			setHeight: $(window).height(),
			autoExpandScrollbar: true,
			scrollbarPosition: 'outside'
Prasad's avatar
Prasad committed
		});
		jQuery('.dropdown-modules-compact').each(function() {
			var element = jQuery(this);
			var heightPer = parseFloat(element.data('height'));
			app.helper.showVerticalScroll(element, {
				setHeight: $(window).height()*heightPer - 3,
				autoExpandScrollbar: true,
				scrollbarPosition: 'outside'
			});
		});
	},

	registerGlobalSearch : function() {
		var thisInstance = this;
		jQuery('.search-link .keyword-input').on('keypress',function(e){
			if(e.which == 13) {

				var element = jQuery(e.currentTarget);
				var searchValue = element.val();
				var data = {};
				data['searchValue'] = searchValue;
				element.trigger(thisInstance._SearchIntiatedEventName,data);
			}
		});
	},

	registerAdvanceSeachIntiator : function () {
		jQuery('#adv-search').on('click',function(e){
			var advanceSearchInstance = new Vtiger_AdvanceSearch_Js();
			advanceSearchInstance.advanceSearchTriggerIntiatorHandler();
//			advanceSearchInstance.initiateSearch().then(function() {
//				advanceSearchInstance.selectBasicSearchValue();
//			});
		});
	},

	/**
	 * Function which will handle the reference auto complete event registrations
	 * @params - container <jQuery> - element in which auto complete fields needs to be searched
	 */
	registerAutoCompleteFields : function(container) {
		var thisInstance = this;
		container.find('input.autoComplete').autocomplete({
			'minLength' : '3',
			'source' : function(request, response){
				//element will be array of dom elements
				//here this refers to auto complete instance
				var inputElement = jQuery(this.element[0]);
				var searchValue = request.term;
				var params = thisInstance.getReferenceSearchParams(inputElement);
Prasad's avatar
Prasad committed
				params.module = app.getModuleName();
				if (jQuery('#QuickCreate').length > 0) {
					params.module = container.find('[name="module"]').val();
				}
				params.search_value = searchValue;
				if(params.search_module && params.search_module!= 'undefined') {
					thisInstance.searchModuleNames(params).then(function(data){
						var reponseDataList = new Array();
						var serverDataFormat = data;
						if(serverDataFormat.length <= 0) {
								jQuery(inputElement).val('');
								serverDataFormat = new Array({
										'label' : 'No Results Found',
										'type'	: 'no results'
								});
						}
						for(var id in serverDataFormat){
								var responseData = serverDataFormat[id];
								reponseDataList.push(responseData);
						}
						response(reponseDataList);
					});
				} else {
					jQuery(inputElement).val('');
					serverDataFormat = new Array({
						'label' : 'No Results Found',
						'type'	: 'no results'
					});
					response(serverDataFormat);
				}
			},
			'select' : function(event, ui ){
				var selectedItemData = ui.item;
				//To stop selection if no results is selected
				if(typeof selectedItemData.type != 'undefined' && selectedItemData.type=="no results"){
						return false;
				}
				var element = jQuery(this);
				var parent = element.closest('td');
				if(parent.length == 0){
					parent = element.closest('.fieldValue');
				}
				var sourceField = parent.find('.sourceField');
				selectedItemData.record = selectedItemData.id;
				selectedItemData.source_module = parent.find('input[name="popupReferenceModule"]').val();
				selectedItemData.selectedName = selectedItemData.label;
				var fieldName = sourceField.attr("name");
				parent.find('input[name="'+fieldName+'"]').val(selectedItemData.id);
				element.attr("value",selectedItemData.id);
				parent.find('.clearReferenceSelection').removeClass('hide');
				parent.find('.referencefield-wrapper').addClass('selected');
				element.attr("disabled","disabled");
				//trigger reference field selection event
				sourceField.trigger(Vtiger_Edit_Js.referenceSelectionEvent,selectedItemData);
				//trigger post reference selection
				sourceField.trigger(Vtiger_Edit_Js.postReferenceSelectionEvent,{'data':selectedItemData});
			}
		});
	},

	/**
	 * Function to register clear reference selection event
	 * @param <jQUery> container
	 */
	registerClearReferenceSelectionEvent : function(container) {
		container.find('.clearReferenceSelection').on('click', function(e){
			e.preventDefault();
			var element = jQuery(e.currentTarget);
			var parentTdElement = element.closest('td');
			if(parentTdElement.length == 0){
				parentTdElement = element.closest('.fieldValue');
			}
			var inputElement = parentTdElement.find('.inputElement');
			var fieldName = parentTdElement.find('.sourceField').attr("name");

			parentTdElement.find('.referencefield-wrapper').removeClass('selected');
			inputElement.removeAttr("disabled").removeAttr('readonly');
			inputElement.attr("value","");
			inputElement.val("");
			parentTdElement.find('input[name="'+fieldName+'"]').val("");
			element.addClass('hide');
			element.trigger(Vtiger_Edit_Js.referenceDeSelectionEvent);
		});
	},

	/**
	 * Function which will register event for create of reference record
	 * This will allow users to create reference record from edit view of other record
	 */
	registerReferenceCreate : function(container) {
		var thisInstance = this;
		container.on('click','.createReferenceRecord', function(e) {
			var element = jQuery(e.currentTarget);
			var controlElementTd = thisInstance.getParentElement(element);
			thisInstance.referenceCreateHandler(controlElementTd);
		});
	},

	/**
	 * Funtion to register popup search event for reference field
	 * @param <jQuery> container
	 */
	referenceModulePopupRegisterEvent : function(container) {
		var thisInstance = this;
Prasad's avatar
Prasad committed
		container.off('click', '.relatedPopup');
		container.on("click",'.relatedPopup',function(e) {
			thisInstance.openPopUp(e);
		});
		container.on('change','.referenceModulesList',function(e){
			var element = jQuery(e.currentTarget);
			var closestTD = thisInstance.getParentElement(element).next();
			var popupReferenceModule = element.val();
			var referenceModuleElement = jQuery('input[name="popupReferenceModule"]', closestTD).length ? 
			jQuery('input[name="popupReferenceModule"]', closestTD) : jQuery('input.popupReferenceModule', closestTD);
			var prevSelectedReferenceModule = referenceModuleElement.val();
			referenceModuleElement.val(popupReferenceModule);

			//If Reference module is changed then we should clear the previous value
			if(prevSelectedReferenceModule != popupReferenceModule) {
					closestTD.find('.clearReferenceSelection').trigger('click');
			}
		});
	},

	/**
	 * Function to open popup list modal
	 */
	openPopUp : function(e) {
		var thisInstance = this;
		var parentElem = thisInstance.getParentElement(jQuery(e.target));

		var params = this.getPopUpParams(parentElem);
		params.view = 'Popup';

		var isMultiple = false;
		if(params.multi_select) {
				isMultiple = true;
		}

		var sourceFieldElement = jQuery('input[class="sourceField"]',parentElem);

		var prePopupOpenEvent = jQuery.Event(Vtiger_Edit_Js.preReferencePopUpOpenEvent);
		sourceFieldElement.trigger(prePopupOpenEvent);

		if(prePopupOpenEvent.isDefaultPrevented()) {
				return ;
		}
		var popupInstance = Vtiger_Popup_Js.getInstance();

		app.event.off(Vtiger_Edit_Js.popupSelectionEvent);
		app.event.one(Vtiger_Edit_Js.popupSelectionEvent,function(e,data) {
			var responseData = JSON.parse(data);
			var dataList = new Array();
Prasad's avatar
Prasad committed
			jQuery.each(responseData, function(key, value){
				var counter = 0;
				for(var valuekey in value){
					if(valuekey == 'name') continue;
					if(typeof valuekey == 'object') continue;
//					var referenceModule = value[valuekey].module;
//					if(typeof referenceModule == "undefined") {
//						referenceModule = value.module;
//					}
//					if(parentElem.find('[name="popupReferenceModule"]').val() != referenceModule) continue;
//					
					var data = {
						'name' : value.name,
						'id' : key
					}
					if(valuekey == 'info') {
						data['name'] = value.name;
					}
					dataList.push(data);
					if(!isMultiple && counter === 0) {
						counter++;
						thisInstance.setReferenceFieldValue(parentElem, data);
					}
				}
			});

			if(isMultiple) {
				sourceFieldElement.trigger(Vtiger_Edit_Js.refrenceMultiSelectionEvent,{'data':dataList});
			}
			sourceFieldElement.trigger(Vtiger_Edit_Js.postReferenceSelectionEvent,{'data':responseData});
		});
		popupInstance.showPopup(params,Vtiger_Edit_Js.popupSelectionEvent,function() {});
	},

Prasad's avatar
Prasad committed
	/**
	 * Functions changes the value of max upload size variable
	 * @param {type} container
	 * @returns {unresolved}
	 */
	getMaxiumFileUploadingSize: function (container) {
		//TODO : get it from the server
		return container.find('.maxUploadSize').data('value');
	},

	/**
	 * Function display file size in kb,mb,gb etc
	 */
	convertFileSizeInToDisplayFormat: function (fileSizeInBytes) {
		var i = -1;
		var byteUnits = [' kB', ' MB', ' GB', ' TB', 'PB', 'EB', 'ZB', 'YB'];
		do {
			fileSizeInBytes = fileSizeInBytes / 1024;
			i++;
		} while (fileSizeInBytes > 1024);

		return Math.max(fileSizeInBytes, 0.1).toFixed(1) + byteUnits[i];

	},