Your IP : 18.117.186.131
/**
* Bitrix Messenger
* Logger class
*
* @package bitrix
* @subpackage im
* @copyright 2001-2019 Bitrix
*/
if (!window.BX)
{
window.BX = {};
}
if (typeof window.BX.Messenger == 'undefined')
{
window.BX.Messenger = {};
}
if (typeof window.BX.Messenger.Const == 'undefined')
{
window.BX.Messenger.Const = {};
}
if (typeof window.BX.Messenger.Utils == 'undefined')
{
window.BX.Messenger.Utils = {};
}
BX.Messenger.Const.dateFormat = Object.freeze({
groupTitle: 'groupTitle',
message: 'message',
recentTitle: 'recentTitle',
recentLinesTitle: 'recentLinesTitle',
default: 'default',
});
BX.Messenger.Utils =
{
browser:
{
isSafari()
{
if (!navigator.userAgent.toLowerCase().includes('safari'))
{
return false;
}
return !this.isSafariBased();
},
isSafariBased()
{
if (!navigator.userAgent.toLowerCase().includes('applewebkit'))
{
return false;
}
return (
navigator.userAgent.toLowerCase().includes('yabrowser')
|| navigator.userAgent.toLowerCase().includes('yaapp_ios_browser')
|| navigator.userAgent.toLowerCase().includes('crios')
)
},
isChrome()
{
return navigator.userAgent.toLowerCase().includes('chrome');
},
isFirefox()
{
return navigator.userAgent.toLowerCase().includes('firefox');
},
isIe()
{
return navigator.userAgent.match(/(Trident\/|MSIE\/)/) !== null;
},
},
platform:
{
isMac()
{
return navigator.userAgent.toLowerCase().includes('macintosh');
},
isLinux()
{
return navigator.userAgent.toLowerCase().includes('linux');
},
isWindows()
{
return navigator.userAgent.toLowerCase().includes('windows') || (!this.isMac() && !this.isLinux());
},
isBitrixMobile()
{
return navigator.userAgent && navigator.userAgent.toLowerCase().includes('bitrixmobile');
},
isBitrixDesktop()
{
return navigator.userAgent.toLowerCase().includes('bitrixdesktop');
},
isMobile()
{
return this.isAndroid() || this.isIos() || this.isBitrixMobile();
},
isIos()
{
return navigator.userAgent.toLowerCase().includes('iphone') || navigator.userAgent.toLowerCase().includes('ipad');
},
getIosVersion()
{
if (!this.isIos())
{
return null;
}
let matches = navigator.userAgent.toLowerCase().match(/(iphone|ipad)(.+)(OS\s([0-9]+))/i);
if (!matches || !matches[4])
{
return null;
}
return matches[4];
},
isAndroid()
{
return navigator.userAgent.toLowerCase().includes('android');
},
},
device:
{
isDesktop()
{
return !this.isMobile();
},
isMobile()
{
if (typeof this.isMobileStatic !== 'undefined')
{
return this.isMobileStatic;
}
this.isMobileStatic = (
navigator.userAgent.toLowerCase().includes('android')
|| navigator.userAgent.toLowerCase().includes('webos')
|| navigator.userAgent.toLowerCase().includes('iphone')
|| navigator.userAgent.toLowerCase().includes('ipad')
|| navigator.userAgent.toLowerCase().includes('ipod')
|| navigator.userAgent.toLowerCase().includes('blackberry')
|| navigator.userAgent.toLowerCase().includes('windows phone')
);
return this.isMobileStatic;
},
orientationHorizontal: 'horizontal',
orientationPortrait: 'portrait',
getOrientation()
{
if (!this.isMobile())
{
return this.orientationHorizontal;
}
return Math.abs(window.orientation) === 0? this.orientationPortrait: this.orientationHorizontal;
}
},
types:
{
isString(item)
{
return item === '' ? true : (item ? (typeof (item) == "string" || item instanceof String) : false);
},
isArray(item)
{
return item && Object.prototype.toString.call(item) == "[object Array]";
},
isFunction(item)
{
return item === null ? false : (typeof (item) == "function" || item instanceof Function);
},
isDomNode(item)
{
return item && typeof (item) == "object" && "nodeType" in item;
},
isDate(item)
{
return item && Object.prototype.toString.call(item) == "[object Date]";
},
isPlainObject(item)
{
if (!item || typeof item !== "object" || item.nodeType)
{
return false;
}
const hasProp = Object.prototype.hasOwnProperty;
try
{
if (
item.constructor
&& !hasProp.call(item, "constructor")
&& !hasProp.call(item.constructor.prototype, "isPrototypeOf")
)
{
return false;
}
}
catch (e)
{
return false;
}
let key;
for (let key in item)
{
}
return typeof(key) === "undefined" || hasProp.call(item, key);
}
},
isDarkColor(hex)
{
if (!hex || !hex.match(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/))
{
return false;
}
if (hex.length === 4)
{
hex = hex.replace(/#([A-Fa-f0-9])/gi, "$1$1");
}
else
{
hex = hex.replace(/#([A-Fa-f0-9])/gi, "$1");
}
hex = hex.toLowerCase();
let darkColor = [
"#17a3ea",
"#00aeef",
"#00c4fb",
"#47d1e2",
"#75d900",
"#ffab00",
"#ff5752",
"#468ee5",
"#1eae43"
];
if (darkColor.includes('#'+hex))
{
return true;
}
let bigint = parseInt(hex, 16);
let red = (bigint >> 16) & 255;
let green = (bigint >> 8) & 255;
let blue = bigint & 255;
let brightness = (red * 299 + green * 587 + blue * 114) / 1000;
return brightness < 128;
},
getDateFormatType(type = BX.Messenger.Const.dateFormat.default, localize = null)
{
if (!localize)
{
localize = BX.message;
}
let format = [];
if (type === BX.Messenger.Const.dateFormat.groupTitle)
{
format = [
["tommorow", "tommorow"],
["today", "today"],
["yesterday", "yesterday"],
["", BX.Main.Date.convertBitrixFormat(localize["IM_UTILS_FORMAT_DATE"])]
];
}
else if (type === BX.Messenger.Const.dateFormat.message)
{
format = [
["", localize["IM_UTILS_FORMAT_TIME"]]
];
}
else if (type === BX.Messenger.Const.dateFormat.recentTitle)
{
format = [
["tommorow", "today"],
["today", "today"],
["yesterday", "yesterday"],
["", BX.Main.Date.convertBitrixFormat(localize["IM_UTILS_FORMAT_DATE_RECENT"])]
]
}
else if (type === BX.Messenger.Const.dateFormat.recentLinesTitle)
{
format = [
["tommorow", "tommorow"],
["today", "today"],
["yesterday", "yesterday"],
["", BX.Main.Date.convertBitrixFormat(localize["IM_UTILS_FORMAT_DATE_RECENT"])]
]
}
else
{
format = [
["tommorow", "tommorow, "+localize["IM_UTILS_FORMAT_TIME"]],
["today", "today, "+localize["IM_UTILS_FORMAT_TIME"]],
["yesterday", "yesterday, "+localize["IM_UTILS_FORMAT_TIME"]],
["", BX.Main.Date.convertBitrixFormat(localize["FORMAT_DATETIME"])]
];
}
return format;
},
hashCode(string = '')
{
let hash = 0;
if (typeof string === 'object' && string)
{
string = JSON.stringify(string);
}
else if (typeof string !== 'string')
{
string = string.toString();
}
if (typeof string !== 'string')
{
return hash;
}
for (let i = 0; i < string.length; i++)
{
let char = string.charCodeAt(i);
hash = ((hash<<5)-hash)+char;
hash = hash & hash;
}
return hash;
},
/**
* Throttle function. Callback will be executed no more than 'wait' period (in ms).
*
* @param callback
* @param wait
* @param context
* @returns {Function}
*/
throttle(callback, wait, context = this)
{
let timeout = null;
let callbackArgs = null;
const nextCallback = () => {
callback.apply(context, callbackArgs);
timeout = null;
};
return function()
{
if (!timeout)
{
callbackArgs = arguments;
timeout = setTimeout(nextCallback, wait);
}
}
},
/**
* Debounce function. Callback will be executed if it hast been called for longer than 'wait' period (in ms).
*
* @param callback
* @param wait
* @param context
* @returns {Function}
*/
debounce(callback, wait, context = this)
{
let timeout = null;
let callbackArgs = null;
const nextCallback = () => {
callback.apply(context, callbackArgs);
};
return function()
{
callbackArgs = arguments;
clearTimeout(timeout);
timeout = setTimeout(nextCallback, wait);
}
},
htmlspecialchars(string)
{
if (typeof string !== 'string')
{
return string;
}
return string.replace(/&/g, '&')
.replace(/"/g, '"')
.replace(/</g, '<')
.replace(/>/g, '>');
},
htmlspecialcharsback(string)
{
if (typeof string !== 'string')
{
return string;
}
return string.replace(/\"/g, '"')
.replace(/'/g, "'")
.replace(/\</g, '<')
.replace(/\>/g, '>')
.replace(/\&/g, '&')
.replace(/\ /g, ' ');
},
getLogTrackingParams(params = {})
{
let result = [];
let {
name = 'tracking',
data = [],
dialog = null,
message = null,
files = null,
} = params;
name = encodeURIComponent(name);
if (
data
&& !(data instanceof Array)
&& typeof data === 'object'
)
{
let dataArray = [];
for (let name in data)
{
if (data.hasOwnProperty(name))
{
dataArray.push(encodeURIComponent(name)+"="+encodeURIComponent(data[name]));
}
}
data = dataArray;
}
else if (!data instanceof Array)
{
data = [];
}
if (dialog)
{
result.push('timType='+dialog.type);
if (dialog.type === 'lines')
{
result.push('timLinesType='+dialog.entityId.split('|')[0]);
}
}
if (files)
{
let type = 'file';
if (files instanceof Array && files[0])
{
type = files[0].type;
}
else
{
type = files.type;
}
result.push('timMessageType='+type);
}
else if (message)
{
result.push('timMessageType=text');
}
if (this.platform.isBitrixMobile())
{
result.push('timDevice=bitrixMobile');
}
else if (this.platform.isBitrixDesktop())
{
result.push('timDevice=bitrixDesktop');
}
else if (this.platform.isIos() || this.platform.isAndroid())
{
result.push('timDevice=mobile');
}
else
{
result.push('timDevice=web');
}
return name + (data.length? '&'+data.join('&'): '') + (result.length? '&'+result.join('&'): '');
}
};