"use strict";

function UniteCreatorAdmin(){

	var t = this, g_objWrapper;
	var g_providerAdmin = new UniteProviderAdminUC();
	var g_objIncludes = new UniteCreatorIncludes();

	var g_generalSettings = new UniteSettingsUC();

	var g_paramsEditorMain = new UniteCreatorParamsEditor();
	var g_paramsEditorItems = new UniteCreatorParamsEditor();

	var g_objDialogParam = new UniteCreatorParamsDialog();
	var g_objDialogItemVariable = new UniteCreatorParamsDialog();
	var g_objDialogMainVariable	= new UniteCreatorParamsDialog();

	var g_codemirrorCss = null, g_codemirrorJs = null;
	var g_codemirrorCssItem = null;
	var g_codemirrorHtmlItem = null, g_codemirrorHtml = null;
	var g_codemirrorHtmlItem2 = null, g_objButtonsPanel;

	var g_objAssetsManager = new UCAssetsManager();
	var g_objAssetsIncludes = new UCAssetsManager();
	var g_settingsItem = new UniteSettingsUC();
	var g_settingsJS = new UniteSettingsUC();

	var g_addonID = null, g_objItemSettingsWrapper, g_objWrapperItems;

	//param panels
	var g_paramsPanelMain = new UniteCreatorParamsPanel();

	var g_paramsPanelItem = new UniteCreatorParamsPanel();
	var g_paramsPanelItem2 = new UniteCreatorParamsPanel();

	var g_paramsPanelJs = new UniteCreatorParamsPanel();
	var g_paramsPanelCss = new UniteCreatorParamsPanel();
	var g_paramsPanelCssItem = new UniteCreatorParamsPanel();

	var g_objVariables = new UniteCreatorVariables();


	var g_temp = {
			isAssetsUpdated: false,
			includesLoadPath: "",
			isItemsAsPostsMode:false,
			itemsByPostsParam:null,
			typeCurrentPost: "uc_current_post",
			typePost: "uc_post",
			putCodeExamplesParams:false,
			isProEditEnabled:false,
	}

	if(!g_ucAdmin)
		var g_ucAdmin = new UniteAdminUC();


	function ____________COMMON____________(){};


	/**
	 * get add options
	 */
	function getAddonAddOptions(){

		var objOptions = g_objWrapper.find("input.uc-addon-addoption");

		if(objOptions.length == 0)
			return(null);

		var optionsAdd = null;
		jQuery.each(objOptions,function(index, input){
			var objInput = jQuery(input);
			var type = input.type;
			var name = input.name;
			switch(type){
				case "checkbox":
					var value = objInput.is(":checked");
				break;
				default:
					var value = objInput.val();
				break;
			}

			if(optionsAdd === null)
				optionsAdd = {};

			optionsAdd[name] = value;
		});


		return(optionsAdd);
	}


	/**
	 * get addon options
	 */
	function getAddonOptions(){

		//get item settings
		var data = g_settingsItem.getSettingsValues();
		data.path_assets = t.getPathAssets();

		//get js settings
		var dataJSSettings = g_settingsJS.getSettingsValues();
		
		data = jQuery.extend(data, dataJSSettings);

		var generalSettingsData = g_generalSettings.getSettingsValues();

		data = jQuery.extend(data, generalSettingsData);

		var addOptions = getAddonAddOptions();
		if(typeof addOptions == "object")
			data = jQuery.extend(data, addOptions);

		return(data);
	}

	/**
	 * get data from addon view
	 */
	function getDataFromAddonView(){

		var objParams = g_paramsEditorMain.getParamsData();
		var objParamsItems = g_paramsEditorItems.getParamsData();

		var objParamsCatData = g_paramsEditorMain.getCatData();

		var html = g_codemirrorHtml ? g_codemirrorHtml.getValue() : jQuery("#area_addon_html").val();
		var htmlItem = g_codemirrorHtmlItem ? g_codemirrorHtmlItem.getValue() : jQuery("#area_addon_html_item").val();
		var htmlItem2 = g_codemirrorHtmlItem2 ? g_codemirrorHtmlItem2.getValue() : jQuery("#area_addon_html_item2").val();

		var css = g_codemirrorCss ? g_codemirrorCss.getValue() : jQuery("#area_addon_css").val();
		var cssItem = g_codemirrorCssItem ? g_codemirrorCssItem.getValue() : jQuery("#area_addon_css_item").val();
		var js = g_codemirrorJs ? g_codemirrorJs.getValue() : jQuery("#area_addon_js").val();

		var dataIncludes = g_objIncludes.getIncludesTabData();

		var options = getAddonOptions();

		var variables_item = g_objVariables.getArrVars(g_objVariables.types.ITEM);
		var variables_main = g_objVariables.getArrVars(g_objVariables.types.MAIN);

		var data = {
				title: jQuery("#text_addon_title").val(),
				name: jQuery("#text_addon_name").val(),
				html: html,
				html_item: htmlItem,
				html_item2: htmlItem2,
				css: css,
				css_item: cssItem,
				js: js,
				includes_js: dataIncludes.arrJS,
				includes_jslib: dataIncludes.arrJSLib,
				includes_css: dataIncludes.arrCSS,
				params: objParams,
				params_items: objParamsItems,
				options: options,
				variables_item: variables_item,
				variables_main: variables_main
		}

		if(objParamsCatData)
			data.params_cats = objParamsCatData;

		if(g_addonID)
			data.id = g_addonID;

		return(data);
	}

	function ____________CODEMIRROR____________(){};


	/**
	 * replace editor text with attribute
	 */
	function replaceEditorTextWithAttribute(objEditor, type){

		var text = objEditor.getSelection();

		if(!text)
			return(false);

		var selections = objEditor.getSelections();
		if(selections.length > 1)
			return(false);

		var type = "text";

		var data = {};
		data.isnew = true;
		data["default_value"] = "max_default";
		data["font_editable"] = false;
		data["name"] = "max_name";
		data["title"] = "title";
		data["type"] = "uc_textfield";

		g_paramsEditorMain.onAddParamButtonClick(data);


	}


	/**
	 * set editor events
	 */
	function initCodeMirrorEvents(editor, type){

		editor.on("keyup",function(editor, event){

			if(!event)
				return(false);

			//ctrl+space
			if(event.code && event.code == "Space" && event.ctrlKey == true){
				replaceEditorTextWithAttribute(editor, type);
			}

		});

	}

	/**
	 * set the editor to the text area
	 */
	function setCodeMirrorEditor(type){

		switch(type){

			case "html":

				if(g_codemirrorHtml)
					return(false);

				g_codemirrorHtml = true;

				setTimeout(function(){

					var objTextArea = jQuery("#area_addon_html");
				    var textArea = objTextArea[0];

				      var mixedMode = {name: "twig", base: "text/html"};

				      var mode = objTextArea.data("mode");
					  if(mode)
						  mixedMode = mode;

				      var optionsCM = {
								mode: mixedMode,
								lineNumbers: true
					  }


					g_codemirrorHtml = CodeMirror.fromTextArea(textArea, optionsCM);

					//initCodeMirrorEvents(g_codemirrorHtml, "main");


					/*
					g_codemirrorHtml.on("change", function(){
						trace("on change");
					});
					*/

				}, 500);

			break;
			case "html_item":

				if(g_codemirrorHtmlItem)
					return(false);

				if(isItemsEnabled() == false)
					return(false);

				g_codemirrorHtmlItem = true;

				setTimeout(function(){

				      var mixedMode = {
						      name: "twig", base: "text/html"
				    	       //name: "htmlmixed"
				      }

				      var optionsCM = {
								mode: mixedMode,
								lineNumbers: true
					        }

				     var objAreaItem = document.getElementById("area_addon_html_item");

					g_codemirrorHtmlItem = CodeMirror.fromTextArea(objAreaItem, optionsCM);

				}, 500);

			break;

			case "html_item2":
				if(g_codemirrorHtmlItem2)
					return(false);

				if(isItemsEnabled() == false)
					return(false);

				g_codemirrorHtmlItem2 = true;

				setTimeout(function(){
				      var mixedMode = {
						      name: "twig", base: "text/html"
				      }
				      var optionsCM = {
								mode: mixedMode,
								lineNumbers: true
					        }

					g_codemirrorHtmlItem2 = CodeMirror.fromTextArea(document.getElementById("area_addon_html_item2"), optionsCM);

				}, 500);

			break;

			case "css":

				if(g_codemirrorCss)
					return(false);

				g_codemirrorCss = true;

				setTimeout(function(){
					g_codemirrorCss = CodeMirror.fromTextArea(document.getElementById("area_addon_css"), {
			            mode: {name: "css"},
			            lineNumbers: true
			        });
				}, 500);

			break;
			case "css_item":
				if(g_codemirrorCssItem)
					return(false);

				g_codemirrorCssItem = true;

				setTimeout(function(){
					g_codemirrorCssItem = CodeMirror.fromTextArea(document.getElementById("area_addon_css_item"), {
			            mode: {name: "css"},
			            lineNumbers: true
			        });
				}, 500);

			break;
			case "js":

				if(g_codemirrorJs)
					return(false);

				g_codemirrorJs = true;

				setTimeout(function(){
					g_codemirrorJs = CodeMirror.fromTextArea(document.getElementById("area_addon_js"), {
			            mode: {name: "javascript"},
			            lineNumbers: true
			        });
				}, 500);

			break;
		}

	}

	function ____________BULK_DIALOG____________(){};


	/**
	 * open bulk dialog
	 */
	function openBulkDialog(event, params){

		var objDialog = jQuery("#uc_dialog_bulk");
		g_ucAdmin.validateDomElement(objDialog, "bulk dialog");

		var options = {minHeight: 450};

		g_ucAdmin.openCommonDialog("uc_dialog_bulk", function(){

			params.addon_id = g_addonID;

			objDialog.html("loading...");

			objDialog.data("params", params);

			g_ucAdmin.ajaxRequest("get_addon_bulk_dialog", params, function(response){

				objDialog.html(response.html);

			});

		},options);

	}

	/**
	 * update selected text
	 */
	function bulkDialogUpdateSelectedText(){
		var objDialog = jQuery("#uc_dialog_bulk");
		var objCheckboxes = objDialog.find("input.uc-check-select:checked");
		var numSelected = objCheckboxes.length;

		jQuery("#uc_bulk_dialog_num_selected").text(numSelected);

	}


	/**
	 * on checkbox select - mark row
	 */
	function bulkDialogOnCheckboxSelect(event, objCheckbox){

		if(!objCheckbox)
			var objCheckbox = jQuery(this);

		var isChecked = objCheckbox.is(":checked");

		var objRow = objCheckbox.parents("tr");
		if(isChecked)
			objRow.addClass("unite-row-selected");
		else
			objRow.removeClass("unite-row-selected");

		bulkDialogUpdateSelectedText();
	}


	/**
	 * init bulk dialog
	 */
	function initBulkDialog(){

		var objDialog = jQuery("#uc_dialog_bulk");

		//--- select all click

		objDialog.on("click", ".uc-check-all", function(){

			var isChecked = jQuery(this).is(":checked");

			var objCheckboxes = objDialog.find("input.uc-check-select");

			if(isChecked)
				objCheckboxes.attr("checked","checked");
			else
				objCheckboxes.removeAttr("checked");

			objCheckboxes.each(function(index, input){
				var objInput = jQuery(input);
				bulkDialogOnCheckboxSelect(null, objInput);
			});

			bulkDialogUpdateSelectedText();
		});

		//--- checkbox click event

		objDialog.on("click", "input.uc-check-select", bulkDialogOnCheckboxSelect);

		// ---- actions -----

		objDialog.on("click", ".uc-action-button", function(){

			var objButton = jQuery(this);

			var action = objButton.data("action");
			var objLoader = objDialog.find(".uc-dialog-loader");
			var objTable = objDialog.find(".unite_table_items");

			var params = objDialog.data("params");


			//get addons id's
			var addonsIDs = [];
			var objCheckboxes = objDialog.find("input.uc-check-select:checked");
			jQuery.each(objCheckboxes, function(index, checkbox){
				var addonID = jQuery(checkbox).data("id");
				addonsIDs.push(addonID);
			});

			if(addonsIDs.length == 0){
				alert("no addons chosen");
				return(false);
			}

			params.addon_ids = addonsIDs;
			params.action_bulk = action;

			//set loading state

			objDialog.find(".uc-section-selected").css("opacity",0);
			objTable.hide();
			objLoader.show();

			g_ucAdmin.ajaxRequest("update_addons_bulk", params, function(response){

				objDialog.html(response.html);
			});


		});


	}


	function ____________ITEMS_RELATED____________(){};


	/**
	 * is items enabled
	 */
	function isItemsEnabled(){

		if(g_temp.isItemsAsPostsMode == true)
			return(true);

		var objValues = g_settingsItem.getSettingsValues();
		var enableItems = objValues.enable_items;
		enableItems = g_ucAdmin.strToBool(enableItems);
		
		return(enableItems);
	}


	/**
	 * hide items related objects
	 */
	function hideItemsRelated(){
		g_objWrapperItems.hide();
		jQuery(".uc-items-related").hide();
	}


	/**
	 * show items related objects
	 */
	function showItemsRelated(){

		//don't show if items in posts mode
		if(g_temp.isItemsAsPostsMode == true)
			return(false);

		g_objWrapperItems.show();
		jQuery(".uc-items-related").show();

	}


	/**
	 * get if items is visible
	 */
	function isItemsVisible(){

		var isVisible = g_objWrapperItems.is(":visible");
		return(isVisible);
	}


	/**
	 * set items as posts mode
	 */
	function setItemsAsPostsMode(param){

		//---- items tab -----

		//g_settingsItem.setValues({"enable_items":true});
		
		var itemsParamType = param["items_param_type"];

		var itemsParam = jQuery.extend({}, param);
		itemsParam.type = itemsParamType;

		g_temp.isItemsAsPostsMode = true;
		g_temp.itemsByPostsParam = itemsParam;

		g_objWrapperItems.hide();
		jQuery("#uc_tab_itemattr .unite_settings_wrapper").hide();

		var itemTabText = param["items_panel_text"];

		jQuery(".uc-postsitems-related").remove();
		jQuery("#uc_tab_itemattr").append("<div class='uc-postsitems-related'>"+itemTabText+"</div>");

		jQuery(".uc-items-related").show();

		//refresh current tab
		addonSelectTab();
	}


	/**
	 * remove items as posts mode
	 */
	function disableItemsAsPostsMode(){

		g_temp.isItemsAsPostsMode = false;
		g_temp.itemsByPostsParam = null;

		jQuery(".uc-items-related").hide();
		jQuery(".uc-postsitems-related").remove();

		jQuery("#uc_tab_itemattr .unite_settings_wrapper").show();

		onSettingsItemsChange();
	}


	/**
	 * check items by posts mode, and set if do
	 */
	function checkItemsByPostsMode(arrParams){

		var param = getPostsListParam(arrParams);

		//set items by posts mode
		if(param){

			setItemsAsPostsMode(param);
			return(false);

		}

		if(g_temp.isItemsAsPostsMode == true)
			disableItemsAsPostsMode();

	}


	function ____________PARAMS_PANEL____________(){};

	/**
	 * get posts list param from params
	 */
	function getPostsListParam(arrParams){

		if(!arrParams)
			return(null);

		for(var index in arrParams){
			var param = arrParams[index];

			switch(param.type){
				case "uc_listing":

					var useFor = g_ucAdmin.getVal(param, "use_for");

					if(useFor == "template" || useFor == "gallery"){
						param["items_param_type"] = "uc_listing";
						param["items_panel_text"] = "Items as dynamic loop mode";

						return(param);
					}

				break;
				case "uc_posts_list":
					param["items_param_type"] = "uc_post";
					param["items_panel_text"] = "Items as posts mode";
					return(param);
				break;
				case "uc_instagram":
					param["items_param_type"] = "uc_instagram_item";
					param["items_panel_text"] = "Items as instagram mode";
					return(param);
				break;
				case "uc_form":
					param["items_param_type"] = "uc_form_item";
					param["items_panel_text"] = "Items as form mode";
					return(param);
				break;
				case "uc_dataset":
					param["items_param_type"] = "uc_dataset";
					param["items_panel_text"] = "Items as dataset mode";
					return(param);
				break;
			}
		}

		return(null);
	}


	/**
	 * check dynamic params
	 */
	function paramsPanelMainSync_addDynamicParams(arrParams){

		//check if dynamic addon
		var options = getAddonOptions();
		var isDynamicAddon = g_ucAdmin.getVal(options, "dynamic_addon");
		isDynamicAddon = g_ucAdmin.strToBool(isDynamicAddon);

		if(isDynamicAddon == false)
			return(arrParams);

		//push post
		var objParam = {type:g_temp.typeCurrentPost, name:"current_post"};
		arrParams.push(objParam);

		return(arrParams);
	}

	/**
	 * add code examples
	 */
	function addEndingParams_addCodeExamples(arrParams){

		//push code examples
		var objParam = {type:"uc_code_examples", name:"code_examples", visual:"Twig Code Examples" };
		arrParams.push(objParam);

		return(arrParams);
	}

	/**
	 * add cod eexamples - js
	 */
	function addEndingParams_addCodeExamplesJS(arrParams){

		//push code examples
		var objParam = {type:"uc_code_examples_js", name:"code_examples_js", visual:"JS Code Snippets" };
		arrParams.push(objParam);

		return(arrParams);
	}


	/**
	 * add ending params
	 */
	function paramsPanelMainSync_addEndingParams(arrParams){

		if(g_temp.putCodeExamplesParams == true)
			arrParams = addEndingParams_addCodeExamples(arrParams);


		return(arrParams);
	}

	/**
	 * add ending params
	 */
	function paramsPanelMainSync_addEndingParamsJS(arrParams){

		if(g_temp.putCodeExamplesParams == true)
			arrParams = addEndingParams_addCodeExamplesJS(arrParams);


		return(arrParams);
	}


	/**
	 * sync params from ed
	 */
	function paramsPanelMainSync(){

		var arrParams = g_paramsEditorMain.getParamsData();

		checkItemsByPostsMode(arrParams);

		var arrVars = g_objVariables.getArrVars(g_objVariables.types.MAIN);

		//add items param
		var hasItems = isItemsEnabled();

		arrParams = paramsPanelMainSync_addDynamicParams(arrParams);

		arrParams = paramsPanelMainSync_addEndingParams(arrParams);

		var arrParamsForCss = jQuery.extend([], arrParams);
		var arrParamsForJS = jQuery.extend([], arrParams);

		//modify params for js
		if(hasItems == true){

			//put extra js functions - put_items_json
			var textPutItemsJson = "{#use put_items_json(\"clean\") to remove extra data#}";
			textPutItemsJson += "\nvar strJsonItems = {{put_items_json()}};";
			textPutItemsJson += "\nvar objItems = JSON.parse(strJsonItems);";
			textPutItemsJson += "\nconsole.log(objItems);";

			var paramPutItemJs = {type:"uc_function", name:"put_items_json()","raw_insert_text":textPutItemsJson};

			//put extra js functions - put_attributes_json
			var textPutAttributesJson = "{#use put_attributes_json(\"clean\") to remove extra data#}";
			textPutAttributesJson += "\nvar strJsonAttributes = {{put_attributes_json()}};";
			textPutAttributesJson += "\nvar objAttributes = JSON.parse(strJsonAttributes);";
			textPutAttributesJson += "\nconsole.log(objAttributes);";

			var paramPutAttributesJs = {type:"uc_function", name:"put_attributes_json()","raw_insert_text":textPutAttributesJson};


			var textGetItems = "{# Generate javascript array from items using twig#}";
			textGetItems += "\n{% set itemsForJs = get_items() %}";
			textGetItems += "\n\nvar arrTitles = [";
			textGetItems += "\n	{% for item in itemsForJs %}";
			textGetItems += "\n		\"{{item.title|raw}}\",";
			textGetItems += "\n	{% endfor %}";
			textGetItems += "\n\n];";
			textGetItems += "\n\nconsole.log(arrTitles);\n";

			var paramGetItemJs = {type:"uc_function",
					name:"get_items()",
					"raw_insert_text":textGetItems
			};

			arrParamsForJS.unshift(paramPutAttributesJs);
			arrParamsForJS.unshift(paramPutItemJs);
			arrParamsForJS.unshift(paramGetItemJs);

		}

		arrParamsForJS = paramsPanelMainSync_addEndingParamsJS(arrParamsForJS);

		//add items related functions
		if(hasItems == true){
			var paramPutItems = {type:"uc_function", name:"put_items()",raw_insert_text:"{{put_items()}} {# - you can use parameters: \"shuffle\", \"one_random\", \"one_first\" like put_items(\"shuffle\")  #} \n {# - also you can use {% set items = get_items() %} with those parameters - #}\n"};
			var paramPutItems2 = {type:"uc_function", name:"put_items2()"};
			var paramNumItems = {type:"text", name:"uc_num_items"};

			//add to top of the params

			arrParams.unshift(paramPutItems2);
			arrParams.unshift(paramPutItems);
			arrParams.unshift(paramNumItems);
		}


		g_paramsPanelCss.setParams(arrParamsForCss);


		g_paramsPanelJs.setParams(arrParamsForJS);
		g_paramsPanelMain.setParams(arrParams, arrVars);

		//sync item params as well
		paramsPanelItemSync();
	}


	/**
	 * sync params from ed
	 */
	function paramsPanelItemSync(){

		if(g_temp.isItemsAsPostsMode == false)
			var arrParamsItems = g_paramsEditorItems.getParamsData();
		else{
			var arrParamsItems = [];
			arrParamsItems.push(g_temp.itemsByPostsParam);
		}

		var arrVarsItems = g_objVariables.getArrVars(g_objVariables.types.ITEM);

		var arrParamsMain = g_paramsEditorMain.getParamsData();
		var arrVarsMain = g_objVariables.getArrVars(g_objVariables.types.MAIN);

		var arrPanels = [g_paramsPanelItem, g_paramsPanelItem2, g_paramsPanelCssItem];

		jQuery.map(arrPanels,function(objPanel){


			objPanel.removeAllParams();
			objPanel.setParams(arrParamsItems, arrVarsItems, "item");
			objPanel.setParams(arrParamsMain, arrVarsMain, "main");

		});

	}


	/**
	 * init param panel globals
	 */
	function initParamPanelGlobals(arrChildKeys, initParamPanelGlobals, arrAddKeys, arrSkipParams){

		var objParamPanel = new UniteCreatorParamsPanel();
		objParamPanel.initGlobalSetting_ChildKeys(arrChildKeys, arrAddKeys);
		objParamPanel.initGlobalSetting_TemplateCode(initParamPanelGlobals);
		objParamPanel.initGlobalSetting_SkipParams(arrSkipParams);


	}


	/**
	 * init the params panel
	 */
	function initParamsPanels(arrPanelKeys, arrPanelItemKeys){

		//add to beginning main params
		var objWrapperMain = jQuery("#uc_params_panel_main");
		var objWrapperJs = jQuery("#uc_params_panel_js");
		var objWrapperCss = jQuery("#uc_params_panel_css");
		var objWrapperCssItem = jQuery("#uc_params_panel_css_item");

		var objWrapperItem = jQuery("#uc_params_panel_item");
		var objWrapperItem2 = jQuery("#uc_params_panel_item2");


		g_paramsPanelMain.init(objWrapperMain,"main", null, arrPanelKeys);
		g_paramsPanelJs.init(objWrapperJs,"js", null, arrPanelKeys);
		g_paramsPanelCss.init(objWrapperCss,"css", null, arrPanelKeys);

		//init items panels
		var arrPanelItems = [
		                     [g_paramsPanelItem, objWrapperItem],
		                     [g_paramsPanelItem2, objWrapperItem2],
		                     [g_paramsPanelCssItem, objWrapperCssItem]
		];

		var itemPrefix = {"item":"item."};

		jQuery.map(arrPanelItems, function(arr){

			var itemsPanel = arr[0];
			var objPanelWrapper = arr[1];

			itemsPanel.init(objPanelWrapper,"item", itemPrefix, arrPanelItemKeys);
			itemsPanel.initConstants(arrPanelKeys, "main");
			itemsPanel.initConstants(arrPanelItemKeys, "item");

		});

		paramsPanelMainSync();

		//on params update event
		g_paramsEditorMain.onUpdateEvent(onParamsEditorMainUpdate);
		g_paramsEditorItems.onUpdateEvent(paramsPanelItemSync);

		g_paramsEditorMain.onEvent(g_paramsEditorMain.events.BULK, openBulkDialog);
		g_paramsEditorItems.onEvent(g_paramsEditorItems.events.BULK, openBulkDialog);


		//on click events
		g_paramsPanelMain.onParamClick(function(textToAdd){
			g_ucAdmin.insertToCodeMirror(g_codemirrorHtml, textToAdd);
		});

		g_paramsPanelJs.onParamClick(function(textToAdd){
			g_ucAdmin.insertToCodeMirror(g_codemirrorJs, textToAdd);
		});

		g_paramsPanelCss.onParamClick(function(textToAdd){
			g_ucAdmin.insertToCodeMirror(g_codemirrorCss, textToAdd);
		});

		g_paramsPanelCssItem.onParamClick(function(textToAdd){
			g_ucAdmin.insertToCodeMirror(g_codemirrorCssItem, textToAdd);
		});

		g_paramsPanelItem.onParamClick(function(textToAdd){
			g_ucAdmin.insertToCodeMirror(g_codemirrorHtmlItem, textToAdd);
		});

		g_paramsPanelItem2.onParamClick(function(textToAdd){
			g_ucAdmin.insertToCodeMirror(g_codemirrorHtmlItem2, textToAdd);
		});


		//delete main variable:
		g_paramsPanelMain.onDeleteVariable(function(event, varName){

			g_objVariables.deleteVar(g_objVariables.types.MAIN, varName);
			paramsPanelMainSync();
		});


		//delete item variable:
		g_paramsPanelItem.onDeleteVariable(function(event, varName){

			g_objVariables.deleteVar(g_objVariables.types.ITEM, varName);
			paramsPanelItemSync();

		});

		//delete item2 variable:
		g_paramsPanelItem2.onDeleteVariable(function(event, varName){

			g_objVariables.deleteVar(g_objVariables.types.ITEM, varName);
			paramsPanelItemSync();

		});

		//on edit Item variable
		function onParamsPanelEditItemVariable(event, varIndex){
			if(!varIndex || varIndex == undefined)
				var varIndex = 0;

			var objVar = g_objVariables.getVariable(g_objVariables.types.ITEM, varIndex);

			g_ucAdmin.validateNotEmpty(objVar, "variable: " + varIndex);

			g_objDialogItemVariable.open(objVar, varIndex, function(objUpdatedVar, varIndex){

				g_objVariables.update(g_objVariables.types.ITEM, varIndex, objUpdatedVar);

				paramsPanelItemSync();

			});
		}

		//edit item variable:
		g_paramsPanelItem.onEditVariable(onParamsPanelEditItemVariable);
		g_paramsPanelItem2.onEditVariable(onParamsPanelEditItemVariable);


		//edit main variable
		g_paramsPanelMain.onEditVariable(function(event, varIndex){
			if(!varIndex || varIndex == undefined)
				var varIndex = 0;

			var objVar = g_objVariables.getVariable(g_objVariables.types.MAIN, varIndex);

			g_ucAdmin.validateNotEmpty(objVar, "variable: " + varIndex);

			g_objDialogMainVariable.open(objVar, varIndex, function(objUpdatedVar, varIndex){

				g_objVariables.update(g_objVariables.types.MAIN, varIndex, objUpdatedVar);

				paramsPanelMainSync();

			});

		});


		//on settings change event
		g_settingsItem.setEventOnChange(function(){
			paramsPanelMainSync();
		});

	}

	function ____________VARIABLES_BUTTONS____________(){};



	/**
	 * init add variable button
	 */
	function initAddVariableButton(){

		//init item add variable
		var objButtonAddVariableItem = jQuery("#uc_params_panel_item_addvar");
		var objButtonAddVariableItem2 = jQuery("#uc_params_panel_item_addvar2");

		//on click - open add variable dialog
		objButtonAddVariableItem.add(objButtonAddVariableItem2).on("click",function(){

			g_objDialogItemVariable.open(null, 0, function(objVar){

				g_objVariables.add(g_objVariables.types.ITEM, objVar);

				paramsPanelItemSync();

			});

		});


		//init main add variable
		var objButtonAddVariableMain = jQuery("#uc_params_panel_main_addvar");

		objButtonAddVariableMain.on("click",function(){

			g_objDialogMainVariable.open(null, 0, function(objVar){

				g_objVariables.add(g_objVariables.types.MAIN, objVar);

				paramsPanelMainSync();

			});

		});


	}


	/**
	 * init variables, must init before the params panels
	 */
	function initVariables(arrVarItems, arrVarMain){

		g_objVariables.addFromArray(g_objVariables.types.ITEM, arrVarItems);
		g_objVariables.addFromArray(g_objVariables.types.MAIN, arrVarMain);

		initAddVariableButton();
	}


	function ____________INCLUDES_TAB____________(){};


	/**
	 * update include assets checkboxes
	 */
	function updateIncludesAssetsCheckboxes(){

		var arrIncludes = g_objIncludes.getArrAllIncludesUrls();

		g_objAssetsIncludes.checkByUrls(arrIncludes);

	}


	/**
	 * init assets manager in includes folder
	 */
	function initAssetsManagerIncludes(){

		//on checkbox click, add/remove include
		g_objAssetsIncludes.eventOnSelectOperation(function(checked, itemData){

			if(checked == true)
				g_objIncludes.addIncludesFromAssets(itemData);
			else{
				g_objIncludes.removeIncludeByAsset(itemData);
			}

		});

		//on load path - add addonID
		g_objAssetsIncludes.eventOnAjaxLoadpath(function(data){
			data.addonID = g_addonID;
			return(data);
		});

		//after update filelist, check assets by url
		g_objAssetsIncludes.eventOnUpdateFilelist(function(){
			updateIncludesAssetsCheckboxes();
		});

		//check assets by urls
		updateIncludesAssetsCheckboxes();

	}


	/**
	 * init includes tab
	 */
	function initIncludesTab(){

		g_objIncludes.initIncludesTab(t);

		var objIncludesBrowserWrapper = jQuery("#uc_includes_browser");
		g_objAssetsIncludes.init(objIncludesBrowserWrapper);

		//init includes browser
		initAssetsManagerIncludes();

		//set on delete event
		g_objIncludes.eventOnDelete(function(){
			updateIncludesAssetsCheckboxes();
		});

		g_objIncludes.eventOnInputBlur(function(){
			updateIncludesAssetsCheckboxes();
		});

	}


	function ____________ASSETS_TAB____________(){};


	/**
	 * get assets path
	 */
	this.getPathAssets = function(){
		var pathAssets = jQuery("#uc_assets_path").data("path");
		return(pathAssets);
	};


	/**
	 * get assets url
	 */
	function getUrlAssets(){
		var pathAssets = t.getPathAssets();
		if(!pathAssets)
			return(pathAssets);

		var urlAssets = g_urlAssetsUC + pathAssets + "/";

		return(urlAssets);
	}


	/**
	 * update path for image select based on the assets path
	 */
	function updateImageSelectPath(){

		var pathAddonAssets = t.getPathAssets();
		var urlAssets = getUrlAssets();

		if(pathAddonAssets){
			pathAddonAssets = g_pathAssetsUC+pathAddonAssets;
		}

		var urlAssets = getUrlAssets();

		g_ucAdmin.triggerEvent("update_assets_path", urlAssets);

		g_ucAdmin.setAddImagePath(pathAddonAssets, urlAssets);

	}


	/**
	 * check set path of assets button, enable / disable if needed
	 */
	function assetsPathCheckButtons(){

		//disable button
		if(g_objAssetsManager.isStartPath() == true)
			g_ucAdmin.disableButton("#uc_button_set_assets_folder");
		else
			g_ucAdmin.enableButton("#uc_button_set_assets_folder");

	}



	/**
	 * init assets path related functions
	 */
	function initAssetsPath(){

		assetsPathCheckButtons();

		//init assets folder acions
		g_objAssetsManager.eventOnUpdateFilelist(function(){
			assetsPathCheckButtons();
		});

		//set path button:
		jQuery("#uc_button_set_assets_folder").on("click",function(){

			if(g_ucAdmin.isButtonEnabled(jQuery(this)) == false)
				return(false);

			var path = g_objAssetsManager.getActivePathRelative();
			jQuery("#uc_assets_path").html(path).data("path", path);
			jQuery("#uc_button_set_assets_unset").show();

			g_temp.includesLoadPath = path;

			updateImageSelectPath();
		});

		//unset path button:
		jQuery("#uc_button_set_assets_unset").on("click",function(){
			var textNotSet = jQuery("#uc_assets_path").data("textnotset");
			jQuery("#uc_assets_path").html(textNotSet).data("path", "");
			jQuery(this).hide();

			g_temp.includesLoadPath = "";

			updateImageSelectPath();
		});

	}


	/**
	 * init assets tab
	 */
	function initAssetsTab(){

		//init assets manager
		var objAssetsManagerWrapper = jQuery("#uc_assets_manager");
		if(objAssetsManagerWrapper.length == 0)
			return(false);

		g_objAssetsManager.init(objAssetsManagerWrapper);

		initAssetsPath();

		//set flag if the assets updated
		g_objAssetsManager.eventOnUpdateFiles(function(){
			g_temp.isAssetsUpdated = true;
		});

	}

	/**
	 * init changelog tab
	 */
	function initChangelogTab() {

		if (isChangelogEnabled() === false)
			return;

		var objChangelog = jQuery('#uc_tab_changelog');
		var objChangelogForm = objChangelog.find('.uc-changelogs-form');
		var objChangelogFormError = objChangelog.find('.uc-changelogs-form-error');
		var objChangelogFormErrorTitle = objChangelog.find('.uc-changelogs-form-error-title');
		var objChangelogFormErrorContent = objChangelog.find('.uc-changelogs-form-error-content');
		var objChangelogFormEditing = objChangelog.find('.uc-changelogs-form-editing');
		var objChangelogFormEditingContent = objChangelog.find('.uc-changelogs-form-editing-content');
		var objChangelogFormClear = objChangelogForm.find('.uc-changelogs-form-clear');
		var objChangelogFormSubmit = objChangelogForm.find('.uc-changelogs-form-submit');
		var objChangelogFormId = objChangelogForm.find('[name="id"]');
		var objChangelogFormType = objChangelogForm.find('[name="type"]');
		var objChangelogFormText = objChangelogForm.find('[name="text"]');

		objChangelogFormId.on('input', function () {
			var value = jQuery(this).val();

			objChangelog
				.find('.uc-changelog')
				.removeClass('uc-active')
				.filter('[data-id="' + value + '"]')
				.addClass('uc-active');
		});

		objChangelogFormClear.on('click', function () {
			objChangelogFormError.hide();
			objChangelogFormEditing.hide();
			objChangelogFormId.val(null).trigger('input');
			objChangelogFormType.val(null).trigger('change');
			objChangelogFormText.val(null).trigger('input');
		});

		objChangelogFormSubmit.on('click', function () {
			var id = objChangelogFormId.val();
			var type = objChangelogFormType.val();
			var text = objChangelogFormText.val().trim();
			var action = id ? 'update_addon_changelog': 'add_addon_changelog';
			var errors = [];

			if (!type)
				errors.push('Type is empty.');

			if (!text)
				errors.push('Text is empty.');

			if (errors.length > 0) {
				objChangelogFormError.show();
				objChangelogFormErrorTitle.html('Validation errors:');
				objChangelogFormErrorContent.html("- " + errors.join("<br />- "));

				return;
			}

			objChangelogFormError.hide();

			g_ucAdmin.setAjaxLoadingButtonID(objChangelogFormSubmit.attr('id'));

			g_ucAdmin.ajaxRequest(action, {
				addon_id: g_addonID,
				id: id,
				type: type,
				text: text,
			}, function () {
				objChangelogFormClear.trigger('click');

				loadChangelog();
			});
		});

		objChangelog.on('click', '.uc-changelog-edit',function () {
			var objRoot = jQuery(this).closest('.uc-changelog');
			var content = objRoot.find('.uc-changelog-text').html();
			var log = objRoot.data('log');

			objChangelogFormClear.trigger('click');

			objChangelogFormEditing.show();
			objChangelogFormEditingContent.html(content);

			objChangelogFormId.val(log.id).trigger('input');
			objChangelogFormType.val(log.type).trigger('change');
			objChangelogFormText.val(log.text).trigger('input');
		});

		objChangelog.on('click', '.uc-changelog-delete',function () {
			var objButton = jQuery(this);
			var objRoot = objButton.closest('.uc-changelog');
			var id = objRoot.data('id');
			var confirmed = confirm('Are you sure you want to delete the selected log?');

			if (confirmed === false)
				return;

			objButton.prop('disabled', true);

			g_ucAdmin.ajaxRequest('delete_addon_changelog', { id: id }, function () {
				loadChangelog();
			}).always(function () {
				objButton.prop('disabled', false);
			});
		});
	}

	/**
	 * load changelog
	 */
	function loadChangelog() {

		if (isChangelogEnabled() === false)
			return;

		var objChangelog = jQuery('#uc_tab_changelog');
		var objChangelogLoader = objChangelog.find('.uc-changelogs-loader');
		var objChangelogContent = objChangelog.find('.uc-changelogs-content');

		objChangelogLoader.show();
		objChangelogContent.hide();

		g_ucAdmin.ajaxRequest('get_addon_changelog', { addon_id: g_addonID }, function (response) {
			objChangelogLoader.hide();
			objChangelogContent.html(response.html).show();
		});
	}

	/**
	 * check if changelog enabled
	 */
	function isChangelogEnabled() {

		var objChangelogTab = jQuery("#uc_tablink_changelog");

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

		return true;
	}

  /**
   * init revisions tab
   */
  function initRevisionsTab() {

	  if (isRevisionsEnabled() === false)
		  return;

    g_objAssetsManager.eventOnUpdateFiles(function () {
      g_ucAdmin.setSuccessMessageID('null'); // don't show success message
      g_ucAdmin.ajaxRequest('create_addon_revision', { id: g_addonID });
    });

    jQuery(document).on('click', '.uc-revision-restore', function (event) {
      var confirmed = confirm('Are you sure you want to restore the widget from this revision?');

      if (confirmed === false)
        return;

      var id = getRevisionId(event.target);

      g_ucAdmin.ajaxRequest('restore_addon_revision', { id: g_addonID, revision_id: id }, function () {
        location.reload();
      });
    });

    jQuery(document).on('click', '.uc-revision-download', function (event) {
	      var id = getRevisionId(event.target);
	      var params = 'id=' + g_addonID + '&revision_id=' + id;
	      var url = g_ucAdmin.getUrlAjax('download_addon_revision', params);

	      window.open(url);
    });
  }

  /**
   * load revisions
   */
  function loadRevisions() {

    if (isRevisionsEnabled() === false)
      return;

    var objRevisions = jQuery('#uc_tab_revisions');
    var objRevisionsLoader = objRevisions.find('.uc-revisions-loader');
    var objRevisionsContent = objRevisions.find('.uc-revisions-content');

    objRevisionsLoader.show();
    objRevisionsContent.hide();

    g_ucAdmin.ajaxRequest('get_addon_revisions', { addon_id: g_addonID }, function (response) {
      objRevisionsLoader.hide();
      objRevisionsContent.html(response.html).show();
    });
  }

  /**
   * check if revision enabled
   */
  function isRevisionsEnabled() {

    var objRevisionsTab = jQuery('#uc_tablink_revisions');

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

    return true;
  }

  /**
   * get revision id from click event
   */
  function getRevisionId(element) {
    var $element = jQuery(element);
    var $root = $element.closest('.uc-revision');
    var id = $root.attr('data-id');

    return id;
  }
	function ____________DYNAMIC____________(){};

	/**
	 * update dynamic post keys
	 */
	function updateDynamicPostKeys(arrPostChildKeys, key){

		var objPanel = new UniteCreatorParamsPanel();
		var objChildKeys = objPanel.getGlobalSetting_ChildKeys();

		objChildKeys[key] = arrPostChildKeys;
		objPanel.updateGlobalSetting_ChildKeys(objChildKeys);

		var objChildKeys = objPanel.getGlobalSetting_ChildKeys();

		paramsPanelMainSync();
	}



	/**
	 * refresh dynamic post fields (custom post)
	 * and sync again
	 */
	function refreshDynamicPostFields(){

		var options = getAddonOptions();

		var postID = g_ucAdmin.getVal(options, "dynamic_post");
		var enableCustomFields = g_ucAdmin.getVal(options, "dynamic_post_enable_customfields");
		enableCustomFields = g_ucAdmin.strToBool(enableCustomFields);

		var enableCategory = g_ucAdmin.getVal(options, "dynamic_post_enable_category");
		enableCategory = g_ucAdmin.strToBool(enableCategory);

		//if no post ID, replace current post by regular post (no meta keys)
		if(!postID){

			var objPanel = new UniteCreatorParamsPanel();
			var objChildKeys = objPanel.getGlobalSetting_ChildKeys();

			var arrPostKeys = g_ucAdmin.getVal(objChildKeys, "uc_post");

			updateDynamicPostKeys(arrPostKeys, g_temp.typeCurrentPost);

			return(false);
		}

		//request specific post variables by ajax
		ajaxRefreshChildPostParam(postID, enableCustomFields, enableCategory, false, g_temp.typeCurrentPost);

	}


	/**
	 * refresh child post param
	 */
	function ajaxRefreshChildPostParam(postID, enableCustomFields, enableCategory, isForWoo, childKey){

		var data = {
				postid: postID,
				enable_custom_fields: enableCustomFields,
				enable_category: enableCategory,
				enable_woo: isForWoo
		};

		g_ucAdmin.ajaxRequest("get_post_child_params", data, function(response){

			var arrPostParams = g_ucAdmin.getVal(response, "child_params_post");

			updateDynamicPostKeys(arrPostParams, childKey);

		});

	}

	function ____________SVG_ICON____________(){};

	/**
	 * get svg preview url
	 */
	function getUrlSvgPreview(){

		var urlAssets = getUrlAssets();

		if(!urlAssets)
			return(null);

		var objItem = g_objAssetsManager.getItemByFilename("preview_icon.svg");

		if(!objItem)
			return(null);

		var urlFull = g_ucAdmin.getVal(objItem, "full_url");

		return(urlFull);
	}


	/**
	 * update preview of svg icon
	 */
	function updateSvgIconPreview(){

		try{
			var urlPreview = getUrlSvgPreview();

			var objHolder = jQuery("#uc_widget_svg_holder");

			if(!urlPreview){
				objHolder.css("background-image","url('')");
				objHolder.hide();
				return(false);
			}

			objHolder.show();
			objHolder.css("background-image","url('"+urlPreview+"')");

		}catch(error){

			setTimeout(updateSvgIconPreview, 1000);

		}

	}


	function ____________EVENTS____________(){};


	/**
	 * on update addon button click
	 */
	function onUpdateAddonClick(){
		
		var data = getDataFromAddonView();
		var strData = g_ucAdmin.encodeObjectForSave(data);
		var passData = {addon_data:strData};

		g_ucAdmin.setAjaxLoaderID("uc_loader_update");
		g_ucAdmin.setSuccessMessageID("uc_message_addon_updated");
		g_ucAdmin.setAjaxHideButtonID("button_update_addon");
		g_ucAdmin.setErrorMessageID("uc_update_addon_error");

		g_ucAdmin.ajaxRequest("update_addon", passData);
	}


	/**
	 * on update addon button click
	 */
	function onUpdateAddonFromCatalogClick(){

		if(confirm("This operation will take the latest version of the addon from the online catalog, and rewrite any custom changes if you made. Proceed?") == false)
			return(false);

		var data = {};
		data.id = g_addonID;

		g_ucAdmin.setAjaxLoaderID("uc_loader_update_catalog");
		g_ucAdmin.setSuccessMessageID("uc_message_addon_updated_catalog");
		g_ucAdmin.setAjaxHideButtonID("uc_button_update_catalog");
		g_ucAdmin.setErrorMessageID("uc_update_addon_error");

		g_ucAdmin.ajaxRequest("update_addon_from_catalog", data);
	}

	/**
	 * enable code examples
	 */
	function onShowCodeExamplesClick(){

		g_temp.putCodeExamplesParams = true;

		paramsPanelMainSync();

	}


	/**
	 * on export addon click
	 */
	function onExportAddonClick(){

		var params = "id="+g_addonID;
		var urlExport = g_ucAdmin.getUrlAjax("export_addon", params);

		window.open(urlExport);
	}


	/**
	 * select tab in addon view
	 * tab is the link object to tab
	 */
	function addonSelectTab(objTab, nohash){

		if(!objTab)
			var objTab = jQuery("#uc_tabs a.uc-tab-selected");
		else{
			if(objTab.hasClass("uc-tab-selected"))
				return(false);
		}

		var contentID = objTab.data("contentid");
		var tabID = objTab.prop("id");

		jQuery("#uc_tab_contents .uc-tab-content").hide();

		jQuery("#" + contentID).show();

		jQuery("#uc_tabs a").not(objTab).removeClass("uc-tab-selected");
		objTab.addClass("uc-tab-selected");

		//add hash:
		if(nohash !== true)
			location.hash = "tab="+tabID;

		switch(contentID){
			case "uc_tab_general":
				setTimeout(updateSvgIconPreview, 500);
			break;
			case "uc_tab_html":
				setCodeMirrorEditor("html");
				setCodeMirrorEditor("html_item");
				setCodeMirrorEditor("html_item2");
			break;
			case "uc_tab_js":
				setCodeMirrorEditor("js");
			break;
			case "uc_tab_css":
				setCodeMirrorEditor("css");
				setCodeMirrorEditor("css_item");
			break;
			case "uc_tab_includes":

				//load includes path

				if(g_temp.isAssetsUpdated == true || g_temp.includesLoadPath != ""){
					g_temp.isAssetsUpdated = false;

					if(g_objAssetsIncludes){
						var loadPath = "";
						if(g_temp.includesLoadPath != ""){
							loadPath = g_temp.includesLoadPath;
							g_temp.includesLoadPath = "";
						}
						g_objAssetsIncludes.loadPath(loadPath);
					}
				}

			break;
			case "uc_tab_changelog":
				loadChangelog();
			break;
			case "uc_tab_revisions":
				loadRevisions();
			break;
		}

	}

	/**
	 * on settings item change - enable items yes/no
	 */
	function onSettingsItemsChange(){

		var enableItems = isItemsEnabled();
		var isVisible = isItemsVisible();

		if(enableItems == true && isVisible == false)
			showItemsRelated();
		else
			if(enableItems == false && isVisible == true)
				hideItemsRelated();

	}




	/**
	 * on general settings change
	 */
	function onGeneralSettingChange(event, data){

		var settingName = g_ucAdmin.getVal(data, "name");

		switch(settingName){

			case "dynamic_addon":
				paramsPanelMainSync();
			break;
			case "dynamic_post":
			case "dynamic_post_enable_customfields":
			case "dynamic_post_enable_taxonomies":
			case "dynamic_post_enable_category":

				refreshDynamicPostFields();

			break;
		}


	}


	/**
	 * on update main params
	 * check dynamic change, and sync main params
	 */
	function onParamsEditorMainUpdate(){

		var objLastParam = g_paramsEditorMain.getLastUpdatedParam();

		if(!objLastParam){
			paramsPanelMainSync();
			return(false);
		}

		var paramType = g_ucAdmin.getVal(objLastParam, "type");

		switch(paramType){
			case "uc_posts_list":

				var postID = g_ucAdmin.getVal(objLastParam, "post_example");
				var enableCustomFields = g_ucAdmin.getVal(objLastParam, "use_custom_fields");
				enableCustomFields = g_ucAdmin.strToBool(enableCustomFields);

				var enableCategory = g_ucAdmin.getVal(objLastParam, "use_category");
				enableCategory = g_ucAdmin.strToBool(enableCategory);

				var isForWoo = g_ucAdmin.getVal(objLastParam, "for_woocommerce_products");
				isForWoo = g_ucAdmin.strToBool(isForWoo);

				ajaxRefreshChildPostParam(postID, enableCustomFields, enableCategory, isForWoo,  g_temp.typePost);

			break;
			default:
				paramsPanelMainSync();
			break;
		}

	}


	/**
	 * init events
	 */
	function initEvents(){

		//general settings events
		g_generalSettings.setEventOnChange(onGeneralSettingChange);

		//item tab events

		//change files event
		g_settingsItem.setEventOnChange(onSettingsItemsChange);

		onSettingsItemsChange();

		//expand click
		jQuery(".uc-tabcontent-link-expand").on("click",function(){

			var objLink = jQuery(this);

			var objRow = objLink.parents("tr");

			var rowClass = "uc-row-expanded";

			objRow.addClass(rowClass);

			objLink.hide();


		});

		jQuery("#button_update_addon").on("click",onUpdateAddonClick);
		jQuery("#button_export_addon").on("click",onExportAddonClick);
		jQuery("#uc_button_update_catalog").on("click",onUpdateAddonFromCatalogClick);

		jQuery(".uc-link-code-examples").on("click", onShowCodeExamplesClick);

	}

	function ____________STICKY_MENU____________(){};

	/**
	 * init sticky menu
	 */
	function initStickyButtonsPanel(){

		var offset = g_objButtonsPanel.offset();

		var adminBar = jQuery("#wpadminbar");

		var adminBarHeight = 0;
		if(adminBar.length)
			adminBarHeight = adminBar.height()+2;

		var offsetTop = Math.round(offset.top) - adminBarHeight;


		jQuery(window).scroll(function () {

			var desTop = jQuery(document).scrollTop();

			//clearTrace()
			//trace(desTop);
			//trace(offsetTop);

			if(desTop > offsetTop){
				g_objButtonsPanel.addClass("uc-stick-top");
			} else {
				g_objButtonsPanel.removeClass("uc-stick-top");
			}
		});

	}

	function ____________INIT____________(){};


	/**
	 * init the params editors
	 */
	function initParamsEditors(objParamsMain, objParamsItems, arrParamsCats){

		var objWrapperMain = jQuery("#attr_wrapper_main");
		g_objWrapperItems = jQuery("#attr_wrapper_items");
		var objDialogParam = jQuery("#uc_dialog_param_main");
		var objDialogItemVariable = jQuery("#uc_dialog_param_variable_item");
		var objDialogMainVariable = jQuery("#uc_dialog_param_variable_main");
		
		g_objDialogParam.init(objDialogParam, t);
		g_objDialogItemVariable.init(objDialogItemVariable, t);
		g_objDialogMainVariable.init(objDialogMainVariable, t);

		g_paramsEditorMain.init(objWrapperMain, objParamsMain, g_objDialogParam, arrParamsCats);
		g_paramsEditorItems.init(g_objWrapperItems, objParamsItems, g_objDialogParam);
		
	}


	/**
	 * init tabs
	 */
	function initTabs(){

		//select current tab
		var initTabID = jQuery("#uc_tabs").data("inittab");

		var objCurrentTab = jQuery("#"+initTabID);
		var hash = location.hash;
		if(hash){
			var tabID = hash.replace("tab=","");
			var objTab = jQuery(tabID);
			if(objTab.length)
				objCurrentTab = objTab;
		}

		addonSelectTab(objCurrentTab, true);

		jQuery("#uc_tabs a").on("click",function(){

			var objTabs = jQuery("#uc_tabs");
			if(objTabs.hasClass("uc-tabs-disabled"))
				return(false);

			var objTab = jQuery(this);
			addonSelectTab(objTab);

		});

		//remove the disabled class
		setTimeout(function(){
			var objTabs = jQuery("#uc_tabs");
			objTabs.removeClass("uc-tabs-disabled");

		},1000);

	}


	/**
	 * init tipsy
	 */
	function initTipsy() {

		if (typeof jQuery("body").tipsy !== "function")
			return;

		g_objWrapper.tipsy({
			selector: ".uc-tip",
			delayIn: 200,
			offset: 4,
			html: true,
			gravity: "s"
		});
	}


	/**
	 * init items tab
	 */
	function initItemsTab(){

		g_objItemSettingsWrapper = jQuery("#uc_tab_itemattr").children(".unite_settings_wrapper");
		
		g_settingsItem.init(g_objItemSettingsWrapper);
		
	}

	/**
	 * init js tab
	 */
	function initJSTab(){

		var objJSSettingsWrapper = jQuery("#uc_tab_js").find(".unite_settings_wrapper");

		g_settingsJS.init(objJSSettingsWrapper);

	}


	/**
	 * put preview image
	 */
	function putPreviewImage(urlPreview){
		if(!urlPreview || urlPreview == "")
			return(false);

		var html = "";
		html += "<div id='uc_edit_addon_preview_image' class='uc-edit-addon-preview-image' style=\"background-image:url('"+urlPreview+"')\"></div>";

		jQuery("#unite_setting_text_preview_row .spanSettingsStaticText").parent().append(html);
	}




	/**
	 * init view by options related items
	 */
	function initByOptions(arrOptions){
		
		var urlPreview = arrOptions["url_preview"];
		if(urlPreview)
			putPreviewImage(urlPreview);

		var objPanel = new UniteCreatorParamsPanel();

		//set thumb sizes
		var objThumbSizes = arrOptions["thumb_sizes"];
		if(objThumbSizes){
			objPanel.initGlobalSetting_ThumbSizes(objThumbSizes);
		}
		
		//set image add fields
		var objImageParams = arrOptions["image_add_fields"];
		if(objImageParams){
			objPanel.initGlobalSetting_ImageAddParams(objImageParams);
		}
		
		
	}


	/**
	 * get control attributes with their values
	 */
	this.getControlParams = function(type){

		switch(type){
			default:
			case "main":
				var arrData = g_paramsEditorMain.getParamsData("control", true);
			break;
			case "items":
			case "item":
				var arrData = g_paramsEditorItems.getParamsData("control", true);
			break;
		}

		return(arrData);
	};


	/**
	 * edit addon view
	 */
	this.initEditAddonView = function(){
		
				
		g_objWrapper = jQuery("#uc_tab_contents");

		var objConfig = jQuery("#uc_edit_item_config");
		var objParamsMain = objConfig.data("params");
		var objParamsItems = objConfig.data("params-items");
		var arrPanelKeys = objConfig.data("panel-keys");

		var arrPanelItemKeys = objConfig.data("panel-item-keys");
		var arrPanelChildKeys = objConfig.data("panel-child-keys");
		var arrPanelAddKeys = objConfig.data("panel-add-keys");
		var arrPanelTemplateCode = objConfig.data("panel-template-code");
		var arrSkipParams = objConfig.data("panel-skip-params");

		var arrVariablesItems = objConfig.data("variables-items");
		var arrVariablesMain = objConfig.data("variables-main");
		var arrParamsCats = objConfig.data("params-cats");

		var arrOptions = objConfig.data("options");

		var isAddEditPro = g_ucAdmin.getVal(arrOptions,"add_edit_pro");
		var isLimitProFunctionality = g_ucAdmin.getVal(arrOptions,"enable_limit_pro_functionality");
		var isProVersion = g_ucAdmin.getVal(arrOptions,"is_pro_version");
		
		if(isAddEditPro === true)
			g_ucAdmin.setOption("uc_edit_pro", true);

		if(isLimitProFunctionality === true)
			g_ucAdmin.setOption("uc_limit_pro_functionality", true);

		if(isProVersion === true)
			g_ucAdmin.setOption("uc_pro_version", true);

		var objSettingsWrapper = jQuery("#uc_general_settings");

		if(jQuery("#addon_id").length)
			g_addonID = jQuery("#addon_id").data("addonid");

		g_objButtonsPanel = jQuery("#uc_buttons_panel");

		initStickyButtonsPanel();
		
		initItemsTab();

		initJSTab();

		initTabs();

		initTipsy();

		g_generalSettings.init(objSettingsWrapper);

		initIncludesTab();

		initParamsEditors(objParamsMain, objParamsItems, arrParamsCats);

		initAssetsTab();

		initChangelogTab();

		initRevisionsTab();

		initByOptions(arrOptions);

		initVariables(arrVariablesItems, arrVariablesMain);	//must init before params panels

		//init param parnels
		initParamPanelGlobals(arrPanelChildKeys, arrPanelTemplateCode, arrPanelAddKeys, arrSkipParams);
		initParamsPanels(arrPanelKeys, arrPanelItemKeys);

		//focus the title if empty
		var title = jQuery("#text_addon_title").val();
		if(jQuery.trim(title) == "")
			jQuery("#text_addon_title").focus();

		initEvents();

		updateImageSelectPath();

		initBulkDialog();

	};

	this.________________INIT_OTHER_VIEWS_______________ = function(){};

	/**
	 * init assets manager view
	 */
	this.initAssetsManagerView = function(){

		var objAssetsManagerWrapper = jQuery("#uc_assets_manager");
		if(objAssetsManagerWrapper.length == 0)
			throw new Error("Assets manager not found");

		g_objAssetsManager.init(objAssetsManagerWrapper);
	};




};
