[ Index ]

PHP Cross Reference of vtigercrm-6.1.0

title

Body

[close]

/layouts/vlayout/modules/Vtiger/resources/ -> Detail.js (source)

   1  /*+***********************************************************************************
   2   * The contents of this file are subject to the vtiger CRM Public License Version 1.0
   3   * ("License"); You may not use this file except in compliance with the License
   4   * The Original Code is:  vtiger CRM Open Source
   5   * The Initial Developer of the Original Code is vtiger.
   6   * Portions created by vtiger are Copyright (C) vtiger.
   7   * All Rights Reserved.
   8   *************************************************************************************/
   9  
  10  jQuery.Class("Vtiger_Detail_Js",{
  11  
  12      detailInstance : false,
  13  
  14      getInstance: function(){
  15          if( Vtiger_Detail_Js.detailInstance == false ){
  16              var module = app.getModuleName();
  17              var view = app.getViewName();
  18              var moduleClassName = module+"_"+view+"_Js";
  19              var fallbackClassName = Vtiger_Detail_Js;
  20              if(typeof window[moduleClassName] != 'undefined'){
  21                  var instance = new window[moduleClassName]();
  22              }else{
  23                  var instance = new fallbackClassName();
  24              }
  25              Vtiger_Detail_Js.detailInstance = instance;
  26          }
  27          return Vtiger_Detail_Js.detailInstance;
  28      },
  29  
  30  
  31  
  32      /*
  33       * function to trigger send Email
  34       * @params: send email url , module name.
  35       */
  36      triggerSendEmail : function(detailActionUrl, module){
  37          Vtiger_Helper_Js.checkServerConfig(module).then(function(data){
  38              if(data == true){
  39                  var currentInstance = Vtiger_Detail_Js.getInstance();
  40                  var parentRecord = new Array();
  41                  var params = {};
  42                  parentRecord.push(currentInstance.getRecordId());
  43                  params['module'] = app.getModuleName();
  44                  params['view'] = "MassActionAjax";
  45                  params['selected_ids'] = parentRecord;
  46                  params['mode'] = "showComposeEmailForm";
  47                  params['step'] = "step1";
  48                  params['relatedLoad'] = true;
  49                  Vtiger_Index_Js.showComposeEmailPopup(params);
  50              } else {
  51                  alert(app.vtranslate('JS_EMAIL_SERVER_CONFIGURATION'));
  52              }
  53          });
  54      },
  55  
  56      /*
  57       * function to trigger Detail view actions
  58       * @params: Action url , callback function.
  59       */
  60      triggerDetailViewAction : function(detailActionUrl, callBackFunction){
  61          var detailInstance = Vtiger_Detail_Js.getInstance();
  62          var selectedIds = new Array();
  63          selectedIds.push(detailInstance.getRecordId());
  64          var postData = {
  65             "selected_ids": JSON.stringify(selectedIds)
  66          };
  67          var actionParams = {
  68              "type":"POST",
  69              "url":detailActionUrl,
  70              "dataType":"html",
  71              "data" : postData
  72          };
  73  
  74          AppConnector.request(actionParams).then(
  75              function(data) {
  76                  if(data) {
  77                      app.showModalWindow(data,{'text-align' : 'left'});
  78                      if(typeof callBackFunction == 'function'){
  79                          callBackFunction(data);
  80                      }
  81                  }
  82              },
  83              function(error,err){
  84  
  85              }
  86          );
  87      },
  88  
  89      /*
  90       * function to trigger send Sms
  91       * @params: send sms url , module name.
  92       */
  93      triggerSendSms : function(detailActionUrl, module) {
  94          Vtiger_Helper_Js.checkServerConfig(module).then(function(data){
  95              if(data == true){
  96                  Vtiger_Detail_Js.triggerDetailViewAction(detailActionUrl);
  97              } else {
  98                  alert(app.vtranslate('JS_SMS_SERVER_CONFIGURATION'));
  99              }
 100          });
 101      },
 102      
 103      triggerTransferOwnership : function(massActionUrl){
 104          var thisInstance = this;
 105          thisInstance.getRelatedModulesContainer = false;
 106          var actionParams = {
 107              "type":"POST",
 108              "url":massActionUrl,
 109              "dataType":"html",
 110              "data" : {}
 111          };
 112          AppConnector.request(actionParams).then(
 113              function(data) {
 114                  if(data) {
 115                      var callback = function(data) {
 116                          var params = app.validationEngineOptions;
 117                          params.onValidationComplete = function(form, valid){
 118                              if(valid){
 119                                  thisInstance.transferOwnershipSave(form)
 120                              }
 121                              return false;
 122                          }
 123                          jQuery('#changeOwner').validationEngine(app.validationEngineOptions);
 124                      }
 125                      app.showModalWindow(data, function(data){
 126                          var selectElement = thisInstance.getRelatedModuleContainer();
 127                          app.changeSelectElementView(selectElement, 'select2');
 128                          if(typeof callback == 'function'){
 129                              callback(data);
 130                          }
 131                      });
 132                  }
 133              }
 134          );
 135      },
 136      
 137      transferOwnershipSave : function (form){
 138          var thisInstance = this;
 139          var transferOwner = jQuery('#transferOwnerId').val();
 140          var relatedModules = jQuery('#related_modules').val();
 141          var recordId = jQuery('#recordId').val();
 142          var params = {
 143              'module': app.getModuleName(),
 144              'action' : 'TransferOwnership',
 145              'record':recordId,
 146              'transferOwnerId' : transferOwner,
 147              'related_modules' : relatedModules
 148          }
 149          AppConnector.request(params).then(
 150              function(data) {
 151                  if(data.success){
 152                      app.hideModalWindow();
 153                      var params = {
 154                          title : app.vtranslate('JS_MESSAGE'),
 155                          text: app.vtranslate('JS_RECORDS_TRANSFERRED_SUCCESSFULLY'),
 156                          animation: 'show',
 157                          type: 'info'
 158                      };
 159                      Vtiger_Helper_Js.showPnotify(params);
 160                  }
 161              }
 162          );
 163      },
 164      
 165      /*
 166       * Function to get the related module container 
 167       */
 168      getRelatedModuleContainer  : function(){
 169          if(this.getRelatedModulesContainer == false){
 170              this.getRelatedModulesContainer = jQuery('#related_modules'); 
 171          }
 172          return this.getRelatedModulesContainer;
 173      },
 174  
 175      /*
 176       * function to trigger delete record action
 177       * @params: delete record url.
 178       */
 179      deleteRecord : function(deleteRecordActionUrl) {
 180          var message = app.vtranslate('LBL_DELETE_CONFIRMATION');
 181          Vtiger_Helper_Js.showConfirmationBox({'message' : message}).then(function(data) {
 182                  AppConnector.request(deleteRecordActionUrl+'&ajaxDelete=true').then(
 183                  function(data){
 184                      if(data.success == true){
 185                          window.location.href = data.result;
 186                      }else{
 187                          Vtiger_Helper_Js.showPnotify(data.error.message);
 188                      }
 189                  });
 190              },
 191              function(error, err){
 192              }
 193          );
 194      },
 195  
 196      reloadRelatedList : function(){
 197          var pageNumber = jQuery('[name="currentPageNum"]').val();
 198          var detailInstance = Vtiger_Detail_Js.getInstance();
 199          detailInstance.loadRelatedList(pageNumber);
 200      }
 201  
 202  },{
 203          targetPicklistChange : false,  
 204       targetPicklist : false,
 205      detailViewContentHolder : false,
 206      detailViewForm : false,
 207          detailViewDetailsTabLabel : 'LBL_RECORD_DETAILS',
 208      detailViewSummaryTabLabel : 'LBL_RECORD_SUMMARY',
 209      detailViewRecentCommentsTabLabel : 'ModComments',
 210      detailViewRecentActivitiesTabLabel : 'Activities',
 211      detailViewRecentUpdatesTabLabel : 'LBL_UPDATES',
 212      detailViewRecentDocumentsTabLabel : 'Documents',
 213  
 214      fieldUpdatedEvent : 'Vtiger.Field.Updated',
 215      widgetPostLoad : 'Vtiger.Widget.PostLoad',
 216  
 217      //Filels list on updation of which we need to upate the detailview header
 218      updatedFields : ['company','designation','title'],
 219      //Event that will triggered before saving the ajax edit of fields
 220      fieldPreSave : 'Vtiger.Field.PreSave',
 221  
 222      referenceFieldNames : {
 223          'Accounts' : 'parent_id',
 224          'Contacts' : 'contact_id',
 225          'Leads' : 'parent_id',
 226          'Potentials' : 'parent_id',
 227          'HelpDesk' : 'parent_id'
 228      },
 229  
 230      //constructor
 231      init : function() {
 232  
 233      },
 234  
 235      getDeleteMessageKey : function() {
 236          return 'LBL_DELETE_CONFIRMATION';
 237      },
 238  
 239      loadWidgets : function(){
 240          var thisInstance = this;
 241          var widgetList = jQuery('[class^="widgetContainer_"]');
 242          widgetList.each(function(index,widgetContainerELement){
 243              var widgetContainer = jQuery(widgetContainerELement);
 244              thisInstance.loadWidget(widgetContainer);
 245          });
 246      },
 247  
 248      loadWidget : function(widgetContainer) {
 249          var thisInstance = this;
 250          var aDeferred = jQuery.Deferred();
 251          var contentHeader = jQuery('.widget_header',widgetContainer);
 252          var contentContainer = jQuery('.widget_contents',widgetContainer);
 253          var urlParams = widgetContainer.data('url');
 254          var relatedModuleName = contentHeader.find('[name="relatedModule"]').val();
 255  
 256          var params = {
 257              'type' : 'GET',
 258              'dataType': 'html',
 259              'data' : urlParams
 260          };
 261          contentContainer.progressIndicator({});
 262          AppConnector.request(params).then(
 263              function(data){
 264                  contentContainer.progressIndicator({'mode': 'hide'});
 265                  contentContainer.html(data);
 266                  app.registerEventForTextAreaFields(jQuery(".commentcontent"))
 267                  contentContainer.trigger(thisInstance.widgetPostLoad,{'widgetName' : relatedModuleName})
 268                  aDeferred.resolve(params);
 269              },
 270              function(){
 271                  aDeferred.reject();
 272              }
 273          );
 274          return aDeferred.promise();
 275      },
 276  
 277      /**
 278       * Function to load only Comments Widget.
 279       */
 280      //TODO improve this API.
 281      loadCommentsWidget : function() {
 282  
 283      },
 284  
 285      loadContents : function(url,data) {
 286          var thisInstance = this;
 287          var aDeferred = jQuery.Deferred();
 288  
 289          var detailContentsHolder = this.getContentHolder();
 290          var params = url;
 291          if(typeof data != 'undefined'){
 292              params = {};
 293              params.url = url;
 294              params.data = data;
 295          }
 296          AppConnector.requestPjax(params).then(
 297              function(responseData){
 298                  detailContentsHolder.html(responseData);
 299                  responseData = detailContentsHolder.html();
 300                  //thisInstance.triggerDisplayTypeEvent();
 301                  thisInstance.registerBlockStatusCheckOnLoad();
 302                  //Make select box more usability
 303                  app.changeSelectElementView(detailContentsHolder);
 304                  //Attach date picker event to date fields
 305                  app.registerEventForDatePickerFields(detailContentsHolder);
 306                  app.registerEventForTextAreaFields(jQuery(".commentcontent"));
 307                  jQuery('.commentcontent').autosize();
 308                  thisInstance.getForm().validationEngine();
 309                  aDeferred.resolve(responseData);
 310              },
 311              function(){
 312  
 313              }
 314          );
 315  
 316          return aDeferred.promise();
 317      },
 318  
 319      getUpdatefFieldsArray : function(){
 320          return this.updatedFields;
 321      },
 322  
 323      /**
 324       * Function to return related tab.
 325       * @return : jQuery Object.
 326       */
 327      getTabByLabel : function(tabLabel) {
 328          var tabs = this.getTabs();
 329          var targetTab = false;
 330          tabs.each(function(index,element){
 331              var tab = jQuery(element);
 332              var labelKey = tab.data('labelKey');
 333              if(labelKey == tabLabel){
 334                  targetTab = tab;
 335                  return false;
 336              }
 337          });
 338          return targetTab;
 339      },
 340  
 341      selectModuleTab : function(){
 342          var relatedTabContainer = this.getTabContainer();
 343          var moduleTab = relatedTabContainer.find('li.module-tab');
 344          this.deSelectAllrelatedTabs();
 345          this.markTabAsSelected(moduleTab);
 346      },
 347  
 348      deSelectAllrelatedTabs : function() {
 349          var relatedTabContainer = this.getTabContainer();
 350          this.getTabs().removeClass('active');
 351      },
 352  
 353      markTabAsSelected : function(tabElement){
 354          tabElement.addClass('active');
 355      },
 356  
 357      getSelectedTab : function() {
 358          var tabContainer = this.getTabContainer();
 359          return tabContainer.find('li.active');
 360      },
 361  
 362      getTabContainer : function(){
 363          return jQuery('div.related');
 364      },
 365  
 366      getTabs : function() {
 367          return this.getTabContainer().find('li');
 368      },
 369  
 370      getContentHolder : function() {
 371          if(this.detailViewContentHolder == false) {
 372              this.detailViewContentHolder = jQuery('div.details div.contents');
 373          }
 374          return this.detailViewContentHolder;
 375      },
 376  
 377      /**
 378       * Function which will give the detail view form
 379       * @return : jQuery element
 380       */
 381      getForm : function() {
 382          if(this.detailViewForm == false) {
 383              this.detailViewForm = jQuery('#detailView');
 384          }
 385          return this.detailViewForm;
 386      },
 387  
 388      getRecordId : function(){
 389          return jQuery('#recordId').val();
 390      },
 391  
 392      getRelatedModuleName : function() {
 393          return jQuery('.relatedModuleName',this.getContentHolder()).val();
 394      },
 395  
 396  
 397      saveFieldValues : function (fieldDetailList) {
 398          var aDeferred = jQuery.Deferred();
 399  
 400          var recordId = this.getRecordId();
 401  
 402          var data = {};
 403          if(typeof fieldDetailList != 'undefined'){
 404              data = fieldDetailList;
 405          }
 406  
 407          data['record'] = recordId;
 408  
 409          data['module'] = app.getModuleName();
 410          data['action'] = 'SaveAjax';
 411  
 412          AppConnector.request(data).then(
 413              function(reponseData){
 414                  aDeferred.resolve(reponseData);
 415              }
 416          );
 417  
 418          return aDeferred.promise();
 419      },
 420  
 421  
 422      getRelatedListCurrentPageNum : function() {
 423          return jQuery('input[name="currentPageNum"]',this.getContentHolder()).val();
 424      },
 425  
 426      /**
 427       * function to remove comment block if its exists.
 428       */
 429      removeCommentBlockIfExists : function() {
 430          var detailContentsHolder = this.getContentHolder();
 431          var Commentswidget = jQuery('.commentsBody',detailContentsHolder);
 432          jQuery('.addCommentBlock',Commentswidget).remove();
 433      },
 434  
 435      /**
 436       * function to get the Comment thread for the given parent.
 437       * params: Url to get the Comment thread
 438       */
 439      getCommentThread : function(url) {
 440          var aDeferred = jQuery.Deferred();
 441          AppConnector.request(url).then(
 442              function(data) {
 443                  aDeferred.resolve(data);
 444              },
 445              function(error,err){
 446  
 447              }
 448          )
 449          return aDeferred.promise();
 450      },
 451  
 452      /**
 453       * function to save comment
 454       * return json response
 455       */
 456      saveComment : function(e) {
 457          var thisInstance = this;
 458          var aDeferred = jQuery.Deferred();
 459          var currentTarget = jQuery(e.currentTarget);
 460          var commentMode = currentTarget.data('mode');
 461          var closestCommentBlock = currentTarget.closest('.addCommentBlock');
 462          var commentContent = closestCommentBlock.find('.commentcontent');
 463          var commentContentValue = commentContent.val();
 464          var errorMsg;
 465          if(commentContentValue == ""){
 466              errorMsg = app.vtranslate('JS_LBL_COMMENT_VALUE_CANT_BE_EMPTY')
 467              commentContent.validationEngine('showPrompt', errorMsg , 'error','bottomLeft',true);
 468              aDeferred.reject();
 469              return aDeferred.promise();
 470          }
 471          if(commentMode == "edit"){
 472              var editCommentReason = closestCommentBlock.find('[name="reasonToEdit"]').val();
 473          }
 474  
 475          var progressIndicatorElement = jQuery.progressIndicator({});
 476          var element = jQuery(e.currentTarget);
 477          element.attr('disabled', 'disabled');
 478  
 479          var commentInfoHeader = closestCommentBlock.closest('.commentDetails').find('.commentInfoHeader');
 480          var commentId = commentInfoHeader.data('commentid');
 481          var parentCommentId = commentInfoHeader.data('parentcommentid');
 482          var postData = {
 483              'commentcontent' :     commentContentValue,
 484              'related_to': thisInstance.getRecordId(),
 485              'module' : 'ModComments'
 486          }
 487  
 488          if(commentMode == "edit"){
 489              postData['record'] = commentId;
 490              postData['reasontoedit'] = editCommentReason;
 491              postData['parent_comments'] = parentCommentId;
 492              postData['mode'] = 'edit';
 493              postData['action'] = 'Save';
 494          } else if(commentMode == "add"){
 495              postData['parent_comments'] = commentId;
 496              postData['action'] = 'SaveAjax';
 497          }
 498          AppConnector.request(postData).then(
 499              function(data){
 500                  progressIndicatorElement.progressIndicator({'mode':'hide'});
 501                  aDeferred.resolve(data);
 502              },
 503              function(textStatus, errorThrown){
 504                  progressIndicatorElement.progressIndicator({'mode':'hide'});
 505                  element.removeAttr('disabled');
 506                  aDeferred.reject(textStatus, errorThrown);
 507              }
 508          );
 509  
 510          return aDeferred.promise();
 511      },
 512  
 513      /**
 514       * function to return the UI of the comment.
 515       * return html
 516       */
 517      getCommentUI : function(commentId){
 518          var aDeferred = jQuery.Deferred();
 519          var postData = {
 520              'view' : 'DetailAjax',
 521              'module' : 'ModComments',
 522              'record' : commentId
 523          }
 524          AppConnector.request(postData).then(
 525              function(data){
 526                  aDeferred.resolve(data);
 527              },
 528              function(error,err){
 529  
 530              }
 531          );
 532          return aDeferred.promise();
 533      },
 534  
 535      /**
 536       * function to return cloned add comment block
 537       * return jQuery Obj.
 538       */
 539      getCommentBlock : function(){
 540          var detailContentsHolder = this.getContentHolder();
 541          var clonedCommentBlock = jQuery('.basicAddCommentBlock',detailContentsHolder).clone(true,true).removeClass('basicAddCommentBlock hide').addClass('addCommentBlock');
 542          clonedCommentBlock.find('.commentcontenthidden').removeClass('commentcontenthidden').addClass('commentcontent');
 543          return clonedCommentBlock;
 544      },
 545  
 546      /**
 547       * function to return cloned edit comment block
 548       * return jQuery Obj.
 549       */
 550      getEditCommentBlock : function(){
 551          var detailContentsHolder = this.getContentHolder();
 552          var clonedCommentBlock = jQuery('.basicEditCommentBlock',detailContentsHolder).clone(true,true).removeClass('basicEditCommentBlock hide').addClass('addCommentBlock');
 553          clonedCommentBlock.find('.commentcontenthidden').removeClass('commentcontenthidden').addClass('commentcontent');
 554          return clonedCommentBlock;
 555      },
 556  
 557      /*
 558       * Function to register the submit event for Send Sms
 559       */
 560      registerSendSmsSubmitEvent : function(){
 561          var thisInstance = this;
 562          jQuery('body').on('submit','#massSave',function(e){
 563              var form = jQuery(e.currentTarget);
 564              var smsTextLength = form.find('#message').val().length;        
 565              if(smsTextLength > 160) {
 566                  var params = {
 567                      title : app.vtranslate('JS_MESSAGE'),
 568                      text: app.vtranslate('LBL_SMS_MAX_CHARACTERS_ALLOWED'),
 569                      animation: 'show',
 570                      type: 'error'
 571                  };
 572                  Vtiger_Helper_Js.showPnotify(params);
 573                  return false;
 574              }
 575              var submitButton = form.find(':submit');
 576              submitButton.attr('disabled','disabled');
 577              thisInstance.SendSmsSave(form);
 578              e.preventDefault();
 579          });
 580      },
 581  
 582      /*
 583       * Function to Save and sending the Sms and hide the modal window of send sms
 584       */
 585      SendSmsSave : function(form){        
 586          var progressInstance = jQuery.progressIndicator({
 587              'position' : 'html',
 588              'blockInfo' : {
 589                  'enabled' : true
 590              }
 591          });
 592          var SendSmsUrl = form.serializeFormData();
 593          AppConnector.request(SendSmsUrl).then(
 594              function(data) {
 595                  app.hideModalWindow();
 596                  progressInstance.progressIndicator({
 597                      'mode' : 'hide'
 598                  });
 599              },
 600              function(error,err){
 601  
 602              }
 603          );
 604      },
 605  
 606      /**
 607       * Function which will register events to update the record name in the detail view when any of
 608       * the name field is changed
 609       */
 610      registerNameAjaxEditEvent : function() {
 611          var thisInstance = this;
 612          var detailContentsHolder = thisInstance.getContentHolder();
 613          detailContentsHolder.on(thisInstance.fieldUpdatedEvent, '.nameField', function(e, params){
 614              var form = thisInstance.getForm();
 615              var nameFields = form.data('nameFields');
 616              var recordLabel = '';
 617              for(var index in nameFields) {
 618                  if(index != 0) {
 619                      recordLabel += ' '
 620                  }
 621  
 622                  var nameFieldName = nameFields[index];
 623                  recordLabel += form.find('[name="'+nameFieldName+'"]').val();
 624              }
 625              var recordLabelElement = detailContentsHolder.closest('.contentsDiv').find('.recordLabel');
 626              recordLabelElement.text(recordLabel);
 627          });
 628      },
 629  
 630      updateHeaderNameFields : function(){
 631          var thisInstance = this;
 632          var detailContentsHolder = thisInstance.getContentHolder();
 633          var form = thisInstance.getForm();
 634          var nameFields = form.data('nameFields');
 635          var recordLabelElement = detailContentsHolder.closest('.contentsDiv').find('.recordLabel');
 636          var title = '';
 637          for(var index in nameFields) {
 638              var nameFieldName = nameFields[index];
 639              var nameField = form.find('[name="'+nameFieldName+'"]');
 640              if(nameField.length > 0){
 641                  var recordLabel = nameField.val();
 642                  title += recordLabel+" ";
 643                  recordLabelElement.find('[class="'+nameFieldName+'"]').text(recordLabel);
 644              }
 645          }
 646          var salutatioField = recordLabelElement.find('.salutation');
 647          if(salutatioField.length > 0){
 648              var salutatioValue = salutatioField.text();
 649              title = salutatioValue+title;
 650          }
 651          recordLabelElement.attr('title',title);
 652      },
 653  
 654      registerAjaxEditEvent : function(){
 655          var thisInstance = this;
 656          var detailContentsHolder =  thisInstance.getContentHolder();
 657          detailContentsHolder.on(thisInstance.fieldUpdatedEvent,'input,select,textarea',function(e){
 658              thisInstance.updateHeaderValues(jQuery(e.currentTarget));
 659          });
 660      },
 661  
 662      updateHeaderValues : function(currentElement){
 663          var thisInstance = this;
 664          if( currentElement.hasClass('nameField')){
 665              thisInstance.updateHeaderNameFields();
 666              return true;
 667          }
 668  
 669          var name = currentElement.attr('name');
 670          var updatedFields = this.getUpdatefFieldsArray();
 671          var detailContentsHolder =  thisInstance.getContentHolder();
 672          if(jQuery.inArray(name,updatedFields) != '-1'){
 673              var recordLabel = currentElement.val();
 674              var recordLabelElement = detailContentsHolder.closest('.contentsDiv').find('.'+name+'_label');
 675              recordLabelElement.text(recordLabel);
 676          }
 677      },
 678  
 679      /*
 680       * Function to register the click event of email field
 681       */
 682      registerEmailFieldClickEvent : function(){
 683          var detailContentsHolder = this.getContentHolder();
 684          detailContentsHolder.on('click','.emailField',function(e){
 685              e.stopPropagation();
 686          })
 687      },
 688  
 689      /*
 690       * Function to register the click event of phone field
 691       */
 692      registerPhoneFieldClickEvent : function(){
 693          var detailContentsHolder = this.getContentHolder();
 694                  detailContentsHolder.on('click','.phoneField',function(e){
 695              e.stopPropagation();
 696          })
 697      },
 698  
 699      /*
 700       * Function to register the click event of url field
 701       */
 702      registerUrlFieldClickEvent : function(){
 703          var detailContentsHolder = this.getContentHolder();
 704          detailContentsHolder.on('click','.urlField',function(e){
 705              e.stopPropagation();
 706          })
 707      },
 708  
 709      /**
 710       * Function to register event for related list row click
 711       */
 712      registerRelatedRowClickEvent: function(){
 713          var detailContentsHolder = this.getContentHolder();
 714          detailContentsHolder.on('click','.listViewEntries',function(e){
 715              var targetElement = jQuery(e.target, jQuery(e.currentTarget));
 716              if(targetElement.is('td:first-child') && (targetElement.children('input[type="checkbox"]').length > 0)) return;
 717              if(jQuery(e.target).is('input[type="checkbox"]')) return;
 718              var elem = jQuery(e.currentTarget);
 719              var recordUrl = elem.data('recordurl');
 720              if(typeof recordUrl != "undefined"){
 721                  window.location.href = recordUrl;
 722              }
 723          });
 724  
 725      },
 726  
 727      loadRelatedList : function(pageNumber){
 728          var relatedListInstance = new Vtiger_RelatedList_Js(this.getRecordId(), app.getModuleName(), this.getSelectedTab(), this.getRelatedModuleName());
 729          var params = {'page':pageNumber};
 730          relatedListInstance.loadRelatedList(params);
 731      },
 732  
 733      registerEventForRelatedListPagination : function(){
 734          var thisInstance = this;
 735          var detailContentsHolder = this.getContentHolder();
 736          detailContentsHolder.on('click','#relatedListNextPageButton',function(e){
 737              var element = jQuery(e.currentTarget);
 738              if(element.attr('disabled') == "disabled"){
 739                  return;
 740              }
 741              var selectedTabElement = thisInstance.getSelectedTab();
 742              var relatedModuleName = thisInstance.getRelatedModuleName();
 743              var relatedController = new Vtiger_RelatedList_Js(thisInstance.getRecordId(), app.getModuleName(), selectedTabElement, relatedModuleName);
 744              relatedController.nextPageHandler();
 745          });
 746          detailContentsHolder.on('click','#relatedListPreviousPageButton',function(){
 747              var selectedTabElement = thisInstance.getSelectedTab();
 748              var relatedModuleName = thisInstance.getRelatedModuleName();
 749              var relatedController = new Vtiger_RelatedList_Js(thisInstance.getRecordId(), app.getModuleName(), selectedTabElement, relatedModuleName);
 750              relatedController.previousPageHandler();
 751          });
 752          detailContentsHolder.on('click','#relatedListPageJump',function(e){
 753              var selectedTabElement = thisInstance.getSelectedTab();
 754              var relatedModuleName = thisInstance.getRelatedModuleName();
 755              var relatedController = new Vtiger_RelatedList_Js(thisInstance.getRecordId(), app.getModuleName(), selectedTabElement, relatedModuleName);
 756              relatedController.getRelatedPageCount();
 757          });
 758          detailContentsHolder.on('click','#relatedListPageJumpDropDown > li',function(e){
 759              e.stopImmediatePropagation();
 760          }).on('keypress','#pageToJump',function(e){
 761              var selectedTabElement = thisInstance.getSelectedTab();
 762              var relatedModuleName = thisInstance.getRelatedModuleName();
 763              var relatedController = new Vtiger_RelatedList_Js(thisInstance.getRecordId(), app.getModuleName(), selectedTabElement, relatedModuleName);
 764              relatedController.pageJumpHandler(e);
 765          });
 766      },
 767  
 768      /**
 769       * Function to register Event for Sorting
 770       */
 771      registerEventForRelatedList : function(){
 772          var thisInstance = this;
 773          var detailContentsHolder = this.getContentHolder();
 774          detailContentsHolder.on('click','.relatedListHeaderValues',function(e){
 775              var element = jQuery(e.currentTarget);
 776              var selectedTabElement = thisInstance.getSelectedTab();
 777              var relatedModuleName = thisInstance.getRelatedModuleName();
 778              var relatedController = new Vtiger_RelatedList_Js(thisInstance.getRecordId(), app.getModuleName(), selectedTabElement, relatedModuleName);
 779              relatedController.sortHandler(element);
 780          });
 781          
 782          detailContentsHolder.on('click', 'button.selectRelation', function(e){
 783              var selectedTabElement = thisInstance.getSelectedTab();
 784              var relatedModuleName = thisInstance.getRelatedModuleName();
 785              var relatedController = new Vtiger_RelatedList_Js(thisInstance.getRecordId(), app.getModuleName(), selectedTabElement, relatedModuleName);
 786              relatedController.showSelectRelationPopup().then(function(data){
 787                  var emailEnabledModule = jQuery(data).find('[name="emailEnabledModules"]').val();
 788                  if(emailEnabledModule){
 789                      thisInstance.registerEventToEditRelatedStatus();
 790                  }
 791              });
 792          });
 793  
 794          detailContentsHolder.on('click', 'a.relationDelete', function(e){
 795              e.stopImmediatePropagation();
 796              var element = jQuery(e.currentTarget);
 797              var instance = Vtiger_Detail_Js.getInstance();
 798              var key = instance.getDeleteMessageKey();
 799              var message = app.vtranslate(key);
 800              Vtiger_Helper_Js.showConfirmationBox({'message' : message}).then(
 801                  function(e) {
 802                      var row = element.closest('tr');
 803                      var relatedRecordid = row.data('id');
 804                      var selectedTabElement = thisInstance.getSelectedTab();
 805                      var relatedModuleName = thisInstance.getRelatedModuleName();
 806                      var relatedController = new Vtiger_RelatedList_Js(thisInstance.getRecordId(), app.getModuleName(), selectedTabElement, relatedModuleName);
 807                      relatedController.deleteRelation([relatedRecordid]).then(function(response){
 808                          relatedController.loadRelatedList();
 809                      });
 810                  },
 811                  function(error, err){
 812                  }
 813              );
 814          });
 815      },
 816  
 817      registerBlockAnimationEvent : function(){
 818          var detailContentsHolder = this.getContentHolder();
 819          detailContentsHolder.on('click','.blockToggle',function(e){
 820              var currentTarget =  jQuery(e.currentTarget);
 821              var blockId = currentTarget.data('id');
 822              var closestBlock = currentTarget.closest('.detailview-table');
 823              var bodyContents = closestBlock.find('tbody');
 824              var data = currentTarget.data();
 825              var module = app.getModuleName();
 826              var hideHandler = function() {
 827                  bodyContents.hide('slow');
 828                  app.cacheSet(module+'.'+blockId, 0)
 829              }
 830              var showHandler = function() {
 831                  bodyContents.show();
 832                  app.cacheSet(module+'.'+blockId, 1)
 833              }
 834              var data = currentTarget.data();
 835              if(data.mode == 'show'){
 836                  hideHandler();
 837                  currentTarget.hide();
 838                  closestBlock.find("[data-mode='hide']").show();
 839              }else{
 840                  showHandler();
 841                  currentTarget.hide();
 842                  closestBlock.find("[data-mode='show']").show();
 843              }
 844          });
 845  
 846      },
 847  
 848      registerBlockStatusCheckOnLoad : function(){
 849          var blocks = this.getContentHolder().find('.detailview-table');
 850          var module = app.getModuleName();
 851          blocks.each(function(index,block){
 852              var currentBlock = jQuery(block);
 853              var headerAnimationElement = currentBlock.find('.blockToggle').not('.hide');
 854              var bodyContents = currentBlock.find('tbody')
 855              var blockId = headerAnimationElement.data('id');
 856              var cacheKey = module+'.'+blockId;
 857              var value = app.cacheGet(cacheKey, null);
 858              if(value != null){
 859                  if(value == 1){
 860                      headerAnimationElement.hide();
 861                      currentBlock.find("[data-mode='show']").show();
 862                      bodyContents.show();
 863                  } else {
 864                      headerAnimationElement.hide();
 865                      currentBlock.find("[data-mode='hide']").show();
 866                      bodyContents.hide();
 867                  }
 868              }
 869          });
 870      },
 871  
 872      /**
 873       * Function to register event for adding related record for module
 874       */
 875      registerEventForAddingRelatedRecord : function(){
 876          var thisInstance = this;
 877          var detailContentsHolder = this.getContentHolder();
 878          detailContentsHolder.on('click','[name="addButton"]',function(e){
 879              var element = jQuery(e.currentTarget);
 880              var selectedTabElement = thisInstance.getSelectedTab();
 881              var relatedModuleName = thisInstance.getRelatedModuleName();
 882              var quickCreateNode = jQuery('#quickCreateModules').find('[data-name="'+ relatedModuleName +'"]');
 883              if(quickCreateNode.length <= 0) {
 884                  window.location.href = element.data('url');
 885                  return;
 886              }
 887  
 888              var relatedController = new Vtiger_RelatedList_Js(thisInstance.getRecordId(), app.getModuleName(), selectedTabElement, relatedModuleName);
 889              relatedController.addRelatedRecord(element);
 890          })
 891      },
 892  
 893  
 894      /**
 895       * Function to handle the ajax edit for detailview and summary view fields
 896       * which will expects the currentTdElement
 897       */
 898      ajaxEditHandling : function(currentTdElement) {
 899              var thisInstance = this;
 900              var detailViewValue = jQuery('.value',currentTdElement);
 901              var editElement = jQuery('.edit',currentTdElement);
 902              var actionElement = jQuery('.summaryViewEdit', currentTdElement);
 903              var fieldnameElement = jQuery('.fieldname', editElement);
 904              var fieldName = fieldnameElement.val();
 905              var fieldElement = jQuery('[name="'+ fieldName +'"]', editElement);
 906  
 907              if(fieldElement.attr('disabled') == 'disabled'){
 908                  return;
 909              }
 910              
 911              if(editElement.length <= 0) {
 912                  return;
 913              }
 914  
 915              if(editElement.is(':visible')){
 916                  return;
 917              }
 918  
 919              detailViewValue.addClass('hide');
 920              editElement.removeClass('hide').show().children().filter('input[type!="hidden"]input[type!="image"],select').filter(':first').focus();
 921  
 922              var saveTriggred = false;
 923              var preventDefault = false;
 924  
 925              var saveHandler = function(e) {
 926                  var element = jQuery(e.target);
 927                  if((element.closest('td').is(currentTdElement))){
 928                      return;
 929                  }
 930  
 931                  currentTdElement.removeAttr('tabindex');
 932  
 933                  var previousValue = fieldnameElement.data('prevValue');
 934                  var formElement = thisInstance.getForm();
 935                  var formData = formElement.serializeFormData();
 936                  var ajaxEditNewValue = formData[fieldName];
 937                  //value that need to send to the server
 938                  var fieldValue = ajaxEditNewValue;
 939                  var fieldInfo = Vtiger_Field_Js.getInstance(fieldElement.data('fieldinfo'));
 940  
 941                  // Since checkbox will be sending only on and off and not 1 or 0 as currrent value
 942                  if(fieldElement.is('input:checkbox')) {
 943                      if(fieldElement.is(':checked')) {
 944                          ajaxEditNewValue = '1';
 945                      } else {
 946                          ajaxEditNewValue = '0';
 947                      }
 948                      fieldElement = fieldElement.filter('[type="checkbox"]');
 949                  }
 950                  var errorExists = fieldElement.validationEngine('validate');
 951                  //If validation fails
 952                  if(errorExists) {
 953                      return;
 954                  }
 955  
 956  
 957  
 958  
 959                  fieldElement.validationEngine('hide');
 960                  //Before saving ajax edit values we need to check if the value is changed then only we have to save
 961                  if(previousValue == ajaxEditNewValue) {
 962                      editElement.addClass('hide');
 963                      detailViewValue.removeClass('hide');
 964                      actionElement.show();
 965                      jQuery(document).off('click', '*', saveHandler);
 966                  } else {
 967                      var preFieldSaveEvent = jQuery.Event(thisInstance.fieldPreSave);
 968                      fieldElement.trigger(preFieldSaveEvent, {'fieldValue' : fieldValue,  'recordId' : thisInstance.getRecordId()});
 969                      if(preFieldSaveEvent.isDefaultPrevented()) {
 970                          //Stop the save
 971                          saveTriggred = false;
 972                          preventDefault = true;
 973                          return
 974                      }
 975                      preventDefault = false;
 976  
 977                      jQuery(document).off('click', '*', saveHandler);
 978  
 979                      if(!saveTriggred && !preventDefault) {
 980                          saveTriggred = true;
 981                      }else{
 982                          return;
 983                      }
 984  
 985                      currentTdElement.progressIndicator();
 986                      editElement.addClass('hide');
 987                      var fieldNameValueMap = {};
 988                      if(fieldInfo.getType() == 'multipicklist') {
 989                          var multiPicklistFieldName = fieldName.split('[]');
 990                          fieldName = multiPicklistFieldName[0];
 991                      }
 992                      fieldNameValueMap["value"] = fieldValue;
 993                      fieldNameValueMap["field"] = fieldName;
 994                      fieldNameValueMap = thisInstance.getCustomFieldNameValueMap(fieldNameValueMap);
 995                      thisInstance.saveFieldValues(fieldNameValueMap).then(function(response) {
 996                          var postSaveRecordDetails = response.result;
 997                          currentTdElement.progressIndicator({'mode':'hide'});
 998                          detailViewValue.removeClass('hide');
 999                          actionElement.show();
1000                          detailViewValue.html(postSaveRecordDetails[fieldName].display_value);
1001                          fieldElement.trigger(thisInstance.fieldUpdatedEvent,{'old':previousValue,'new':fieldValue});
1002                          fieldnameElement.data('prevValue', ajaxEditNewValue);
1003                          fieldElement.data('selectedValue', ajaxEditNewValue); 
1004                          //After saving source field value, If Target field value need to change by user, show the edit view of target field. 
1005                          if(thisInstance.targetPicklistChange) { 
1006                                  if(jQuery('.summaryView', thisInstance.getForm()).length > 0) { 
1007                                          thisInstance.targetPicklist.find('.summaryViewEdit').trigger('click'); 
1008                                  } else { 
1009                                          thisInstance.targetPicklist.trigger('click'); 
1010                                  } 
1011                                  thisInstance.targetPicklistChange = false; 
1012                                  thisInstance.targetPicklist = false; 
1013                          } 
1014                          },
1015                          function(error){
1016                              //TODO : Handle error
1017                              currentTdElement.progressIndicator({'mode':'hide'});
1018                          }
1019                      )
1020                  }
1021              }
1022  
1023              jQuery(document).on('click','*', saveHandler);
1024      },
1025  
1026  
1027      triggerDisplayTypeEvent : function() {
1028          var widthType = app.cacheGet('widthType', 'narrowWidthType');
1029          if(widthType) {
1030              var elements = jQuery('#detailView').find('td');
1031              elements.addClass(widthType);
1032          }
1033      },
1034  
1035      /**
1036       * Function updates the hidden elements which is used for creating relations
1037       */
1038      addElementsToQuickCreateForCreatingRelation : function(container,moduleName,recordId){
1039          jQuery('<input type="hidden" name="sourceModule" value="'+moduleName+'" >').appendTo(container);
1040          jQuery('<input type="hidden" name="sourceRecord" value="'+recordId+'" >').appendTo(container);
1041          jQuery('<input type="hidden" name="relationOperation" value="true" >').appendTo(container);
1042      },
1043  
1044      /**
1045       * Function to register event for activity widget for adding
1046       * event and task from the widget
1047       */
1048      registerEventForActivityWidget : function(){
1049          var thisInstance = this;
1050  
1051          /*
1052           * Register click event for add button in Related Activities widget
1053           */
1054          jQuery('.createActivity').on('click', function(e){
1055              var referenceModuleName = "Calendar";
1056              var quickCreateNode = jQuery('#quickCreateModules').find('[data-name="'+ referenceModuleName +'"]');
1057              var recordId = thisInstance.getRecordId();
1058              var module = app.getModuleName();
1059              var element = jQuery(e.currentTarget);
1060  
1061              if(quickCreateNode.length <= 0) {
1062                  Vtiger_Helper_Js.showPnotify(app.vtranslate('JS_NO_CREATE_OR_NOT_QUICK_CREATE_ENABLED'))
1063              }
1064              var fieldName = thisInstance.referenceFieldNames[module];
1065  
1066              var customParams = {};
1067              customParams[fieldName] = recordId;
1068  
1069              var fullFormUrl = element.data('url');
1070              var preQuickCreateSave = function(data){
1071                  thisInstance.addElementsToQuickCreateForCreatingRelation(data,module,recordId);
1072  
1073                  var taskGoToFullFormButton = data.find('[class^="CalendarQuikcCreateContents"]').find('#goToFullForm');
1074                  var eventsGoToFullFormButton = data.find('[class^="EventsQuikcCreateContents"]').find('#goToFullForm');
1075                  var taskFullFormUrl = taskGoToFullFormButton.data('editViewUrl')+"&"+fullFormUrl;
1076                  var eventsFullFormUrl = eventsGoToFullFormButton.data('editViewUrl')+"&"+fullFormUrl;
1077                  taskGoToFullFormButton.data('editViewUrl',taskFullFormUrl);
1078                  eventsGoToFullFormButton.data('editViewUrl',eventsFullFormUrl);
1079              }
1080  
1081              var callbackFunction = function() {
1082                  var params = {};
1083                  params['record'] = recordId;
1084                  params['view'] = 'Detail';
1085                  params['module'] = module;
1086                  params['mode'] = 'getActivities';
1087  
1088                  AppConnector.request(params).then(
1089                      function(data) {
1090                          var activitiesWidget = jQuery('#relatedActivities');
1091                          activitiesWidget.html(data);
1092                          app.changeSelectElementView(activitiesWidget);
1093                          thisInstance.registerEventForActivityWidget();
1094                      }
1095                  );
1096  
1097                  var summaryViewContainer = thisInstance.getContentHolder();
1098                  var updatesWidget = summaryViewContainer.find("[data-name='LBL_UPDATES']");
1099                  thisInstance.loadWidget(updatesWidget);
1100              }
1101  
1102              var QuickCreateParams = {};
1103              QuickCreateParams['callbackPostShown'] = preQuickCreateSave;
1104              QuickCreateParams['callbackFunction'] = callbackFunction;
1105              QuickCreateParams['data'] = customParams;
1106              QuickCreateParams['noCache'] = false;
1107              quickCreateNode.trigger('click', QuickCreateParams);
1108          });
1109      },
1110  
1111  
1112      /**
1113       * Function to register all the events related to summary view widgets
1114       */
1115      registerSummaryViewContainerEvents : function(summaryViewContainer) {
1116          var thisInstance = this;
1117          this.registerEventForActivityWidget();
1118  
1119          /**
1120           * Function to handle the ajax edit for summary view fields
1121           */
1122          summaryViewContainer.on('click', '.summaryViewEdit', function(e){
1123              var currentTarget = jQuery(e.currentTarget);
1124              currentTarget.hide();
1125              var currentTdElement = currentTarget.closest('td.fieldValue');
1126              thisInstance.ajaxEditHandling(currentTdElement);
1127          });
1128  
1129          /**
1130           * Function to handle actions after ajax save in summary view
1131           */
1132          summaryViewContainer.on(thisInstance.fieldUpdatedEvent, '.recordDetails', function(e, params){
1133              var updatesWidget = summaryViewContainer.find("[data-name='LBL_UPDATES']");
1134              thisInstance.loadWidget(updatesWidget);
1135          });
1136  
1137          /*
1138           * Register the event to edit the status for for related activities
1139           */
1140          summaryViewContainer.on('click', '.editStatus', function(e){
1141              var currentTarget = jQuery(e.currentTarget);
1142              var currentDiv = currentTarget.closest('.activityStatus');
1143              var editElement = currentDiv.find('.edit');
1144              var detailViewElement = currentDiv.find('.value');
1145  
1146              currentTarget.hide();
1147              detailViewElement.addClass('hide');
1148              editElement.removeClass('hide').show();
1149  
1150              var callbackFunction = function() {
1151                  var fieldnameElement = jQuery('.fieldname', editElement);
1152                  var fieldName = fieldnameElement.val();
1153                  var fieldElement = jQuery('[name="'+ fieldName +'"]', editElement);
1154                  var previousValue = fieldnameElement.data('prevValue');
1155                  var ajaxEditNewValue = fieldElement.find('option:selected').text();
1156  
1157                  if(previousValue == ajaxEditNewValue) {
1158                                          editElement.addClass('hide');
1159                                          detailViewElement.removeClass('hide');
1160                      currentTarget.show();
1161                                  } else {
1162                                          var errorExists = fieldElement.validationEngine('validate');  
1163                                          //If validation fails  
1164                                          if(errorExists) {  
1165                                                  Vtiger_Helper_Js.addClickOutSideEvent(currentDiv, callbackFunction);   
1166                                                                  return;   
1167                                          }
1168                      var activityDiv = currentDiv.closest('.activityEntries');
1169                      var activityId = activityDiv.find('.activityId').val();
1170                      var moduleName = activityDiv.find('.activityModule').val();
1171                      var activityType = activityDiv.find('.activityType').val();
1172  
1173                      currentDiv.progressIndicator();
1174                                          editElement.addClass('hide');
1175                      var params = {
1176                          action : 'SaveAjax',
1177                          record : activityId,
1178                          field : fieldName,
1179                          value : ajaxEditNewValue,
1180                          module : moduleName,
1181                          activitytype : activityType
1182                      };
1183  
1184                      AppConnector.request(params).then(
1185                          function(data) {
1186                              currentDiv.progressIndicator({'mode':'hide'});
1187                              detailViewElement.removeClass('hide');
1188                              currentTarget.show();
1189                              detailViewElement.html(ajaxEditNewValue);
1190                              fieldnameElement.data('prevValue', ajaxEditNewValue);
1191                          }
1192                      );
1193                  }
1194              }
1195  
1196              //adding clickoutside event on the currentDiv - to save the ajax edit of status values
1197              Vtiger_Helper_Js.addClickOutSideEvent(currentDiv, callbackFunction);
1198          });
1199  
1200          /*
1201           * Register click event for add button in Related widgets
1202           * to add record from widget
1203           */
1204  
1205          jQuery('.changeDetailViewMode').on('click',function(e){
1206              var currentElement = jQuery(e.currentTarget);
1207              var detailViewTitleContainer = currentElement.closest('.toggleViewByMode');
1208              var viewModeElement = jQuery('input[name="viewMode"]',detailViewTitleContainer)
1209              var url = viewModeElement.data('fullUrl');
1210  
1211              var element = jQuery('<div></div>');
1212              element.progressIndicator({
1213                  'position':'html',
1214                  'blockInfo': {
1215                      'enabled' : true,
1216                      'elementToBlock' : summaryViewContainer
1217                  }
1218              });
1219  
1220              thisInstance.loadContents(url).then(
1221                  function(){
1222                      element.progressIndicator({'mode' : 'hide'});
1223                      thisInstance.deSelectAllrelatedTabs();
1224                      thisInstance.loadWidgets();
1225                                          thisInstance.registerEventForPicklistDependencySetup(thisInstance.getForm());
1226  
1227                      // Indicate the page content change
1228                      app.notifyPostAjaxReady();
1229                  }
1230              );
1231          });
1232  
1233          /*
1234           * Register click event for add button in Related widgets
1235           * to add record from widget
1236           */
1237          jQuery('.createRecord').on('click',function(e){
1238              var currentElement = jQuery(e.currentTarget);
1239              var summaryWidgetContainer = currentElement.closest('.summaryWidgetContainer');
1240              var widgetHeaderContainer = summaryWidgetContainer.find('.widget_header');
1241              var referenceModuleName = widgetHeaderContainer.find('[name="relatedModule"]').val();
1242              var recordId = thisInstance.getRecordId();
1243              var module = app.getModuleName();
1244              var quickCreateNode = jQuery('#quickCreateModules').find('[data-name="'+ referenceModuleName +'"]');
1245              var fieldName = thisInstance.referenceFieldNames[module];
1246  
1247              var customParams = {};
1248              customParams[fieldName] = recordId;
1249  
1250              if(quickCreateNode.length <= 0) {
1251                  Vtiger_Helper_Js.showPnotify(app.vtranslate('JS_NO_CREATE_OR_NOT_QUICK_CREATE_ENABLED'))
1252              }
1253  
1254              var postQuickCreateSave = function(data) {
1255                  thisInstance.postSummaryWidgetAddRecord(data,currentElement);
1256              }
1257  
1258              var goToFullFormcallback = function(data){
1259                  thisInstance.addElementsToQuickCreateForCreatingRelation(data,module,recordId);
1260              }
1261  
1262              var QuickCreateParams = {};
1263              QuickCreateParams['callbackFunction'] = postQuickCreateSave;
1264              QuickCreateParams['goToFullFormcallback'] = goToFullFormcallback;
1265              QuickCreateParams['data'] = customParams;
1266              QuickCreateParams['noCache'] = false;
1267              quickCreateNode.trigger('click', QuickCreateParams);
1268          });
1269      },
1270  
1271      addRelationBetweenRecords : function(relatedModule, relatedModuleRecordId){
1272          var aDeferred = jQuery.Deferred();
1273          var thisInstance = this;
1274          var selectedTabElement = thisInstance.getSelectedTab();
1275          var relatedController = new Vtiger_RelatedList_Js(thisInstance.getRecordId(), app.getModuleName(), selectedTabElement, relatedModule);
1276          relatedController.addRelations(relatedModuleRecordId).then(
1277              function(data){
1278                  var summaryViewContainer = thisInstance.getContentHolder();
1279                  var updatesWidget = summaryViewContainer.find("[data-name='LBL_UPDATES']");
1280                  thisInstance.loadWidget(updatesWidget);
1281                  aDeferred.resolve(data);
1282              },
1283  
1284              function(textStatus, errorThrown){
1285                  aDeferred.reject(textStatus, errorThrown);
1286              }
1287          )
1288          return aDeferred.promise();
1289      },
1290  
1291      /**
1292       * Function to handle Post actions after adding record from
1293       * summary view widget
1294       */
1295      postSummaryWidgetAddRecord : function(data,currentElement){
1296          var summaryWidgetContainer = currentElement.closest('.summaryWidgetContainer');
1297          var widgetHeaderContainer = summaryWidgetContainer.find('.widget_header');
1298          var widgetDataContainer = summaryWidgetContainer.find('.widget_contents');
1299          var referenceModuleName = widgetHeaderContainer.find('[name="relatedModule"]').val();
1300          var recordId = this.getRecordId();
1301          var module = app.getModuleName();
1302          var idList = new Array();
1303          idList.push(data.result._recordId);
1304          widgetDataContainer.progressIndicator({});
1305          this.addRelationBetweenRecords(referenceModuleName,idList).then(
1306              function(data){
1307                  var params = {};
1308                  params['record'] = recordId;
1309                  params['view'] = 'Detail';
1310                  params['module'] = module;
1311                  params['page'] = widgetDataContainer.find('[name="page"]').val();
1312                  params['limit'] = widgetDataContainer.find('[name="pageLimit"]').val();
1313                  params['relatedModule'] = referenceModuleName;
1314                  params['mode'] = 'showRelatedRecords';
1315  
1316                  AppConnector.request(params).then(
1317                      function(data) {
1318                          var documentsWidget = jQuery('#relatedDocuments');
1319                          widgetDataContainer.progressIndicator({'mode' : 'hide'});
1320                          widgetDataContainer.html(data);
1321                          app.changeSelectElementView(documentsWidget);
1322                      }
1323                  );
1324              }
1325          )
1326      },
1327  
1328      /**
1329       * Function to register event for emails related record click
1330       */
1331      registerEventForEmailsRelatedRecord : function(){
1332          var detailContentsHolder = this.getContentHolder();
1333          var emailsRelatedContainer = detailContentsHolder.find('[name="emailsRelatedRecord"]');
1334          var parentId = this.getRecordId();
1335          var popupInstance = Vtiger_Popup_Js.getInstance();
1336          detailContentsHolder.on('click','[name="emailsRelatedRecord"]',function(e){
1337              var element = jQuery(e.currentTarget);
1338              var recordId = element.data('id');
1339              var params = {};
1340              params['module'] = "Emails";
1341              params['view'] = "ComposeEmail";
1342              params['mode'] = "emailPreview";
1343              params['record'] = recordId;
1344              params['parentId'] = parentId;
1345              params['relatedLoad'] = true;
1346              popupInstance.show(params);
1347          })
1348          detailContentsHolder.on('click','[name="emailsEditView"]',function(e){
1349              e.stopPropagation();
1350              var module = "Emails";
1351              Vtiger_Helper_Js.checkServerConfig(module).then(function(data){
1352                  if(data == true){
1353                      var element = jQuery(e.currentTarget);
1354                      var closestROw = element.closest('tr');
1355                      var recordId = closestROw.data('id');
1356                      var parentRecord = new Array();
1357                      parentRecord.push(parentId);
1358                      var params = {};
1359                      params['module'] = "Emails";
1360                      params['view'] = "ComposeEmail";
1361                      params['mode'] = "emailEdit";
1362                      params['record'] = recordId;
1363                      params['selected_ids'] = parentRecord;
1364                      params['parentId'] = parentId;
1365                      params['relatedLoad'] = true;
1366                      popupInstance.show(params);
1367                  } else {
1368                      Vtiger_Helper_Js.showPnotify(app.vtranslate('JS_EMAIL_SERVER_CONFIGURATION'));
1369                  }
1370              })
1371          })
1372      },
1373  
1374      /**
1375       * Function to register event for adding email from related list
1376       */
1377      registerEventForAddingEmailFromRelatedList : function() {
1378          var detailContentsHolder = this.getContentHolder();
1379          var parentId = this.getRecordId();
1380          detailContentsHolder.on('click','[name="composeEmail"]',function(e){
1381              e.stopPropagation();
1382              var element = jQuery(e.currentTarget);
1383              var parentRecord = new Array();
1384              var params = {};
1385              parentRecord.push(parentId);
1386              params['module'] = app.getModuleName();
1387              params['view'] = "MassActionAjax";
1388              params['selected_ids'] = parentRecord;
1389              params['mode'] = "showComposeEmailForm";
1390              params['step'] = "step1";
1391              params['relatedLoad'] = true;
1392              Vtiger_Index_Js.showComposeEmailPopup(params);
1393          })
1394      },
1395      registerEnterClickEventForTagRecord : function() {
1396          jQuery('#tagRecordText').keypress(function(e) {
1397              if(e.which == 13) {
1398                  jQuery('#tagRecord').trigger('click');
1399              }
1400          });
1401      },
1402      checkTagExists : function(tagText) {
1403          var tagsArray = tagText.split(' ');
1404          for(var i=0;i<tagsArray.length;i++){
1405              var tagElement = jQuery('#tagsList').find("[data-tagname='"+tagsArray[i]+"']");
1406              if(tagElement.length > 0){
1407                  tagsArray.splice(i,1);
1408                  i--;
1409              }
1410          }
1411          var tagName = tagsArray.join(' ');
1412          if(tagName == ''){
1413              return true;
1414          } else {
1415              return tagName;
1416          }
1417  
1418      },
1419  
1420      addTagsToList : function(data,tagText) {
1421          var tagsArray = tagText.split(' ');
1422  
1423          for(var i=0;i<tagsArray.length;i++){
1424              var id = data.result[1][tagsArray[i]];
1425              jQuery('#tagsList').prepend('<div class="tag row-fluid span11 marginLeftZero" data-tagname="'+tagsArray[i]+'" data-tagid="'+id+'"><span class="tagName textOverflowEllipsis span11 cursorPointer"><a>'+tagsArray[i]+'</a></span><span class="pull-right cursorPointer deleteTag">x</span></div>');
1426          }
1427  
1428      },
1429  
1430      checkTagMaxLengthExceeds : function(tagText) {
1431          var tagsArray = tagText.split(' ');
1432          var maxTagLength = jQuery('#maxTagLength').val();
1433  
1434          for(var i=0;i<tagsArray.length;i++){
1435              if(tagsArray[i].length > parseInt(maxTagLength)) {
1436                  return true;
1437              }
1438          }
1439          return false;
1440      },
1441  
1442      registerClickEventForAddingTagRecord : function() {
1443          var thisInstance = this;
1444          jQuery('#tagRecord').on('click',function(){
1445              var textElement = jQuery('#tagRecordText');
1446              var tagText = textElement.val();
1447              if(tagText == ''){
1448                  textElement.validationEngine('showPrompt', app.vtranslate('JS_PLEASE_ENTER_A_TAG') , 'error','bottomLeft',true);
1449                  return;
1450              }
1451              var maxLengthExceeds = thisInstance.checkTagMaxLengthExceeds(tagText);
1452              if(maxLengthExceeds == true){
1453                  var maxTagLenth = jQuery('#maxTagLength').val();
1454                  textElement.validationEngine('showPrompt', app.vtranslate('JS_MAX_TAG_LENGTH_EXCEEDS')+' '+maxTagLenth, 'error','bottomLeft',true);
1455                  return;
1456              }
1457              var tagExistResult = thisInstance.checkTagExists(tagText);
1458              if(tagExistResult == true){
1459                  textElement.validationEngine('showPrompt', app.vtranslate('JS_TAG_NAME_ALREADY_EXIST') , 'error','bottomLeft',true);
1460                  return;
1461              } else {
1462                  tagText = tagExistResult;
1463              }
1464              var params = {
1465                  module : app.getModuleName(),
1466                  action : 'TagCloud',
1467                  mode : 'save',
1468                  tagname : tagText,
1469                  record : thisInstance.getRecordId()
1470              }
1471              AppConnector.request(params).then(
1472                      function(data) {
1473                          thisInstance.addTagsToList(data,tagText);
1474                          textElement.val('');
1475                      }
1476                  );
1477          });
1478      },
1479      registerRemovePromptEventForTagCloud : function(data) {
1480          jQuery('#tagRecordText').on('focus',function(e){
1481              var errorPrompt = jQuery('.formError',data);
1482              if(errorPrompt.length > 0) {
1483                  errorPrompt.remove();
1484              }
1485          });
1486      },
1487  
1488      registerDeleteEventForTag : function(data) {
1489          var thisInstance = this;
1490          jQuery(data).on('click','.deleteTag',function(e){
1491              var tag = jQuery(e.currentTarget).closest('.tag');
1492              var tagId = tag.data('tagid');
1493              tag.fadeOut('slow', function() {
1494                  tag.remove();
1495              });
1496              var params = {
1497                  module : app.getModuleName(),
1498                  action : 'TagCloud',
1499                  mode : 'delete',
1500                  tag_id : tagId,
1501                  record : thisInstance.getRecordId()
1502              }
1503              AppConnector.request(params).then(
1504                  function(data) {
1505                  });
1506          });
1507      },
1508      registerTagClickEvent : function(data){
1509          var thisInstance = this;
1510          jQuery(data).on('click','.tagName',function(e) {
1511              var tagElement = jQuery(e.currentTarget);
1512              var tagId = tagElement.closest('.tag').data('tagid');
1513              var params = {
1514                  'module' : app.getModuleName(),
1515                  'view' : 'TagCloudSearchAjax',
1516                  'tag_id' : tagId,
1517                  'tag_name' : tagElement.find('a').text()
1518              }
1519              AppConnector.request(params).then(
1520                  function(data) {
1521                      var params = {
1522                          'data' : data,
1523                          'css'  : {'min-width' : '40%'}
1524                      }
1525                      app.showModalWindow(params);
1526                      thisInstance.registerChangeEventForModulesList();
1527                  }
1528              )
1529          });
1530      },
1531  
1532      registerChangeEventForModulesList : function() {
1533          jQuery('#tagSearchModulesList').on('change',function(e) {
1534              var modulesSelectElement = jQuery(e.currentTarget);
1535              if(modulesSelectElement.val() == 'all'){
1536                  jQuery('[name="tagSearchModuleResults"]').removeClass('hide');
1537              } else{
1538                  jQuery('[name="tagSearchModuleResults"]').removeClass('hide');
1539                  var selectedOptionValue = modulesSelectElement.val();
1540                  jQuery('[name="tagSearchModuleResults"]').filter(':not(#'+selectedOptionValue+')').addClass('hide');
1541              }
1542          });
1543      },
1544  
1545      registerPostTagCloudWidgetLoad : function() {
1546          var thisInstance = this;
1547          app.getContentsContainer().on('Vtiger.Widget.Load.LBL_TAG_CLOUD',function(e,data){
1548              thisInstance.registerClickEventForAddingTagRecord();
1549              thisInstance.registerEnterClickEventForTagRecord();
1550              thisInstance.registerDeleteEventForTag(data);
1551              thisInstance.registerRemovePromptEventForTagCloud(data);
1552              thisInstance.registerTagClickEvent(data);
1553          });
1554      },
1555  
1556      registerEventForRelatedTabClick : function(){
1557          var thisInstance = this;
1558          var detailContentsHolder = thisInstance.getContentHolder();
1559          var detailContainer = detailContentsHolder.closest('div.detailViewInfo');
1560          app.registerEventForDatePickerFields(detailContentsHolder);
1561          //Attach time picker event to time fields
1562          app.registerEventForTimeFields(detailContentsHolder);
1563  
1564          jQuery('.related', detailContainer).on('click', 'li', function(e, urlAttributes){
1565              var tabElement = jQuery(e.currentTarget);
1566              var element = jQuery('<div></div>');
1567              element.progressIndicator({
1568                  'position':'html',
1569                  'blockInfo' : {
1570                      'enabled' : true,
1571                      'elementToBlock' : detailContainer
1572                  }
1573              });
1574              var url = tabElement.data('url');
1575              if(typeof urlAttributes != 'undefined'){
1576                  var callBack = urlAttributes.callback;
1577                  delete urlAttributes.callback;
1578              }
1579              thisInstance.loadContents(url,urlAttributes).then(
1580                  function(data){
1581                      thisInstance.deSelectAllrelatedTabs();
1582                      thisInstance.markTabAsSelected(tabElement);
1583                      Vtiger_Helper_Js.showHorizontalTopScrollBar();
1584                      element.progressIndicator({'mode': 'hide'});
1585                      if(typeof callBack == 'function'){
1586                          callBack(data);
1587                      }
1588                      //Summary tab is clicked
1589                      if(tabElement.data('linkKey') == thisInstance.detailViewSummaryTabLabel) {
1590                          thisInstance.loadWidgets();
1591                          thisInstance.registerSummaryViewContainerEvents(detailContentsHolder);
1592                                                  thisInstance.registerEventForPicklistDependencySetup(thisInstance.getForm());
1593                      }else if(tabElement.data('linkKey') == thisInstance.detailViewDetailsTabLabel){ 
1594                                                  thisInstance.registerEventForPicklistDependencySetup(thisInstance.getForm()); 
1595                                          } 
1596  
1597                      // Let listeners know about page state change.
1598                      app.notifyPostAjaxReady();
1599                  },
1600                  function (){
1601                      //TODO : handle error
1602                      element.progressIndicator({'mode': 'hide'});
1603                  }
1604              );
1605          });
1606      },
1607          
1608      /** 
1609       * Function to register event for setting up picklistdependency 
1610       * for a module if exist on change of picklist value 
1611       */
1612      registerEventForPicklistDependencySetup: function(container) {
1613          var thisInstance = this;
1614          var picklistDependcyElemnt = jQuery('[name="picklistDependency"]', container);
1615          if (picklistDependcyElemnt.length <= 0) {
1616              return;
1617          }
1618          var picklistDependencyMapping = JSON.parse(picklistDependcyElemnt.val());
1619          var sourcePicklists = Object.keys(picklistDependencyMapping);
1620          if (sourcePicklists.length <= 0) {
1621              return;
1622          }
1623  
1624          var sourcePickListNames = "";
1625          for (var i = 0; i < sourcePicklists.length; i++) {
1626              sourcePickListNames += '[name="' + sourcePicklists[i] + '"],';
1627          }
1628          var sourcePickListElements = container.find(sourcePickListNames);
1629          sourcePickListElements.on('change', function(e) {
1630              var currentElement = jQuery(e.currentTarget);
1631              var sourcePicklistname = currentElement.attr('name');
1632  
1633              var configuredDependencyObject = picklistDependencyMapping[sourcePicklistname];
1634              var selectedValue = currentElement.val();
1635              var targetObjectForSelectedSourceValue = configuredDependencyObject[selectedValue];
1636              var picklistmap = configuredDependencyObject["__DEFAULT__"];
1637  
1638              if (typeof targetObjectForSelectedSourceValue == 'undefined') {
1639                  targetObjectForSelectedSourceValue = picklistmap;
1640              }
1641              jQuery.each(picklistmap, function(targetPickListName, targetPickListValues) {
1642                  var targetPickListMap = targetObjectForSelectedSourceValue[targetPickListName];
1643                  if (typeof targetPickListMap == "undefined") {
1644                      targetPickListMap = targetPickListValues;
1645                  }
1646                  var targetPickList = jQuery('[name="' + targetPickListName + '"]', container);
1647                  if (targetPickList.length <= 0) {
1648                      return;
1649                  }
1650  
1651                  //On change of SourceField value, If TargetField value is not there in mapping, make user to select the new target value also. 
1652                  var selectedValue = targetPickList.data('selectedValue');
1653                  if (jQuery.inArray(selectedValue, targetPickListMap) == -1) {
1654                      thisInstance.targetPicklistChange = true;
1655                      thisInstance.targetPicklist = targetPickList.closest('td');
1656                  } else {
1657                      thisInstance.targetPicklistChange = false;
1658                      thisInstance.targetPicklist = false;
1659                  }
1660  
1661                  var listOfAvailableOptions = targetPickList.data('availableOptions');
1662                  if (typeof listOfAvailableOptions == "undefined") {
1663                      listOfAvailableOptions = jQuery('option', targetPickList);
1664                      targetPickList.data('available-options', listOfAvailableOptions);
1665                  }
1666  
1667                  var targetOptions = new jQuery();
1668                  var optionSelector = [];
1669                  optionSelector.push('');
1670                  for (var i = 0; i < targetPickListMap.length; i++) {
1671                      optionSelector.push(targetPickListMap[i]);
1672                  }
1673  
1674                  jQuery.each(listOfAvailableOptions, function(i, e) {
1675                      var picklistValue = jQuery(e).val();
1676                      if (jQuery.inArray(picklistValue, optionSelector) != -1) {
1677                          targetOptions = targetOptions.add(jQuery(e));
1678                      }
1679                  })
1680                  var targetPickListSelectedValue = '';
1681                  targetPickListSelectedValue = targetOptions.filter('[selected]').val();
1682                  if (targetPickListMap.length == 1) {
1683                      targetPickListSelectedValue = targetPickListMap[0]; // to automatically select picklist if only one picklistmap is present. 
1684                  }
1685                  targetPickList.html(targetOptions).val(targetPickListSelectedValue).trigger("liszt:updated");
1686              })
1687  
1688          });
1689          //To Trigger the change on load 
1690          sourcePickListElements.trigger('change');
1691      },
1692      
1693      /**
1694       * Function to get child comments
1695       */
1696      getChildComments : function(commentId){
1697          var aDeferred = jQuery.Deferred();
1698          var url= 'module='+app.getModuleName()+'&view=Detail&record='+this.getRecordId()+'&mode=showChildComments&commentid='+commentId;
1699          var dataObj = this.getCommentThread(url);
1700          dataObj.then(function(data){
1701              aDeferred.resolve(data);
1702          });
1703          return aDeferred.promise();
1704      },
1705      
1706      /**
1707       * Function to show total records count in listview on hover
1708       * of pageNumber text
1709       */
1710      registerEventForTotalRecordsCount : function(){
1711          var thisInstance = this;
1712          var detailContentsHolder = this.getContentHolder();
1713          detailContentsHolder.on('click','.totalNumberOfRecords',function(e){
1714              var element = jQuery(e.currentTarget);
1715              var totalNumberOfRecords = jQuery('#totalCount').val();
1716              element.addClass('hide');
1717              element.parent().progressIndicator({});
1718              if(totalNumberOfRecords == '') {
1719                  var selectedTabElement = thisInstance.getSelectedTab();
1720                  var relatedModuleName = thisInstance.getRelatedModuleName();
1721                  var relatedController = new Vtiger_RelatedList_Js(thisInstance.getRecordId(), app.getModuleName(), selectedTabElement, relatedModuleName);
1722                  relatedController.getRelatedPageCount().then(function(){
1723                      thisInstance.showPagingInfo();
1724                  });
1725              }else{
1726                  thisInstance.showPagingInfo();
1727              }
1728              element.parent().progressIndicator({'mode':'hide'});
1729          })
1730      },
1731      
1732      registerEventForActivityFollowupClickEvent : function(){
1733          var thisInstance = this;
1734          var detailContentsHolder = this.getContentHolder();
1735          detailContentsHolder.on('click','.holdFollowupOn',function(e){
1736              e.stopPropagation();
1737              var selectedTabElement = thisInstance.getSelectedTab();
1738              var relatedModuleName = thisInstance.getRelatedModuleName();
1739              var relatedController = new Vtiger_RelatedList_Js(thisInstance.getRecordId(), app.getModuleName(), selectedTabElement, relatedModuleName);
1740              relatedController.addFollowupEvent(e);
1741          });
1742      },
1743      
1744      registerEventForMarkAsCompletedClick : function(){
1745          var thisInstance = this;
1746          var detailContentsHolder = this.getContentHolder();
1747          detailContentsHolder.on('click','.markAsHeld',function(e){
1748              e.stopPropagation();
1749              var selectedTabElement = thisInstance.getSelectedTab();
1750              var relatedModuleName = thisInstance.getRelatedModuleName();
1751              var relatedController = new Vtiger_RelatedList_Js(thisInstance.getRecordId(), app.getModuleName(), selectedTabElement, relatedModuleName);
1752              relatedController.markAsCompleted(e);
1753          });
1754      },
1755      
1756      showPagingInfo : function() {
1757          var totalNumberOfRecords = jQuery('#totalCount').val();
1758          var pageNumberElement = jQuery('.pageNumbersText');
1759          var pageRange = pageNumberElement.text();
1760          var newPagingInfo = pageRange+" "+app.vtranslate('of')+" "+totalNumberOfRecords;
1761          var listViewEntriesCount = parseInt(jQuery('#noOfEntries').val());
1762          if(listViewEntriesCount != 0){
1763              jQuery('.pageNumbersText').html(newPagingInfo);
1764          } else {
1765              jQuery('.pageNumbersText').html("");
1766          }
1767      },
1768      
1769      getCustomFieldNameValueMap : function(fieldNameValueMap){
1770          return fieldNameValueMap;
1771      },
1772      
1773      registerEvents : function(){
1774          var thisInstance = this;
1775          //thisInstance.triggerDisplayTypeEvent();
1776          thisInstance.registerSendSmsSubmitEvent();
1777          thisInstance.registerAjaxEditEvent();
1778          this.registerRelatedRowClickEvent();
1779          this.registerBlockAnimationEvent();
1780          this.registerBlockStatusCheckOnLoad();
1781          this.registerEmailFieldClickEvent();
1782          this.registerPhoneFieldClickEvent();
1783          this.registerEventForActivityFollowupClickEvent();
1784          this.registerEventForMarkAsCompletedClick();
1785          this.registerEventForRelatedList();
1786          this.registerEventForRelatedListPagination();
1787          this.registerEventForAddingRelatedRecord();
1788          this.registerEventForEmailsRelatedRecord();
1789          this.registerEventForAddingEmailFromRelatedList();
1790          this.registerPostTagCloudWidgetLoad();
1791          this.registerEventForRelatedTabClick();
1792          Vtiger_Helper_Js.showHorizontalTopScrollBar();
1793          this.registerUrlFieldClickEvent();
1794          
1795          var detailViewContainer = jQuery('div.detailViewContainer');
1796          if(detailViewContainer.length <= 0) {
1797              // Not detail view page
1798              return;
1799          }
1800  
1801          var detailContentsHolder = thisInstance.getContentHolder();
1802          app.registerEventForDatePickerFields(detailContentsHolder);
1803          //Attach time picker event to time fields
1804          app.registerEventForTimeFields(detailContentsHolder);
1805          
1806          //register all the events for summary view container
1807          this.registerSummaryViewContainerEvents(detailContentsHolder);
1808                  thisInstance.registerEventForPicklistDependencySetup(thisInstance.getForm()); 
1809  
1810          detailContentsHolder.on('click', '#detailViewNextRecordButton', function(e){
1811              var selectedTabElement = thisInstance.getSelectedTab();
1812              var url = selectedTabElement.data('url');
1813              var currentPageNum = thisInstance.getRelatedListCurrentPageNum();
1814              var requestedPage = parseInt(currentPageNum)+1;
1815              var nextPageUrl = url+'&page='+requestedPage;
1816              thisInstance.loadContents(nextPageUrl);
1817          });
1818  
1819          detailContentsHolder.on('click', '#detailViewPreviousRecordButton', function(e){
1820              var selectedTabElement = thisInstance.getSelectedTab();
1821              var url = selectedTabElement.data('url');
1822              var currentPageNum = thisInstance.getRelatedListCurrentPageNum();
1823              var requestedPage = parseInt(currentPageNum)-1;
1824              var params = {};
1825              var nextPageUrl = url+'&page='+requestedPage;
1826              thisInstance.loadContents(nextPageUrl);
1827          });
1828  
1829          detailContentsHolder.on('click','table.detailview-table td.fieldValue', function(e) {
1830              var currentTdElement = jQuery(e.currentTarget);
1831              thisInstance.ajaxEditHandling(currentTdElement);
1832          });
1833  
1834  
1835          detailContentsHolder.on('click', '.relatedPopup', function(e){
1836              var editViewObj = new Vtiger_Edit_Js();
1837              editViewObj.openPopUp(e);
1838              return false;
1839          });
1840  
1841          detailContentsHolder.on('click','.addCommentBtn', function(e){
1842              thisInstance.removeCommentBlockIfExists();
1843              var addCommentBlock = thisInstance.getCommentBlock();
1844              addCommentBlock.appendTo('.commentBlock');
1845          });
1846  
1847          detailContentsHolder.on('click','.closeCommentBlock', function(e){
1848              var currentTarget = jQuery(e.currentTarget);
1849              var commentInfoBlock = currentTarget.closest('.singleComment');
1850              commentInfoBlock.find('.commentActionsContainer').show();
1851              commentInfoBlock.find('.commentInfoContent').show();
1852              thisInstance.removeCommentBlockIfExists();
1853          });
1854  
1855          detailContentsHolder.on('click','.replyComment', function(e){
1856              thisInstance.removeCommentBlockIfExists();
1857              var currentTarget = jQuery(e.currentTarget);
1858              var commentInfoBlock = currentTarget.closest('.singleComment');
1859              var addCommentBlock = thisInstance.getCommentBlock();
1860              commentInfoBlock.find('.commentActionsContainer').hide();
1861              addCommentBlock.appendTo(commentInfoBlock).show();
1862              app.registerEventForTextAreaFields(jQuery('.commentcontent',commentInfoBlock));
1863          });
1864  
1865          detailContentsHolder.on('click','.editComment', function(e){
1866              thisInstance.removeCommentBlockIfExists();
1867              var currentTarget = jQuery(e.currentTarget);
1868              var commentInfoBlock = currentTarget.closest('.singleComment');
1869              var commentInfoContent = commentInfoBlock.find('.commentInfoContent');
1870              var commentReason = commentInfoBlock.find('[name="editReason"]');
1871              var editCommentBlock = thisInstance.getEditCommentBlock();
1872              editCommentBlock.find('.commentcontent').text(commentInfoContent.text());
1873              editCommentBlock.find('[name="reasonToEdit"]').val(commentReason.text());
1874              commentInfoContent.hide();
1875              commentInfoBlock.find('.commentActionsContainer').hide();
1876              editCommentBlock.appendTo(commentInfoBlock).show();
1877              app.registerEventForTextAreaFields(jQuery('.commentcontent',commentInfoBlock));
1878          });
1879  
1880          detailContentsHolder.on('click','.viewThread', function(e){
1881              var currentTarget = jQuery(e.currentTarget);
1882              var currentTargetParent = currentTarget.parent();
1883              var commentActionsBlock = currentTarget.closest('.commentActions');
1884              var currentCommentBlock = currentTarget.closest('.commentDetails');
1885              var ulElements = currentCommentBlock.find('ul');
1886              if(ulElements.length > 0){
1887                  ulElements.show();
1888                  commentActionsBlock.find('.hideThreadBlock').show();
1889                  currentTargetParent.hide();
1890                  return;
1891              }
1892              var commentId = currentTarget.closest('.commentDiv').find('.commentInfoHeader').data('commentid');
1893              thisInstance.getChildComments(commentId).then(function(data){
1894                  jQuery(data).appendTo(jQuery(e.currentTarget).closest('.commentDetails'));
1895                  commentActionsBlock.find('.hideThreadBlock').show();
1896                  currentTargetParent.hide();
1897              });
1898          });
1899  
1900          detailContentsHolder.on('click','.hideThread', function(e){
1901              var currentTarget = jQuery(e.currentTarget);
1902              var currentTargetParent = currentTarget.parent();
1903              var commentActionsBlock = currentTarget.closest('.commentActions');
1904              var currentCommentBlock = currentTarget.closest('.commentDetails');
1905              currentCommentBlock.find('ul').hide();
1906              currentTargetParent.hide();
1907              commentActionsBlock.find('.viewThreadBlock').show();
1908          });
1909  
1910          detailContentsHolder.on('click','.detailViewThread',function(e){
1911              var recentCommentsTab = thisInstance.getTabByLabel(thisInstance.detailViewRecentCommentsTabLabel);
1912              var commentId = jQuery(e.currentTarget).closest('.singleComment').find('.commentInfoHeader').data('commentid');
1913              var commentLoad = function(data){
1914                  window.location.href = window.location.href+'#'+commentId;
1915              }
1916              recentCommentsTab.trigger('click',{'commentid':commentId,'callback':commentLoad});
1917          });
1918  
1919          detailContentsHolder.on('click','.detailViewSaveComment', function(e){
1920              var element = jQuery(e.currentTarget);
1921              if(!element.is(":disabled")) {
1922                  var dataObj = thisInstance.saveComment(e);
1923                  dataObj.then(function(){
1924                      var commentsContainer = detailContentsHolder.find("[data-name='ModComments']");
1925                      thisInstance.loadWidget(commentsContainer).then(function() {
1926                          element.removeAttr('disabled');
1927                      });
1928                  });
1929              }
1930          });
1931  
1932          detailContentsHolder.on('click','.saveComment', function(e){
1933              var element = jQuery(e.currentTarget);
1934              if(!element.is(":disabled")) {
1935                  var currentTarget = jQuery(e.currentTarget);
1936                  var mode = currentTarget.data('mode');
1937                  var dataObj = thisInstance.saveComment(e);
1938                  dataObj.then(function(data){
1939                      var closestAddCommentBlock = currentTarget.closest('.addCommentBlock');
1940                      var commentTextAreaElement = closestAddCommentBlock.find('.commentcontent');
1941                      var commentInfoBlock = currentTarget.closest('.singleComment');
1942                      commentTextAreaElement.val('');
1943                      if(mode == "add"){
1944                          var commentId = data['result']['id'];
1945                          var commentHtml = thisInstance.getCommentUI(commentId);
1946                          commentHtml.then(function(data){
1947                              var commentBlock = closestAddCommentBlock.closest('.commentDetails');
1948                              var detailContentsHolder = thisInstance.getContentHolder();
1949                              var noCommentsMsgContainer = jQuery('.noCommentsMsgContainer',detailContentsHolder);
1950                              noCommentsMsgContainer.remove();
1951                              if(commentBlock.length > 0){
1952                                  closestAddCommentBlock.remove();
1953                                  var childComments = commentBlock.find('ul');
1954                                  if(childComments.length <= 0){
1955                                      var currentChildCommentsCount = commentInfoBlock.find('.viewThreadBlock').data('childCommentsCount');
1956                                      var newChildCommentCount = currentChildCommentsCount + 1;
1957                                      commentInfoBlock.find('.childCommentsCount').text(newChildCommentCount);
1958                                      var parentCommentId = commentInfoBlock.find('.commentInfoHeader').data('commentid');
1959                                      thisInstance.getChildComments(parentCommentId).then(function(responsedata){
1960                                          jQuery(responsedata).appendTo(commentBlock);
1961                                          commentInfoBlock.find('.viewThreadBlock').hide();
1962                                          commentInfoBlock.find('.hideThreadBlock').show();
1963                                      });
1964                                  }else {
1965                                      jQuery('<ul class="liStyleNone"><li class="commentDetails">'+data+'</li></ul>').appendTo(commentBlock);
1966                                  }
1967                              } else {
1968                                  jQuery('<ul class="liStyleNone"><li class="commentDetails">'+data+'</li></ul>').prependTo(closestAddCommentBlock.closest('.commentContainer').find('.commentsList'));
1969                                  commentTextAreaElement.css({height : '71px'});
1970                              }
1971                              commentInfoBlock.find('.commentActionsContainer').show();
1972                          });
1973                      }else if(mode == "edit"){
1974                          var modifiedTime = commentInfoBlock.find('.commentModifiedTime');
1975                          var commentInfoContent = commentInfoBlock.find('.commentInfoContent');
1976                          var commentEditStatus = commentInfoBlock.find('[name="editStatus"]');
1977                          var commentReason = commentInfoBlock.find('[name="editReason"]');
1978                          commentInfoContent.html(data.result.commentcontent);
1979                          commentReason.html(data.result.reasontoedit);
1980                          modifiedTime.text(data.result.modifiedtime);
1981                          modifiedTime.attr('title',data.result.modifiedtimetitle)
1982                          if(commentEditStatus.hasClass('hide')){
1983                              commentEditStatus.removeClass('hide');
1984                          }
1985                          if(data.result.reasontoedit != ""){
1986                              commentInfoBlock.find('.editReason').removeClass('hide')
1987                          }
1988                          commentInfoContent.show();
1989                          commentInfoBlock.find('.commentActionsContainer').show();
1990                          closestAddCommentBlock.remove();
1991                      }
1992                      element.removeAttr('disabled');
1993                  });
1994              }
1995          });
1996  
1997          detailContentsHolder.on('click','.moreRecentComments', function(){
1998              var recentCommentsTab = thisInstance.getTabByLabel(thisInstance.detailViewRecentCommentsTabLabel);
1999              recentCommentsTab.trigger('click');
2000          });
2001  
2002          detailContentsHolder.on('click','.moreRecentUpdates', function(){
2003              var currentPage = jQuery("#updatesCurrentPage").val();
2004              var recordId = jQuery("#recordId").val();
2005              var nextPage = parseInt(currentPage) + 1;
2006              var url = "index.php?module=" + app.getModuleName() + "&view=Detail&record=" + recordId + "&mode=showRecentActivities&page=" + nextPage + "&tab_label=LBL_UPDATES";
2007              AppConnector.request(url).then(
2008                  function(data) {
2009                      jQuery("#updatesCurrentPage").remove();
2010                      jQuery("#moreLink").remove();
2011                      jQuery('#updates').append(data);
2012                  },
2013                  function(error,err){
2014  
2015                  }
2016              );
2017          });
2018  
2019  
2020          detailContentsHolder.on('click','.moreRecentDocuments', function(){
2021              var recentDocumentsTab = thisInstance.getTabByLabel(thisInstance.detailViewRecentDocumentsTabLabel);
2022              recentDocumentsTab.trigger('click');
2023          });
2024  
2025          detailContentsHolder.on('click','.moreRecentActivities', function(){
2026              var recentActivitiesTab = thisInstance.getTabByLabel(thisInstance.detailViewRecentActivitiesTabLabel);
2027              recentActivitiesTab.trigger('click');
2028          });
2029  
2030          thisInstance.getForm().validationEngine(app.validationEngineOptions);
2031  
2032          thisInstance.loadWidgets();
2033  
2034          app.registerEventForTextAreaFields(jQuery('.commentcontent'));
2035          this.registerEventForTotalRecordsCount();
2036      }
2037  });


Generated: Fri Nov 28 20:08:37 2014 Cross-referenced by PHPXref 0.7.1