Файл: static/plugins/base/js/avatar_change.js
Строк: 295
<?php
var avatarChange = function( params )
{
$.event.props.push('dataTransfer');
this.params = params;
this.$dropArea = $('#avatar-drop-area');
this.$dropAreaLabel = $('#avatar-drop-area-label');
this.$fileInput = $('#avatar-change-file-input');
this.$preloader = $('#avatar-change-preloader');
this.$step1 = $("#avatar-change-step-1");
this.$step2 = $("#avatar-change-step-2");
this.$backButton = $('#avatar-crop-back-btn');
this.$cropButton = $('#avatar-crop-btn');
this.$cropPreview = $('#avatar-crop-preview');
this.$cropTarget = $('#avatar-crop-target');
this.fileTypes = ['image/jpeg', 'image/png', 'image/gif'];
this.coords = {};
this.jcropApi = {};
// selected image params
this.url = '';
this.entityType = '';
this.entityId = '';
this.id = '';
var self = this;
this.cropPreview = function showPreview(coords) {
var rx = self.params.minCropSize / coords.w;
var ry = self.params.minCropSize / coords.h;
self.coords = coords;
self.$cropPreview.css({
width: Math.round(rx * self.$cropTarget.width()) + 'px',
height: Math.round(ry * self.$cropTarget.height()) + 'px',
marginLeft: '-' + Math.round(rx * coords.x) + 'px',
marginTop: '-' + Math.round(ry * coords.y) + 'px'
});
};
this.initCrop = function( callback ){
var ts = new Date().getTime();
var url = self.url + "?" + ts;
if (!$.isEmptyObject(self.jcropApi)) { // reset jcrop api
self.jcropApi.destroy();
}
var image = new Image();
image.onload = function(e) {
var width = this.width;
var height = this.height;
self.$cropTarget.attr('src', url);
self.$cropPreview.attr('src', url);
document.avatarFloatBox.$header.find(".floatbox_title span").html(PEEP.getLanguageText('base', 'avatar_crop'));
var cropWidth = document.avatarFloatBox.$body.width() - self.params.minCropSize - 16;
$(".peep_avatar_crop_area").css({ width: cropWidth });
$(".peep_avatar_crop_result").css({ width: self.params.minCropSize });
$(".avatar_crop_preview_wrap").css({ height: self.params.minCropSize });
self.$cropPreview.css({ width: self.params.minCropSize, height: self.params.minCropSize });
if (height < self.params.minCropSize) {
self.$cropTarget.css({ height: self.params.minCropSize });
}
self.$cropTarget.Jcrop({
onChange: self.cropPreview,
onSelect: self.cropPreview,
boxWidth: cropWidth,
minSize: [ self.params.minCropSize, self.params.minCropSize ],
aspectRatio: 1
},function(){
self.jcropApi = this;
if (width >= self.params.minCropSize && height >= self.params.minCropSize) {
self.jcropApi.setSelect(self.getCropInitialSelection(width, height));
}
self.$step1.hide();
self.$step2.show();
if ( callback && typeof(callback) === "function" )
{
callback();
}
});
};
image.src = url;
};
if ( self.params.step == 2 )
{
self.$backButton.closest(".peep_button").hide();
// join form
if ( self.params.inputId ) {
self.$step2.hide();
PEEP.inProgressNode(self.$preloader);
self.$preloader.show();
var file = document.getElementById(self.params.inputId).files[0];
if ( file ) {
var reader = new FileReader();
reader.onload = function(e) {
var image = new Image();
image.onload = function(e) {
var width = this.width;
var height = this.height;
if (width < self.params.minCropSize || height < self.params.minCropSize) {
PEEP.error(PEEP.getLanguageText('base', 'avatar_image_too_small', { width : self.params.minCropSize, height : self.params.minCropSize }));
document.avatarFloatBox.close();
$("#" + self.params.inputId).val("");
}
else {
var fd = new FormData();
fd.append('file', file);
self.uploadFile(fd);
}
};
image.src = e.target.result;
};
reader.readAsDataURL(file);
}
}
// pre-selected item from library
else if ( self.params.url && self.params.entityType && self.params.id ) {
self.url = self.params.url;
self.entityType = self.params.entityType;
self.entityId = self.params.entityId;
self.id = self.params.id;
self.initCrop(function(){ self.$preloader.hide(); });
}
}
this.checkFileType = function(fileType) {
return self.fileTypes.indexOf(fileType.toLowerCase()) !== -1;
};
this.getCropInitialSelection = function(width, height){
var xC = width / 2, yC = height / 2;
var halfSize = width < height ? width / 2 : height / 2;
var padding = width < height ? width * 0.05 : height * 0.05;
halfSize = halfSize - padding;
var x1 = xC - halfSize, y1 = yC - halfSize;
var x2 = xC + halfSize, y2 = yC + halfSize;
return [x1, y1, x2, y2];
};
this.$cropButton.click(function() {
var button = $(this);
PEEP.inProgressNode(button);
var params = { ajaxFunc: 'ajaxCropPhoto', coords: self.coords, view_size: self.$cropTarget.width() };
if ( self.entityType && self.id ) {
params.entityType = self.entityType;
params.entityId = self.entityId;
params.id = self.id;
}
else {
params.url = self.url;
}
// do we need change avatar?
params.changeUserAvatar = self.params.changeUserAvatar ? 1 : 0;
$.ajax({
url: self.params.ajaxResponder,
type: 'POST',
data: params,
dataType: 'json',
success: function(data) {
if (data.result)
{
if ( !self.params.inputId )
{
PEEP.info(PEEP.getLanguageText('base', 'avatar_changed'));
}
PEEP.trigger('base.avatar_cropped', data); // Listen this event to update interface
document.avatarFloatBox.close();
}
else
{
if ( data.error )
{
PEEP.error(data.error);
}
else
{
PEEP.error(PEEP.getLanguageText('base', 'crop_avatar_failed'));
}
}
PEEP.activateNode(button);
}
});
});
this.$backButton.click(function(){
self.$step2.hide();
self.$step1.show();
document.avatarFloatBox.$header.find(".floatbox_title span").html(PEEP.getLanguageText('base', 'avatar_change'));
});
this.$dropArea.click(function(){
self.$fileInput.trigger('click');
});
self.$fileInput.change(function(e){
var files = e.target.files || (e.dataTransfer && e.dataTransfer.files);
if ( !files || !self.checkFileType(files[0].type) ) {
PEEP.error(PEEP.getLanguageText('base', 'not_valid_image'));
return;
}
var height = self.$step1.height();
self.$preloader.height(height);
self.$step1.hide();
PEEP.inProgressNode(self.$preloader);
self.$preloader.show();
var reader = new FileReader();
reader.onload = function(e) {
var image = new Image();
image.onload = function(e) {
var width = this.width;
var height = this.height;
if (width < self.params.minCropSize || height < self.params.minCropSize) {
PEEP.error(PEEP.getLanguageText('base', 'avatar_image_too_small', { width : self.params.minCropSize, height : self.params.minCropSize }));
self.$step1.show();
PEEP.activateNode(self.$preloader);
self.$preloader.hide();
}
else {
var fd = new FormData();
fd.append('file', files[0]);
self.uploadFile(fd);
}
};
image.src = e.target.result;
};
reader.readAsDataURL(files[0]);
});
this.$dropArea.on('dragenter', function(e) {
e.stopPropagation();
e.preventDefault();
self.$dropAreaLabel.html(PEEP.getLanguageText('base', 'drop_image_here'));
});
this.$dropArea.on('dragleave', function(e) {
self.$dropAreaLabel.html(PEEP.getLanguageText('base', 'drag_image_or_browse'));
});
this.$dropArea.on('drop', function(e){
e.preventDefault();
var files = e.target.files || (e.dataTransfer && e.dataTransfer.files);
if (files && files.length > 1) {
PEEP.error(PEEP.getLanguageText('base', 'avatar_drop_single_image'));
}
else {
if ( !files || !self.checkFileType(files[0].type) ) {
PEEP.error(PEEP.getLanguageText('base', 'not_valid_image'));
}
else {
var height = self.$step1.height();
self.$preloader.height(height);
PEEP.inProgressNode(self.$preloader);
self.$preloader.show();
self.$step1.hide();
var fd = new FormData();
fd.append('file', files[0]);
self.uploadFile(fd);
}
}
self.$dropAreaLabel.html(PEEP.getLanguageText('base', 'drag_image_or_browse'));
});
this.uploadFile = function(formData)
{
formData.append('ajaxFunc', 'ajaxUploadImage');
var jqXHR = $.ajax({
xhr: function() {
var xhrobj = $.ajaxSettings.xhr();
if (xhrobj.upload) {
xhrobj.upload.addEventListener('progress', function(event) {
var percent = 0;
var position = event.loaded || event.position;
var total = event.total;
if (event.lengthComputable) {
percent = Math.ceil(position / total * 100);
}
}, false);
}
return xhrobj;
},
url: self.params.ajaxResponder,
type: "POST",
dataType: 'json',
contentType: false,
processData: false,
cache: false,
data: formData,
success: function(data){
if (data.result) {
var ts = new Date().getTime();
self.url = data.url;
self.initCrop(function(){ self.$preloader.hide(); });
}
else
{
if ( data.error )
{
PEEP.error(data.error);
}
else
{
PEEP.error('Undefined error!');
}
document.avatarFloatBox.close();
}
}
});
};
$("body").on("click", ".peep_photo_avatar_hover", function(){
var image = new Image();
var $btn = $(this).find(".avatar_select");
var node = $(this).parents(".peep_photo_item:eq(0)");
$btn.hide();
node.addClass("peep_avatar_preloader");
var timeout;
function hidePreolader () {
node.removeClass("peep_avatar_preloader");
$btn.show();
timeout && window.clearTimeout(timeout);
}
var load = function(e) {
if (this.width < self.params.minCropSize || this.height < self.params.minCropSize) {
PEEP.error(PEEP.getLanguageText('base', 'avatar_image_too_small', { width : self.params.minCropSize, height : self.params.minCropSize }));
hidePreolader();
}
else {
self.id = $btn.data("id");
self.url = $btn.data("url");
self.entityId = $btn.data("eid");
self.entityType = $btn.data("type");
self.initCrop( hidePreolader );
}
};
image.onload = load;
timeout = window.setTimeout(hidePreolader, 30000);
image.src = $btn.data("url");
});
// document.avatarFloatBox.bind('close', function(){
// $("body").off("click", ".avatar_select");
//
// if (self.params.step == 2 && self.params.inputId){
// $("#" + self.params.inputId).val("");
// }
// });
$(".avatar_load_more").click(function(){
var $moreBtn = $(this);
var $parent = $moreBtn.parent();
var offset = $moreBtn.data("offset");
$moreBtn.data("offset", offset + self.params.limit);
$parent.addClass("peep_preloader");
$.ajax({
url: self.params.ajaxResponder,
type: 'POST',
data: { ajaxFunc: 'ajaxLoadMore', entityType : $moreBtn.data("type"), entityId : $moreBtn.data("id"), offset : offset },
dataType: 'json',
success: function(data){
if (data.result) {
var $item = $parent.closest(".peep_photo_item_wrap");
$item.prev().show();
$item.before(data.markup);
PEEP.updateScroll($('.peep_photo_library_wrap'));
$parent.removeClass("peep_preloader");
if ( $moreBtn.data("offset") >= data.count )
{
$item.hide();
}
}
}
});
});
};
?>