Files
crm.clientright.ru/layouts/v7/resources/helper.js
Fedor ac7467f0b4 Major CRM updates: AI Assistant, Court Status API, S3 integration improvements, and extensive file storage system
- Added comprehensive AI Assistant system (aiassist/ directory):
  * Vector search and embedding capabilities
  * Typebot proxy integration
  * Elastic search functionality
  * Message classification and chat history
  * MCP proxy for external integrations

- Implemented Court Status API (GetCourtStatus.php):
  * Real-time court document status checking
  * Integration with external court systems
  * Comprehensive error handling and logging

- Enhanced S3 integration:
  * Improved file backup system with metadata
  * Batch processing capabilities
  * Enhanced error logging and recovery
  * Copy operations with URL fixing

- Added Telegram contact creation API
- Improved error logging across all modules
- Enhanced callback system for AI responses
- Extensive backup file storage with timestamps
- Updated documentation and README files

- File storage improvements:
  * Thousands of backup files with proper metadata
  * Fix operations for broken file references
  * Project-specific backup and recovery systems
  * Comprehensive file integrity checking

Total: 26,461+ files added/modified including AWS SDK, vendor dependencies, and extensive backup system.
2025-10-16 11:17:21 +03:00

1039 lines
35 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*+***********************************************************************************
* The contents of this file are subject to the vtiger CRM Public License Version 1.0
* ("License"); You may not use this file except in compliance with the License
* The Original Code is: vtiger CRM Open Source
* The Initial Developer of the Original Code is vtiger.
* Portions created by vtiger are Copyright (C) vtiger.
* All Rights Reserved.
*************************************************************************************/
jQuery.Class("Vtiger_Helper_Js",{
checkServerConfigResponseCache : '',
/*
* Function to get the instance of Mass edit of Email
*/
getEmailMassEditInstance : function(){
var className = 'Emails_MassEdit_Js';
var emailMassEditInstance = new window[className]();
return emailMassEditInstance;
},
requestToShowComposeEmailForm : function(selectedId,fieldname,fieldmodule){
var selectedFields = new Array();
selectedFields.push(fieldname);
var selectedIds = new Array();
selectedIds.push(selectedId);
var params = {
'module' : 'Emails',
'fieldModule' : fieldmodule,
'selectedFields[]' : selectedFields,
'selected_ids[]' : selectedIds,
'view' : 'ComposeEmail'
}
var emailsMassEditInstance = Vtiger_Helper_Js.getEmailMassEditInstance();
emailsMassEditInstance.showComposeEmailForm(params);
},
/*
* Function to get the compose email popup
*/
getInternalMailer : function(selectedId,fieldname,fieldmodule){
var module = 'Emails';
var cacheResponse = Vtiger_Helper_Js.checkServerConfigResponseCache;
var checkServerConfigPostOperations = function (data) {
if(data == true){
Vtiger_Helper_Js.requestToShowComposeEmailForm(selectedId,fieldname,fieldmodule);
} else {
alert(app.vtranslate('JS_EMAIL_SERVER_CONFIGURATION'));
}
}
if(cacheResponse === ''){
var helperInstance = new Vtiger_Helper_Js;
var checkServerConfig = helperInstance.checkServerConfig(module);
checkServerConfig.then(function(data){
Vtiger_Helper_Js.checkServerConfigResponseCache = data;
checkServerConfigPostOperations(Vtiger_Helper_Js.checkServerConfigResponseCache);
});
} else {
checkServerConfigPostOperations(Vtiger_Helper_Js.checkServerConfigResponseCache);
}
},
},{
init : function() {
this._initNotificationDefaults();
this.registerPostOverLayPageContentHideEvent();
},
registerPostOverLayPageContentHideEvent : function() {
var self = this;
jQuery('#overlayPageContent').on('hidden.bs.modal', function() {
self.hidePageContentOverlay().then(function() {
app.event.trigger('post.overlayPageContent.hide', jQuery('#overlayPageContent'));
});
});
},
/*
* Function to get Date Instance
* @params date---this is the field value
* @params dateFormat---user date format
* @return date object
*/
getDateInstance : function(dateTime,dateFormat, fieldType){
var dateTimeComponents = dateTime.split(" ");
var dateComponent = dateTimeComponents[0];
var timeComponent = dateTimeComponents[1];
var seconds = '00';
var splittedDate = dateComponent.split("-");
if(splittedDate.length > 3) {
var errorMsg = app.vtranslate("JS_INVALID_DATE");
throw errorMsg;
}
var splittedDateFormat = dateFormat.split("-");
var year = splittedDate[splittedDateFormat.indexOf("yyyy")];
var month = splittedDate[splittedDateFormat.indexOf("mm")];
var date = splittedDate[splittedDateFormat.indexOf("dd")];
var dateInstance = Date.parse(year+"-"+month+"-"+date);
if(isNaN(dateInstance) || (dateInstance == null) || (year.length != 4) || (month.length > 2) || (date.length > 2)){
var errorMsg = app.vtranslate("JS_INVALID_DATE");
throw errorMsg;
}
if(fieldType == 'date' && typeof timeComponent != 'undefined') {
var errorMsg = app.vtranslate("JS_INVALID_DATE");
throw errorMsg;
}
//Before creating date object time is set to 00
//because as while calculating date object it depends system timezone
if(typeof timeComponent == "undefined"){
timeComponent = '00:00:00';
}
var timeSections = timeComponent.split(':');
if(typeof timeSections[2] != 'undefined'){
seconds = timeSections[2];
}
//Am/Pm component exits
if(typeof dateTimeComponents[2] != 'undefined') {
timeComponent += ' ' + dateTimeComponents[2];
if(dateTimeComponents[2].toLowerCase() == 'pm' && timeSections[0] != '12') {
timeSections[0] = parseInt(timeSections[0], 10) + 12;
}
if(dateTimeComponents[2].toLowerCase() == 'am' && timeSections[0] == '12') {
timeSections[0] = '00';
}
}
month = month-1;
var dateInstance = new Date(year,month,date,timeSections[0],timeSections[1],seconds);
return dateInstance;
},
/*
* function to check server Configuration
* returns boolean true or false
*/
checkServerConfig : function(module){
var aDeferred = jQuery.Deferred();
var actionParams = {
"action": 'CheckServerInfo',
'module' : module
};
app.request.post({data:actionParams}).then(
function(err,data) {
var state = false;
if(err === null){
state = true;
} else {
state = false;
}
aDeferred.resolve(state);
}
);
return aDeferred.promise();
},
showConfirmationBox: function(data) {
var aDeferred = jQuery.Deferred();
var buttonsInfo, title;
if((typeof data.buttons == "object") && (Object.keys(data.buttons).length > 0)){
buttonsInfo = data.buttons;
}else{
buttonsInfo = {
cancel: {
//SalesPlatform.ru begin
//label: 'No',
label: app.vtranslate('LBL_NO'),
//SalesPlatform.ru end
className : 'btn-default confirm-box-btn-pad pull-right'
},
confirm: {
//SalesPlatform.ru begin
//label: 'Yes',
label: app.vtranslate('LBL_YES'),
//SalesPlatform.ru end
className : 'confirm-box-ok confirm-box-btn-pad btn-primary'
}
}
}
if(typeof data.title != "undefined"){
title = data.title;
}else{
title = '';
}
bootbox.confirm({
title : title,
buttons: buttonsInfo,
message: data['message'],
htmlSupportEnable: data.hasOwnProperty('htmlSupportEnable') ? data['htmlSupportEnable'] : true,
callback: function(result) {
if (result) {
aDeferred.resolve();
} else {
aDeferred.reject();
}
}
});
return aDeferred.promise();
},
showAlertBox: function(data, cb) {
var message = data['message'];
if (typeof cb == 'function') {
bootbox.alert(message, cb);
}
else {
var aDeferred = jQuery.Deferred();
bootbox.alert(message, function(result) {
if (result) {
aDeferred.resolve();
} else {
aDeferred.reject();
}
});
return aDeferred.promise();
}
},
defaultScrollParams : function(){
return {
height: '',
railVisible:false,
alwaysVisible:true
};
},
showScroll : function(container, params) {
if(typeof params == "undefined") {
params = {};
}
var params = jQuery.extend(this.defaultScrollParams(), params);
container.slimScroll(params);
},
showHorizontalScroll : function(element, options) {
if(typeof options == 'undefined') {
options = {};
}
var params = {
horizontalScroll: true,
theme: "dark-thick",
advanced: {
autoExpandHorizontalScroll:true
}
}
if(typeof options != 'undefined'){
var params = jQuery.extend(params,options);
}
return element.mCustomScrollbar(params);
},
showVerticalScroll : function(element, options) {
if(typeof options == 'undefined') {
options = {};
}
var params = {
theme: "dark-thick",
advanced: {
autoExpandHorizontalScroll:true,
setTop: 0
}
};
if(typeof options != 'undefined'){
var params = jQuery.extend(params,options);
}
return element.mCustomScrollbar(params);
},
showBothAxisScroll : function(element, options){
if(typeof options == 'undefined') {
options = {};
}
var params = {
scrollbarPosition : 'inside',
alwaysShowScrollbar : 2,
theme: "dark-thick",
axis:"xy",
live : true
};
if(typeof options != 'undefined'){
var params = jQuery.extend(params,options);
}
return element.mCustomScrollbar(params);
},
defaultModalParams : function() {
return {
backdrop:true,
show:true,
keyboard: false
};
},
loadPageOverlay : function(data, params) {
var overlayPage = jQuery('#overlayPage');
var aDeferred = new jQuery.Deferred();
if(typeof params == "undefined") {
params = {};
}
var defaultParams = this.defaultModalParams();
params = jQuery.extend(defaultParams,params);
var max_height = (jQuery(window).height()) - ($('.global-nav').height());
$('#overlayPage').one('shown.bs.modal',function(){
if(!params.hasOwnProperty('ignoreScroll') && params['ignoreScroll'] != true) {
var scrollParams = {
height: '',
railVisible:true,
alwaysVisible:true,
postition:"outside"
};
app.helper.showVerticalScroll(overlayPage.find('.modal-body'), scrollParams);
}
aDeferred.resolve(overlayPage.find('.data'));
});
$('#overlayPage').one('hidden.bs.modal',function(){
// Added to hide custom arrow added for taskmanagement
overlayPage.find('.arrow').removeClass("show");
overlayPage.find('.data').html('');
$('#overlayPage');
});
jQuery(window).one('resize',function(){
var max_height = (jQuery(window).height()) - ($('.global-nav').height()) - 60;
$('#overlayPage').
css('max-height',max_height).find('.data').css('max-height',max_height);
});
overlayPage.find('.data').html(data);
$('#overlayPage').
css('max-height',max_height).find('.modal-body').css('max-height',max_height);
overlayPage.modal(params);
return aDeferred.promise();
},
hidePageOverlay : function() {
$('#overlayPage').modal('hide');
},
loadPageContentOverlay : function(data, params) {
var aDeferred = new jQuery.Deferred();
var defaultParams = this.defaultModalParams();
params = jQuery.extend(defaultParams,params);
var overlayPageContent = $('#overlayPageContent');
if(jQuery(".content-area").length && jQuery(".content-area").hasClass('full-width')|| (jQuery('.settingsgroup').length === 0 && jQuery('#modules-menu').length === 0)){
overlayPageContent.addClass('full-width');
}
var alreadyShown = false;
if(overlayPageContent.hasClass('in')) {
alreadyShown = true;
}
overlayPageContent.one('shown.bs.modal',function(){
aDeferred.resolve($('#overlayPageContent'));
});
overlayPageContent.one('hidden.bs.modal',function(){
overlayPageContent.find('.data').html('');
})
overlayPageContent.find('.data').html(data);
vtUtils.applyFieldElementsView(overlayPageContent);
overlayPageContent.modal(params);
if(alreadyShown) {
aDeferred.resolve(jQuery('#overlayPageContent'));
}
return aDeferred.promise();
},
hidePageContentOverlay : function() {
var aDeferred = new jQuery.Deferred();
var overlayPageContent = $('#overlayPageContent');
overlayPageContent.one('hidden.bs.modal', function() {
overlayPageContent.find('.data').html('');
aDeferred.resolve();
})
$('#overlayPageContent').modal('hide');
return aDeferred.promise();
},
loadHelpPageOverlay : function(data, params) {
var aDeferred = new jQuery.Deferred();
var defaultParams = this.defaultModalParams();
params = jQuery.extend(defaultParams,params);
var helpOverlayPageContent = jQuery('#helpPageOverlay');
//first hide helpoverlay if already shown
if(helpOverlayPageContent.hasClass('in')) {
this.hideHelpPageOverlay();
}
var cb = params.cb;
if(typeof cb != "function") {
cb = function(){};
}
helpOverlayPageContent.one('shown.bs.modal', function () {
aDeferred.resolve(helpOverlayPageContent);
});
$('#helpPageOverlay').html(data).modal(params);
vtUtils.applyFieldElementsView(helpOverlayPageContent);
cb(helpOverlayPageContent);
return aDeferred.promise();
},
hideHelpPageOverlay : function() {
var aDeferred = new jQuery.Deferred();
var overlayPageContent = $('#helpPageOverlay');
overlayPageContent.one('hidden.bs.modal', function(){
overlayPageContent.find('.data').html('');
aDeferred.resolve();
})
$('#helpPageOverlay').modal('hide');
return aDeferred.promise();
},
showModal : function(content,params) {
// we should hide all existing modal's
this.hideModal();
if(typeof params === "undefined") {
params = {};
}
var defaultParams = this.defaultModalParams();
params = jQuery.extend(defaultParams,params);
var cb = params.cb;
var container = jQuery('.myModal');
container.on('hidden.bs.modal',function() {
container.html('');
window.onbeforeunload = null;
});
if(typeof cb === "function") {
container.off('shown.bs.modal');
//This event is fired when the modal has been made visible to the user
container.one('shown.bs.modal', function () {
cb(container);
});
}
container.html(content).modal(params);
vtUtils.applyFieldElementsView(container);
return container;
},
hideModal : function(){
var aDeferred = new jQuery.Deferred();
var container = jQuery('.myModal');
container.one('hidden.bs.modal', function(){
aDeferred.resolve();
})
$('.myModal').modal('hide');
return aDeferred.promise();
},
showInfoMessage : function(message) {
$('#messageBar').html('<div class="alert alert-info">\n\
<a href="#" class="close" data-dismiss="alert">&times;</a>\n\
<strong>'+message+'</strong>\n\
</div>');
},
showErrorMessage : function(message) {
$('#messageBar').html('<div class="alert alert-danger">\n\
<a href="#" class="close" data-dismiss="alert">&times;</a>\n\
<strong>'+message+'</strong>\n\
</div>');
},
showProgress : function(message) {
var messageBar = jQuery('#messageBar');
messageBar.removeClass('hide');
var messageHTML='';
if(message !== undefined) {
messageHTML = '<div class="message"><span>'+message+'</span></div>';
}
messageBar.html('<div style="text-align:center;position:fixed;top:50%;left:40%;"><img src="'+app.vimage_path('loading.gif')+'">'+ messageHTML +'</div>');
},
hideProgress : function() {
var messageBar = jQuery('#messageBar');
messageBar.addClass('hide');
},
getSelect2FromSelect : function(selectEle){
if(typeof selectEle == "undefined") {
return jQuery({});
}
var select2 = selectEle.data('select2');
if(typeof select2 == "undefined") {
return jQuery({});
}
return jQuery('#'+select2.containerId);
},
/*
* Function to add clickoutside event on the element - By using outside events plugin
* @params element---On which element you want to apply the click outside event
* @params callbackFunction---This function will contain the actions triggered after clickoutside event
*/
addClickOutSideEvent : function(element, callbackFunction) {
element.one('clickoutside',callbackFunction);
},
_initNotificationDefaults : function() {
if(jQuery('.module-action-bar').length) {
this.ERROR_DELAY = 1000;
var defaultSettings = {
'element' : jQuery('body'),
'offset' : {
'x' : 50,
'y' : 92 + jQuery('.module-action-bar').offset().top
},
'z_index' : 10003,
'template' : '<div data-notify="container" class="col-xs-11 col-sm-3 vt-notification vt-notification-{0}" role="alert">' +
'<div class="notificationHeader">'+
'<button type="button" aria-hidden="true" class="close pull-right" data-notify="dismiss">×</button>' +
'<span data-notify="icon"></span> ' +
'<span data-notify="title">{1}</span> ' +
'</div>'+
'<div data-notify="message">{2}</div>' +
'<div class="progress" data-notify="progressbar">' +
'<div class="progress-bar progress-bar-{0}" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%;"></div>' +
'</div>' +
'<a href="{3}" target="{4}" data-notify="url"></a>' +
'</div>',
'delay' : 600,
'animate' : 'null'
}
jQuery.notifyDefaults(defaultSettings);
}
},
showAlertNotification : function(options,settings) {
var defaultOptions = {
'icon' : 'fa fa-exclamation-triangle',
'title' : app.vtranslate('JS_ALERT')
}
options = jQuery.extend(defaultOptions,options);
jQuery.notify(options,settings);
},
showErrorNotification : function (options, settings) {
var defaultOptions = {
'icon' : 'fa fa-exclamation-circle',
'title' : app.vtranslate('JS_ERROR')
}
var defaultSettings = {
'delay' : this.ERROR_DELAY
}
options = jQuery.extend(defaultOptions, options);
settings = jQuery.extend(defaultSettings, settings);
jQuery.notify(options,settings);
},
showSuccessNotification : function(options, settings) {
var defaultOptions = {
'icon' : 'fa fa-check-circle',
'title' : app.vtranslate('JS_SUCCESS')
}
options = jQuery.extend(defaultOptions, options);
jQuery.notify(options,settings);
},
rand : function() {
return Math.floor((Math.random() * 1000) + 1);
},
getColorContrast: function(hexcolor) {
hexcolor = hexcolor.slice(1);
var r = parseInt(hexcolor.substr(0,2),16);
var g = parseInt(hexcolor.substr(2,2),16);
var b = parseInt(hexcolor.substr(4,2),16);
var yiq = ((r*299)+(g*587)+(b*114))/1000;
return (yiq >= 128) ? 'light' : 'dark';
},
/*
* Function to show the custom dialogs
*/
showCustomDialogBox : function(data){
//options are array of objects with label,button class and callback properties
bootbox.dialog(data);
},
/**
* Function to decode the encoded htmlentities values
*/
getDecodedValue : function(value) {
return jQuery('<div></div>').html(value).text();
},
initializeColorPicker : function(element,customParams,onChangeFunc) {
var params = {
flat : true,
onChange : onChangeFunc
};
if(typeof customParams !== 'undefined') {
params = jQuery.extend(params,customParams);
}
element.ColorPicker(params);
},
getRandomColor : function() {
return '#'+(0x1000000+(Math.random())*0xffffff).toString(16).substr(1,6);
},
// https://github.com/kvz/phpjs/blob/master/functions/array/array_diff.js
array_diff : function(arr1) {
// discuss at: http://phpjs.org/functions/array_diff/
// original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// improved by: Sanjoy Roy
// revised by: Brett Zamir (http://brett-zamir.me)
// example 1: array_diff(['Kevin', 'van', 'Zonneveld'], ['van', 'Zonneveld']);
// returns 1: {0:'Kevin'}
var retArr = {},
argl = arguments.length,
k1 = '',
i = 1,
k = '',
arr = {};
arr1keys: for (k1 in arr1) {
for (i = 1; i < argl; i++) {
arr = arguments[i];
for (k in arr) {
if (arr[k] === arr1[k1]) {
// If it reaches here, it was found in at least one array, so try next value
continue arr1keys;
}
}
retArr[k1] = arr1[k1];
}
}
return retArr;
},
array_merge : function() {
// discuss at: http://phpjs.org/functions/array_merge/
// original by: Brett Zamir (http://brett-zamir.me)
// bugfixed by: Nate
// bugfixed by: Brett Zamir (http://brett-zamir.me)
// input by: josh
// example 1: arr1 = {"color": "red", 0: 2, 1: 4}
// example 1: arr2 = {0: "a", 1: "b", "color": "green", "shape": "trapezoid", 2: 4}
// example 1: array_merge(arr1, arr2)
// returns 1: {"color": "green", 0: 2, 1: 4, 2: "a", 3: "b", "shape": "trapezoid", 4: 4}
// example 2: arr1 = []
// example 2: arr2 = {1: "data"}
// example 2: array_merge(arr1, arr2)
// returns 2: {0: "data"}
var args = Array.prototype.slice.call(arguments),
argl = args.length,
arg,
retObj = {},
k = '',
argil = 0,
j = 0,
i = 0,
ct = 0,
toStr = Object.prototype.toString,
retArr = true;
for (i = 0; i < argl; i++) {
if (toStr.call(args[i]) !== '[object Array]') {
retArr = false;
break;
}
}
if (retArr) {
retArr = [];
for (i = 0; i < argl; i++) {
retArr = retArr.concat(args[i]);
}
return retArr;
}
for (i = 0, ct = 0; i < argl; i++) {
arg = args[i];
if (toStr.call(arg) === '[object Array]') {
for (j = 0, argil = arg.length; j < argil; j++) {
retObj[ct++] = arg[j];
}
} else {
for (k in arg) {
if (arg.hasOwnProperty(k)) {
if (parseInt(k, 10) + '' === k) {
retObj[ct++] = arg[k];
} else {
retObj[k] = arg[k];
}
}
}
}
}
return retObj;
},
array_search: function(needle, haystack, argStrict) {
// discuss at: http://phpjs.org/functions/array_search/
// original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// input by: Brett Zamir (http://brett-zamir.me)
// bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// depends on: array
// test: skip
// example 1: array_search('zonneveld', {firstname: 'kevin', middle: 'van', surname: 'zonneveld'});
// returns 1: 'surname'
// example 2: ini_set('phpjs.return_phpjs_arrays', 'on');
// example 2: var ordered_arr = array({3:'value'}, {2:'value'}, {'a':'value'}, {'b':'value'});
// example 2: var key = array_search(/val/g, ordered_arr); // or var key = ordered_arr.search(/val/g);
// returns 2: '3'
var strict = !!argStrict,
key = '';
if (haystack && typeof haystack === 'object' && haystack.change_key_case) { // Duck-type check for our own array()-created PHPJS_Array
return haystack.search(needle, argStrict);
}
if (typeof needle === 'object' && needle.exec) { // Duck-type for RegExp
if (!strict) { // Let's consider case sensitive searches as strict
var flags = 'i' + (needle.global ? 'g' : '') +
(needle.multiline ? 'm' : '') +
(needle.sticky ? 'y' : ''); // sticky is FF only
needle = new RegExp(needle.source, flags);
}
for (key in haystack) {
if (needle.test(haystack[key])) {
return key;
}
}
return false;
}
for (key in haystack) {
if ((strict && haystack[key] === needle) || (!strict && haystack[key] == needle)) {
return key;
}
}
return false;
},
getCookie : function(c_name) {
var c_value = document.cookie;
var c_start = c_value.indexOf(" " + c_name + "=");
if (c_start == -1) {
c_start = c_value.indexOf(c_name + "=");
}
if (c_start == -1) {
c_value = null;
} else {
c_start = c_value.indexOf("=", c_start) + 1;
var c_end = c_value.indexOf(";", c_start);
if (c_end == -1) {
c_end = c_value.length;
}
c_value = unescape(c_value.substring(c_start, c_end));
}
return c_value;
},
setCookie : function(c_name,value,exdays) {
var exdate = new Date();
exdate.setDate(exdate.getDate() + exdays);
var c_value=escape(value) + ((exdays==null) ? "" : "; expires="+exdate.toUTCString());
document.cookie=c_name + "=" + c_value;
},
getViewHeight: function(){
var winHeight= jQuery(window).height()-50;
return winHeight;
},
showPopup : function(content,params) {
if(typeof params === "undefined") {
params = {};
}
var defaultParams = app.helper.defaultModalParams();
params = jQuery.extend(defaultParams,params);
var cb = params.cb;
if(jQuery('#popupModal').length) return;
var container = jQuery('<div id="popupModal" class="modal"></div>');
container.on('hidden.bs.modal',function() {
container.html('').remove();
});
if(typeof cb === "function") {
container.off('shown.bs.modal');
//This event is fired when the modal has been made visible to the user
container.on('shown.bs.modal', function () {
cb(container);
});
}
container.html(content).modal(params);
vtUtils.applyFieldElementsView(container);
return container;
},
hidePopup : function() {
jQuery('#popupModal').modal("hide");
},
/*
* Function to confirmation modal for recurring events updation and deletion
*/
showConfirmationForRepeatEvents : function(customParams) {
var self = this;
var aDeferred = jQuery.Deferred();
if(typeof customParams === 'undefined') {
customParams = {};
}
var params = {
module : 'Calendar',
view : 'RecurringDeleteCheck'
};
jQuery.extend(params, customParams);
var postData = {};
self.showProgress();
app.request.get({'data' : params}).then(function(e,data) {
self.hideProgress();
var callback = function(modalContainer) {
modalContainer.on('click', '.onlyThisEvent', function() {
postData['recurringEditMode'] = 'current';
self.hidePopup();
aDeferred.resolve(postData);
});
modalContainer.on('click', '.futureEvents', function() {
postData['recurringEditMode'] = 'future';
self.hidePopup();
aDeferred.resolve(postData);
});
modalContainer.on('click', '.allEvents', function() {
postData['recurringEditMode'] = 'all';
self.hidePopup();
aDeferred.resolve(postData);
});
};
self.showPopup(data, {
'cb' : callback
});
});
return aDeferred.promise();
},
equalWidth : function(group){
broadest = 0;
group.each(function () {
var thisWidth = jQuery(this).width();
if (thisWidth > broadest) {
broadest = thisWidth;
}
});
group.width(broadest);
},
fixedBottomListViewScroll : function(scrollwrap){
scrollwrap = jQuery(scrollwrap);
//The element should be relative to calculate offset
scrollwrap.css({position: "relative", top: '-15px'});
var winHeight = jQuery(window).innerHeight();
var viewportOffset = scrollwrap.offset().top - jQuery(window).scrollTop();
var view = jQuery('[name="view"]').val();
if (viewportOffset >= winHeight) {
if(view == "Popup"){
scrollwrap.css({position: "fixed", top: 'auto', bottom: '15px'});
}else if(view == "List"){
scrollwrap.css({position: "fixed", top: 'auto', bottom: 0});
}
} else {
scrollwrap.css({position: "relative", 'top': '-15px', bottom: 'auto'});
}
},
dynamicListViewHorizontalScroll : function(){
var thisInstance = this;
this.equalWidth(jQuery(".sticky-wrap, #scroller_wrapper"));
var stickyWrapWidth = jQuery('.sticky-wrap').width();
jQuery('.sticky-wrap').css("width", stickyWrapWidth-3);
this.equalWidth(jQuery("#listview-table, #scroller"));
var tableHeight = jQuery('.sticky-wrap').height();
var winHeight = jQuery(window).innerHeight();
jQuery("#scroller_wrapper").scroll(function () {
jQuery(".sticky-wrap").scrollLeft(jQuery("#scroller_wrapper").scrollLeft());
});
jQuery(".sticky-wrap").scroll(function () {
jQuery("#scroller_wrapper").scrollLeft(jQuery(".sticky-wrap").scrollLeft());
});
jQuery(window).scroll(function () {
thisInstance.fixedBottomListViewScroll(jQuery("#scroller_wrapper"));
});
if(tableHeight > winHeight-142){
thisInstance.fixedBottomListViewScroll(jQuery("#scroller_wrapper"));
}
},
dynamicPopupViewHorizontalScroll : function(){
var thisInstance = this;
this.equalWidth(jQuery(".popupEntriesDiv, #scroller_wrapper"));
this.equalWidth(jQuery(".listview-table, #scroller"));
var tableHeight = jQuery('.popupEntriesDiv').height();
var winHeight = jQuery('.modal-body').innerHeight();
jQuery("#scroller_wrapper").scroll(function () {
jQuery(".popupEntriesDiv").scrollLeft(jQuery("#scroller_wrapper").scrollLeft());
});
jQuery(".popupEntriesDiv").scroll(function () {
jQuery("#scroller_wrapper").scrollLeft(jQuery(".popupEntriesDiv").scrollLeft());
});
jQuery(window).scroll(function () {
thisInstance.fixedBottomListViewScroll(jQuery("#scroller_wrapper"));
});
if(tableHeight > winHeight-142){
thisInstance.fixedBottomListViewScroll(jQuery("#scroller_wrapper"));
}
},
/**
* Function to check if the browser is ie
*/
isMSIE : function() {
return navigator.userAgent.indexOf("MSIE ") > 0;
},
/**
* Function to check newer version of ie
*/
isTrident : function() {
return (/Trident/).test(navigator.userAgent);
},
/**
* Function to check if the browser in mozilla
*/
isMozilla: function() {
var ua = navigator.userAgent;
ua = ua.toLowerCase();
return (/mozilla/).test(ua) || (/firefox/).test(ua);
},
/**
* Function to check if the browser is webkit
*/
isWebkit: function() {
var ua = navigator.userAgent;
ua = ua.toLowerCase();
return (/webkit/).test(ua) || (/chrom(e|ium)/).test(ua);
},
/*
* Function to check Duplication of Account Name
* returns boolean true or false
*/
checkDuplicateName : function(details) {
var accountName = details.accountName;
var recordId = details.recordId;
var aDeferred = jQuery.Deferred();
var moduleName = details.moduleName;
if(typeof moduleName == "undefined"){
moduleName = app.getModuleName();
}
var params = {
'module' : moduleName,
'action' : "CheckDuplicate",
'accountname' : accountName,
'record' : recordId
}
app.request.post({data: params}).then(
function(err, data) {
var result = data.success;
if(result == true) {
aDeferred.reject(data);
} else {
aDeferred.resolve(data);
}
}
);
return aDeferred.promise();
},
registerLeavePageWithoutSubmit: function(form) {
var initialFormData = form.serialize();
window.onbeforeunload = function(e) {
if (initialFormData != form.serialize() && form.data('submit') != "true") {
return app.vtranslate("JS_CHANGES_WILL_BE_LOST");
}
};
},
registerModalDismissWithoutSubmit: function(form) {
var initialFormData = form.serialize();
jQuery('.modal .close,.modal .cancelLink').click(function(e) {
if (initialFormData != form.serialize() && form.data('submit') != "true") {
app.helper.showConfirmationBox({'message' : app.vtranslate("JS_CHANGES_WILL_BE_LOST") +' '+ app.vtranslate('JS_WISH_TO_PROCEED')}).then(function(){
window.onbeforeunload = null;
if(form.closest('#overlayPageContent').length > 0) {
app.helper.hidePageContentOverlay();
}else {
app.helper.hideModal();
}
});
return false;
}
});
},
getDropDownmenuParent: function ($this) {
var selector = $this.attr('data-target');
if (!selector) {
selector = $this.attr('href');
selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
};
var $parent = selector && $(selector);
return $parent && $parent.length ? $parent : $this.parent();
}
});
function VtError(params) {
this.name = 'VtError';
this.stack = (new Error()).stack;
this.title = params.title || app.vtranslate('JS_ERROR');
this.message= params.message || '';
}
VtError.prototype = Object.create(Error.prototype);
VtError.prototype.constructor = VtError;