text: /*+**********************************************************************************
   * 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_List_Js('Vtiger_FindDuplicates_Js',{
  
  	massDeleteRecords : function(url) {
  		var listInstance = new Vtiger_FindDuplicates_Js();
          var fields = jQuery('#duplicateSearchFields').val();
          var ignoreEmpty = jQuery('#ignoreEmpty').val();
          url += '&mode=FindDuplicates&fields=' + fields + '&ignoreEmpty=' + ignoreEmpty;
  		Vtiger_List_Js.massDeleteRecords(url,listInstance);
  	}
  },{
  
  	popupWindowInstance : false,
  
  	/**
  	 * Function that is triggered after deleting records
  	 */
  	postMassDeleteRecords : function() {
  		var aDeferred = jQuery.Deferred();
  		var thisInstance = this;
  		var fields = jQuery('#duplicateSearchFields').val();
  		var moduleName = app.getModuleName();
  		var pageNumber = jQuery('#pageNumber').val();
  		var ignoreEmpty = jQuery('#ignoreEmpty').val();
  		var url = 'module='+moduleName+'&view=FindDuplicates&fields='+fields+'&ignoreEmpty='+ignoreEmpty;
  		AppConnector.requestPjax(url+'&page='+pageNumber).then(
  			function(data){
  				jQuery('#listViewContents').html(data);
  				jQuery('#recordsCount').val('');
  				jQuery('#totalPageCount').text('');
                  var selectedIds = new Array();
                  thisInstance.writeSelectedIds(selectedIds);
  				thisInstance.calculatePages().then(function(){
  					thisInstance.updatePagination();
  				});
  				thisInstance.registerMergeRecordEvent(thisInstance.mergeRecordPopupCallback);
  				aDeferred.resolve();
  			}
  		);
  		return aDeferred.promise();
  	},
  
  	/**
  	 * Function registers events for navigation in duplicate search view
  	 */
  	registerPageNavigationEvents : function() {
  		var thisInstance = this;
  		var fields = jQuery('#duplicateSearchFields').val();
  		var moduleName = app.getModuleName();
  		var ignoreEmpty = jQuery('#ignoreEmpty').val();
  		var url = 'module='+moduleName+'&view=FindDuplicates&fields='+fields+'&ignoreEmpty='+ignoreEmpty;
  
  		jQuery('#listViewNextPageButton').on('click',function() {
  			var pageLimit = jQuery('#pageLimit').val();
  			var noOfEntries = jQuery('#noOfEntries').val();
  			if(noOfEntries >= pageLimit) {
  				var pageNumber = jQuery('#pageNumber').val();
  				var nextPageNumber = parseInt(parseFloat(pageNumber)) + 1;
  				AppConnector.requestPjax(url+'&page='+nextPageNumber).then(function(data) {
  					jQuery('#listViewContents').html(data);
  					jQuery('#pageNumber').val(nextPageNumber);
  					jQuery('#pageToJump').val(nextPageNumber);
  					thisInstance.calculatePages().then(function(){
  						thisInstance.updatePagination();
  					});
  					thisInstance.registerMergeRecordEvent(thisInstance.mergeRecordPopupCallback);
  				});
  			}
  		});
  
  		jQuery('#listViewPreviousPageButton').on('click',function() {
  			var pageNumber = jQuery('#pageNumber').val();
  			if(pageNumber > 1) {
  				var previousPageNumber = parseInt(parseFloat(pageNumber)) - 1;
  				jQuery('#pageNumber').val(previousPageNumber);
  				jQuery('#pageToJump').val(previousPageNumber);
  				AppConnector.requestPjax(url+'&page='+previousPageNumber).then(
  					function(data){
  						jQuery('#listViewContents').html(data);
  						thisInstance.calculatePages().then(function(){
  							thisInstance.updatePagination();
  						});
  						thisInstance.registerMergeRecordEvent(thisInstance.mergeRecordPopupCallback);
  					}
  				);
  			}
  		});
  
  		jQuery('#listViewPageJump').on('click', function(e) {
  			jQuery('#pageToJump').validationEngine('hideAll');
  			var element = jQuery('#totalPageCount');
  			var totalPageNumber = element.text();
  			if(totalPageNumber == "") {
  				var totalRecordCount = jQuery('#totalCount').val();
  				if(totalRecordCount != 'undefined') {
  					var recordPerPage = jQuery('#noOfEntries').val();
  					if(recordPerPage == '0') recordPerPage = 1;
  					var totalPages = Math.ceil(totalRecordCount/recordPerPage);
  					if(totalPages == 0){
  						totalPages = 1;
  					}
  					element.text(totalPages);
  					return;
  				}
  				element.progressIndicator({});
  				thisInstance.getPageCount().then(function(data){
  					var pageCount = data['result']['page'];
  					if(pageCount == 0){
  						pageCount = 1;
  					}
  					element.text(pageCount);
  					element.progressIndicator({'mode': 'hide'});
  				});
  			}
  		});
  
  		jQuery('#listViewPageJumpDropDown').on('click','li',function(e) {
  				e.stopImmediatePropagation();
  			}).on('keypress','#pageToJump',function(e) {
  				if(e.which == 13) {
  					e.stopImmediatePropagation();
  					var element = jQuery(e.currentTarget);
  					var response = Vtiger_WholeNumberGreaterThanZero_Validator_Js.invokeValidation(element);
  					if(typeof response != "undefined"){
  						element.validationEngine('showPrompt',response,'',"topLeft",true);
  					} else {
  						element.validationEngine('hideAll');
  						var currentPageElement = jQuery('#pageNumber');
  						var currentPageNumber = currentPageElement.val();
  						var newPageNumber = parseInt(jQuery(e.currentTarget).val());
  						var totalPages = parseInt(jQuery('#totalPageCount').text());
  						if(newPageNumber > totalPages){
  							var error = app.vtranslate('JS_PAGE_NOT_EXIST');
  							element.validationEngine('showPrompt',error,'',"topLeft",true);
  							return;
  						}
  						if(newPageNumber == currentPageNumber){
  							var message = app.vtranslate('JS_YOU_ARE_IN_PAGE_NUMBER')+" "+newPageNumber;
  							var params = {
  								text: message,
  								type: 'info'
  							};
  							Vtiger_Helper_Js.showMessage(params);
  							return;
  						}
  						currentPageElement.val(newPageNumber);
  
  						AppConnector.requestPjax(url+'&page='+newPageNumber).then(
  							function(data){
  								jQuery('#listViewContents').html(data);
  								thisInstance.updatePagination();
  								element.closest('.btn-group').removeClass('open');
  								thisInstance.registerMergeRecordEvent(thisInstance.mergeRecordPopupCallback);
  							}
  						);
  					}
  				return false;
  			}
  		});
  	},
  
  	/**
  	 * Function registers event for merge button
  	 */
  	registerMergeRecordEvent : function(cb) {
  		var thisInstance = this;
  		jQuery('input[name="merge"]').on('click', function(e) {
  			var element = jQuery(e.currentTarget);
  			var groupName = element.data('group');
  			var mergeRecordsCheckBoxes = jQuery('input[name="mergeRecord"]:checked');
  			if(mergeRecordsCheckBoxes.length < 2) {
  				Vtiger_Helper_Js.showMessage({text: app.vtranslate('JS_SELECT_ATLEAST_TWO_RECORD_FOR_MERGING')});
  				return false;
  			} else {
  				var count = 0;
  				var records = [];
  				var stop = false;
  				mergeRecordsCheckBoxes.each(function(key, obj) {
  					var ele = jQuery(obj);
  					if(ele.data('group') != groupName) {
  						Vtiger_Helper_Js.showMessage({text: app.vtranslate('JS_SELECT_RECORDS_TO_MERGE_FROM_SAME_GROUP')});
  						stop = true;
  						return false;
  					}
  					records.push(ele.data('id'));
  					count++;
  				});
  				if(stop) return false;
  				if(count > 3) {
  					Vtiger_Helper_Js.showMessage({text: app.vtranslate('JS_ALLOWED_TO_SELECT_MAX_OF_THREE_RECORDS')});
  					return false;
  				}
  				var popupInstance = Vtiger_Popup_Js.getInstance();
  				var url = 'module='+app.getModuleName()+'&view=MergeRecord&records='+records;
  				thisInstance.popupWindowInstance = popupInstance.show(url, '', '', '', function(params){
  					thisInstance.mergeRecordPopupCallback();
  				});
  			}
  		});
  	},
  
  	/**
  	 * Callback function after the merge popup appears
  	 */
  	mergeRecordPopupCallback : function() {
  		var thisInstance = this;
  		var win = thisInstance.popupWindowInstance;
  		var form = win.document.forms['massMerge'];
  		jQuery(form.primaryRecord).on('change', function(event) {
  			var id = jQuery(event.currentTarget).val();
  			jQuery(form).find('[data-id='+id+']').attr('checked', true);
  		});
  
  		jQuery(form).on('submit', function(e){
  			e.preventDefault();
  			var params = jQuery(form).serialize();
  			AppConnector.request(params).then(function(data){
  				win.close();
  				thisInstance.postMassDeleteRecords();
  			});
  		});
  	},
  
  	/**
  	 * Function registers various events for duplicate search
  	 */
  	registerEvents : function() {
  		var thisInstance = this;
  		thisInstance.registerMergeRecordEvent(thisInstance.mergeRecordPopupCallback);
  		thisInstance.registerMainCheckBoxClickEvent();
  		thisInstance.registerPageNavigationEvents();
  		thisInstance.registerCheckBoxClickEvent();
  		thisInstance.registerSelectAllClickEvent();
  		thisInstance.registerDeselectAllClickEvent();
  		thisInstance.registerEventForTotalRecordsCount();
  	},
  
  	/**
  	 * Function returns current view name for the module
  	 */
  	getCurrentCvId : function(){
  		return jQuery('#viewName').val();
  	},
  
  	/**
  	 * Function gets the record count
  	 */
  	getRecordsCount : function(){
  		var aDeferred = jQuery.Deferred();
  		var recordCountVal = jQuery("#recordsCount").val();
  		if(recordCountVal != ''){
  			aDeferred.resolve(recordCountVal);
  		} else {
  			var count = '';
  			var module = app.getModuleName();
  			var parent = app.getParentModuleName();
  			var fields = jQuery('#duplicateSearchFields').val();
  			var ignoreEmpty = jQuery('#ignoreEmpty').val();
  			var postData = {
  				"module": module, "parent": parent,
  				"view": "FindDuplicatesAjax", "mode": "getRecordsCount",
  				"fields": fields, "ignoreEmpty":ignoreEmpty
  			}
  			AppConnector.request(postData).then(
  				function(data) {
  					var response = JSON.parse(data);
  					jQuery("#recordsCount").val(response['result']['count']);
  					count =  response['result']['count'];
  					aDeferred.resolve(count);
  				},
  				function(error,err){
  				}
  			);
  		}
  		return aDeferred.promise();
  	}
  });