"use strict";

function UCAssetsManager(){

	var g_objWrapper, g_activePath, g_startPath, g_pathKey, g_objFileList;
	var g_objPanel, g_codeMirror, g_objBrowserMove, g_objErrorFilelist;
	
	var g_options = {
			single_item_select:false,
			custom_startPath:null,
			addon_id:null
	};
	
	if(!g_ucAdmin){
		var g_ucAdmin = new UniteAdminUC();
	}
	
	var t = this;
	
	//internal events
	var events = {
			CHANGE_FILELIST: "change_filelist",
			SELECT_ITEM: "select_item",
			UPDATE_FILES: "update_files",
			SELECT_OPERATION: "select_click"		//trigger only when clicked on checkbox or on item
	};
	
	var g_temp = {
		needRefreshAssets: false,
		isBrowser:false,
		funcOnSelectOperation:null,
		funcOnAjaxLoadPath:null,
		funcOnUpdateFiles:null
	};
	
	
	function ____________GETTERS______________(){};

	
	/**
	 * get data from item
	 */
	function getItemData(objItem){
		var data = {};
		
		data["type"] = objItem.data("type");
		data["file"] = objItem.data("file");
		data["url"] = objItem.data("url");
		data["full_url"] = g_ucAdmin.urlToFull(data["url"]);
		data["filepath"] = g_activePath+"/"+data["file"];
		
		return(data);
	}
	
	
	/**
	 * get items array from objects
	 */
	function getArrItemsFromObjects(objItems){

		var arrItems = [];
		
		jQuery.each(objItems,function(index, item){
			var objItem = jQuery(item);
			var data = getItemData(objItem);
			data.objItem = objItem;
			
			arrItems.push(data);
		});
		
		return(arrItems);
	}

	
	/**
	 * get checkboxes object
	 */
	function getArrItems(){
		var objItems = getObjItems();
		var arrItems = getArrItemsFromObjects(objItems);
		
		return(arrItems);
	}
	
	/**
	 * get items array by filename
	 */
	function getItemByFilename(filename){
		
		var arrItems = getArrItems();
		
		var arrItemsNew = arrItems.filter(function(item){
			
			if(item.file == filename)
				return(true);
			
			return(false);
		});
		
		if(arrItemsNew.length == 0)
			return(null);
		
		var arrItem = arrItemsNew[0];
				
		return(arrItem);
	}
	
	
	/**
	 * get items objects
	 */
	function getObjItems(type){
		var selector = ".uc-filelist-item";
		if(type)
			selector += ".uc-type-"+type;
		
		var objItems = g_objWrapper.find(selector);
		
		return(objItems);
	}
	
	/**
	 * get child deletories object - without the ..
	 */
	function getObjChildDirs(){
		var objDirs = getObjItems("dir");
		objDirs = objDirs.not(".uc-dir-back");
		return(objDirs);
	}
	
	
	/**
	 * check if some item selected
	 */
	function isItemSelected(objItem){
		if(objItem.hasClass("uc-filelist-item-selected"))
			return(true);
		
		return(false);
	}
	
	
	/**
	 * get selected items objects
	 */
	function getObjSelectedItems(){
		var objItems = g_objWrapper.find(".uc-filelist-item-selected");
		return(objItems);
	}
	
	
	/**
	 * get unselected items objects
	 */
	function getObjUnselectedItems(){
		var objItems = g_objWrapper.find(".uc-filelist-item").not(".uc-filelist-item-selected");
		return(objItems);
	}
	
	
	/**
	 * get all selected items
	 */
	function getArrSelectedItems(){
		var objItems = getObjSelectedItems();
		var arrItems = getArrItemsFromObjects(objItems);
		
		return(arrItems);
		
	}
	
	
	/**
	 * get single selected item, if the item is not single throw error
	 */
	function getSelectedSingleItem(){
		var arrItems = getArrSelectedItems();
		if(arrItems.length != 1)
			throw new Error("Wrong number of selected item. Should be 1");
		
		var item = arrItems[0];
		return(item);
	}
	
	
	/**
	 * get assets items array
	 */
	function getArrSelectedFiles(){
		
		var arrFiles = [];
		var arrItems = getArrSelectedItems();
		
		jQuery.each(arrItems, function(index, item){
			arrFiles.push(item.file);
		});
		
		return(arrFiles);
	}
	
	
	/**
	 * get num items
	 */
	function getNumItems(type){
		var objItems = getObjItems(type);
		var numItems = objItems.length;
		return(numItems);
	}
	
	
	/**
	 * get num selected items
	 */
	function getNumSelectedItems(){
		var objItems = g_objWrapper.find(".uc-filelist-item-selected");
		var numItems = objItems.length;
		return(numItems);
	}

	
	/**
	 * get parent folder
	 */
	function getParentFolder(path){
		
		if(path.length == 0)
			return(path);
		
		var searchPos = path.length-2;
		
		var lastSap = path.lastIndexOf("/", searchPos);
		
		if(lastSap == -1)
			lastSap = path.lastIndexOf("\\", searchPos);
				
		if(lastSap == -1)
			return(path);
				
		path = path.substring(0, lastSap);
		return(path);
	}
	
	
	/**
	 * get path by file. concat file to active path
	 */
	function getPathByFile(file){
		
		var path = g_activePath;
		
		if(file == ".."){		//get parent path
			path = getParentFolder(path);
		}else{
			var isWinSlash = (path.indexOf("\\") !== -1);
			if(isWinSlash == true)
				path = path + "\\" + file;
			else
				path = path + "/" + file;
		}
		
		path = path.replace("//","/");
		path = path.replace("\\\\","\\");
		
		return(path);
	}
	
	
	
	function ____________OPERATIONS______________(){};
	
	
	/**
	 * update filepath to the the relevant div
	 */
	function updateActivePath(path){
		g_activePath = path;
		g_objWrapper.find(".uc-assets-activepath .uc-pathname").text(".."+path);
	}
	
	
	/**
	 * check some item
	 */
	function selectItem(objItem, isCheck){
		
		//skip unselectable item
		if(objItem.hasClass("uc-filelist-selectable") == false)
			return(true);
		
		var objCheckbox = objItem.find(".uc-filelist-checkbox");
		
		if(isCheck == true)
			objItem.addClass("uc-filelist-item-selected");
		else
			objItem.removeClass("uc-filelist-item-selected");
		
		if(objCheckbox.length != 0){
			objCheckbox.prop('checked', isCheck);
		}
		
		triggerEvent(events.SELECT_ITEM, [objItem, isCheck]);
		
	}
	
	
	/**
	 * select single item
	 */
	function selectSingleItem(objItem){
		
		if(objItem.hasClass("uc-filelist-selectable") == false)
			return(true);
		
		unselectAllItems(objItem);
		selectItem(objItem, true);
	}
	
	
	/**
	 * toggle item selection
	 */
	function toggleItemSelection(objItem){
				
		var isSelected = isItemSelected(objItem);
		
		if(isSelected == false)
			selectItem(objItem, true);
		else
			selectItem(objItem, false);
	}
	
	
	/**
	 * select all items
	 */
	function selectAllItems(){
		
		var objItems = getObjItems();
		objItems = objItems.filter(".uc-filelist-selectable");
		
		jQuery(objItems).each(function(index, item){
			var objItem = jQuery(item);
			selectItem(objItem, true);
		});
		
	}
	
	
	/**
	 * unselect all items
	 */
	function unselectAllItems(objExcept){
		
		var objItems = getObjSelectedItems();
		
		if(objExcept)
			objItems = objItems.not(objExcept);
		
		jQuery(objItems).each(function(index, item){
			var objItem = jQuery(item);
			selectItem(objItem, false);
		});
		
	}

	
	/**
	 * on delete items click, delete selected items
	 */
	function deleteSelectedFiles(){
		
		var arrFiles = getArrSelectedFiles();
		
		if(arrFiles.length == 0){
			alert("No Files Chosen");
			return(false);
		}
		
		var numFiles = arrFiles.length;
		
		var message = "Do you sure you want to delete "+ numFiles+ " files?";
		if(confirm(message) == false)
			return(false);
		
		//mark selected files with "deleting class"
		var selectedItems = g_objFileList.find(".uc-filelist-item-selected");
		
		selectedItems.addClass("uc-filelist-item-deleting");
		selectedItems.removeClass("uc-filelist-item-selected");
		
		g_objWrapper.find(".uc-button-delete-file").hide();
		g_objWrapper.find(".uc-preloader-deleting").show();
		
		assetsAjaxRequest("assets_delete_files", {arrFiles: arrFiles, path: g_activePath, pathkey:g_pathKey}, function(response){
			
			var htmlList = response.html;
			g_objFileList.html(htmlList);
			
			g_objWrapper.find(".uc-preloader-deleting").hide();
			g_objWrapper.find(".uc-button-delete-file").show().addClass("button-disabled");
			
			triggerEvent(events.CHANGE_FILELIST);
			triggerEvent(events.UPDATE_FILES);
		});
	
	}
	
	
	function ____________UPLOAD______________(){};
	
	
	/**
	 * upload dialog on close
	 */
	function uploadDialogOnClose(){
		
		var objDialog = jQuery("#uc_dialog_upload_files");
		var objManager = objDialog.data("objManager");
		var objDropzone = objDialog.data("dropzone");
		
		var isNeedRefresh = objDialog.data("needRefresh");
		
		if(isNeedRefresh === true)
			objManager.refreshQuite();
		
		objDropzone.removeAllFiles();
		jQuery("#uc_dialog_upload_files").dialog("close");
		
	}
	
	
	
	/**
	 * open upload dialog, may occur from different managers
	 */
	function openDialogUpload(objManager){
		
		var objDialog = jQuery("#uc_dialog_upload_files");
		
		objDialog.data("manager", objManager);
		
		var buttonOpts = {};
		
		buttonOpts["Close"] = uploadDialogOnClose; 
		
		objDialog.dialog({
			dialogClass:"unite-ui",			
			buttons:buttonOpts,
			minWidth:960,
			modal:true,
			close:uploadDialogOnClose,
			open:function(){

				objDialog.data("needRefresh", false);
				
				var activePath = objManager.getActivePath();
				
				jQuery("#uc_dialogupload_activepath").html(activePath);
				jQuery("#uc_input_upload_path").val(activePath);
				jQuery("#uc_input_pathkey").val(g_pathKey);
			}
		});
		
	}
	
	/**
	 * init upload files dialog on assets tab
	 */
	function initUploadFilesDialog(){
		
		var objDialog = jQuery("#uc_dialog_upload_files");
		if(objDialog.length == 0)
			return(false);
		
		var objDropzone = objDialog.data("dropzone");
		if(objDropzone)
			return(false);		//allow init only once
		
		//init dropzone
		Dropzone.autoDiscover = false;
		var objDropzone = new Dropzone("#uc_form_dropzone");
		
		objDialog.data("dropzone", objDropzone);
		
		objDropzone.on("addedfile", function(file,second) {
			
			triggerEvent(events.UPDATE_FILES);
			objDialog.data("needRefresh", true);
			
		});
		 
		objDropzone.on("queuecomplete", function(file) {
			
			var objManager = objDialog.data("manager");
			if(!objManager)
				throw new Error("assets manager not found, something wrong.");
			
			objManager.refreshQuite();
			
			objDialog.data("needRefresh", false);
		 });		
		
	}
	
	
	function ____________CREATE_FOLDER______________(){};
	
	
	/**
	 * open create folder dialog
	 */
	function openCreateFolderDialog(){
		
		var objDialog = jQuery("#uc_dialog_create_folder");
		if(objDialog.length == 0)
			throw new Error("The create folder dialog must be here");
		
		//init fields
		jQuery("#uc_dialog_create_folder_name").val("");
		
		//oepn dialog
		g_ucAdmin.openCommonDialog(objDialog);
		
	}

	
	/**
	 * create folder
	 */
	function createFolder(){
		
		var folderName = jQuery("#uc_dialog_create_folder_name").val();
		
		var data = {
				"pathkey":g_pathKey,
				"path":g_activePath,
				"folder_name":folderName
			};
		
		data = modifyDataBeforeAjax(data);
		
		g_ucAdmin.dialogAjaxRequest("uc_dialog_create_folder", "assets_create_folder", data, function(response){
			g_objFileList.html(response.html);
			
			triggerEvent(events.CHANGE_FILELIST);
			triggerEvent(events.UPDATE_FILES);
			
		});
		
	}
	
	
	/**
	 * init create folder actions
	 */
	function initCreateFolderActions(){
		jQuery("#uc_dialog_create_folder_action").on("click",createFolder);
		jQuery("#uc_dialog_create_folder_name").doOnEnter(createFolder);
	}
	
	
	function ____________CREATE_FILE______________(){};

	/**
	 * open create folder dialog
	 */
	function openCreateFileDialog(){
		
		var objDialog = jQuery("#uc_dialog_create_file");
		if(objDialog.length == 0)
			throw new Error("The create file dialog must be here");
		
		//init fields
		jQuery("#uc_dialog_create_file_name").val("");
		
		//open dialog
		g_ucAdmin.openCommonDialog(objDialog);
		
	}

	
	/**
	 * create folder
	 */
	function createFile(){
		
		var fileName = jQuery("#uc_dialog_create_file_name").val();
		
		var data = {
				"pathkey":g_pathKey,
				"path":g_activePath,
				"filename":fileName
			};
		
		data = modifyDataBeforeAjax(data);

		g_ucAdmin.dialogAjaxRequest("uc_dialog_create_file", "assets_create_file", data, function(response){
			g_objFileList.html(response.html);
			
			triggerEvent(events.CHANGE_FILELIST);
			triggerEvent(events.UPDATE_FILES);
		});
		
	}
	
	
	/**
	 * init create folder actions
	 */
	function initCreateFileActions(){
		
		jQuery("#uc_dialog_create_file_action").on("click",createFile);
		
		jQuery("#uc_dialog_create_file_name").doOnEnter(createFile);
	}
	
	
	function ____________SELECT_ALL______________(){};
	
	
	/**
	 * update select all button state
	 */
	function updateSelectAllButtonState(){
		
		var objButton = g_objPanel.find(".uc-button-select-all");
		
		var numItems = getNumItems();
		
		if(numItems == 0){
			objButton.addClass("button-disabled");
			
			objButton.html(objButton.data("textselect"));
			return(false);
		}
		
		objButton.removeClass("button-disabled");
		
		var numSelected = getNumSelectedItems();
		if(numSelected != numItems){
			objButton.html(objButton.data("textselect"));
		}else{
			objButton.html(objButton.data("textunselect"));
		}
		
	}
	
	
	/**
	 * select / unselect all files
	 */
	function selectUnselectAll(){
		var objUnselectedItems = getObjUnselectedItems();
		if(objUnselectedItems.length != 0)
			selectAllItems();
		else
			unselectAllItems();
		
	}
	
	
	function ____________EDIT_FILE______________(){};
	
	
	/**
	 * on edit dialog open
	 */
	function onEditDialogOpen(item){
		
		var objTextarea = jQuery("#uc_dialog_edit_file_textarea");
		
		if(g_codeMirror)
			g_codeMirror.toTextArea();

		objTextarea.hide();
		
		var data = {filename: item.file, path: g_activePath, pathkey: g_pathKey};
		g_ucAdmin.setErrorMessageID("uc_dialog_edit_file_error");
		g_ucAdmin.setAjaxLoaderID("uc_dialog_edit_file_loader");
		assetsAjaxRequest("assets_get_file_content", data, function(response){
			
			objTextarea.show();
			objTextarea.val(response.content);
		    
			var modeName;
			
			switch(item.type){
				default:
				case "html":
					modeName = "htmlmixed";
				break;
				case "xml":
					modeName = "xml";
				break;
				case "css":
					modeName = "css";
				break;
				case "javascript":
					modeName = "javascript";
				break;
			}
			
			var optionsCM = {
					mode: {name: modeName },
					lineNumbers: true
			 };
			
			g_codeMirror = CodeMirror.fromTextArea(objTextarea[0], optionsCM);
			
		});
		
	}
	
	
	/**
	 * on edit dialog save functionality
	 */
	function onEditDialogSave(){
		
		if(!g_codeMirror)
			throw new Error("Codemirror editor not found");
		
		var content = g_codeMirror.getValue();
		var objDialog = jQuery("#uc_dialog_edit_file");
		
		var item = objDialog.data("item");
		
		var data = {filename: item.file, path: g_activePath, pathkey: g_pathKey, content: content};
		
		g_ucAdmin.setAjaxLoaderID("uc_dialog_edit_file_loadersaving");
		g_ucAdmin.setErrorMessageID("uc_dialog_edit_file_error");
		g_ucAdmin.setSuccessMessageID("uc_dialog_edit_file_success");
		
		assetsAjaxRequest("assets_save_file", data);
		
	}
	
	
	/**
	 * open edit file dialog from selected file
	 */
	function openEditFileDialog(){
		var item = getSelectedSingleItem();

		var objDialog = jQuery("#uc_dialog_edit_file");

		var buttonOpts = {};
		
		buttonOpts[g_uctext.close] = function(){
			objDialog.dialog("close");
		};

		buttonOpts[g_uctext.save] = function(){
			onEditDialogSave();
		};
		
		var dialogTitle = g_uctext.edit_file+": "+item.file;
		
		objDialog.data("item", item);
		
		var dialogExtendOptions = {
			      "closable" : true,
			      "minimizable" : true,
			      "maximizable" : true,
			      "collapsable" : true
			    };
		
		
		objDialog.dialog({
			dialogClass:"unite-ui",			
			buttons:buttonOpts,
			minWidth:"1000",
			minHeight:550,
			title: dialogTitle,
			modal:false,
			open:function(){
				onEditDialogOpen(item);
			}
		}).dialogExtend(dialogExtendOptions);
		
		
	}
	
	function ____________MOVE_FILES______________(){};
	
	
	/**
	 * get path for copy / move, this folder or parent
	 */
	function getPathForCopyMove(){
		var path = g_activePath;
		var objDirs = getObjChildDirs();
		var numDirs = objDirs.length;
		if(objDirs.length == 0)
			path = getParentFolder(path);
		
		return(path);
	}
	
	
	/**
	 * set path for move dialog
	 */
	function dialogMoveSetPath(pathMove){
		
		jQuery("#uc_dialog_move_files_url").html(pathMove).data("path", pathMove);
	
		var objButton = jQuery("#uc_dialog_move_files_action");
		
		var objDialog = jQuery("#uc_dialog_move_files");
		var basePath = objDialog.data("base_path");
		
		//disable / enable action button
		if(pathMove === basePath)
			objButton.addClass("button-disabled");
		else
			objButton.removeClass("button-disabled");
		
	}
	
	
	/**
	 * open move files dialog
	 */
	function openMoveFilesDialog(){
				
		var options = {
			minWidth:700
		};
		
		g_ucAdmin.openCommonDialog("uc_dialog_move_files", function(){
			
			var objDialog = jQuery("#uc_dialog_move_files");
			
			//save init data
			
			objDialog.data("base_path", g_activePath);
			
			var arrFiles = getArrSelectedFiles();
			var numFiles = arrFiles.length;
			
			if(numFiles == 0)
				return(false);
			
			objDialog.data("arr_files", arrFiles);
			
			//set move path and load path
			var pathMove = getPathForCopyMove();
			dialogMoveSetPath(pathMove);
			
			//update label text
			var objLabel = objDialog.find("#uc_dialog_move_label");
			
			var labelText = objLabel.data("text");
			labelText = labelText.replace("%1",numFiles);
			
			objLabel.html(labelText+":");
			
			g_objBrowserMove.loadPath(pathMove, true);
		}, options);
		
	}
	
	
	/**
	 * do dialog mvoe files request
	 */
	function dialogMoveFilesRequest(actionOnExists){
		
		var objDialog = jQuery("#uc_dialog_move_files");
		
		var arrFiles = objDialog.data("arr_files");
		var basePath = objDialog.data("base_path");
		
		var data = {
				pathkey: g_pathKey,
				pathSource: basePath,
				arrFiles: arrFiles,
				pathTarget: jQuery("#uc_dialog_move_files_url").data("path")
		};

		if(actionOnExists)
			data.actionOnExists = actionOnExists;
		
		jQuery("#uc_dialog_move_files_actions_wrapper").show();
		jQuery("#uc_dialog_move_message").hide();
		
		var dialogID = "uc_dialog_move_files";
		g_ucAdmin.setAjaxLoaderID(dialogID + "_loader");
		g_ucAdmin.setErrorMessageID(dialogID + "_error");
		g_ucAdmin.setAjaxHideButtonID(dialogID + "_action");
		
		var objSuccessMessage = jQuery("#"+dialogID + "_success");
		
		assetsAjaxRequest("assets_move_files", data, function(response){
			
			//of not moved
			if(response.hasOwnProperty("done") && response.done === false){
				
				jQuery("#uc_dialog_move_files_actions_wrapper").hide();
				jQuery("#uc_dialog_move_message").show();
				jQuery("#uc_dialog_move_message_text").html(response.message);
				
				
			}else{
				
				//if successfully moved
				objSuccessMessage.html(response.message);
				g_objFileList.html(response.html);
				
				jQuery("#"+dialogID).dialog("close");

				triggerEvent(events.CHANGE_FILELIST);
				triggerEvent(events.UPDATE_FILES);
			}
			
		});
		
	}
	
	
	/**
	 * init move dialog actions
	 */
	function initMoveFileActions(){
		
		var objDialogMove = jQuery("#uc_dialog_move_files");
				
		//init move dialog folder browser 
		var objBrowserMoveWrapper = jQuery("#uc_movefile_browser");
		
		g_objBrowserMove = new UCAssetsManager();
		g_objBrowserMove.init(objBrowserMoveWrapper);
		
		//on fielist change
		g_objBrowserMove.eventOnUpdateFilelist(function(){
			var path = g_objBrowserMove.getActivePath();
			dialogMoveSetPath(path);
		});
		
		//on checkbox select
		g_objBrowserMove.eventOnSelectOperation(function(){
			
			var arrItems = g_objBrowserMove.getArrSelectedItems();
			var numItems = arrItems.length;
			
			if(numItems > 1)
				throw new Error("number of selected items can be 1 or 0");
			
			if(numItems == 0){
				var path = g_objBrowserMove.getActivePath();
			}else{
				var objItem = arrItems[0];
				var path = objItem.filepath;
			}

			dialogMoveSetPath(path);
			
		});
		
		//move files action
		jQuery("#uc_dialog_move_files_action").on("click",function(){
			
			if(jQuery(this).hasClass("button-disabled"))
				return(false);
			
			dialogMoveFilesRequest();
		});
		
		//onExists button click
		objDialogMove.find(".uc-dialog-move-message .unite-button-secondary").on("click",function(){
			var action = jQuery(this).data("action");
			
			if(action == "cancel"){		//return to initial position
				jQuery("#uc_dialog_move_files_actions_wrapper").show();
				jQuery("#uc_dialog_move_message").hide();
				jQuery("#uc_dialog_move_files_action").show();
			}else{
				dialogMoveFilesRequest(action);
			}
		});
	}
	
	function ____________RENAME_FILES______________(){}

	
	/**
	 * open rename files dialog
	 */
	function openRenameFileDialog(){
		
		var objDialog = jQuery("#uc_dialog_rename_file");
		if(objDialog.length == 0)
			throw new Error("The rename file dialog must be here");
		
		var objItem = getSelectedSingleItem();
		var filename = objItem.file;
		
		jQuery("#uc_dialog_rename_file_input").val(filename).select();
		
		//open dialog
		g_ucAdmin.openCommonDialog(objDialog);
		
	}
	
	/**
	 * create folder
	 */
	function renameFile(){
		
		var fileName = jQuery("#uc_dialog_rename_file_input").val();
		
		var objFile = getSelectedSingleItem();
		
		var data = {
				"pathkey":g_pathKey,
				"path":g_activePath,
				"filename":objFile.file,
				"filename_new":fileName
			};
		
		data = modifyDataBeforeAjax(data);
		
		g_ucAdmin.dialogAjaxRequest("uc_dialog_rename_file", "assets_rename_file", data, function(response){
			g_objFileList.html(response.html);
			
			triggerEvent(events.CHANGE_FILELIST);
			triggerEvent(events.UPDATE_FILES);
		});
		
	}
	
	
	/**
	 * init create folder actions
	 */
	function initRenameFileActions(){
		
		jQuery("#uc_dialog_rename_file_action").on("click",renameFile);
		
		jQuery("#uc_dialog_rename_file_input").doOnEnter(renameFile);
	}
	
	function ____________VIEW_FILES______________(){}
	
	/**
	 * run view files
	 */
	function runViewFile(){
		
		var objItem = getSelectedSingleItem();
		
		var fullUrl = g_ucAdmin.getVal(objItem, "full_url");
		
		if(!fullUrl){
			alert("view not available");
			return(false);
		}
		
		window.open(fullUrl);
	}
	
	
	function ____________UNZIP______________(){}
		
	
	/**
	 * unzip selected file
	 */
	function unzipSelectedFile(){
		var item = getSelectedSingleItem();
		
		var data = {pathkey:g_pathKey, path: g_activePath, filename: item.file};
		
		var objLoader = g_objPanel.find(".uc-preloader-unzip");
		objLoader.show();
		
		assetsAjaxRequest("assets_unzip_file",data,function(response){
			objLoader.hide();
			g_objFileList.html(response.html);
			
			triggerEvent(events.CHANGE_FILELIST);
			triggerEvent(events.UPDATE_FILES);
		});
		
	}
	
	function ____________ACTIONS_PANEL______________(){};
	
	
	/**
	 * check operations buttons
	 */
	function checkActionPanelButtons(){
		
		if(g_objPanel.length == 0)
			return(false);
		
		var buttonsSingle = g_objPanel.find(".uc-relate-single");
		var buttonsMultiple = g_objPanel.find(".uc-relate-multiple");
		var buttonsAll = buttonsSingle.add(buttonsMultiple);
		var buttonSpecial = g_objPanel.find(".uc-relate-special");
		var buttonsFilesOnly = g_objPanel.find(".uc-relate-file");
		
		var numSelected = getNumSelectedItems();
		
		if(numSelected == 0){
			g_ucAdmin.disableButton(buttonsAll);
			g_ucAdmin.disableButton(buttonSpecial);
		}
		else
			if(numSelected == 1){	//single mode
								
				var item = getSelectedSingleItem();
				var itemType = item.type;
				var isDir = (itemType == "dir");
				
				//set buttons for disable
				var buttonsDisable = null;
				if(isDir == true)
					buttonsDisable = buttonsFilesOnly;
				
				//remove the disable buttons from the enable list
				if(buttonsDisable)
					buttonsAll = buttonsAll.not(buttonsDisable);
				
				g_ucAdmin.enableButton(buttonsAll);
				
				if(buttonsDisable)
					g_ucAdmin.disableButton(buttonsDisable);
				
				//enable type related buttons
				var classType = ".uc-relate-type-" + itemType;
				var buttonsType = g_objPanel.find(classType);
				
				g_ucAdmin.enableButton(buttonsType);
			}
			else{	//multiple mode - single buttons disabled
				g_ucAdmin.disableButton(buttonsSingle);
				g_ucAdmin.disableButton(buttonSpecial);
				
				g_ucAdmin.enableButton(buttonsMultiple);
			}
		
		//update select panel button
		updateSelectAllButtonState();
	}
	
	
	/**
	 * run some action
	 */
	function runAction(action){
		
		if(g_temp.isBrowser == true){
			switch(action){
				case "select_all":
					selectUnselectAll();
				break;
				default:
					trace("wrong browser action: " + action);
				break;
			}
			return(false);
		}
		
		//do manager mode actions
		switch(action){
			case "select_all":
				selectUnselectAll();
			break;
			case "delete":
				deleteSelectedFiles();
			break;
			case "upload":
				openDialogUpload(t);
			break;
			case "create_file":
				openCreateFileDialog();
			break;
			case "create_folder":
				openCreateFolderDialog();
			break;
			case "edit":
				openEditFileDialog();
			break;
			case "move":
				openMoveFilesDialog();
			break;
			case "unzip":
				unzipSelectedFile();
			break;
			case "rename":
				openRenameFileDialog();
			break;
			case "view":
				runViewFile();
			break;
			default:
				trace("wrong action: " + action);
			break;
		}
	}
	
	
	/**
	 * init actions panel
	 */
	function initActionsPanel(){
		
		g_objPanel = g_objWrapper.find(".uc-assets-buttons-panel");
		
		if(g_objPanel.length == 0)
			return(false);
		
		/**
		 * on buttons click - run action
		 */
		g_objPanel.find("a.uc-panel-button").on("click",function(){
			var objButton = jQuery(this);
			if(objButton.hasClass("button-disabled"))
				return(false);
			
			var action = jQuery(this).data("action");
			runAction(action);
		});
		
		
		//init global events
		onEvent(events.SELECT_ITEM, function(){
			checkActionPanelButtons();
		});
		
		onEvent(events.CHANGE_FILELIST, function(){
			checkActionPanelButtons();
		});
		
	}
	
	
	
	function ____________INIT______________(){};
	
	
	/**
	 * uncheck all assets checkboxes
	 */
	function uncheckOnInit(){
		
		var objCheckboxes = g_objWrapper.find(".uc-filelist-checkbox");

		objCheckboxes.each(function(){
			var checkbox = jQuery(this);
			var initChecked = checkbox.data("initchecked");
			
			if(!initChecked)
				checkbox.prop('checked', false);
		});
		
	}
	
	
	/**
	 * edit manager mode
	 */
	function initManagerMode(){
		
		//init dropzone only once
		initUploadFilesDialog();
		
		initCreateFolderActions();
		initCreateFileActions();
		initMoveFileActions();
		initRenameFileActions();
		
		initActionsPanel();
		
	}

	
	/**
	 * validate that the manager has put only once
	 */
	function validateManagerPutOnce(){
		var isManagerPut = jQuery.data( document.body, "uc-manager-put-once");
		if(isManagerPut === true)
			throw new Error("The file manager can't be put twice to the page");

		jQuery.data( document.body, "uc-manager-put-once", true );
	}
	
	
	/**
	 * init options
	 */
	function initOptions(){
		
		var objOptions = g_objWrapper.data("options");
				
		if(typeof objOptions != "object")
			throw new Error("The input options are not object");
				
		g_options = jQuery.extend(g_options, objOptions);
				
	}
	
	
	/**
	 * init the assets
	 */
	function init(){
		
		g_activePath = g_objWrapper.data("path");
		g_startPath = g_objWrapper.data("startpath");
				
		g_temp.isBrowser = g_objWrapper.data("isbrowser");
		g_temp.isBrowser = g_ucAdmin.strToBool(g_temp.isBrowser);
		
		g_pathKey = g_objWrapper.data("pathkey");
		g_objFileList = g_objWrapper.find(".uc-filelist");
		g_objErrorFilelist = g_objWrapper.find(".uc-filelist-error");

		
		initOptions();
		
		if(g_temp.isBrowser === false){
			
			validateManagerPutOnce();
			
			initManagerMode();
		}
		
		uncheckOnInit();
		
		initEvents();
		
		//triger change filelist change event
		triggerEvent(events.CHANGE_FILELIST);
	}
	
	function ____________EVENTS______________(){};

	
	/**
	 * on assets click event, do operations according item
	 */
	function onItemClick(){
				
		var objItem = jQuery(this);
		
		//protection against double event handling
		var isBelongs = isObjectBelongsToParent(objItem);
		if(isBelongs == false)
			return(true);
		
		var type = objItem.data("type");
		var file = objItem.data("file");
		
		if(type == "dir"){
			t.loadPath(file);
			return(false);
		}
		
		//on filename click:
		
		//if browser mode - then do identical to checkbox click
		if(g_temp.isBrowser == true && g_options.single_item_select == false)
			toggleItemSelection(objItem);
		else
			selectSingleItem(objItem);
		
		var isSelected = isItemSelected(objItem);
		triggerEvent(events.SELECT_OPERATION, [objItem, isSelected]);
		
	}
	
	/**
	 * check if some object belongs to it's parent 
	 * to avoid double event handling
	 */
	function isObjectBelongsToParent(obj){
		
		var objParent = obj.parents(".uc-assets-wrapper");
		var parentID = objParent.attr("id");
		var wrapperID = t.getID();
		
		if(parentID == wrapperID)
			return(true);
		
		return(false);
	}
	
	
	/**
	 * on checkbox click
	 */
	function onCheckboxClick(event){
		
		event.stopPropagation();
		
		var objCheckbox = jQuery(this);
		
		var isBelongs = isObjectBelongsToParent(objCheckbox);
		
		if(isBelongs == false)
			return(true);
		
		var isChecked = objCheckbox.is(":checked");
		
		var objItem = objCheckbox.parents(".uc-filelist-item");
		
		if(g_options.single_item_select == true){
			if(isChecked == false)
				selectItem(objItem, false);	//unselect item
			else
				selectSingleItem(objItem);	//select single item
		}
		else
			selectItem(objItem, isChecked);
		
		triggerEvent(events.SELECT_OPERATION, [objItem, isChecked]);

	}
	
	
	/**
	 * trigger internal event
	 */
	function triggerEvent(eventName, params){
		if(!params)
			var params = null;
		
		g_objWrapper.trigger(eventName, params);
	}
	
	
	/**
	 * on internal event
	 */
	function onEvent(eventName, func){
		g_objWrapper.on(eventName, func);
	}
	
	
	/**
	 * init events
	 */
	function initEvents(){
				
		g_objFileList.on("click", "input.uc-filelist-checkbox", onCheckboxClick);
		g_objFileList.on("click", "a.uc-filelist-item", onItemClick);
		
		//on select item event
		onEvent(events.SELECT_OPERATION, function(event, item, isChecked){
			
			var objItem = jQuery(item);
			
			if(typeof g_temp.funcOnSelectOperation == "function"){
				var itemData = getItemData(objItem);
				g_temp.funcOnSelectOperation(isChecked, itemData);
			}
			
		});
		
		
		//on update files event
		onEvent(events.UPDATE_FILES, function(){
			
			if(typeof g_temp.funcOnUpdateFiles == "function")
				g_temp.funcOnUpdateFiles();
			
		});
		
		
	}
	
	
	/**
	 * get arr selected items bridge
	 */
	this.getArrSelectedItems = function(){
		return getArrSelectedItems();
	}
	
	/**
	 * check by urls
	 */
	this.checkByUrls = function(arrUrls){
		var arrItems = getArrItems();

		jQuery(arrItems).each(function(index, data){
			var url = data.full_url;
			var found = (jQuery.inArray(url, arrUrls) != -1);
			selectItem(data.objItem, found);
		});
	
	}
	
	
	/**
	 * get active path
	 */
	this.getActivePath = function(){
		
		return(g_activePath);
	}
	
	
	/**
	 * get relative activepath
	 */
	this.getActivePathRelative = function(){
		
		var pathRelative = g_activePath.replace(g_startPath, ""); 
		pathRelative = g_ucAdmin.stripPathSlashes(pathRelative);
		
		return(pathRelative);
	}
	
	
	/**
	 * return if activepath is start path
	 */
	this.isStartPath = function(){
		
		var isStart = (g_activePath == g_startPath);
		return(isStart);
	}
	
	/**
	 * set custom start path
	 */
	this.setCustomStartPath = function(path){
		g_options.custom_startPath = path;
	}
	
	
	/**
	 * modify data before ajax
	 */
	function modifyDataBeforeAjax(data){
		
		if(!data)
			data = {};
		
		if(g_options.addon_id)
			data["addonID"] = g_options.addon_id;
		
		return(data);
	}
	
	
	/**
	 * call ajax request and add data
	 */
	function assetsAjaxRequest(action, data, funcSuccess){
		
		data = modifyDataBeforeAjax(data);
		
		g_ucAdmin.ajaxRequest(action, data, funcSuccess);
	}
	
	
	/**
	 * load assets dir
	 */
	this.loadPath = function(file, byPath, quiteMode){
		
		if(!quiteMode)
			var quiteMode = false;
		
		//choose small circle in active bar, or filelist preloader
		var preloaderID = ".uc-preloader-filelist";
		if(quiteMode == true)
			preloaderID = ".uc-preloader-refreshpath";
				
		if(!file){
			var path = g_activePath;
		}else{

			if(byPath === true){
				var path = file;
			}else{	//load by file
				var path = getPathByFile(file);
			}
			
		}
		
		
		if(!path)
			throw new Error("empty path");
		
		
		//show preloader, hide filelist
		var objPreloader = g_objWrapper.find(preloaderID);
				
		if(objPreloader)
			objPreloader.show();
		
		if(quiteMode == false)
			g_objFileList.hide();
		
		//update active path
		updateActivePath(path);
		
		var data = {path: path, pathkey: g_pathKey};
		if(g_temp.funcOnAjaxLoadPath)
			data = g_temp.funcOnAjaxLoadPath(data);
		
		if(g_options.custom_startPath != null)
			data.startpath = g_options.custom_startPath;
		
		//request path change
		g_objErrorFilelist.hide();
		g_ucAdmin.setErrorMessageID(g_objErrorFilelist);
		assetsAjaxRequest("assets_get_filelist", data, function(response){
		
			if(objPreloader)
				objPreloader.hide();
			
			var htmlList = response.html;
			g_objFileList.html(htmlList);
			
			if(quiteMode == false)
				g_objFileList.show();
			
			triggerEvent(events.CHANGE_FILELIST);
		});
		
	}
	
	/**
	 * silent refresh - without visible loader show
	 */
	this.refreshQuite = function(){
		t.loadPath(null, null, true);
	}
	
	
	/**
	 * init the assets manager
	 */
	this.init = function(objWrapper){
		
		g_objWrapper = objWrapper;
		
		if(g_objWrapper.length == 0)
			throw new Error("Can't find assets wrapper");
		
		if(g_objWrapper.hasClass("uc-assets-wrapper") == false)
			throw new Error("Wrong assets manager wrapper");
		
		//check startup error
		var startupErrorWrapper = g_objWrapper.find(".uc-assets-startup-error");
		if(startupErrorWrapper.length !== 0)
			return(false);
		
		init();
	}
	
	
	/**
	 * get assets manager ID
	 */
	this.getID = function(){
		
		var id = g_objWrapper.attr("id");
		return(id);
	}
	
	
	/**
	 * set function on ajax load path, to add additional fields
	 */
	this.eventOnAjaxLoadpath = function(func){
		g_temp.funcOnAjaxLoadPath = func;
	}
	
	
	/**
	 * set function that run after update filelist
	 */
	this.eventOnUpdateFilelist = function(func){
		onEvent(events.CHANGE_FILELIST, func);
	}
	
	
	/**
	 * set function on update files
	 */
	this.eventOnUpdateFiles = function(func){
		g_temp.funcOnUpdateFiles = func;
	}
	
	/**
	 * on operatio select event
	 */
	this.eventOnSelectOperation = function(func){
		g_temp.funcOnSelectOperation = func;		
	}
	
	/**
	 * get array of items by filename
	 */
	this.getItemByFilename = function(filename){
		
		return getItemByFilename(filename);
	}
	
}