Newer
Older
WebMCR / upload / themes / default / js / global.js
@Qexy.org Qexy.org on 23 Sep 2016 21 KB Beta 1.4.0
var mcr = {
	debug: true, // Включение/отключение логирования ошибок в консоль [true|false]

	// Получение информации, загружаемой с сервера
	meta_data: JSON.parse($('meta[name="data"]').attr('content')),

	// Функция показа/скрытия информации о загрузке
	loading: function(status){

		if(status!==false){
			if($('#js-loader').is(':hidden')){ $('#js-loader').fadeIn(500); }
		}else{
			if($('#js-loader').is(':visible')){ $('#js-loader').fadeOut(500); }
		}

		return (status===false) ? false : true;
	},

	/*
	 * Оповещение - показывает блок оповещения с различной информацией и автоматически выключает показ информации о загрузке (предыдущую функцию)
	 *
	 * @param title - Название блока
	 *
	 * @param message - Сообщение оповещения
	 *
	 * @param type - Тип оповещения 2-Ошибка(красный блок)|3-Успех(зеленый блок)|4-информация(синий блок)|остальное-примечание(оранжевый блок)
	 *
	 * @param result - Возвращаемый результат [true|false]
	 */
	notify: function(title, message, type, result){

		var that = this;

		type = (type===undefined) ? 0 : parseInt(type);

		switch(type){
			case 2: type = 'alert-error'; break;
			case 3: type = 'alert-success'; break;
			case 4: type = 'alert-info'; break;

			default: type = ''; break;
		}

		$('#js-notify').removeClass('alert-error alert-success alert-info').addClass(type);

		$('#js-notify > #title').html(title);
		$('#js-notify > #message').html(message);

		$('#js-notify').fadeIn(300);

		that.loading(false);

		$('html, body').animate({ scrollTop: $('#js-notify').offset().top-50}, 'fast');

		if(typeof timeout != 'undefined'){ clearTimeout(timeout); }

		timeout = setTimeout(function(){ that.notify_close(); }, 2500);

		return (result===true) ? true : false;
	},

	// Скрывает оповещение и очищает его содержимое
	notify_close: function(){
		$('#js-notify').fadeOut(500);
	},

	// Логгер ошибок в консоль
	logger: function(data){
		if(this.debug){ console.log(data); }
	},

	// Получение параметра из URL по ключу
	getUrlParam: function(name){
		name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
		var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
			results = regex.exec(location.search);
		return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
	},

	// Получение всех параметров из URL
	getUrlParams: function(){
		var string = location.search.split('?')[1];

		var result = {};

		string = decodeURIComponent(string);

		if(string==undefined || string=='undefined'){ return result; }

		$.each(string.split('&'), function(key, val){
			expl = val.split('=');

			result[expl[0]] = expl[1];
		});

		return result;
	},

	// Изменение параметра url
	changeUrlParam: function(json){
		var get = this.getUrlParams();

		$.each(json, function(key, value){
			if(get[key]===undefined || value!==false){ get[key] = value; }
			if(value===false && get[key]!==undefined){ delete get[key]; }
		});

		if(Object.keys(get).length<=0){ location.search = ''; return false; }

		var string = '?';

		$.each(get, function(key, val){
			string = string+key+'='+val+'&';
		});

		string = string.substring(0, string.length - 1);

		location.search = string;

		return true;
	},

	/*
	 * Результирующий запрос - запрос, возвращающий результат.
	 *
	 * @param method - метод отправки запроса [GET|POST]
	 *
	 * @param url - Адрес на который будет отправляться запрос
	 *
	 * @param params - Параметры запроса [key1=param&key2=param2...]
	 *
	 */
	send_ret_req: function(method, url, params){
		var req = null;
		try { req = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {
			try { req = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {
				try { req = new XMLHttpRequest(); } catch(e) {}
			}
		}
		if(req == null){ throw new Error(lng.e_xmlhr); }

		req.open(method, url, false);
		req.send(params);

		return req.responseText;
	},

	// Получение информации о откртых и закрытых спойлерах
	spl_items: Cookies.getJSON('spl_items'),

	init_filemanager: function(pge){
		var that = this;

		var loadpage = (pge===undefined) ? 1 : pge;

		that.loading();

		var formdata = new FormData();
		
		formdata.append('mcr_secure', that.meta_data.secure);
		formdata.append('page', loadpage);

		$.ajax({
			url: "index.php?mode=ajax&do=filemanager",
			dataType: "json",
			type: 'POST',
			contentType: false,
			processData: false,
			data: formdata,
			error: function(data){
				that.logger(data);
				that.notify(lng.error, lng.e_filemanager);
			},

			success: function(data){

				if(!data._type){ that.loading(false); return; }

				$('.file-manager > .lastfiles').empty();

				$.each(data._data, function(key, ar){

					if(ar.size < 1024){
						var size = ar.size+' '+lng.b;
					}else if(ar.size < 1048576){
						var size = (ar.size / 1024).toFixed(2);
						size = size+' '+lng.kb;
					}else if(ar.size < 1073741824){
						var size = (ar.size / 1024 / 1024).toFixed(2);
						size = size+' '+lng.mb;
					}else{
						var size = (ar.size / 1024 / 1024 / 1024).toFixed(2);
						size = size+' '+lng.gb;
					}

					$('.file-manager > .lastfiles').append('<div class="file-line" id="'+ar.uniq+'">'+
							'<div class="line-uniq"><a href="'+ar.link+'">'+ar.uniq+'</a> <a href="#" rel="tooltip" title="'+lng.change+'" class="file-edit icon-edit"></a></div>'+
							'<div class="line-oldname">'+ar.oldname+'</div>'+
							'<div class="line-size">'+size+'</div>'+
							'<div class="line-downloads"><i class="icon-download" rel="tooltip" title="'+lng.count_downloads+'"></i> '+ar.downloads+'</div>'+
							'<div class="line-info"><i class="icon-info-sign" rel="tooltip" title="'+lng.added+': '+ar.login+' | '+lng.date+': '+ar.date+'"></i></div>'+
							'<div class="line-act"><a href="#" rel="tooltip" title="'+lng.delete+'" class="file-remove icon-remove"></a></div>'+
						'</div>');

					that.loading(false);
				});

				$('.file-manager > .lastfiles').append('<div class="pagination" id="'+loadpage+'"><ul>'+
						'<li><a href="#" class="ajax-pagin-left"><</a></li>'+
						'<li><a href="#" class="ajax-pagin-right">></a></li>'+
					'</ul></div>');
			},

			complete:function(){

				if(pge!==undefined){
					$('html, body').stop().animate({
						scrollTop: $('.file-manager').offset().top
					}, 0);
				}
			}
		});
	}
};

// Функции, вызываемые при загрузке
$(function(){
	$('input[type="file"].file-inputs').bootstrapFileInput();

	// Загрузка файлового менеджера(если доступен)
	if($('.file-manager').length > 0){ mcr.init_filemanager(); }

	// Добавление элемента защиты в html код страницы
	$('form[method="post"]').prepend('<input type="hidden" name="mcr_secure" value="'+mcr.meta_data.secure+'">');

	// Включение обработчика tooltip'ов от bootstrap
	$('body').tooltip({selector: '[rel=tooltip]'});
	//$('[rel=tooltip]').tooltip({container: 'body'}); // If jump elements

	// Обработчик закрытия блока оповещений
	$('body').on('click', '#js-notify > #close', function(){

		mcr.notify_close();

		return false;
	});

	$("body").on('click', '#close-notify', function(){
		$(".block-notify").fadeOut("normal", function(){
			$(this).remove();
		});
		return false;
	});
	
	$("body").on("click", ".check-all", function(){
		var element = $(this).attr("data-for");
		var val = false;
		if($(this)[0].checked){ val = true; }
		$("."+element).prop('checked', val);

	});

	$('body').on('click', '.remove', function(){

		if($(this).attr("data-checkbox")!='false'){
			var element = $(this).attr("data-for");
			var length = $('.'+element+':checked').length;

			if(length<=0){
				return mcr.notify(lng.error, lng.not_selected);
			}

		}
		
		var text = $(this).attr("data-text");
		if(!confirm(text)){ return false; }

		return true;
	});

	$(".mcr-debug .action").on("click", function(){
		$(".mcr-debug").toggleClass("open");
		return false;
	});

	// Обработчик клика по ББ-кодам
	$("body").on("click", ".bb-panel .bb", function(){

		if($(this).hasClass('bb-modal')){ return true; }

		// Получает идентификатор панели ББ-кодов и поля ввода
		var panel_id = $(this).closest(".bb-panel").attr("id");

		// Получаем поле ввода
		var panel_obj = $('textarea[data-for="'+panel_id+'"]')[0];

		// Фокусируем поле ввода
		panel_obj.focus();

		// Получаем позиции курсора
		var pos1 = panel_obj.selectionStart, pos2 = panel_obj.selectionEnd;

		// Получаем теги элементов
		var leftcode = ($(this).attr("data-left")==undefined) ? '' : $(this).attr("data-left");
		var rightcode = ($(this).attr("data-right")==undefined) ? '' : $(this).attr("data-right");

		var val = panel_obj.value;

		// Вставка ББ-кода в содержимое поля ввода на места выделения
		panel_obj.value = val.substr(0,pos1) + leftcode + val.substr(pos1,pos2-pos1) + rightcode + val.substr(pos2,val.length);

		// Устанавливаем позиции курсора после вставки ББ-кода
		panel_obj.setSelectionRange(pos1+leftcode.length,pos2+leftcode.length);

		return false;
	});

	$("body").on("click", ".bb-panel .bb.bb-modal", function(){

		// Получает идентификатор панели ББ-кодов и поля ввода
		var panel_id = $(this).closest(".bb-panel").attr("id");

		// Получаем поле ввода
		var panel_obj = $('textarea[data-for="'+panel_id+'"]')[0];

		var modal_id = $(this).attr('href');

		// Фокусируем поле ввода
		panel_obj.focus();

		// Получаем позиции курсора
		var pos1 = panel_obj.selectionStart, pos2 = panel_obj.selectionEnd;

		// Получаем выделенный текст
		var copy = panel_obj.value.substring(pos1, pos2);

		if($(this).attr('data-paste').length>0){
			var insert = parseInt($(this).attr('data-paste'));
			// Вставляем выделенный текст в поле модального окна
			$(modal_id+' .bb-input').eq(insert).val(copy);
		}

	});

	$("body").on("click", ".bb-panel .bb-insert-input", function(){

		// Получает идентификатор панели ББ-кодов и поля ввода
		var panel_id = $(this).closest(".bb-panel").attr("id");

		// Получаем поле ввода
		var panel_obj = $('textarea[data-for="'+panel_id+'"]')[0];

		// Фокусируем поле ввода
		panel_obj.focus();

		// Получаем позиции курсора
		var pos1 = panel_obj.selectionStart;
		var pos2 = panel_obj.selectionEnd;

		var modal = $(this).closest('.modal');

		var inputs = modal.find('.bb-input');
		var code = modal.find('.data-code');
		var leftcode = code.attr('data-left');
		var rightcode = code.attr('data-right');
		var centercode = code.attr('data-center');

		$.each(inputs, function(key, elem){

			leftcode = leftcode.replace('*'+key+'*', elem.value);
			rightcode = rightcode.replace('*'+key+'*', elem.value);
			centercode = centercode.replace('*'+key+'*', elem.value);
		});

		code = leftcode + centercode + rightcode;

		var val = panel_obj.value;

		// Вставка ББ-кода в содержимое поля ввода на места выделения
		panel_obj.value = val.substr(0,pos1) + code + val.substr(pos2,val.length);

		$('#'+modal.attr('id')).modal('hide');

		pos1 = pos1+leftcode.length;
		pos2 = pos1+centercode.length;

		panel_obj.setSelectionRange(pos1,pos2);

		return false;
	});

	// Обработчик клика по очистке формы от ББ-Кодов
	$('body').on('click', '.bb-panel .bb-clear', function(){

		var panel = $(this).closest('.bb-panel');

		var panel_id = panel.attr('id'), elements = panel.find('.bb');

		var panel_obj = $('textarea[data-for="'+panel_id+'"]');

		var new_val = panel_obj.val();

		elements.each(function(){

			var left = $(this).attr('data-left');
			if($(this).closest('.bb-smiles').length<=0){
				var reg = new RegExp('\\[(\\w+)(="\\*(\\d+)\\*")?\\]', 'ig');
				var find = reg.exec(left);
			}else{
				var find = null;
				new_val = new_val.replace(left, '');
			}

			if(find!==null){

				var repl = new RegExp('\\[(\\/)?'+find[1]+'(="([\\w\\s\\-\\.\\:\\;\\+\\|\\,\\?\\&\\=\\/\\*]+)?")?\\]', 'ig');
				new_val = new_val.replace(repl, '');
			}
		});

		panel_obj[0].value = new_val;

		return false;
	});

	$("#search-selector a").click(function(){

		var search_val = $("#search-hidden").val();

		$("#search-selector a#"+search_val).parent().removeClass("active");

		var id = this.id;

		$("#search-hidden").val(id);

		$(this).parent().addClass("active");

		return false;

	});

	$("body").on("click", ".edit", function(){
		
		var element = $(this).attr("data-for");
		var length = $('.'+element+':checked').length, link = $(this).attr("data-link");

		if(length!=1){
			return mcr.notify(lng.error, lng.only_one);
		}

		var id = $('.'+element+':checked').val();

		window.location.href = link+id;
		
		return false;
	});

	// Обработка всех групп меню в цикле
	$('.spl-body').each(function(){
		// ID группы
		var id = $(this).attr('id');

		// Проверка на существование записи о группе в куках
		if(mcr.spl_items===undefined || mcr.spl_items[id]===undefined){ return; }

		// Изменение класса группы при условии
		if(mcr.spl_items[id]===true){
			$(this).toggleClass('closed');
			$('.spl-btn[data-for="'+id+'"]').toggleClass('closed');
		}
	});
	
	// Действие при клике на кнопку спойлера
	$('body').on('click', '.spl-btn', function(){

		var that = $(this);

		if(that.attr('data-block')!==undefined){

			that.closest(that.attr('data-block')).find('.spl-body').slideToggle("fast", function(){
				that.toggleClass('closed');
				$(this).toggleClass('closed');
			});

			return false;
		}

		var element = $(this).attr("data-for");

		if(mcr.spl_items===undefined){ mcr.spl_items = {}; }

		// Изменение класса при нажатии и выставление печенек
		$(".spl-body#"+element).slideToggle("fast", function(){
			that.toggleClass('closed');
			$(this).toggleClass('closed');

			mcr.spl_items[element] = (!mcr.spl_items[element]) ? true : false;
			
			Cookies.set('spl_items', mcr.spl_items, { expires: 365 });
		});

		return false;
	});

	$('body').on('click', '.qxbb-spoiler > .qxbb-spoiler-btn', function(){

		var body = $(this).closest('.qxbb-spoiler').find('.qxbb-spoiler-body');

		if(body.is(':visible')){
			body.fadeOut('fast');
		}else{
			body.fadeIn('normal');
		}

		return false;
	});

	// Класс для ссылок с отменой редиректа
	$("body").on("click", ".false", function(){ return false; });

	$('body').on('input change', '.file-manager input[name="files"]', function(){

		mcr.loading();

		var formdata = new FormData();

		$.each($(this)[0].files, function(key, value){
			if(value.size > 51200000){ return; }
			formdata.append('files'+key, value);
		});
		
		formdata.append('mcr_secure', mcr.meta_data.secure);

		$.ajax({
			url: "index.php?mode=ajax&do=filemanager&op=upload",
			dataType: "json",
			type: 'POST',
			contentType: false,
			processData: false,
			data: formdata,
			error: function(data){
				mcr.logger(data);
				mcr.notify(lng.error, lng.e_file_load);
			},

			success: function(data){

				if(!data._type){ return mcr.notify(data._title, data._message); }

				if(data._data.errors.length > 0){ mcr.notify(lng.warning, lng.e_files_not_loaded); mcr.logger(data._data.errors); }

				$.each(data._data.data, function(key, ar){

					if(ar.size < 1024){
						var size = ar.size+' б';
					}else if(ar.size < 1048576){
						var size = ar.size+' Кб';
					}else if(ar.size < 1073741824){
						var size = ar.size+' Мб';
					}else{
						var size = ar.size+' Гб';
					}

					$('.file-manager > .lastfiles').prepend('<div class="file-line" id="'+ar.uniq+'">'+
							'<div class="line-uniq"><a href="'+ar.link+'">'+ar.uniq+'</a> <a href="#" rel="tooltip" title="'+lng.change+'" class="file-edit icon-edit"></a></div>'+
							'<div class="line-oldname">'+ar.oldname+'</div>'+
							'<div class="line-size">'+size+'</div>'+
							'<div class="line-downloads"><i class="icon-download" rel="tooltip" title="'+lng.count_downloads+'"></i> '+ar.downloads+'</div>'+
							'<div class="line-info"><i class="icon-info-sign" rel="tooltip" title="'+lng.added+': '+ar.login+' | '+lng.date+': '+ar.date+'"></i></div>'+
							'<div class="line-act"><a href="#" rel="tooltip" title="'+lng.delete+'" class="file-remove icon-remove"></a></div>'+
						'</div>');

					$('.file-manager .file-input-wrapper input[type="file"].file-inputs').attr('title', lng.drop_files_here);
					$('.file-manager .file-input-wrapper > span').text(lng.drop_files_here);
					$('.file-manager .file-input-wrapper input[type="file"].file-inputs').removeAttr('style');

					mcr.loading(false);
				});
			}
		});

		return false;
	});

	$('body').on('click', '.file-manager .file-remove', function(){

		mcr.loading();

		var that = $(this);

		var id_line = that.closest('.file-line').attr('id');

		var formdata = new FormData();

		formdata.append('mcr_secure', mcr.meta_data.secure);
		formdata.append('id', id_line);

		$.ajax({
			url: "index.php?mode=ajax&do=filemanager&op=remove",
			dataType: "json",
			type: 'POST',
			contentType: false,
			processData: false,
			data: formdata,
			error: function(data){
				mcr.logger(data);
				mcr.notify(lng.error, lng.e_file_delete);
			},
			success: function(data){
				if(!data._type){ return mcr.notify(data._title, data._message); }

				that.closest('.file-line').fadeOut('normal', function(){
					$(this).remove();
					mcr.loading(false);
				});
			}
		});

		return false;
	});

	$('body').on('click', '.file-manager .file-edit', function(){

		mcr.loading();

		var that = $(this);

		var text = that.prev('a').text();

		if(!that.hasClass('edit-active')){
			if(that.hasClass('icon-edit')){ that.removeClass('icon-edit'); }
			that.addClass('icon-ok edit-active');
			that.prev('a').remove();
			$('<input class="file-edit-input" type="text" value="'+text+'">').insertBefore(that);
			mcr.loading(false);
			return false;
		}

		var id_line = that.closest('.file-line').attr('id');
		var new_val = that.prev('.file-edit-input').val();

		if(new_val.length <= 0){ return mcr.notify(lng.error, lng.e_id_not_filled); }

		var formdata = new FormData();

		formdata.append('mcr_secure', mcr.meta_data.secure);
		formdata.append('id', id_line);
		formdata.append('val', new_val);

		$.ajax({
			url: "index.php?mode=ajax&do=filemanager&op=edit",
			dataType: "json",
			type: 'POST',
			contentType: false,
			processData: false,
			data: formdata,
			error: function(data){
				mcr.logger(data);
				mcr.notify(lng.error, lng.e_file_edit);
			},
			success: function(data){
				if(!data._type){ return mcr.notify(data._title, data._message); }

				if(that.hasClass('icon-ok')){ that.removeClass('icon-ok'); }
				if(that.hasClass('edit-active')){ that.removeClass('edit-active'); }
				that.addClass('icon-edit');

				that.prev('.file-edit-input').remove();

				$('<a href="'+data._data.link+'">'+data._data.uniq+'</a>').insertBefore(that);

				that.closest('.file-line').attr('id', data._data.uniq);

				mcr.loading(false);
			}
		});

		return false;
	});

	$('body').on('click', '.pagination .ajax-pagin-left, .pagination .ajax-pagin-right', function(){
		var that = $(this);

		var page = $(this).closest('.pagination').attr('id');

		page = ($(this).hasClass('ajax-pagin-left')) ? parseInt(page)-1 : parseInt(page)+1;

		mcr.init_filemanager(page);

		return false;
	});

	$('.cpp').minicolors();

	$('body').on('click', '.is_auth_user', function(){
		if(!mcr.meta_data.is_auth){ mcr.notify(lng.error, lng.e_auth, false); return false; }
	});

	function fd_ac_users(query){
		var formdata = new FormData();

		formdata.append('mcr_secure', mcr.meta_data.secure);
		formdata.append('query', query);

		return formdata;
	}

	$('body').on('input', 'input[type="text"].ac_users', function(){

		var that = $(this);

		var formdata = new FormData();

		formdata.append('mcr_secure', mcr.meta_data.secure);
		formdata.append('query', that.val());

		that.typeahead({
			items: 10,
			minLength: 2,
			source: function(query, process){
				return $.ajax({
					url: "index.php?mode=ajax&do=ac_users",
					dataType: 'json',
					type: 'POST',
					async: true,
					cache: false,
					contentType: false,
					processData: false,
					data: fd_ac_users(query),
					error: function(data){
						mcr.logger(data);
						mcr.notify(lng.error, 'warn');
					},

					success: function(data){
						if(!data._type){ return; }

						process(data._data);
					}
				});
			},

			matcher: function (param){
				return true;
			}
		});
	});
	
});