https://www.high-endrolex.com/28
/**
* Wise Chat core controller.
*
* @author Marcin Ławrowski
* @link http://kaine.pl/projects/wp-plugins/wise-chat
*/
function WiseChatController(options) {
var progressBar = new WiseChatProgressBar(options);
var notifier = new WiseChatNotifier(options);
var messagesHistory = new WiseChatMessagesHistory();
var imageViewer = new WiseChatImageViewer();
var dateFormatter = new WiseChatDateFormatter();
var messageAttachments = new WiseChatMessageAttachments(options, imageViewer, progressBar);
var dateAndTimeRenderer = new WiseChatDateAndTimeRenderer(options, dateFormatter);
var messages = new WiseChatMessages(options, messagesHistory, messageAttachments, dateAndTimeRenderer, notifier, progressBar);
var settings = new WiseChatSettings(options, messages);
var maintenanceExecutor = new WiseChatMaintenanceExecutor(options, messages);
var emoticonsPanel = new WiseChatEmoticonsPanel(options, messages);
messages.start();
maintenanceExecutor.start();
};
/**
* WiseChatDateFormatter class. Formats dates given in UTC timezone.
*
* @author Marcin Ławrowski
*/
function WiseChatDateFormatter() {
function makeLeadZero(number) {
return (number < 10 ? '0' : '') + number;
}
/**
* Parses date given in ISO format.
*
* @param {String} isoDate Date in ISO format
*
* @return {Date} Parsed date
*/
function parseISODate(isoDate) {
var s = isoDate.split(/\D/);
return new Date(Date.UTC(s[0], --s[1]||'', s[2]||'', s[3]||'', s[4]||'', s[5]||'', s[6]||''))
}
/**
* Determines whether two dates have equal day, month and year.
*
* @param {Date} firstDate
* @param {Date} secondDate
*
* @return {Boolean}
*/
function isSameDate(firstDate, secondDate) {
var dateFormatStr = 'Y-m-d';
return formatDate(firstDate, dateFormatStr) == formatDate(secondDate, dateFormatStr);
}
/**
* Returns formatted date.
*
* @param {Date} date Date to format as a string
* @param {String} format Desired date format
*
* @return {String} Formatted date
*/
function formatDate(date, format) {
format = format.replace(/Y/, date.getFullYear());
format = format.replace(/m/, makeLeadZero(date.getMonth() + 1));
format = format.replace(/d/, makeLeadZero(date.getDate()));
format = format.replace(/H/, makeLeadZero(date.getHours()));
format = format.replace(/i/, makeLeadZero(date.getMinutes()));
return format;
}
/**
* Returns localized time without seconds.
*
* @param {Date} date Date to format as a string
*
* @return {String} Localized time
*/
function getLocalizedTime(date) {
if (typeof (date.toLocaleTimeString) != "undefined") {
var timeLocale = date.toLocaleTimeString();
if ((timeLocale.match(/:/g) || []).length == 2) {
timeLocale = timeLocale.replace(/:\d\d$/, '');
timeLocale = timeLocale.replace(/:\d\d /, ' ');
timeLocale = timeLocale.replace(/[A-Z]{2,4}\-\d{1,2}/, '');
timeLocale = timeLocale.replace(/[A-Z]{2,4}/, '');
}
return timeLocale;
} else {
return formatDate(date, 'H:i');
}
}
/**
* Returns localized date.
*
* @param {Date} date Date to format as a string
*
* @return {String} Localized date
*/
function getLocalizedDate(date) {
if (typeof (date.toLocaleDateString) != "undefined") {
return date.toLocaleDateString();
} else {
return formatDate(date, 'Y-m-d');
}
}
// public API:
this.formatDate = formatDate;
this.parseISODate = parseISODate;
this.isSameDate = isSameDate;
this.getLocalizedTime = getLocalizedTime;
this.getLocalizedDate = getLocalizedDate;
};
/**
* WiseChatMessageAttachments class. Attachments management.
*
* @author Marcin Ławrowski
*/
function WiseChatMessageAttachments(options, imageViewer, progressBar) {
var IMAGE_TYPES = ['jpg', 'jpeg', 'png', 'gif'];
var prepareImageEndpoint = options.apiEndpointBase + '?action=wise_chat_prepare_image_endpoint';
var container = jQuery('#' + options.chatId);
var messageAttachmentsPanel = container.find('.wcMessageAttachments');
var imageUploadPreviewImage = container.find('.wcImageUploadPreview');
var imageUploadFile = container.find('.wcImageUploadFile');
var attachmentClearButton = container.find('.wcAttachmentClear');
var fileUploadFile = container.find('.wcFileUploadFile');
var fileUploadNamePreview = container.find('.wcFileUploadNamePreview');
var attachments = [];
function showErrorMessage(message) {
alert(message);
}
function addAttachment(type, data, name) {
attachments.push({ type: type, data: data, name: name });
}
function showImageAttachment() {
if (attachments.length > 0 && attachments[0].type === 'image') {
imageViewer.show(attachments[0].data);
}
}
function onImageUploadFileChange() {
var fileInput = imageUploadFile[0];
if (typeof FileReader === 'undefined' || fileInput.files.length === 0) {
showErrorMessage('Unsupported operation');
return;
}
var fileDetails = fileInput.files[0];
if (fileDetails.size && fileDetails.size > options.imagesSizeLimit) {
showErrorMessage(options.messages.messageSizeLimitError);
return;
}
if (IMAGE_TYPES.indexOf(getExtension(fileDetails)) > -1) {
var fileReader = new FileReader();
fileReader.onload = function(event) {
clearAttachments();
prepareImage(event.target.result, function(preparedImageData) {
addAttachment('image', preparedImageData);
imageUploadPreviewImage.show();
imageUploadPreviewImage.attr('src', preparedImageData);
messageAttachmentsPanel.show();
imageUploadFile.val('');
});
};
fileReader.readAsDataURL(fileDetails);
} else {
showErrorMessage(options.messages.messageUnsupportedTypeOfFile);
}
}
function prepareImage(imageSource, successCallback) {
var that = this;
progressBar.setValue(0);
progressBar.show();
jQuery.ajax({
type: "POST",
url: prepareImageEndpoint,
data: {
data: imageSource,
checksum: options.checksum
},
progressUpload: function(event) {
if (event.lengthComputable) {
var percent = parseInt(event.loaded / event.total * 100);
if (percent > 100) {
percent = 100;
}
progressBar.setValue(percent);
}
}
})
.success(function(result) {
progressBar.hide();
successCallback.apply(that, [result]);
})
.error(function(jqXHR, textStatus, errorThrown) {
progressBar.hide();
try {
var response = jQuery.parseJSON(jqXHR.responseText);
if (typeof response.error != 'undefined') {
showErrorMessage(response.error);
} else {
showErrorMessage('Image preparation error');
}
}
catch (e) {
showErrorMessage('Unknown error occurred');
}
});
}
function onFileUploadFileChange() {
var fileInput = fileUploadFile[0];
if (typeof FileReader === 'undefined' || fileInput.files.length === 0) {
showErrorMessage('Unsupported operation');
return;
}
var fileDetails = fileInput.files[0];
if (options.attachmentsValidFileFormats.indexOf(getExtension(fileDetails)) > -1) {
var fileReader = new FileReader();
var fileName = fileDetails.name;
if (fileDetails.size > options.attachmentsSizeLimit) {
showErrorMessage(options.messages.messageSizeLimitError);
} else {
fileReader.onload = function(event) {
clearAttachments();
addAttachment('file', event.target.result, fileName);
fileUploadNamePreview.html(fileName);
fileUploadNamePreview.show();
messageAttachmentsPanel.show();
};
fileReader.readAsDataURL(fileDetails);
}
} else {
showErrorMessage(options.messages.messageUnsupportedTypeOfFile);
}
}
function getExtension(fileDetails) {
if (typeof fileDetails.name !== 'undefined') {
var splitted = fileDetails.name.split('.');
if (splitted.length > 1) {
return splitted.pop().toLowerCase();
}
}
return null;
}
function resetInput(inputField) {
inputField.wrap('