/**
 * http://new-dev.ru/
 * author GoldSoft <newdevexpert@gmail.com>
 * Copyright (c) New-Dev.ru
 */

AIREWRITER_KERNEL = {

	__: function(text) {
		return text;
	},

	callFunction: function(func) {
		var dim = func.split(".");
		if (dim.length > 1) {
			return window[dim[0]][dim[1]]();
		} else {
			return window[func]();
		}
	},

	redirectTo: function(url) {
		window.location.href = url;
	},

	confirmDialog: function(dialogText, okFunc, cancelFunc, dialogTitle, options) {

		var kernel = this,
			btns = {};
		
		btns[kernel.__("Нет")] = function() { 
			if (typeof (cancelFunc) == "function") {
				setTimeout(cancelFunc, 50);
			}
			$(this).dialog("destroy");
		};
		
		btns[kernel.__("Да")] = function() { 
			if (typeof (okFunc) == "function") {
				setTimeout(okFunc, 50);
			}
			$(this).dialog("destroy");
		};

		
		var defaults = {
			modal: true,
			resizable: false,
			width: "auto",
			minHeight: 75,
			title: dialogTitle || kernel.__("Необходимо подтверждение"),
			buttons: btns
		};	

		$.extend(defaults, options);
		
		$('<div style="padding: 10px; max-width: 100%; word-wrap: break-word;">' + (dialogText || kernel.__("Вы уверены, что хотите это сделать?")) + "</div>").dialog(defaults);
	},

	showAjaxError: function(data) {
		var kernel = this;
		
		kernel.confirmDialog(
			data.responseText,
			function() {
				$(this).dialog("close");
			},
			null,
			"Ajax error",
			{buttons: null}
		);
	},

	showResponse: function(data, sender) {
		var kernel = this;
		
		if (!data.redirect)
			HideLoading();

		
		if (data.msg) {
			if (data.status == "ok") {
				Growl.info({ title: data.msg.title, text: data.msg.text });
			} else if (data.status == "error") {
				Growl.error({ title: data.msg.title, text: data.msg.text });
			}
		}
		
		if (data.container && data.func) {
			var $target = (data.container == "sender") ? sender : $(data.container);
			$target.html(data.response).fadeIn("slow",function() {
				kernel.callFunction(data.func);
			});
		} else if (data.container) {
			var $target = (data.container == "sender") ? sender : $(data.container);
			$target.html(data.response);
		} else if (data.append_container && data.func) {
			$(data.append_container).append(data.response);
			kernel.callFunction(data.func);
		} else if (data.append_container) {
			$(data.append_container).append(data.response);
		} else if (data.func) {
			kernel.callFunction(data.func);
		}
		
		if (data.redirect) {
			setTimeout(function() {
				if (data.redirect == "self")
					window.location.reload();
				else
					window.location.href = data.redirect;
			}, 1000);
		}
	},

	doAjax: function(sender) {
		var kernel = this,
			url = sender.data("url"),
				query_str = sender.data("vars").replace(/\|/g, "&");
		
		if (query_str.indexOf("&user_hash=") == -1)
			query_str += "&user_hash=" + AIREWRITER_OPTIONS.USER_HASH;
		
		if (typeof url === "undefined") {
			url = AIREWRITER_OPTIONS.IN_ADMINPANEL ? AIREWRITER_OPTIONS.ADMIN_URL : AIREWRITER_OPTIONS.SITE_AJAX_URL;
		}
		
		if (query_str.indexOf("&without_loader=1") === -1)
			ShowLoading("");
		
		$.ajax({
			type: "POST",
			url: url,
			data: query_str,
			dataType: "json",
			success: function(data) {
				if (!data.redirect) {
					sender.attr("disabled", false);
				}
				
				kernel.showResponse(data, sender);
			},
			error: function(data) {
				HideLoading();
				kernel.showAjaxError(data);
			}
		});
		
		return false;
	},
	
	bindAjaxButtons: function() {
		var kernel = this;
		
		$(document).on("click", 'a[data-do="ajax-airewriter"], input[data-do="ajax-airewriter"]', function(event) {
			var sender = $(this);
				
			if (typeof sender.data("confirm") !== "undefined") {

				kernel.confirmDialog(
					sender.data("msg"),
					function() {
						kernel.doAjax(sender);
					}, 
					null, 
					sender.data("title")
				);

			} else {
				kernel.doAjax(sender);
			}
			
			return false;
		});
	},
	
	bindAjaxForms: function() {
		var kernel = this;
		
		$("form.airewriter_ajax_form").submit(function() {
			ShowLoading("");
			$.post(AIREWRITER_OPTIONS.ADMIN_URL, $(this).serialize(), function( data ) {
				kernel.showResponse(data);
			}, "json")
			.fail(function(response) {
				HideLoading();
				kernel.showAjaxError(response);
			});
			
			return false;
		});
	},
	
	parseVarsStr: function(vars) {
		var arr = vars.split("|"),
			varsData = [];
		
		for (var x = 0; x < arr.length; x++) {
			var tmp = arr[x].split("=");
			varsData[unescape(tmp[0])] = unescape(tmp[1]).replace(/[+]/g, " ");
		}
		
		return varsData;
	},
	
	setDataVarsValue: function(sender, key, value) {
		var vars = sender.data("vars"),
			str = "|" + key + "=" + value;
		
		if (vars.indexOf(key) === -1) {
			vars += str;
		} else {
			var re = new RegExp("\\|" + key + "=[^\\|]*"); 
			vars = vars.replace(re, str);
		}
		
		sender.data("vars", vars);
	},
	
	execAjaxAiReWriter: function($sender) {
		var $el = $sender.prev(),
			kernel = this;
		
		if (!kernel.isXfieldElement($el)) {
			var $container = $el.closest("td.xfields");
			
			if ($container.length) {
				$el = $container.find("[name^=\"xfield\[\"]");
			} else {
				$container = $el.closest("div");
				
				if ($container.length) {
					$el = $container.find("[name^=\"xfield\[\"]");
				} else {
					Growl.error({ title:kernel.__("Ошибка"), text:kernel.__("Контейнер дополнительного поля не найден") });
					return false;
				}
			}
		}
		
		if (kernel.isXfieldElement($el)) {
			var site_url = $el.val(),
				xfieldname = $el.prop("name");
			
			this.setDataVarsValue($sender, "site_url", site_url);
			
			this.doAjax($sender);
		} else {
			Growl.error({ title:kernel.__("Ошибка"), text:kernel.__("Элемент дополнительного поля не найден") });
			return false;
		}
	},
	
	isXfieldElement: function($el) {
		return (
			$el.length
			&&
			typeof $el.attr("name") !== "undefined"
			&&
			$el.attr("name") !== false
			&&
			$el.attr("name").indexOf("xfield[") === 0
		);
	},
	
	setXfieldValue: function(vars_data) {
		var data = new FormData(),
			xfieldname = AIREWRITER_OPTIONS.CFG.site_screen_xfieldname;
		
		data.append("mod", "upload");
		data.append("subaction", "upload");
		data.append("news_id", vars_data["post_id"]);
		data.append("area", "xfieldsimage");
		data.append("author", vars_data["user_login"]);
		data.append("xfname", xfieldname);
		data.append("user_hash", AIREWRITER_OPTIONS.USER_HASH);
		
		
		fetch(vars_data["url"])
			.then(response => response.blob())
			.then(blob => {
				const filename = vars_data["url"].split("/").reverse()[0];
				const myFile = new File([blob], filename, {type: blob.type});
				data.append("qqfile", myFile);
				
				$.ajax({
					url: AIREWRITER_OPTIONS.SITE_URL + "engine/ajax/controller.php",
					type: "POST",
					data: data,
					dataType: "json",
					contentType: false,//!
					cache: false,
					processData: false,
					success: function(response) {
						//console.log(response);
						
						
						
						
						
						var id = "LASTDELETE";
						
						if ( response.success ) {
							var returnbox = response.returnbox;
							var returnval = response.xfvalue;

							returnbox = returnbox.replace(/&lt;/g, "<");
							returnbox = returnbox.replace(/&gt;/g, ">");
							returnbox = returnbox.replace(/&amp;/g, "&");

							$('#uploadfile-'+id+' .qq-status').html('AAAAAAAALAST');
							$('#uploadedfile_' + xfieldname).html( returnbox );
							$('#xf_' + xfieldname).val(returnval);

							$('#xfupload_' + xfieldname + ' .qq-upload-button, #xfupload_' + xfieldname + ' .qq-upload-button input').attr("disabled","disabled");
							
							setTimeout(function() {
								$('#uploadfile-'+id).fadeOut('slow', function() { $(this).remove(); });
							}, 1000);

						} else {
							$('#uploadfile-'+id+' .qq-status').html('BBBBBBBBBBBBLAST');

							if( response.error ) $('#uploadfile-'+id+' .qq-status').append( '<br /><span class="text-danger">' + response.error + '</span>' );

							setTimeout(function() {
								$('#uploadfile-'+id).fadeOut('slow');
							}, 4000);
						}
						
						
						
						
						
						
						
					},
					error: function() {
						alert("failed");
					}
				});
				
			});
		
		return false;
		
		
		
	},	
	
	
	
	
};
