View file Загрузка фото AJAX/js/photo/uploader.js

File size: 6.52Kb
var LANG_DROP_TO_UPLOAD = 'Перетащите сюда файлы';
var LANG_CANCEL = 'Отмена';
var LANG_ERROR = 'Произошла ошибка';
var LANG_SELECT_UPLOAD = 'Выберите файл';
var fileTpl = '<span style="float: right;"><img class="qq-files-list-file-cancel" upload-file-id="" src="/style/icons/delete.gif" alt="" /> <img id="edit_start" class="hidden" src="/style/icons/edit.gif" alt="" /> <img id="delete_foto" class="hidden" src="/style/icons/delete.gif" alt="" /></span>'
	+ '<div class="preview hidden"><img src=""></div>'
	+ '<div> '
	+ '<img id="file_icon" /> '
	+ '<span id="file_name"></span>'
	+ '</div>'
	+ '<div class="qq-progress-wrapper"><div class="qq-progress"></div></div>'
	+ '<div class="edit">'
	+ 'Имя:<br><input type="text" id="edit_name"><br>'
	+ 'Описание:<br><textarea id="edit_desc"></textarea><br>'
	+ '<input type="submit" id="edit_save_btn" value="Сохранить"><br>'
	+ '</div>';
var EDIT_PHOTO_URL = '/ajax/photo/edit_photo.php';
var DELETE_PHOTO_URL = '/ajax/photo/delete_photo.php';

function handleJsonErrors(json) {
	if (json == undefined || json.error != undefined) {
		showError(json == undefined ? 'Произошла ошибка' : json.error);
		return true;
	}

	return false;
}

String.prototype.trim = function trim(text) {
	return this.replace(/^\s*/, '').replace(/\s*$/, '');
}

function showError(error) {
	alert(error);
}


function PhotoUploader(id_gallery) {
	var self = this;
	var file_uploader_url = '/ajax/photo/upload_file.php?id_gallery=' + id_gallery;
	var image_icon_src = '/style/themes/default/loads/14/jpg.png';

	var fileUploaderWrapperElement = document.getElementById('file_uploader_wrapper');
	var fileUploaderElement = fileUploaderWrapperElement.querySelector('#file_uploader');
	var filesListElement = document.getElementById('fu_files_list');
	var $fileUploaderElement = $(fileUploaderElement);
	var $filesListElement = $(filesListElement);

	var editSaveQueue = {},
		filesQueue = {},
		deleteQueue = {};

	var uploader;

	$(document).ready(function () {
		var uploader = self.initUploader();
	});

	this.initUploader = function () {
		return new qq.FileUploader({
			element: fileUploaderElement, 
			listElement: filesListElement, 
			action: file_uploader_url, 
			multiple: true, 
			debug: true, 
			onSubmit: function(id, fileName) {
				var fileElement = $('<div>', {html: fileTpl, class: 'main'}).appendTo($filesListElement);
				fileElement.find('#file_icon').attr('src', image_icon_src);
				fileElement.find('#file_name').text(fileName);
				filesQueue[id] = fileElement;

				var cancel = fileElement.find('.qq-files-list-file-cancel');
				cancel.show();
				cancel.attr('upload-file-id', id);
			}, 
			onProgress: function(id, fileName, loaded, total) {
				var fileElement = filesQueue[id];
				if (!fileElement)
					return;

				fileElement.find('.qq-progress-wrapper').show();
				fileElement.find('.qq-progress').width(((loaded / total) * 100) + '%');
			}, 
			onCancel: function(id, fileName) {
				var fileElement = filesQueue[id];
				fileElement.remove();
				delete filesQueue[id];
			}, 
			onComplete: function(id, fileName, result) {
				var fileElement = filesQueue[id];
				if (result != undefined) {
					if (result.status == 1) {
						fileElement.attr('data-id-foto', result.id_foto);
						fileElement.find('.qq-progress-wrapper').hide();
						fileElement.find('.qq-files-list-file-cancel').hide();
						var $previewElement = $('.preview', fileElement);
						$previewElement.show();
						$('img', $previewElement).attr('src', '/foto/foto128/' + result.id_foto + '.jpg');
						$('#file_name', fileElement).html('<a href="/foto/' + id_current_user + '/' + id_gallery + '/' + result.id_foto + '/">' + result.name + '.' + result.extension + '</a>');
						var $editElement = $('.edit', fileElement);
						$('#edit_name', $editElement).val(result.name_input);

						self.addEdit(result.id_foto);
						self.addDelete(result.id_foto);
						return;
					} else {
						showError(result.error);
					}
				} else {
						showError('Произошла ошибка');
				}
				fileElement.remove();
				delete filesQueue[id];
			}, 
			showMessage: function () {}
		});
	}

	this.cancelUploadingFile = function(id) {
		uploader._handler.cancel(id);
	}

	this.addEdit = function (id_foto) {
		var $fileElement = $('[data-id-foto=' + id_foto + ']', $filesListElement);
		$fileElement.addClass('editing');
		var $editElement = $('.edit', $fileElement);
		var $editNameElement = $('#edit_name', $editElement);
		var $editDescElement = $('#edit_desc', $editElement);
		var $editSaveBtn = $('#edit_save_btn', $editElement);

		var $editStartBtn = $('#edit_start', $fileElement);
		$editStartBtn.show();

		$editStartBtn.on('click', function () {
			$fileElement.toggleClass('editing');
		})

		$editSaveBtn.on('click', function (e) {
			e.preventDefault();

			if (editSaveQueue[id_foto] != undefined) {
				showError('Не так быстро');
				return;
			}

			var name = $editNameElement.val().trim();
			var desc = $editDescElement.val().trim();

			if (name.length == 0) {
				showError('Введите название файла');
				return;
			}

			$.ajax({
				url: EDIT_PHOTO_URL, 
				type: 'post', 
				data: {
					id_gallery: id_gallery, 
					id_foto: id_foto, 
					name: name, 
					desc: desc
				}, 
				success: function (json) {
					console.log(json);
					if (handleJsonErrors(json))
						return;
					$('#file_name', $fileElement).html('<a href="/foto/' + id_current_user + '/' + id_gallery + '/' + id_foto + '/">' + json.name + '.' + json.extension + '</a>');
					$editStartBtn.click();
				}, 
				complete: function () {
					delete editSaveQueue[id_foto];
				}
			});
		})
	}

	this.addDelete = function (id_foto) {
		var $fileElement = $('[data-id-foto=' + id_foto + ']', $filesListElement);
		var $deleteBtn = $('#delete_foto', $fileElement);
		$deleteBtn.show();

		$deleteBtn.on('click', function () {
			if (deleteQueue[id_foto]) {
				showError('Не так быстро');
				return;
			}

			$.ajax({
				url: DELETE_PHOTO_URL, 
				type: 'post', 
				data: {
					id_gallery: id_gallery, 
					id_foto: id_foto
				}, 
				success: function (json) {
					if (handleJsonErrors(json))
						return;

					$fileElement.hide(100, function () {
						$fileElement.remove();
					});
				}, 
				complete: function () {
					delete deleteQueue[id_foto];
				}
			});
		});
	}

}