HEX
Server: Apache
System: Linux pdx1-shared-a1-38 6.6.104-grsec-jammy+ #3 SMP Tue Sep 16 00:28:11 UTC 2025 x86_64
User: mmickelson (3396398)
PHP: 8.1.31
Disabled: NONE
Upload Files
File: /home/mmickelson/martyknows.com/wp-content/plugins/mediamatic/assets/js/core.js
	var mediaConfig 		= mediamaticConfig;
	
	var coreFilter 			= {
		categoryID:  '',
		page: 1,
	};
    var MediamaticCore 		= {
		
		// for iaoAlert jquery plugin
		iaoAlertTime:					'5000',
		iaoAlertPosition:				'top-right',
		alertSuccessIcon: 				'<span class="icon_holder success"></span>',
 		alertWarningIcon:				'<span class="icon_holder warning">!</span>',
		slugError:						'<span class="error_note">'+mediaConfig.slugError+'</span>',
		enterName:						'<span class="error_note">'+mediaConfig.enterName+'</span>',
		
		// get ajax URL
		ajaxurl:						mediaConfig.ajaxUrl,
		uploadURL:						mediaConfig.uploadURL,
		nonce:							mediaConfig.nonce,
		
		// get translated texts from interface.php file
		areYouSure:						mediaConfig.areYouSure,
		clearText:						mediaConfig.clearText,
		willBeMovedToUncategorized:		mediaConfig.willBeMovedToUncategorized,
		confirmText:					mediaConfig.confirmText,
		cancelText:						mediaConfig.cancelText,
		newFolderText:					mediaConfig.newFolderText,
		renameText:						mediaConfig.renameText,
		clearMediaText:					mediaConfig.clearMediaText,
		deleteText:						mediaConfig.deleteText,
		pluginURL:						mediaConfig.pluginURL,
		hasSubFolder:					mediaConfig.hasSubFolder,
		plugin:							mediaConfig.plugin,
		
		moveOneFile:					mediaConfig.moveOneFile,
		moveText:						mediaConfig.move,
		filesText:						mediaConfig.files,
		itemText:						mediaConfig.item,
		itemsText:						mediaConfig.items,
		noItemDOM:						mediaConfig.noItemDOM,
		
		
		tooltipForListMode:				null,
		
		// min and maximum width for sidebar
		minWidth:						250,
		maxWidth:						750,
		
		// global variables
		menuItemDepthPerLevel: 			18,
		globalMaxDepth: 				11,
        menuList: 						undefined,
        menusChanged: 					false,
        isRTL: 							!!("undefined" !== typeof isRtl && isRtl), 			// get true if RTL is activated, otherwise get false
        negateIfRTL: 					("undefined" !== typeof isRtl && isRtl) ? -1 : 1, 	// get -1 if RTL is activated, otherwise get 1
        currentParent: 					null,
        oldParent: 						null,
        mediamaticCurrentFolder: 			localStorage.getItem('mediamaticCurrentFolder') || 'all',
        mediamaticState: 					(localStorage.getItem('mediamaticTreeState')) ? localStorage.getItem('mediamaticTreeState').split(',') : [],
		mediamaticIsListNoFolder:			localStorage.getItem('mediamaticIsListNoFolder')|| 0,
		

		
        init: function () {
			// change iaoalert position if RTL mode is activated
			if(this.isRTL){
				this.iaoAlertPosition = 'top-left';
			}
			// change iaoalert success icon: add SVG
			this.alertSuccessIcon = '<span class="icon_holder success">'+this.getIcon('check')+'</span>';
			
			// add extra class to body for mediamatic
			jQuery('body').addClass('mediamatic-admin-panel');
			
			// remove duplicate IDs from tree in order to avoid any issues with opener (triangle)
			this.mediamaticState = this.removeDuplicates(this.mediamaticState);
			
			// get sidebar to body
			this.appendSidebarToBody();
			
			
			
			// if has sidebar 
			if(jQuery('.cc_mediamatic_sidebar').length){
				
				// remove all wordpress error or notice if has sidebar
				jQuery('.update-nag').remove();
				
				// define menu list after appending interface to body
				this.menuList = jQuery("#mediamatic_be_folder_list");

				// jQuery extensions
				this.extensionsForMediamatic();

				// init sortable folders (categories) function
				if (this.menuList.length) {
					this.sortableCategories();
				}

				// update icons for parent folders
				this.addIcons();

				// append context menu
				this.appendMovingPopup();

				// init SVG magic function
				this.magicSVG();

				// call context menu by clicking on triple points
				this.callMovingPopup();

				// new folder click function for top button
				this.addNewFolderByTopButton();

				// new folder click function for context menu
				this.addNewFolderByContextMenu();

				// cancel adding new folder
				this.cancelAddingNewCategory();

				// change sidebar width with splitter
				this.splitter();
				
				// opens custom menu on popup media window
				this.triggerCustomMenu();
				
				// searches from folders
				this.startSearchFolder();
				
				this.detectAnyChange();
				
				
			}
				
			
			
			// list mode functions
			if(this.isListMode()){
				// append moving tooltip "Move 1 file";
				this.appendDragger();
				
				// select this tooltip
				this.tooltipForListMode	 	= jQuery("#mediamatic-dragger");
				
				this.setFolderFilterForList();
				
				this.movingMediaForListMode();
				
			}
			
			
        },
		
		
		setFolderFilterForList: function(){
			
			var self = this;
				
			// Add all folders to select
			jQuery.each(mediamaticFolders, function (index, element) {
				jQuery('.wpmediacategory-filter').append('<option value="' + element.folderID + '">' + element.folderName + '</option>');
			});

			// Set value of select
			//jQuery('select[name="cc_mediamatic_folder"]').val(folderID);
			
			var url 	= new URL(window.location.href);
			var mediamatic_filter = url.searchParams.get("cc_mediamatic_folder");
			
			jQuery('.cc_mediamatic_header .header_bottom ul li[data-id="all"]').addClass('active');
			
			if(mediamatic_filter != null){
				self.defineAndSetActiveCategory();
			}			
			
		},
		
		
		detectAnyChange: function(){
			
			
			/*var mutationObserver = new MutationObserver(function(mutations) {
				mutations.forEach(function(mutation) {
					console.log(mutation);
				});
			});*/
			
			
			jQuery(window).on('click', function(){
				
				// we need to disable sidebar from popup window
				if(jQuery(".mediamatic-modal .media-frame").hasClass('hide-router')) {
					jQuery(".mediamatic-modal").addClass('closed');
				}else{
					jQuery(".mediamatic-modal").removeClass('closed');
				}
			});
		},
		
		
		triggerCustomMenu: function(){
			var trigger = jQuery('.mediamatic-custom-menu-trigger');
			
			trigger.on('click', function(){
				if(jQuery(this).hasClass('closed')){
					jQuery('.mediamatic-custom-menu').removeClass('closed');
					jQuery(this).removeClass('closed');
				}else{
					jQuery('.mediamatic-custom-menu').addClass('closed');
					jQuery(this).addClass('closed');
				}
			});
		},
		
		appendDragger: function(){
			var self			= this;
			if(jQuery('#mediamatic-dragger').length === 0){
				jQuery("body").append('<div id="mediamatic-dragger" data-id="">' + self.moveOneFile + '</div>');
			}
		},
		movingMediaForListMode: function(){
			var self			= this;
			
			
			jQuery('.wpmediacategory-filter').val(self.mediamaticCurrentFolder);
			jQuery('.wpmediacategory-filter').trigger('change');
			localStorage.setItem('mediamaticCurrentFolder', self.mediamaticCurrentFolder);

			self.dragDropListMode();
			
			
		},
		
		moveMultipleMediaForListMode: function(IDs,folderID){
			var self		= this;
			
			var requestData = {
				action: 'mediamaticAjaxMoveMultipleMedia',
				IDs: IDs,
				folderID: folderID,
			};
			
			
			self.startPreloader();
			
			jQuery.each(IDs, function(i, e) {
				jQuery('#post-' + e).addClass('cc_opacity');
			});
			
			jQuery.ajax({
				type: 'POST',
				url: self.ajaxurl,
				cache: false,
				data: requestData,
				success: function(data) {
					var fnQueriedObj 	= jQuery.parseJSON(data);
					var result			= fnQueriedObj.result;
					
					
					
					result.forEach(function(item){
						self.updateCount(item.from, item.to);
					});
					
					if (jQuery('.wpmediacategory-filter').val() !== null) {
						jQuery.each(IDs, function(i, e) {
							jQuery('#post-' + e).remove();
						});
						var length = jQuery('.wp-list-table tbody tr').length;
						if(length === 0){
							jQuery('.wp-list-table tbody').append(self.noItemDOM);
							jQuery('.displaying-num').hide();
						}else{
							jQuery('.displaying-num').text(length + ' ' + (length === 1 ? self.itemText : self.itemsText));
						}
					}
					
					jQuery('.wp-list-table tbody tr').removeClass('cc_opacity');
					self.stopPreloader();
					
				},
				error: function(xhr, textStatus, errorThrown){
					console.log(errorThrown);
					console.log(textStatus);
					console.log(xhr);
				}
			});
		},
		
		updateCount: function(from, to){
			from 	= parseInt(from);
			to 		= parseInt(to);
			if(from !== to){
				if(from){
					var countTermFrom 	= jQuery('ul li.category_item[data-id="' + from + '"] .cc_count').text();
					
					countTermFrom 		= parseInt(countTermFrom) -1;
					if(countTermFrom){
						jQuery('ul li.category_item[data-id="' + from + '"] .cc_count').text(countTermFrom);
					}else{
						jQuery('ul li.category_item[data-id="' + from + '"] .cc_count').text(0);
					}
				}
				if(to){
					var countTermTo 	= jQuery('ul li.category_item[data-id="' + to + '"] .cc_count').text();
					countTermTo 		= parseInt(countTermTo) +1;
					jQuery('ul li.category_item[data-id="' + to + '"] .cc_count').text(countTermTo);
				}
			}	
		},
		
		getSelectedFilesForListMode: function(){
			var selectedFiles 	= jQuery('.wp-list-table input[name="media[]"]:checked');
			var IDs 			= [];
			if(selectedFiles.length){
				selectedFiles.each(function (index, item) {
					IDs.push(jQuery(item).val());
				});
				return IDs;
			}

			return false;
		},
		
		moveSingleMediaForListMode: function(folderID){
			var self			= this;
			var mediaID			= self.tooltipForListMode.data("id");
			var mediaItem	 	= jQuery('.attachment[data-id="' + mediaID + '"]');
			var currentFolder 	= jQuery(".wpmediacategory-filter").val();
			currentFolder		= jQuery('.category_item.active').attr('data-id');
			
			
			
			// if selected All category OR moving going on into All category stop action
			if (folderID === 'all' || folderID 	=== currentFolder){
				jQuery('.wp-list-table tbody tr').removeClass('cc_opacity');
				return false;
			}
			
			
			self.startPreloader();
			jQuery('#post-' + mediaID).addClass('cc_opacity');
			
			var requestData = {
				action: 'mediamaticAjaxGetTermsByMedia',
				nonce: self.nonce,
				ID: mediaID,
			};

			jQuery.ajax({
				type: 'POST',
				url: self.ajaxurl,
				cache: false,
				data: requestData,
				success: function(data) {
					var fnQueriedObj 	= jQuery.parseJSON(data);
					var error			= fnQueriedObj.error;
					if(error === 'no'){
						
						self.moveSingleMediaAjaxProcessForListMode(fnQueriedObj.terms,folderID,mediaID,currentFolder,mediaItem);
					}else{
						self.stopPreloader();
					}
					
				},
				error: function(xhr, textStatus, errorThrown){
					console.log(errorThrown);
					console.log(textStatus);
					console.log(xhr);
				}
			});
			
		},
		
		moveSingleMediaAjaxProcessForListMode: function(result,folderID,mediaID,currentFolder,mediaItem){
			var self	= this;
			var terms 	= Array.from(result, v => v.term_id);
			//check if drag to owner folder

			if (terms.includes(parseInt(folderID))) {
				self.stopPreloader();
				jQuery('.wp-list-table tbody tr').removeClass('cc_opacity');
				return;
			}
			

			var attachments = {};

			attachments[mediaID] = { menu_order: 0 };
			
			var requestData = {
				action: 'mediamaticAjaxMoveSingleMedia',
				attachments: attachments,
				mediaID: mediaID,
				folderID: folderID,
			};
			
			

			jQuery.ajax({
				type: 'POST',
				url: self.ajaxurl,
				cache: false,
				data: requestData,
				success: function(data) {
					
					
					var fnQueriedObj 	= jQuery.parseJSON(data);
					var error			= fnQueriedObj.error;
					
					if (error === 'no') {

						jQuery.each(terms, function (index, value) {
							self.updateCount(value, folderID);
						});
						
						//if attachment not in any terms (folder)
						if (currentFolder === 'all' && !terms.length) {
							self.updateCount(-1, folderID);
						}

						if (parseInt(currentFolder) === -1) {							
							self.updateCount(-1, folderID);
						}

						if (currentFolder !== 'all') {
							mediaItem.detach();
						}

					}
					
					self.stopPreloader();
					jQuery('.wp-list-table tbody tr').removeClass('cc_opacity');
					
					if(jQuery('.wpmediacategory-filter').val() !== null){
						jQuery('#post-' + mediaID).remove();
						var length = jQuery('.wp-list-table tbody tr').length;
						if(length === 0){
							jQuery('.wp-list-table tbody').append(self.noItemDOM);
							jQuery('.displaying-num').hide();
						}else{
							jQuery('.displaying-num').text(length + ' ' + (length === 1 ? self.itemText : self.itemsText));
						}
					}

					
				},
				error: function(xhr, textStatus, errorThrown){
					console.log(errorThrown);
					console.log(textStatus);
					console.log(xhr);
				}
			});
		},

		splitter: function(){
			var self = this;
			jQuery(".cc_mediamatic_sidebar").mediamaticResize({
				handleSelector: ".mediamatic_splitter.active",
				resizeHeight: false,
				onDrag: function (e, jQueryel, newWidth) {
					jQueryel.css('overflow', 'initial');
				 	if((newWidth <= self.minWidth) || (newWidth >= self.maxWidth)){
				 		return false;
				 	}
				 	jQuery('.cc_mediamatic_sidebar_in').css({width: newWidth + 'px'});
				}
			});
			
		},
		defineAndSetActiveCategory: function(){
			var self 		= this;
			var folderID;
			
			folderID		= self.mediamaticCurrentFolder;		
			
			/*console.log(localStorage.getItem('mediamaticCurrentFolder'));
			console.log(folderID);*/
			
			jQuery('.cc_mediamatic_header .header_bottom ul li[data-id="all"]').removeClass('active');
			
			if(folderID == 'all'){
				jQuery('.cc_mediamatic_header .header_bottom ul li[data-id="all"]').addClass('active');
			}else if(parseInt(folderID) > 0){
				jQuery('#cc_category_item_' + folderID).addClass('active');
			}else if(parseInt(folderID) === -1){
				jQuery('.cc_mediamatic_header .header_bottom ul li[data-id="-1"]').addClass('active');
			}

			
			if(self.isListMode()){
				if((jQuery('ul.cc_mediamatic_category_list li.category_item').length === 0) && (parseInt(folderID) === -1)){
					self.mediamaticCurrentFolder = 'all';
					folderID	= 'all';
					self.mediamaticIsListNoFolder = -1;
					localStorage.setItem('mediamaticIsListNoFolder', self.mediamaticIsListNoFolder);
					
				}
				if((jQuery('ul.cc_mediamatic_category_list li.category_item').length === 0) && (parseInt(self.mediamaticIsListNoFolder) === -1)){
					self.mediamaticCurrentFolder = 'all';
					folderID	= 'all';
					self.mediamaticIsListNoFolder = -1;
					localStorage.setItem('mediamaticIsListNoFolder', self.mediamaticIsListNoFolder);
				}
			}else{
				self.mediamaticIsListNoFolder = 0;
				localStorage.setItem('mediamaticIsListNoFolder', self.mediamaticIsListNoFolder);
			}
			
			
			jQuery('.wpmediacategory-filter').val(self.mediamaticCurrentFolder);
			jQuery('.wpmediacategory-filter').trigger('change');
			jQuery('.attachments').css('height', 'auto');
		},
		
		
		dragDropListMode: function(){
			"use strict";
			var self					= this;
			var dragItem 				= jQuery("#mediamatic-dragger");
			var textDrag 				= self.moveOneFile;
			
			
			jQuery('table.wp-list-table tr').draggable({

				revert: "invalid",
				containment: "document",
				cursor: 'move',
				cursorAt: {
					left: 2,
					top: 2
				},

				helper: function(){
					return jQuery("<div></div>");
				},

				start: function(){

					var selectedFiles = jQuery('.wp-list-table input[name="media[]"]:checked').length;
					if (selectedFiles > 0) {textDrag = self.moveText + ' ' + selectedFiles + ' ' + self.filesText;}

					jQuery('body').addClass('cc_draging');
					dragItem.html(textDrag);
					dragItem.addClass('active');
				},

				stop: function() {
					jQuery('body').removeClass('cc_draging');
					dragItem.removeClass('active');
					textDrag = self.moveOneFile;
				},

				drag: function(){
					var ID 				= jQuery(this).attr("id");
					ID 					= ID.match(/post-([\d]+)/)[1];
					dragItem.data("id", ID);

					dragItem.css({
						"top": event.clientY - 15,
						"left": event.clientX - 15,
					});
				}


			});
			
				
			jQuery("li.category_item").droppable({
				accept: "table.wp-list-table tr",
				hoverClass: 'hover',
				classes: {
					"ui-droppable-active": "ui-state-highlight"
				},
				drop: function() {

					var folderID 	= jQuery(this).attr('data-id');
					var IDs 		= self.getSelectedFilesForListMode();
					
					
					if(IDs.length){
						self.moveMultipleMediaForListMode(IDs, folderID);
					}else{
						self.moveSingleMediaForListMode(folderID);
					}
					
				}
			});
			
			
		},
		
		
		addIcons: function () {
			var self 	= this;
            var list 	= self.menuList.find('li.category_item');
            jQuery.each(list, function (index,element) {
                var depth 		= jQuery(element).menuItemDepth();
                var nextLi 		= jQuery(element).next();
                if (nextLi.hasClass('category_item')) {
					var depthNext 	= nextLi.menuItemDepth();
                    if (depthNext > depth) {
                        if (self.mediamaticState.indexOf(jQuery(element).data('id').toString()) < 0) {
							var children = jQuery(element).childMenuItems();
							children.wrapAll('<li class="new-wrapper children_of_' + jQuery(element).attr('id') + '"><ul></ul></li>');
							jQuery(element).find('.cc_dropdown').addClass('has_children').addClass('close');
                        }else{
                            jQuery(element).find('.cc_dropdown').addClass('has_children').addClass('open');
                        }
                    }
                }
            });

			
            jQuery(document).on('click', '.cc_dropdown.has_children', function (event) {
                event.stopPropagation();
                event.preventDefault();
				var clickBtn	= jQuery(this);
				var clickedLi	= clickBtn.closest('li.category_item');
				var ID 			= clickedLi.data('id');
				var children;
				
				if(clickBtn.hasClass('open')) {
					children 	= clickedLi.childMenuItems();

					children.wrapAll('<li class="new-wrapper children_of_' + clickedLi.attr('id') + '"><ul></ul></li>');
					clickBtn.removeClass('open').addClass('close');

					self.mediamaticState.splice(self.mediamaticState.indexOf(ID.toString()), 1);
					localStorage.setItem("mediamaticTreeState", self.mediamaticState);

				}else if(clickBtn.hasClass('close')) {
					children 	= jQuery('.children_of_' + clickedLi.attr('id') + ' > ul > li.category_item');

					children.unwrap().unwrap();
					clickBtn.removeClass('close').addClass('open');
					if (self.mediamaticState.indexOf(ID.toString()) < 0) {
						ID = ID.toString();
						self.mediamaticState.push(ID);
						localStorage.setItem("mediamaticTreeState", self.mediamaticState);
					}

				}
				
				localStorage.setItem('mediamaticCurrentFolder', ID);
				
				self.updateFolderPosition();

            });
        },
		refreshFolderPositionAjax: function(current, newParent){
			var self		= this;
			var requestData = {
				action: 'mediamaticAjaxMoveCategory',
				current: current,
				parent: newParent,
			};

			jQuery.ajax({
				type: 'POST',
				url: self.ajaxurl,
				cache:true,
				data: requestData,
				success: function(data) {
					var fnQueriedObj 	= jQuery.parseJSON(data);
					if(fnQueriedObj.error === 'no'){
						self.updateFolderPosition();
					}
				},
				error: function(xhr, textStatus, errorThrown){
					console.log(errorThrown);
					console.log(textStatus);
					console.log(xhr);
				}
			});
		},
		updateFolderPosition: function(){
			var self		= this,
				data 		= '',
				i			= '';
			
			self.startPreloader();
			
			jQuery(".cc_mediamatic_sidebar .input_category_id").each(function () {
				var ID		= jQuery(this).val();i += '0';
				if(data !== '') {data = data + '#';}
				data 		= data + ID + ',' + i;
			});
			
			var requestData = {
				action: 'mediamaticAjaxUpdateFolderPosition',
				data: data
			};
			
			jQuery.ajax({
				type: 'POST',
				url: self.ajaxurl,
				cache:true,
				data: requestData,
				success: function() {
					self.stopPreloader();
				},
				error: function(xhr, textStatus, errorThrown){
					console.log(errorThrown);
					console.log(textStatus);
					console.log(xhr);
				}
			});
			
			
		},
		extensionsForMediamatic: function(){
			var self = this;
            jQuery.fn.extend({
				ccMoveCursorToEnd: function(){
					this.focus();
					var thisVal = this.val();
					this.val('').val(thisVal);
					return this;
				},
				refreshFoldersPosition: function(){
					return this.each(function () {
						var item 		= jQuery(this),
							depth 		= parseInt(item.menuItemDepth(), 10),
							parentDepth = depth - 1,
							parent 		= item.prevAll('.category_item_depth_' + parentDepth).first(),
							newParent 	= 0,
							current 	= item.find('.input_category_id').val();
						if (depth !== 0) {
							newParent 	= parent.find('.input_category_id').val();
						}
						self.refreshFolderPositionAjax(current, newParent);
					});	
				},
                menuItemDepth: function () {
                    var margin = self.isRTL ? this.eq(0).css('margin-right') : this.eq(0).css('margin-left');
                    return self.pxToDepth(margin && -1 != margin.indexOf('px') ? margin.slice(0, -2) : 0);
                },
                updateDepthClass: function (current, prev) {
                    return this.each(function(){
                        var t 	= jQuery(this);
                        prev 	= prev || t.menuItemDepth();
                        jQuery(this).removeClass('category_item_depth_' + prev).addClass('category_item_depth_' + current);
                    });
                },
                shiftDepthClass: function(change) {
                    return this.each(function () {
                        var t 			= jQuery(this),
                            depth 		= t.menuItemDepth(),
                            newDepth 	= parseInt(depth + change);

                        t.removeClass('category_item_depth_' + depth).addClass('category_item_depth_' + (newDepth));

                        if(newDepth === 0){
                            t.find('.is-submenu').hide();
                        }
                    });
                },
                childMenuItems: function () {
                    var result = jQuery();
                    this.each(function () {
                        var t = jQuery(this), depth = t.menuItemDepth(), next = t.next('li');
                        while (next.length && next.menuItemDepth() > depth || next.hasClass('new-wrapper')) {
                            result	= result.add(next);
                            next 	= next.next('li');
                        }
                    });
                    return result;
                },
                updateParentMenuItemDBId: function () {
                    return this.each(function () {
                        var item 		= jQuery(this),
                            input 		= item.find('.input_parent_id'),
                            depth 		= parseInt(item.menuItemDepth(), 10),
                            parentDepth = depth - 1,
                            parent 		= item.prevAll('.category_item_depth_' + parentDepth).first();
                        var newParent 	= 0;
                        if(parseInt(depth) !== 0){
                            newParent 	= parent.find('.input_category_id').val();
                        }
                        input.val(newParent);
                        if(parseInt(newParent) !== self.currentParent) {
                            jQuery.event.trigger({
                                type: 'MediamaticCoreTree_parent_changed',
                                new_parent: newParent,
                                id: item.find('.input_category_id').val(),
                            });
                            self.mediamaticState.push(newParent);
							self.mediamaticState = self.removeDuplicates(self.mediamaticState); // array unique
                            localStorage.setItem("mediamaticTreeState", self.mediamaticState);
                        }
                        self.currentParent = null;
                    });
                },
            });
        },
		
		
		
		sortableCategories: function () {
			// to call all functions in this file
			var self = this;
			
			// depth variables
            var currentDepth = 0,
				originalDepth,
				minDepth,
				maxDepth,
                prev,
				next,
				prevBottom,
				nextThreshold,
				helperHeight,
				transport,
                menuEdge = self.menuList.offset().left,
                body = jQuery('body'),
				maxChildDepth,
                menuMaxDepth = initialMenuMaxDepth();

			
            menuEdge += self.isRTL ? self.menuList.width() : 0;
			
            self.menuList.sortable({
                handle: '.cat_item a',
                placeholder: 'mediamatic-sortable-placeholder',
                items: '> *',
                start: function (e, ui) {
                    var height,
						width,
						parent,
						children,
						tempHolder;

                    // handle placement for rtl orientation
                    if (self.isRTL){
						ui.item[0].style.right = 'auto';
					}

                    transport 		= ui.item.children('.mediamatic_be_placeholder');

                    // Set depths. currentDepth must be set before children are located.
                    originalDepth 	= ui.item.menuItemDepth();
                    updateCurrentDepth(ui, originalDepth);

                    // Attach child elements to parent
                    // Skip the placeholder
                    parent 			= (ui.item.next()[0] == ui.placeholder[0]) ? ui.item.next() : ui.item;
                    children 		= parent.childMenuItems();
                   	
                    transport.append(children);

                    // Update the height of the placeholder to match the moving item.
                    height 			= transport.outerHeight();
                    // If there are children, account for distance between top of children and parent
                    height 			+= (height > 0) ? (ui.placeholder.css('margin-top').slice(0, -2) * 1) : 0;
                    height 			+= ui.helper.outerHeight();
                    helperHeight 	= height;
                    height 			-= 2; // Subtract 2 for borders
                    ui.placeholder.height(height);

                    // Update the width of the placeholder to match the moving item.
                    maxChildDepth 	= originalDepth;
                    children.each(function () {
                        var depth 		= jQuery(this).menuItemDepth();
                        maxChildDepth 	= (depth > maxChildDepth) ? depth : maxChildDepth;
                    });
                    width 			= ui.helper.find('.cat_item a').outerWidth(); // Get original width
                    width 			+= self.depthToPx(maxChildDepth - originalDepth); // Account for children
                    width 			-= 2; // Subtract 2 for borders
                    ui.placeholder.width(width);

                    // Update the list of menu items.
                    tempHolder 		= ui.placeholder.next('.category_item');
                    tempHolder.css('margin-top', helperHeight + 'px'); // Set the margin to absorb the placeholder
                    ui.placeholder.detach(); // detach or jQuery UI will think the placeholder is a menu item
                    jQuery(this).sortable('refresh'); // The children aren't sortable. We should let jQ UI know.
                    ui.item.after(ui.placeholder); // reattach the placeholder.
                    tempHolder.css('margin-top', 0); // reset the margin

                    // Now that the element is complete, we can update...
                    updateSharedVars(ui);
                    self.currentParent = ui.item.find('.input_parent_id').val();

                    self.oldParent 	= ui.item.prev();
                },
                stop: function (e, ui) {
                    var children,
						subMenuTitle,
                        depthChange 	= currentDepth - originalDepth;

                    // Return child elements to the list
                    if(jQuery('.children_of_' + ui.item.attr('id')).length) {
                        jQuery('.children_of_' + ui.item.attr('id')).insertAfter(ui.item);
                    }else{
                        children 		= transport.children().insertAfter(ui.item);
                    }
                    jQuery.each(jQuery('.new-wrapper'), function (index, el) {
                        jQuery(el).insertAfter('#cc_category_item_' + jQuery(el).attr('class').match(/children_of_cc_category_item_(\d)+/)[1]);
                    });
                    // Add "sub menu" description
                    subMenuTitle 		= ui.item.find('.item-title .is-submenu');
                    if(currentDepth > 0){
						subMenuTitle.show();
					}else{
						subMenuTitle.hide();
					}
                      
                    // Update depth classes
                    if(parseInt(depthChange) !== 0){
                        ui.item.updateDepthClass(currentDepth);

                        if(jQuery('.children_of_' + ui.item.attr('id')).length) {
                            children = jQuery('.children_of_' + ui.item.attr('id')).find('.category_item');
                            children.shiftDepthClass(depthChange);
                        }else{
                            children.shiftDepthClass(depthChange);
                        }
                        updateMenuMaxDepth(depthChange);
                    }

                    // Register a change
                    self.registerChange();
                    // Update the item data.
                    ui.item.updateParentMenuItemDBId();

                    // address sortable's incorrectly-calculated top in opera
                    ui.item[0].style.top = 0;

                    // handle drop placement for rtl orientation
                    if (self.isRTL) {
                        ui.item[0].style.left = 'auto';
                        ui.item[0].style.right = 0;
                    }

                    //finally, remove or add icon for oldParent
                    if(self.oldParent.childMenuItems().length === 0) {
                        self.oldParent.find('.cc_dropdown').removeClass('has_children open');
                    }else{
                        self.oldParent.find('.cc_dropdown').addClass('has_children open');
                    }
                    //remove or add icon for new_parent
                    var new_parent = jQuery('#cc_category_item_' + ui.item.find('.input_parent_id').val());
                    if (new_parent.childMenuItems().length > 0) {
                        new_parent.find('.cc_dropdown').addClass('has_children open');
                    }
                    if (new_parent.find('.cc_dropdown').hasClass('close')) {
                        new_parent.find('.cc_dropdown').trigger('click');
                    }
                    ui.item.refreshFoldersPosition();//chidang
                },
                change: function (e, ui) {
                    // Make sure the placeholder is inside the menu.
                    // Otherwise fix it, or we're in trouble.
                    if (!ui.placeholder.parent().hasClass('cc_mediamatic_category_list')){
						(prev.length) ? prev.after(ui.placeholder) : self.menuList.prepend(ui.placeholder);
					}
                    updateSharedVars(ui);
                },
                sort: function (e, ui) {
                    var offset 	= ui.helper.offset(),
                        edge 	= self.isRTL ? offset.left + ui.helper.width() : offset.left,
                        depth 	= self.negateIfRTL * self.pxToDepth(edge - menuEdge);

                    // Check and correct if depth is not within range.
                    // Also, if the dragged element is dragged upwards over
                    // an item, shift the placeholder to a child position.
                    if(depth > maxDepth || offset.top < prevBottom) {
                        depth 	= maxDepth;
                    }else if(depth < minDepth){
                        depth 	= minDepth;
                    }

                    if(depth != currentDepth){
						updateCurrentDepth(ui, depth);
					}
                        

                    // If we overlap the next element, manually shift downwards
                    if (nextThreshold && offset.top + helperHeight > nextThreshold) {
                        next.after(ui.placeholder);
                        updateSharedVars(ui);
                        jQuery(this).sortable('refreshPositions');
                    }
                }
            });

            function updateSharedVars(ui) {
                var depth;

                prev = ui.placeholder.prev('.category_item');
                next = ui.placeholder.next('.category_item');

                // Make sure we don't select the moving item.
                if (prev[0] == ui.item[0]){prev = prev.prev('.category_item');}
                if (next[0] == ui.item[0]){next = next.next('.category_item');}

                prevBottom 		= (prev.length) ? prev.offset().top + prev.height() : 0;
                nextThreshold 	= (next.length) ? next.offset().top + next.height() / 3 : 0;
                minDepth 		= (next.length) ? next.menuItemDepth() : 0;

                if (prev.length){
					maxDepth 	= ((depth = prev.menuItemDepth() + 1) > self.globalMaxDepth) ? self.globalMaxDepth : depth;
				}else{
					maxDepth 	= 0;
				}
            }

            function updateCurrentDepth(ui, depth) {
                ui.placeholder.updateDepthClass(depth, currentDepth);
                currentDepth 	= depth;
            }

            function initialMenuMaxDepth() {
                if (!body[0].className){return 0;}
                var match 		= body[0].className.match(/menu-max-depth-(\d+)/);
                return match && match[1] ? parseInt(match[1], 10) : 0;
            }

            function updateMenuMaxDepth(depthChange) {
                var depth,
					newDepth = menuMaxDepth;
                if (depthChange == 0) {
                    return;
                }else if(depthChange > 0) {
                    depth = maxChildDepth + depthChange;
                    if (depth > menuMaxDepth){
						newDepth = depth;
					}
                } else if (depthChange < 0 && maxChildDepth == menuMaxDepth) {
                    while (!jQuery('.category_item_depth_' + newDepth, self.menuList).length && newDepth > 0){
						newDepth--;
					}
                }
                // Update the depth class.
                body.removeClass('menu-max-depth-' + menuMaxDepth).addClass('menu-max-depth-' + newDepth);
                menuMaxDepth = newDepth;
            }
        },
		
		addNewFolderByContextMenu: function(){
			var self = this;
			jQuery('.cc_mediamatic_popup ul li > span.cc_add').on('click',function(e){
				e.preventDefault();
				e.stopPropagation();
				jQuery('.cc_mediamatic_popup').removeClass('popup_opened');
				self.insertCategoryToActive();	
				self.magicSVG();
				self.tripleActionsOnCategories();
				// commented
//				self.scrollToElement(jQuery('.folder-input'),800);
//				setTimeout(function(){
//					jQuery('.folder-input').ccMoveCursorToEnd();
//				},800);
				jQuery('.folder-input').ccMoveCursorToEnd();
			});
		},
		
		addNewFolderByTopButton: function(){
			var self			= this;
			jQuery('.cc_mediamatic_header .header_top a').on('click',function(e){
				e.preventDefault();
				e.stopPropagation();
				jQuery('.cc_mediamatic_popup').removeClass('popup_opened');
				
				// check if button already clicked
				if(jQuery('.folder-input').length) {
					jQuery('.folder-input').ccMoveCursorToEnd();
					return false;
				}else{
					
					jQuery('ul.cc_mediamatic_category_list li').removeClass('rename');
				}
				
				// if selected current folder remove it from localStorage
				if(!jQuery('#cc_category_item_' + self.mediamaticCurrentFolder).length){
					self.mediamaticCurrentFolder = null;
					localStorage.removeItem('mediamaticCurrentFolder');
				}
				
				if(!jQuery('.active#cc_category_item_' + self.mediamaticCurrentFolder).length){
					self.mediamaticCurrentFolder = null;
				}
				
				if (self.mediamaticCurrentFolder == null) {
					jQuery('#mediamatic_be_folder_list').append(self.newCategoryFormTemplate());
					self.magicSVG();
					self.tripleActionsOnCategories();
					// commented
//					self.scrollToElement(jQuery('.folder-input'),800); 
//					setTimeout(function(){
//						jQuery('.folder-input').ccMoveCursorToEnd();
//					},800);
					jQuery('.folder-input').ccMoveCursorToEnd();
				}else{
					self.insertCategoryToActive();	
					self.magicSVG();
					self.tripleActionsOnCategories();	
					// commented
//					self.scrollToElement(jQuery('.folder-input'),800);
//					setTimeout(function(){
//						jQuery('.folder-input').ccMoveCursorToEnd();
//					},800);
					
					jQuery('.folder-input').ccMoveCursorToEnd();
				}
				
				return false;
			});
		},
		
		insertCategoryToActive: function(){
			var self				= this,
				parentElement 		= jQuery('#cc_category_item_' + self.mediamaticCurrentFolder),
				depth 				= parentElement.menuItemDepth(),
				parentDepth 		= depth;
				depth 				= parseInt(depth) + 1;
			
			if (depth >= (self.globalMaxDepth + 1)) {
				alert('The max Depth is: ' + self.globalMaxDepth);
			}else{
				// открыть папку, если она закрыта
				var openerButton 	= jQuery('#cc_category_item_' + self.mediamaticCurrentFolder).find('.cc_dropdown');
				if (openerButton.hasClass('close')){
					openerButton.trigger('click');
				}
				// вставить после последнего child элемента
				var element 		= jQuery('[class="input_parent_id"][value="' + self.mediamaticCurrentFolder + '"]');
				if (element.length === 0) {
					jQuery(self.newCategoryFormTemplate('category_item_depth_' + depth)).insertAfter(jQuery('#cc_category_item_' + self.mediamaticCurrentFolder));
				}else{
					var li 			= jQuery('#cc_category_item_' + self.mediamaticCurrentFolder),
                     allNextLi 		= li.childMenuItems();
					jQuery.each(allNextLi, function (i, e) {
						var depthh = jQuery(e).menuItemDepth();

						if (depthh <= parentDepth) {
							jQuery(self.newCategoryFormTemplate('category_item_depth_' + depth)).insertAfter(jQuery(e).prev());
						} else if (i === (allNextLi.length - 1)) {
							jQuery(self.newCategoryFormTemplate('category_item_depth_' + depth)).insertAfter(jQuery(e));
						}
					});
				}
			}
				
		},
		
		cancelAddingNewCategory: function(){
			var self	= this;
			jQuery('ul.cc_mediamatic_category_list .cat_item a').off().stop(true,true).on('click', function (event) {
                event.preventDefault();
                var button = jQuery(this);
				
                self.setActiveCategory(button);
            });
			
			jQuery('.cc_mediamatic_header .header_bottom ul li a').off().stop(true,true).on('click', function (event) {
                event.preventDefault();
                var button = jQuery(this);
                self.setActiveCategory(button);
				
				
				
            });
			
			 jQuery(document).on('click', '.add-new-folder-cancel', function (event) {
                event.preventDefault();
				 jQuery('li.new_category').fadeOut(300, function(){ jQuery(this).remove();});
            });	
		},
		
		
		addCategoryAjaxProcess: function(data,parent,depth,parentDepth){
			var self				= this,			
				fnQueriedObj 		= jQuery.parseJSON(data),
				termID				= fnQueriedObj.termID,
				termName			= fnQueriedObj.termName,
				newOption 			= jQuery("<option></option>").attr("value", termID).text(termName + (0)),
				newCategoryHTML 	= self.newCategoryTemplate(termID, termName, parent, depth);
			
			
			jQuery('li.category_item.new_category').remove();
			
			var currentFolder		= self.mediamaticCurrentFolder;
			
			if(currentFolder === null) {
				// append into primary folder list as last child
				jQuery('#mediamatic_be_folder_list').append(newCategoryHTML);
			}else{
				// append to the last child
				var e = jQuery('[class="input_parent_id"][value="' + currentFolder + '"]');
				if(e.length === 0){
					jQuery(newCategoryHTML).insertAfter(jQuery('#cc_category_item_' + currentFolder));
					jQuery('#cc_category_item_' + currentFolder).find('.cc_dropdown').addClass('has_children open');
				}else{
					var li 					= jQuery('#cc_category_item_' + currentFolder),
						allNextLi 			= li.nextAll(),
						penultimateLength 	= parseInt(allNextLi.length - 1);
					jQuery.each(allNextLi, function(i,e) {
						var depthh 	= jQuery(e).menuItemDepth();
						if(depthh <= parentDepth){
							jQuery(newCategoryHTML).insertAfter(jQuery(e).prev());
							return false;
						}else if(i === penultimateLength){
							jQuery(newCategoryHTML).insertAfter(jQuery(e));
						}
					});

				}
			}
			self.magicSVG();
			self.callMovingPopup();
			mediamaticFolders.push({ folderID: termID, folderName: termName, term_count: 0 });
			self.refreshBackbone('add');
			jQuery(".wpmediacategory-filter").append(newOption);
			self.cancelAddingNewCategory();

			self.updateFolderPosition();
			if (parent && self.mediamaticState.indexOf(parent.toString()) < 0) {
				self.mediamaticState.push(parent);
				localStorage.setItem("mediamaticTreeState", self.mediamaticState);
			}


			self.stopPreloader();
		},
		
		appendSidebarToBody: function(){
			var html 	= '';
			var self	= this;
			if(jQuery(".cc_mediamatic_temporary").length){
				html += jQuery(".cc_mediamatic_temporary").html();
				jQuery(".cc_mediamatic_temporary").remove();
				jQuery("#wpbody .wrap").wrapAll('<div class="wrap-all"></div>');
			}
			
			if(jQuery('body').hasClass('post-type-attachment')){
				jQuery('body').addClass('mediamatic_ready');
			}
			
			jQuery("#wpbody .wrap").before(html);
			
			
			var wpadminbarheight = 0;
			if(jQuery('#wpadminbar').length){
				wpadminbarheight = jQuery('#wpadminbar').outerHeight();
			}
			
			var height	= jQuery(window).height() - wpadminbarheight - 40;
			if(jQuery('.media-modal-content').length){
				height = jQuery(window).height() - 80;
			}
			jQuery('.cc_mediamatic_sidebar').css({height:height});
			height = height - jQuery('.cc_mediamatic_header').outerHeight();
			jQuery('.cc_mediamatic_sidebar .cc_mediamatic_content').css({height:height});
			jQuery('.cc_mediamatic_sidebar .cc_mediamatic_content').niceScroll();
			
			jQuery(window).on('resize',function(){
				height	= jQuery(window).height() - wpadminbarheight - 20;
				if(jQuery('.media-modal-content').length){
					height = jQuery(window).height() - 80;
				}
				jQuery('.cc_mediamatic_sidebar').css({height:height});
				height = height - jQuery('.cc_mediamatic_header').outerHeight();
				jQuery('.cc_mediamatic_sidebar .cc_mediamatic_content').css({height:height});
				jQuery('.cc_mediamatic_sidebar .cc_mediamatic_content').getNiceScroll().resize();
			});
		},
		
		
		
		callMovingPopup: function(){
			var self 			= this;
			var content 		= jQuery('.cc_mediamatic_popup');
			var listChildren 	= jQuery('ul.cc_mediamatic_category_list li');
			jQuery('ul.cc_mediamatic_category_list .cc_drag').on('click', function(e){
				e.preventDefault();
				e.stopPropagation();
				
				// if has new category action remove this section
				jQuery('li.new_category').remove();
				
				// variables
				var element			= jQuery(this);				
				var currentItem 	= element.closest('li');
				var ID 				= currentItem.data('id');
				
				
				coreFilter.categoryID 			= ID;
				self.mediamaticCurrentFolder 	= ID;

				
				var lastName	= currentItem.find('.cc_title').text();
				currentItem.find('input').val(lastName);
	
				
				var topCoord		= currentItem.offset().top - self.getBodyScrollTop();
				var leftCoord		= currentItem.offset().left + currentItem.width();
				// open myPanel and set position
				content.addClass('popup_opened');
				if(self.isRTL){
					var rightCoord	= jQuery(window).width() - currentItem.offset().left;
					content.css({right:rightCoord + 'px',top:topCoord + 'px'});
				}else{
					content.css({left:leftCoord,top:topCoord});
				}
				
				jQuery(window).on('resize',function(){
					self.recalculateCoordinationsPopup(currentItem,content);
				});
				jQuery('.cc_mediamatic_content').on('scroll',function(){
					self.recalculateCoordinationsPopup(currentItem,content);
				});
				
				
				self.tripleActionsOnCategories(currentItem);
				
			});
			
			
			
			jQuery(window).on('click', function(){
				if(jQuery('li.new_category').length){
					jQuery('li.new_category').remove();
				}
				jQuery('.cc_mediamatic_popup').removeClass('popup_opened');
			});	
		},
		
		recalculateCoordinationsPopup: function(li,content){
			var self			= this;
			var topCoord		= li.offset().top - self.getBodyScrollTop();
			var leftCoord		= li.offset().left + li.width();
			// open myPanel and set position
			if(self.isRTL){
				var rightCoord	= jQuery(window).width() - li.offset().left;
				content.css({right:rightCoord + 'px',top:topCoord + 'px'});
			}else{
				content.css({left: leftCoord, top: topCoord});
			}
		},
		
		tripleActionsOnCategories: function(currentItem){
			var content = jQuery('.cc_mediamatic_popup');
			var self	= this;
			/* action #1: add new category via popup */
			content.find('.cc_add').on('click',function(e){
				e.preventDefault();
				e.stopPropagation();
			});
			/* action #2: rename existing category via popup */
			content.find('.cc_rename').off().on('click',function(e){
				e.preventDefault();
				e.stopPropagation();
				currentItem.addClass('rename');
				currentItem.find('input').ccMoveCursorToEnd();
				content.removeClass('popup_opened');
			});
			/* action #3: delete existing category via popup */
			content.find('.cc_delete').off().on('click',function(e){
				e.preventDefault();
				e.stopPropagation();
				
				
				if(self.checkIfCategoryHasChildren(currentItem)){
					self.callDeleteErrorPopup();
				}else{	
					self.callDeleteConfirmPopup();
				}
				content.removeClass('popup_opened');
			});
			/* action #4: clear existing category via popup */
			content.find('.cc_clear').off().on('click',function(e){
				e.preventDefault();
				e.stopPropagation();
				
				self.callClearConfirmPopup(currentItem);
				content.removeClass('popup_opened');
			});
			
			/* action #2.2: cancel renaming category */
			jQuery('ul.cc_mediamatic_category_list .cc_cancel').off().on('click',function(e){
				e.preventDefault();
				e.stopPropagation();
				
				var renamedLi	= jQuery('ul.cc_mediamatic_category_list li.rename');
				if(!renamedLi.data('id')){
					renamedLi.remove();
				}else{
					var lastName	= renamedLi.find('.cc_title').text();
					renamedLi.find('input').val(lastName);
					jQuery('ul.cc_mediamatic_category_list li').removeClass('rename');
				}
			});
			
			/* action #3: apply renaming category */
			jQuery('ul.cc_mediamatic_category_list .cc_apply').off().on('click',function(e){
				e.preventDefault();
				e.stopPropagation();
				var renamedLi	= jQuery('ul.cc_mediamatic_category_list li.rename');
				var lastName	= renamedLi.find('.cc_title').text();
				var newName		= renamedLi.find('input').val();
				var ID 			= renamedLi.data('id');
				
				// check category name
				if(self.ifStringIsEmpty(newName)){
					jQuery.iaoAlert({
						msg: self.alertWarningIcon + self.enterName,
						type: "success",
						alertTime: self.iaoAlertTime,
						position: self.iaoAlertPosition,
					});
					self.magicSVG();
				}else if(newName === lastName){
					renamedLi.removeClass('rename');
				}else{
					if(ID){
						self.renameExistingCategory(ID,newName,renamedLi);
					}else{
						self.insertNewCategory(newName);
					}
				}
				
			});
			
			
			jQuery('ul.cc_mediamatic_category_list .cc_changer,ul.cc_mediamatic_category_list .cc_btns').on('click',function(e){
				e.preventDefault();
				e.stopPropagation();
				
			});
			
			jQuery(window).on('click', function(){
				if(jQuery('ul.cc_mediamatic_category_list li.rename').length){
					var renamedLi	= jQuery('ul.cc_mediamatic_category_list li.rename');
					var lastName	= renamedLi.find('.cc_title').text();
					renamedLi.find('input').val(lastName);
				}
				jQuery('ul.cc_mediamatic_category_list li').removeClass('rename');
			});	
		},
		insertNewCategory: function(categoryName){
			var parent			= 0;
			var self			= this;
			if(self.ifStringIsEmpty(categoryName)){
				jQuery.iaoAlert({
					msg: self.alertWarningIcon + self.enterName,
					type: "success",
					alertTime: self.iaoAlertTime,
					position: self.iaoAlertPosition,
				});
				self.magicSVG();
			}else{

				var depth 			= 0,
					parentElement 	= jQuery('#cc_category_item_' + parent),
					parentDepth 	= 0;
				if (self.mediamaticCurrentFolder !== null) {
					parent 			= self.mediamaticCurrentFolder;
					//find depth
					parentElement 	= jQuery('#cc_category_item_' + parent);
					depth 			= parentElement.menuItemDepth();
					parentDepth 	= depth;
					depth 			= parseInt(depth) + 1;
					//end finding depth
				}

				self.startPreloader();

				var requestData 	= {
					action: 'mediamaticAjaxAddCategory',
					categoryName: categoryName,
					parent: parent,
				};

				jQuery.ajax({
					type: 'POST',
					url: self.ajaxurl,
					cache:true,
					data: requestData,
					success: function(data) {
						self.addCategoryAjaxProcess(data,parent,depth,parentDepth);
						self.stopPreloader();
					},
					error: function(xhr, textStatus, errorThrown){
						console.log(errorThrown);
						console.log(textStatus);
						console.log(xhr);
					}
				});
			}
			
		},
		
		renameExistingCategory: function(ID,title,li){
			var self 			= this;
			
			self.startPreloader();
			
			var requestData 	= {
				action: 'mediamaticAjaxRenameCategory',
				categoryID: ID,
				categoryTitle: title,
			};

			jQuery.ajax({
				type: 'POST',
				url: self.ajaxurl,
				cache:true,
				data: requestData,
				success: function(data) {
					self.renameExistingCategoryAjaxProcess(data,li);
				},
				error: function(xhr, textStatus, errorThrown){
					console.log(errorThrown);
					console.log(textStatus);
					console.log(xhr);
					self.stopPreloader();
				}
			});	
		},
		
		renameExistingCategoryAjaxProcess: function(data,li){
			var self			= this;
			var fnQueriedObj 	= jQuery.parseJSON(data);
			if(fnQueriedObj.error === 'no'){
				li.find('.cc_title').text(fnQueriedObj.title);
				li.find('input').val(fnQueriedObj.title);
				li.removeClass('rename');
			}else{
				jQuery.iaoAlert({
					msg: self.alertWarningIcon + self.slugError,
					type: "success",
					alertTime: self.iaoAlertTime,
					position: self.iaoAlertPosition,
				});
				self.magicSVG();
			}
			self.stopPreloader();
		},
		
		
		callDeleteErrorPopup: function(){
			var self			= this;
			
			jQuery.iaoAlert({
				msg: self.alertWarningIcon + self.hasSubFolder,
				type: "success",
				alertTime: self.iaoAlertTime,
				position: self.iaoAlertPosition,
			});
			self.magicSVG();
		},
		
		
		callClearConfirmPopup: function(currentItem){
			var self			= this;
			var HTML			= self.confirmToClearDOM();
							
							
			jQuery('#mediamatic_be_confirm').remove();
			jQuery('body').prepend(HTML);
			
			var confirm 		= jQuery('#mediamatic_be_confirm');
			confirm.addClass('opened folder_clear');
			confirm				= jQuery('#mediamatic_be_confirm.folder_clear');
			var yes				= confirm.find('a.yes');
			var no				= confirm.find('a.no');

			
			yes.off().on('click', function(e){
				e.preventDefault();
				self.clearCategoryAjax(confirm, currentItem);
				return false;
			});
			
			no.on('click', function(){
				confirm.removeClass();
				confirm.remove();
				return false;
			});
		},
		
		clearCategoryAjax: function(confirm, currentItem){
			var self 		= this;
			var categoryID	= coreFilter.categoryID;
			self.startPreloader();
			
			var requestData = {
				action: 'mediamaticAjaxClearCategory',
				categoryID: categoryID,
			};

			jQuery.ajax({
				type: 'POST',
				url: self.ajaxurl,
				cache: false,
				data: requestData,
				success: function(data) {
					var fnQueriedObj 	= jQuery.parseJSON(data),
						count			= fnQueriedObj.count,
						error			= fnQueriedObj.error;
					if(error === 'no'){
						self.clearCategoryAjaxProcess(categoryID,count,confirm, currentItem);
					}
					self.stopPreloader();
				},
				error: function(xhr, textStatus, errorThrown){
					console.log(errorThrown);
					console.log(textStatus);
					console.log(xhr);
					self.stopPreloader();
				}
			});
			
		},
		clearCategoryAjaxProcess: function(categoryID,count,confirm, currentItem){
			var self				= this;
			currentItem.find('.cc_count').text(0);
			self.refreshUncategorizedCount(count);
			
			confirm.remove();
		},
		
		
		callDeleteConfirmPopup: function(){
			var self			= this;
			var html			= self.confirmToDeleteDOM();
							
							
			jQuery('#mediamatic_be_confirm').remove();
			jQuery('body').prepend(html);
			
			var confirm 		= jQuery('#mediamatic_be_confirm');
			confirm.addClass('opened folder_delete');
			var yes				= confirm.find('a.yes');
			var no				= confirm.find('a.no');

			
			yes.off().on('click', function (e) {
				e.preventDefault();
				self.deleteCategoryAjax(confirm);
				return false;
			});
			no.on('click', function () {
				confirm.removeClass();
				confirm.remove();
				return false;
			});
		},
		
		deleteCategoryAjax: function(confirm){
			var self = this;
			self.startPreloader();
			var categoryID	= coreFilter.categoryID;
			var requestData = {
				action: 'mediamaticAjaxDeleteCategory',
				categoryID: categoryID,
			};

			jQuery.ajax({
				type: 'POST',
				url: self.ajaxurl,
				cache: true,
				data: requestData,
				success: function(data) {
					var fnQueriedObj = jQuery.parseJSON(data),
						count			= fnQueriedObj.count,
						error			= fnQueriedObj.error;
					if(error === 'no'){
						self.deleteCategoryAjaxProcess(categoryID,count);
						jQuery('ul.cc_mediamatic_category_list li.active').removeClass('active');
						confirm.remove();
					}
					self.stopPreloader();
				},
				error: function(xhr, textStatus, errorThrown){
					console.log(errorThrown);
					console.log(textStatus);
					console.log(xhr);
					self.stopPreloader();
				}
			});
			
		},
		deleteCategoryAjaxProcess: function(categoryID,count){
			var self		= this;
			self.refreshUncategorizedCount(count);
			localStorage.removeItem('mediamaticCurrentFolder');
			var parentID 	= jQuery('#cc_category_item_' + categoryID).find('.input_parent_id').val();


			jQuery('#cc_category_item_' + categoryID).remove();
			
			// если есть родитель у удаленной категории, и если у него не осталось child элементы, убрать треугольник
			if(parentID){
				if(jQuery("#cc_category_item_" + parentID).childMenuItems().length === 0){
					jQuery("#cc_category_item_" + parentID + " .cc_dropdown").removeClass('open close');
				}
			}
			coreFilter.categoryID = '';
			self.mediamaticCurrentFolder = 'all';
		},
		refreshUncategorizedCount: function(extraCount){
			var count 	= jQuery('.cc_mediamatic_header .cc_uncategorized a .cc_count').html();
			count 		= parseInt(count) + parseInt(extraCount);
			jQuery('.cc_mediamatic_header .cc_uncategorized a .cc_count').html(count);
		},
		/********************************************************************************************************/
		/************************************** Все вспомогательные функции *************************************/
		/********************************************************************************************************/
		confirmToClearDOM: function(){
			var self = this;
			var html = '<div id="mediamatic_be_confirm">';
					html += '<div class="confirm_inner">';
						html += '<div class="desc_holder">';
							html += '<h3>' + self.areYouSure + '</h3>';
							html += '<p>' + self.willBeMovedToUncategorized + '</p>';
						html += '</div>';
						html += '<div class="links_holder">';
							html += '<a class="yes" href="#">' + self.clearText + '</a>';
							html += '<a class="no" href="#">' + self.cancelText + '</a>';
						html += '</div>';
					html += '</div>';
				html += '</div>';
			return html;
		},
		confirmToDeleteDOM: function(){
			var self = this;
			var html = '<div id="mediamatic_be_confirm">';
					html += '<div class="confirm_inner">';
						html += '<div class="desc_holder">';
							html += '<h3>' + self.areYouSure + '</h3>';
							html += '<p>' + self.willBeMovedToUncategorized + '</p>';
						html += '</div>';
						html += '<div class="links_holder">';
							html += '<a class="yes" href="#">' + self.deleteText + '</a>';
							html += '<a class="no" href="#">' + self.cancelText + '</a>';
						html += '</div>';
					html += '</div>';
				html += '</div>';
			return html;
		},
		/* проверить, есть ли child элементы у выбранней категории */
		checkIfCategoryHasChildren: function(li){
			if(jQuery(li).next().find(".input_parent_id").length && jQuery(li).next().find(".input_parent_id").val() == coreFilter.categoryID){
				return true;
			}else{
				return false;
			}
		},
		/* преобразование изображений в SVG */
		magicSVG: function(){
			jQuery('img.mediamatic_be_svg').each(function(){
				var jQueryimg 		= jQuery(this);
				var imgClass	= jQueryimg.attr('class');
				var imgURL		= jQueryimg.attr('src');
				jQuery.get(imgURL, function(data) {
					var jQuerysvg = jQuery(data).find('svg');
					if(typeof imgClass !== 'undefined') {jQuerysvg = jQuerysvg.attr('class', imgClass+' replaced-svg');}
					jQuerysvg = jQuerysvg.removeAttr('xmlns:a');
					jQueryimg.replaceWith(jQuerysvg);
				}, 'xml');
			});
		},
		/* залить в body контекстнее меню (new folder, rename, delete) */
		appendMovingPopup: function(){
			var self = this;
			var html = '';
			html += '<div class="cc_mediamatic_popup">';
				html += '<ul>';
					
			
				if(self.plugin == 'Mediamatic'){
					html += '<li><span class="cc_add"><span class="cc_text">'+self.newFolderText+'<span></span></span></span></li>';
					html += '<li><span class="cc_rename">'+self.renameText+'</span></li>';
					html += '<li><span class="cc_clear">'+self.clearMediaText+'</span></li>';
				}
					html += '<li><span class="cc_delete">'+self.deleteText+'</span></li>';
				html += '</ul>';
			html += '</div>';
			jQuery('body').append(html);
		},
		/* создание HTML структуру для новой категории */
		newCategoryTemplate: function(ID, title, parent, depth){
			var self = this;
			var html = '';
			html += '<li id="cc_category_item_'+ID+'" data-id="'+ID+'" class="category_item category_item_depth_' + depth + ' parent_'+ID+'" data-parent-id="parent_'+parent+'">';
					html += '<div class="cat_item">';
						html += '<span class="cc_dropdown"></span>';
						html += '<a href="#">';
							html += '<span class="cc_icon">'+self.getIcon('folder')+'</span>';
							html += '<span class="cc_title">'+title+'</span>';
							html += '<span class="cc_count">0</span>';
						html += '</a>';
						html += '<div class="cc_changer"><div>'+self.getIcon('folder')+'<input type="text" value="'+title+'" /></div></div>';
						html += self.dragButton();
						html += self.applyCancelButtons();
					html += '</div>';
					html += self.extraHTMLForNewCategory(ID,parent);
				html += '</li>';
			return html;
		},
		/* создание HMTL формы для заполнения новой категории */
		newCategoryFormTemplate: function (extraClass) {
			var self = this;
            if(typeof extraClass === 'undefined'){extraClass = '';}
			var html = '';
			html += '<li class="category_item active rename new_category ' + extraClass + '">';
					html += '<div class="cat_item">';
						html += '<span class="cc_dropdown"></span>';
						html += '<a href="#">';
							html += '<span class="cc_icon">'+self.getIcon('folder')+'</span>';
							html += '<span class="cc_title"></span>';
							html += '<span class="cc_count">0</span>';
						html += '</a>';
						html += '<div class="cc_changer"><div>'+self.getIcon('folder')+'<input class="folder-input" type="text" value="" /></div></div>';
						html += self.dragButton();
						html += self.applyCancelButtons();
					html += '</div>';
				html += '</li>';
			return html;
        },
		extraHTMLForNewCategory: function(ID,parentID){
			var html = '';
			html += '<ul class="mediamatic_be_placeholder"></ul>';
			html += '<input class="input_category_id" type="hidden" value="' + ID + '">';
			html += '<input class="input_parent_id" type="hidden" value="' + parentID + '">';
			return html;
		},
		dragButton: function(){
			return '<span class="cc_drag"><span></span></span>';
		},
		applyCancelButtons: function(){
			var self = this;
			var html = '';
			
			html += '<div class="cc_btns">';
				html += '<span class="cc_apply">'+self.getIcon('check')+'<span class="cc_tooltip">'+self.confirmText+'</span></span>';
				html += '<span class="cc_cancel">'+self.getIcon('close')+'<span class="cc_tooltip">'+self.cancelText+'</span></span>';
			html += '</div>';
			
			return html;
		},
		getIcon: function(icon){
			var self = this;
			return 	'<img class="mediamatic_be_svg" src="' + self.pluginURL + '/assets/img/'+icon+'.svg" />';
		},
		/* преобразование depth в пиксели */
		depthToPx: function (depth) {
            return depth * this.menuItemDepthPerLevel;
        },
		/* преобразование пиксели обратно в deoth */		
        pxToDepth: function (px) {
            return Math.floor(px / this.menuItemDepthPerLevel);
        },
		/* !!!!!!!!!!!! изменить регистр */
		registerChange: function () {
            this.menusChanged = true;
        },
		/* создать уникальный массив */
		removeDuplicates: function(array) {
			var uniqueNames = [];
			jQuery.each(array, function(i, el){
				el = el.toString();
				if(el !== '0' && (jQuery.inArray(el, uniqueNames) === -1)){uniqueNames.push(el);}
			});
			return uniqueNames;
		},
		/* начать preloader */
		startPreloader: function(){
			jQuery('.mediamatic_be_loader').addClass('active');
		},
		/* остановить preloader */
		stopPreloader: function(){
			jQuery('.mediamatic_be_loader').removeClass('active');
		},
		/* анимациооный скролл к элементу */
		scrollToElement: function(element,speed){
			jQuery([document.documentElement, document.body]).animate({
				scrollTop: element.offset().top
			}, speed);
		},
		
		setActiveCategory: function (element) {
			
			var self = this;
			
			jQuery('.cc_mediamatic_header .header_bottom ul li').removeClass('active');
			self.menuList.find('li').removeClass('active');
			element.closest('li').addClass('active');
			self.mediamaticCurrentFolder 	= element.closest('li').attr('data-id');
			var currentFolder				= self.mediamaticCurrentFolder;
			localStorage.setItem('mediamaticCurrentFolder', currentFolder);
			
				
			if(self.isListMode()){
				if(parseInt(self.mediamaticCurrentFolder) !== -1){
					self.mediamaticIsListNoFolder = 0;
					localStorage.setItem('mediamaticIsListNoFolder', self.mediamaticIsListNoFolder);
				}
				
				if(currentFolder == 'all'){currentFolder = ''}
				
				jQuery('select[name="cc_mediamatic_folder"]').val(currentFolder);
				
				jQuery('.wp-admin.upload-php #posts-filter .filter-items input[name="filter_action"]').trigger("click");
				
				
			}else{
				self.startPreloader();
				
				jQuery('.wpmediacategory-filter').val(currentFolder);
				jQuery('.wpmediacategory-filter').trigger('change');
				
				
				// we need refresh backbone view in order to display images correctly in current folder
				self.refreshBackbone();
				
				
				jQuery('.attachments').css('height', 'auto');
                localStorage.setItem('mediamaticCurrentFolder', currentFolder);
				self.stopPreloader();
			}

        },
		
		refreshBackbone: function(action){
			var self		= this;
			var sidebar 	= jQuery('.cc_mediamatic_sidebar');
			var backbone 	= self.getBackboneOfMedia(sidebar);
				
			if(action === 'add'){
				 if(typeof backbone.view === "object"){
					var folderFilter = backbone.view.toolbar.get("mediamatic-filter");
					if(typeof backbone.view === "object") {
						folderFilter.createFilters();
					}
				}
			}else{
		
				
				if (backbone.browser.length > 0 && typeof backbone.view === "object") {
					// Refresh the backbone view
					try {
						backbone.view.collection.props.set({ ignore: (+ new Date()) });
					} catch (e) { console.log(e); }
				}
			}
                       
		},
		
		isListMode: function(){
			if(jQuery('select[name="cc_mediamatic_folder"]').length){
				return true;
			}
			return false;
		},
		
		setForActiveAllFiles: function(){
			var self = this;
			self.startPreloader();
			self.mediamaticCurrentFolder = 'all';
			jQuery('.cc_mediamatic_header .header_bottom ul li[data-id="all"]').addClass('active');
			
			jQuery('.wpmediacategory-filter').val(self.mediamaticCurrentFolder);
			jQuery('.wpmediacategory-filter').trigger('change');
			jQuery('.attachments').css('height', 'auto');
			
			localStorage.setItem('mediamaticCurrentFolder', self.mediamaticCurrentFolder);
			
			self.stopPreloader();
		},
		
		ifStringIsEmpty: function(string){
			return (!string || /^\s*jQuery/.test(string));
		},
		
		getBodyScrollTop: function(){
			return this.pageYOffset || (document.documentElement && document.documentElement.scrollTop) || (document.body && document.body.scrollTop);	
		},
		
		getBackboneOfMedia: function(obj) {
			// Get the attachments browser
			var browser,
				backboneView,
				parentModal = obj.parents(".media-modal");
			if (parentModal.length > 0) {
				browser 	= parentModal.find(".attachments-browser");
			}else{
				browser 	= jQuery("#wpbody-content .attachments-browser");
			}
			backboneView 	= browser.data("backboneView");
			return {
				browser: 	browser,
				view: 		backboneView
			};
		},
		
		
		executeSearch: function(){
			var self = this;
			var searchVal = jQuery.trim(jQuery("#mediamatic-search").val()).toLowerCase();
			var li = jQuery('li.category_item');
			
			
			if(searchVal != ''){
				li.addClass('hide-for-search');
				
				li.each(function(){
					var el 			= jQuery(this);
					var parent_ID 	= el.data('parent-id');
					var title 		= el.find('.cc_title').text().toLowerCase();
					
					searchVal = new RegExp(searchVal,"g");
					
					//console.log(searchVal);
					
					if(title.match(searchVal)){
						el.removeClass('hide-for-search');
						if(parent_ID != 'parent_0'){
							self.removeParentClass(li, parent_ID);
						}
						
						//console.log(parent_ID);
					}
				});
			}else{
				li.removeClass('hide-for-search');
			}
		},
		
		
		removeParentClass: function(items, parent_id){
			var self = this;
			
			items.each(function(){
				var item 		= jQuery(this);
				if(item.hasClass(parent_id)){
					item.removeClass('hide-for-search');
					var parent_ID = item.data('parent-id');
					
					if(parent_ID != 'parent_0'){
						self.removeParentClass(items, parent_ID);
					}
					
				}
			});
		},
		
		startSearchFolder: function(){
			var self = this;
			jQuery(document).on("keyup", "#mediamatic-search", function(){
				self.executeSearch();
			});

			jQuery(document).on("change", "#mediamatic-search", function(){
				self.executeSearch();
			});

			jQuery(document).on("blur", "#mediamatic-search", function(){
				self.executeSearch();
			});
			
		},
		
		
		
		
		
    };




(function (jQuery){
	"use strict";
	jQuery(document).ready(function(){
		
		MediamaticCore.init();

	});
})(jQuery);