
//global variables
var g_dataProviderUC = {
		pathSelectImages: null,
		pathSelectImagesBase:null,
		urlSelectImagesBase:null,
		objBrowserImages: null,
		objBrowserAudio: null
};

function UniteProviderAdminUC(){

	var t = this;
	var g_parent;

	var g_temp = {
		keyUrlAssets: "[url_assets]/",
	};

	/**
	 * open new add image dialog
	 */
	function openNewMediaDialog(title,onInsert,isMultiple, type){

		if(isMultiple == undefined)
			isMultiple = false;

		var mediaTypes = type;
		if(typeof mediaTypes === "string" && mediaTypes.indexOf(",") !== -1)
			mediaTypes = mediaTypes.split(",");

		var hasSvg = false;
		if(Array.isArray(mediaTypes)){
			mediaTypes = mediaTypes.map(function(item){
				item = jQuery.trim(item);
				if(item === "svg"){
					hasSvg = true;
					return "image/svg+xml";
				}
				return item;
			}).filter(function(item){
				return item !== "";
			});
		}else if(mediaTypes === "svg"){
			hasSvg = true;
			mediaTypes = "image/svg+xml";
		}

		// Media Library params
		let options = {
			//frame:      'post',
            //state:      'insert',
			title : title,
			multiple : isMultiple,
			library : { type : mediaTypes },
			button : { text : 'Insert' }
		}

		var frame = wp.media(options);		

		// if SVG only
		if (hasSvg === true) {
			frame.on('open', function() {
				setTimeout(() => {
					const fileInputs = document.querySelectorAll('.media-frame input[type="file"]');
					fileInputs.forEach(input => {
						input.setAttribute('accept', '.svg');
					});
				}, 300);
			});
		}

		// Runs on select
		frame.on('select', function(){
			var objSettings = frame.state().get('selection').first().toJSON();

			var selection = frame.state().get('selection');
			var arrImages = [];

			if(isMultiple == true){		//return image object when multiple
			    selection.map( function( attachment ) {
			    	var objImage = attachment.toJSON();
			    	var obj = {};
			    	obj.url = objImage.url;
			    	obj.id = objImage.id;
			    	arrImages.push(obj);
			    });
				onInsert(arrImages);
			}else{		//return image url and id - when single
				onInsert(objSettings.url, objSettings.id);
			}

		});

		// Open ML
		frame.open();
	}


	/**
	 * open new image dialog
	 */
	function openNewImageDialog(title, onInsert, isMultiple, type = 'image'){

		openNewMediaDialog(title, onInsert, isMultiple, type);

	}


	/**
	 * open audio select dialog
	 */
	function openAudioDialog(title, onInsert, isMultiple){

		openNewMediaDialog(title, onInsert, isMultiple, "audio");

	}


	/**
	 * open old add image dialog
	 */
	function openOldImageDialog(title,onInsert){
		var params = "type=image&post_id=0&TB_iframe=true";

		params = encodeURI(params);

		tb_show(title,'media-upload.php?'+params);

		window.send_to_editor = function(html) {
			 tb_remove();
			 var urlImage = jQuery(html).attr('src');
			 if(!urlImage || urlImage == undefined || urlImage == "")
				var urlImage = jQuery('img',html).attr('src');

			onInsert(urlImage,"");	//return empty id, it can be changed
		}
	}


	/**
	 * test media editor
	 */
	function testMediaEditor(){

		/*
		trace("open dialog");
		trace(wp.media.gallery);
 		trace(wp.media);

 	    var frameStates = {
 	    	      create: 'gallery',
 	    	      add: 'gallery-library',
 	    	      edit: 'gallery-edit'
 	    	    };

		// Open the media dialog

 	    var attachments = wp.media.query({
 	       orderby: 'post__in',
 	       order: 'ASC',
 	       type: 'image',
 	     });

 	     var objSelection = new wp.media.model.Selection(attachments.models, {
 	       props: attachments.props.toJSON(),
 	       multiple: true
 	     });


 		var options = {
		    title: 'Add Gallery',
		    state:"gallery",	//gallery-library, gallery-edit
		    library: {
		    	orderby:"date",
		        query:"true"
		    },
		    multiple: true,
		    modal:true,
		    mode:["select"],
		  //  selection: objSelection,
		    uploader:true
 		};

 		//var objFrame = wp.media(options);
 		//objFrame.open();


 		/*
		wp.media()
		// On select, get the selected images
		.on('select', function() {

			trace("select");

		})
		// Open the dialog
		.open(options);

		var objFrame = wp.media.editor.open( null, options );
		objFrame.on("select",function(){

			trace("select!!!");

		});

		//wp.media.gallery.edit('[gallery ids=""]');
		return(false);
		*/
	}



	/**
	 * open "add image" dialog
	 */
	this.openAddImageDialog = function(title, onInsert, isMultiple, source, type = 'image'){

		if(source == "addon"){
			openAddonImageSelectDialog(title, onInsert);
			return(false);
		}

		if(typeof wp != "undefined" && typeof wp.media != "undefined")
			openNewImageDialog(title,onInsert,isMultiple, type);
		else{
			openOldImageDialog(title,onInsert);
		}

	};


	/**
	 * open "add image" dialog
	 */
	this.openAddMp3Dialog = function(title, onInsert, isMultiple, source){


		if(typeof wp == "undefined" || typeof wp.media == "undefined"){
			trace("the audio select dialog could not be opened");
			return(false);
		}

		if(source == "addon"){
			openAddonAudioSelectDialog(title, onInsert);
			return(false);
		}else{

			openAudioDialog(title,onInsert,isMultiple);

		}

	};


	/**
	 * get shortcode
	 */
	this.getShortcode = function(alias){

		var shortcode = "[uniteaddon "+alias +"]";

		if(alias == "")
			shortcode = "";

		return(shortcode);
	};


	/**
	 * clear setting
	 */
	this.clearSetting = function(type, objInput, dataname){

		switch(type){
			case "select_post_taxonomy":
			case "select_post_type":

				defaultValue = objInput.data(dataname);
				objInput.val(defaultValue);
			break;
			default:
				return(false);
			break;
		}

		return(true);
	}


	/**
	 * init setting events
	 */
	this.initSettingEvents = function(type, objInput){

		switch(type){
			case "select_post_taxonomy":
				initTaxonomyTypeSetting(objInput);
			break;
			case "select_post_type":

				initPostTypeSetting(objInput);

			break;
		}

	}

	/**
	 * set setting value
	 */
	this.setSettingValue = function(type, objInput, value){

		switch(type){
			case "select_post_taxonomy":
			case "select_post_type":

				objInput.val(value);
				objInput.trigger("change");
			break;
			default:
				return(false);
			break;
		}

		return(true);
	}


	/**
	 * init update plugin button
	 */
	function initUpdatePlugin(){

		var objButton = jQuery("#uc_button_update_plugin");

		if(objButton.length == 0)
			return(false);

		//init update plugin button
		objButton.click(function(){

			jQuery("#dialog_update_plugin").dialog({
				dialogClass:"unite-ui",
				minWidth:600,
				minHeight:400,
				modal:true,
			});

		});

	}


	/**
	 * init internal image select dialog
	 */
	function initMediaSelectDialog(type){

		if(typeof UCAssetsManager == "undefined")
			return(false);


		switch(type){
			case "image":
				var dialogID = "#uc_dialog_image_select";
				var browserID = "#uc_dialogimage_browser";

				g_dataProviderUC.objBrowserImages = new UCAssetsManager();

				var browser = g_dataProviderUC.objBrowserImages;
				var inputID = "#uc_dialog_image_select_url";
				var buttonID = "#uc_dialog_image_select_button";
			break;
			case "audio":

				var dialogID = "#uc_dialog_audio_select";
				var browserID = "#uc_dialogaudio_browser";

				g_dataProviderUC.objBrowserAudio = new UCAssetsManager();

				var browser = g_dataProviderUC.objBrowserAudio;
				var inputID = "#uc_dialog_audio_select_url";
				var buttonID = "#uc_dialog_audio_select_button";

			break;
			default:
				throw new Error("wrong type: "+type);
			break;
		}

		//init assets browser
		var browserImagesWrapper = jQuery(browserID);

		if(browserImagesWrapper.length == 0)
			return(false);

		browser.init(browserImagesWrapper);

		//update folder for next time open
		browser.eventOnUpdateFilelist(function(){

			var path = browser.getActivePath();

			t.setPathSelectImages(path);
		});

		//on select some file
		browser.eventOnSelectOperation(function(event, objItem){

			//get relative url
			var urlRelative = objItem.file;

			if(g_dataProviderUC.pathSelectImagesBase){
				urlRelative = objItem.url.replace(g_dataProviderUC.pathSelectImagesBase+"/", "");
			}

			var objInput = jQuery(inputID);

			objItem.url_assets_relative = g_temp.keyUrlAssets + urlRelative;

			objInput.val(urlRelative);
			objInput.data("item", objItem).val(urlRelative);

			//enable button
			g_ucAdmin.enableButton(buttonID);

		});


		/**
		 * on select button click - close the dialog and run oninsert function
		 */
		jQuery(buttonID).click(function(){

			if(g_ucAdmin.isButtonEnabled(buttonID) == false)
				return(false);

			var objDialog = jQuery(dialogID);
			var objInput = jQuery(inputID);

			var objItem = objInput.data("item");

			if(!objItem)
				throw new Error("please select some "+type);

			var funcOnInsert = objDialog.data("func_oninsert");

			if(typeof funcOnInsert != "function")
				throw new Error("on insert should be a function");

			funcOnInsert(objItem);

			objDialog.dialog("close");

		});

	}


	/**
	 * open addon media select dialog
	 */
	function openAddonMediaSelectDialog(title, onInsert, type){

		switch(type){
			case "image":
				var dialogID = "#uc_dialog_image_select";
				var dialogName = "image select";
				var inputID = "#uc_dialog_image_select_url";
				var buttonID = "#uc_dialog_image_select_button";
				var objBrowser = g_dataProviderUC.objBrowserImages;
			break;
			case "audio":
				var dialogID = "#uc_dialog_audio_select";
				var dialogName = "audio select";
				var inputID = "#uc_dialog_audio_select_url";
				var buttonID = "#uc_dialog_audio_select_button";
				var objBrowser = g_dataProviderUC.objBrowserAudio;
			break;
			default:
				throw new Error("Wrong dialog type:"+type);
			break;
		}

		var objDialog = jQuery(dialogID);
		if(objDialog.length == 0)
			throw new Error("dialog "+dialogName+" not found!");

		objDialog.data("func_oninsert", onInsert);
		objDialog.data("obj_browser", objBrowser);


		objDialog.dialog({
			minWidth:900,
			minHeight:450,
			modal:true,
			title:title,
			open:function(){

				var objDialog = jQuery(this);
				var objBrowser = objDialog.data("obj_browser");

				//clear the input
				var objInput = jQuery(inputID);
				objInput.data("url","").val("");

				//disable the button
				g_ucAdmin.disableButton(buttonID);

				//objBrowser =

				//set base start path (even if null)
				objBrowser.setCustomStartPath(g_dataProviderUC.pathSelectImagesBase);

				var loadPath = g_dataProviderUC.pathSelectImages;
				if(!loadPath)
					loadPath = g_pathAssetsUC;

				objBrowser.loadPath(loadPath, true);

			}
		});

	}


	/**
	 * open addon image select dialog
	 */
	function openAddonImageSelectDialog(title, onInsert){

		openAddonMediaSelectDialog(title, onInsert, "image");

	}


	/**
	 * open addon image select dialog
	 */
	function openAddonAudioSelectDialog(title, onInsert){

		openAddonMediaSelectDialog(title, onInsert, "audio");

	}


	/**
	 * convert url assets related to full url
	 */
	this.urlAssetsToFull = function(url){

		if(!url)
			return(url);


		if(!g_dataProviderUC.urlSelectImagesBase)
			return(url);

		var key = g_temp.keyUrlAssets;

		if(url.indexOf(key) == -1)
			return(url);

		url = url.replace(key, g_dataProviderUC.urlSelectImagesBase);

		return(url);
	}


	/**
	 * set select images path
	 */
	this.setPathSelectImages = function(path, basePath, baseUrl){

		if(basePath)
			g_dataProviderUC.pathSelectImagesBase = basePath;

		if(baseUrl)
			g_dataProviderUC.urlSelectImagesBase = baseUrl;

		if(path)
			g_dataProviderUC.pathSelectImages = path;

	}


	/**
	 * set the parent - ucAdmin
	 */
	this.setParent = function(parent){
		g_parent = parent;
	}


	/**
	 * open activation dialog
	 */
	function openActivateDialog(){

		g_parent.openCommonDialog("uc_dialog_activate_catalog",function(){

			jQuery("#uc_dialog_activate_catalog_text").focus();

		});

	}


	/**
	 * init activate
	 */
	function initActivateDialog(){

		//--- top activate button

		var objButtonActivate = jQuery("#uc_button_activate_catalog");

		if(objButtonActivate.length == 0)
			return(false);

		objButtonActivate.click(openActivateDialog);

		//--- dialog activate button

		jQuery("#uc_dialog_activate_catalog_action").click(function(){

			var code = jQuery("#uc_dialog_activate_catalog_text").val();

			var data = {
					code: code
			};

			if(g_ucCatalogAddonType)
				data["addontype"] = g_ucCatalogAddonType;

			g_parent.dialogAjaxRequest("uc_dialog_activate_catalog","activate_catalog_codecanyon",data);

		});


	}


	/**
	 * init the provider admin object
	 */
	this.init = function(){

		initUpdatePlugin();

		initMediaSelectDialog("image");
		initMediaSelectDialog("audio");

		initActivateDialog();

	}

	function _______EDITORS_SETTING_____(){}


	/**
	 * get first editor options
	 */

    function initEditor_tinyMCE_GetOptions(objEditorsOptions) {
        if (!objEditorsOptions || jQuery.isEmptyObject(objEditorsOptions))
            return {};

        for (var key in objEditorsOptions) {
            if (!objEditorsOptions.hasOwnProperty(key)) continue;
            var options = objEditorsOptions[key];

            if (options != null)
                return options;
        }

        return {};
    }

	/**
	 * trigger change on editor, pass back
	 */
    var uelm_ucEditorChangeTimers = uelm_ucEditorChangeTimers || {};

    function onEditorChange(editor, objSettings) {

        var DEBOUNCE_DELAY = 600; 

        var editorId = editor && (editor.id || (editor.getElement && editor.getElement().id));
        if (!editorId)
            return;

        if (uelm_ucEditorChangeTimers[editorId]) {
            clearTimeout(uelm_ucEditorChangeTimers[editorId]);
        }

        uelm_ucEditorChangeTimers[editorId] = setTimeout(function () {

            if (!editor || !editor.getElement) {
                return;
            }

            var el = editor.getElement();
            if (!el)
                return;

            editor.save();

            var $el = jQuery(el);

            $el.trigger("keyup");
            $el.trigger("change");

            delete uelm_ucEditorChangeTimers[editorId];

        }, DEBOUNCE_DELAY);
    }

	/**
	 * init tinymce editor
	 */
	function initEditor_tinyMCE(inputID, objSettings) {
		//init editor
		var options = initEditor_tinyMCE_GetOptions(window.tinyMCEPreInit.mceInit);

		options = jQuery.extend({}, options, {
			resize: "vertical",
			height: 200,
			id: inputID,
			selector: "#" + inputID,
		});

		options.setup = function (editor) {
			editor.on("Change", function () {
				onEditorChange(editor, objSettings);
			});

			editor.on("keyup", function () {
				onEditorChange(editor, objSettings);
			});
		};

		window.tinyMCEPreInit.mceInit[inputID] = options;

		tinyMCE.init(options);

		//init quicktags
		var optionsQT = initEditor_tinyMCE_GetOptions(window.tinyMCEPreInit.qtInit);

		optionsQT = jQuery.extend({}, optionsQT, {
			id: inputID,
		});

		window.tinyMCEPreInit.qtInit[inputID] = optionsQT;

		quicktags(optionsQT);
		QTags._buttonsInit();

		window.wpActiveEditor = inputID;
	}


	/**
	 * init editors - run function after timeout
	 */
	function initEditors_afterTimeout(objSettings, arrEditorNames, isForce) {

		if (typeof window.tinyMCEPreInit === "undefined" && arrEditorNames.length)
			throw new Error("Init " + arrEditorNames[0] + " editor error. no other editors found on page");

		var idPrefix = objSettings.getIDPrefix();

		jQuery(arrEditorNames).each(function (index, name) {
			var inputID = idPrefix + name;
			inputID = inputID.replace("#", "");

			if (isForce === true
				|| window.tinyMCEPreInit.mceInit.hasOwnProperty(inputID) === false
				|| window.tinyMCEPreInit.mceInit[inputID] === null) {
                    initEditor_tinyMCE(inputID, objSettings);
            }
				
		});
	}

	function _______POST_TAXONOMY_____(){}


	/**
	 * init taxonomy setting
	 */
	function initTaxonomyTypeSetting(selectPostType){

		if(selectPostType.length == 0)
			return(false);

		var objParent = selectPostType.parents(".unite_settings_wrapper");
		if(objParent.length == 0)
			objParent = selectPostType.parents(".wpb_edit_form_elements");


		if(objParent.length == 0)
			throw new Error("unable to find post list setting parent");

		var selectPostTaxonomy = objParent.find(".unite-setting-post-taxonomy");

		if(selectPostTaxonomy.length == 0)
			return(false);

		var dataPostTypes = selectPostType.data("arrposttypes");

		if(typeof dataPostTypes == "string"){
			dataPostTypes = g_parent.decodeContent(dataPostTypes);
			dataPostTypes = JSON.parse(dataPostTypes);
		}

		selectPostType.change(function(){

			var postType = selectPostType.val();
			var selectedTax = selectPostTaxonomy.val();
			var objTax = g_parent.getVal(dataPostTypes, postType);
			if(!objTax)
				return(true);

			var objOptions = selectPostTaxonomy.find("option");
			var firstVisibleOption = null;

			jQuery.each(objOptions, function(index, option){

				var objOption = jQuery(option);
				var optionTax = objOption.prop("value");

				var taxFound = objTax.hasOwnProperty(optionTax);

				if(taxFound == true && firstVisibleOption == null)
					firstVisibleOption = optionTax;

				if(taxFound == true)
					objOption.show();
				else
					objOption.hide();

			});

			var isCurrentTaxRelevant = objTax.hasOwnProperty(selectedTax);
			if(isCurrentTaxRelevant == false && firstVisibleOption){
				selectPostTaxonomy.val(firstVisibleOption);
			}

		});	//end onchange


		selectPostType.trigger("change");

	}


	function _______POST_LIST_____(){}


	/**
	 * init post lists
	 */
	function initPostTypeSetting(selectPostType){

		if(selectPostType.length == 0)
			return(false);

		var objParent = selectPostType.parents(".unite_settings_wrapper");
		if(objParent.length == 0)
			objParent = selectPostType.parents(".wpb_edit_form_elements");

		if(objParent.length == 0)
			throw new Error("unable to find post list setting parent");

		var selectPostCategory = objParent.find(".unite-setting-post-category");

		if(selectPostCategory.length == 0)
			return(false);

		var dataPostTypes = selectPostType.data("arrposttypes");
		if(typeof dataPostTypes == "string"){
			dataPostTypes = g_parent.decodeContent(dataPostTypes);
			dataPostTypes = JSON.parse(dataPostTypes);
		}

		selectPostType.change(function(){

			var arrPostTypes = selectPostType.val();

			//force array always
			if(jQuery.isArray(arrPostTypes) == false)
				arrPostTypes = [arrPostTypes];

			selectPostCategory.html("");

			var selectedID = selectPostCategory.val();
			var isSomeCatSelected = false;
			var htmlOptions = "";

			htmlOptions += "<option value=''>[All Categories]</option>"

			for(var postType of arrPostTypes){

				var objPostType = g_parent.getVal(dataPostTypes, postType);
				if(!objPostType)
					continue;

				var objCats = objPostType["cats"];
				if(!objCats)
					continue;

				jQuery.each(objCats, function(catID, catText){

					var catShowText = g_parent.htmlspecialchars(catText);

					var selected = "";
					if(selectedID == catID){
						selected = " selected='selected'";
						isSomeCatSelected = true;
					}

					htmlOptions += "<option value='"+catID+"' "+selected+">"+catShowText+"</option>"

				});

			}


			selectPostCategory.html(htmlOptions);

			if(isSomeCatSelected == false)
				selectPostCategory.val("");

		});

		selectPostType.trigger("change");
	}


	function _______END_POST_LISTS_____(){}

	/**
	 * init editors, if the editors not inited, init them
	 */
	this.initEditors = function (objSettings, isForce) {
		var arrEditorNames = objSettings.getFieldNamesByType("editor_tinymce");

		if (arrEditorNames.length === 0)
			return;

		// init on the next tick to pick the input value
		setTimeout(function () {
			initEditors_afterTimeout(objSettings, arrEditorNames, isForce);
		});
	}

	/**
	 * destroy editors
	 */
	this.destroyEditors = function (objSettings) {
		var arrEditorNames = objSettings.getFieldNamesByType("editor_tinymce");

		if (arrEditorNames.length === 0)
			return;

		var idPrefix = objSettings.getIDPrefix();

		jQuery.each(arrEditorNames, function (index, name) {
			var editorID = idPrefix + name;
			editorID = editorID.replace("#", "");

			var objEditor = tinyMCE.EditorManager.get(editorID);

			if (objEditor) {
				try {
					if (tinymce.majorVersion === "4")
						window.tinyMCE.execCommand("mceRemoveEditor", !0, editorID);
					else
						window.tinyMCE.execCommand("mceRemoveControl", !0, editorID);
				} catch (e) {
					//
				}

				// window.tinyMCEPreInit.mceInit[editorID] = null;
				// window.tinyMCEPreInit.qtInit[editorID] = null;

                if (window.tinyMCEPreInit && window.tinyMCEPreInit.mceInit) {
                    delete window.tinyMCEPreInit.mceInit[editorID];
                }

                if (window.tinyMCEPreInit && window.tinyMCEPreInit.qtInit) {
                    delete window.tinyMCEPreInit.qtInit[editorID];
                }
			}
		});
	}
}
