/**
 * Исполняемый код приложения "Сервис загрузки изображений". Состоит из двух частей
 * 1. "Стэк" - содержит код необходимый для работы стэков
 * 2. "Итем" - содержит код для обработки страницы изображения
 */
function picStandAloneAgileWrapper() {
    "use strict";
    var DI = new DependencyInjector(),
        DIContextMenu = DI.get("ContextMenu"),
        DIPaste       = DI.get("Paste"),
        DIHistoryApi  = DI.get("HistoryApi"),
        DISite        = DI.get("Site"),
        DIUser        = DI.get("User"),
        DIAppReg      = DI.get("AppRegister"),
        DICookies     = Cookies,
        bBone = Backbone,
        svgHandler = PicSVGHandler.getInstance(),
        hostName   = window.location.hostname,
        $   = jQuery,
        app = {
            id:      'ElizaAppPic',
            name:    'pic',
            state:   'default',
            standAlone: 0,
            layout:  {},
            systems: {} // Список всех систем из левого меню, для коллбеков из роутера
        },
        UserHandler = DIUser,
        hApi   = DIHistoryApi,
        picStatus   = {
            stackId:   0,  // айди стека
            ownerId:   0,  // айди хозяина
            name:      '',
            format:    '',
            state:     '',
            parent:    0,
            parent_id: 0,
            items:     0,  // количество итемов
            url:       '',
            title:     '',
            editable:  0,
            pages: {
                max: 1,
                start: 1,
                end: 1
            },
            imageData: {},
            scroll: ''
        },
        scroller_enabled = false,
        scroller_obj,
        scroller_axis_y = 0,
        PAGES_PER_PAGE  = 30,
        rightMenuActive = false,
        imageEditActive = false,
        imageCropActive = false,
        fromClipBoard   = false,
        picGLBContentOnly = "false",
        picGLBAlbumsOnly  = "false",
        selectedCount = 0,
        selectedList  = [],
        picIds = {
            scrollRight:   "elizaPicRightScroll"
        },
        uriPic      = "/api/pic/",
        uriPicImage = uriPic+"image/",
        uriPicStack = uriPic+"stack/",
        uriPicUtils = uriPic+"utils/",
        tmpG = templateGet,
        tmpR = templateRender,
        
        pic  = "app/pic/",
        picI = pic+"image_",
        picE = pic+"explorer_",
        picT = pic+"items_",
        picP = pic+"popup_",
        cmn = "common/",
        elz = "eliza/",
        tb  = elz+"toolbar_",
        cntx = "feature/contextmenu_",
        tmplElzScroll    = elz+"scroll_content",
        tmplElzForbidden = elz+"forbidden",
        tmplElzFooter    = elz+"footer_1",
        tmplCmnIcon          = cmn+"elz_icon",
        tmplCmnLoadingCircle = cmn+"elz_loading_circle",
        tmplCmnUploadZone    = cmn+"upload_zone",
        tmplCmnBookmarks     = cmn+"bookmarks",
        tmplCmnBookmarksItem = cmn+"bookmarks_item",
        tmplCmnAvatar        = cmn+"scl_avatar",
        tmplTbPanel  = tb+"panel",
        tmplTbButton = tb+"button",
        tmplTbGroup  = tb+"group",
        tmplTbTitle  = tb+"title",
        tmplTbNum    = tb+"num_of_num",
        tmplCntxItem = cntx+"item",
        tmplCntxList = cntx+"list",
        tmplPicExplorerLi = picE+"li",
        tmplPicExplorerUl = picE+"ul",
        tmplPicExplorerWp = picE+"wp",
        tmplPicImage             = pic+"image",
        tmplPicImageCropper      = picI+"cropper",
        tmplPicImageEditor       = picI+"editor",
        tmplPicImageEditorFooter = tmplPicImageEditor+"_footer",
        tmplPicImageRightContent = picI+"right_content",
        tmplPicImageRightHead    = picI+"right_head",
        tmplPicImageSlider       = picI+"slider",
        tmplPicImageSliderItem   = tmplPicImageSlider+"_item",
        tmplPicImageSliderItems  = tmplPicImageSlider+"_items",
        tmplPicImageSvg          = picI+"svg",
        tmplPicItemsGroup   = picT+"group",
        tmplPicItemsItem    = picT+"item",
        tmplPicItemsList    = picT+"list",
        tmplPicItemsLoading = picT+"loading",
        tmplPopupContent  = picP+"content",
        tmplPopupSettings = picP+"settings",
        tmpAppPicExplorerLi,
        tmpAppPicExplorerUl,
        tmpAppPicExplorerWp,
        tmpAppPicImage,
        tmpAppPicImageCropper,
        tmpAppPicImageEditor,
        tmpAppPicImageEditorFooter,
        tmpAppPicImageRightContent,
        tmpAppPicImageRightHead,
        tmpAppPicImageSlider,
        tmpAppPicImageSliderItem,
        tmpAppPicImageSliderItems,
        tmpAppPicImageSvg,
        tmpAppPicItemsGroup,
        tmpAppPicItemsItem,
        tmpAppPicItemsList,
        tmpAppPicItemsLoading,
        tmpAppPicPopupContent,
        tmpAppPicPopupSettings,
        tmpAppToolbarPanel,
        tmpAppToolbarButton,
        tmpAppToolbarGroup,
        tmpAppToolbarTitle,
        tmpAppToolbarNum,
        tmpAppCommonIcon,
        tmpAppCommonLoadingCircle,
        tmpAppCommonUploadZone,
        tmpAppCommonBookmarks,
        tmpAppCommonBookmarksItem,
        tmpAppCommonAvatar,
        tmpAppScrollContent,
        tmpAppFooter,
        tmpAppForbidden,
        tmpAppFeatureContextMenuItem,
        tmpAppFeatureContextMenuList,
        tmpObjElzIcon,
        tmpObjItemsItem,
        tmpObjImgSliderItem,
        idElizaApp = "ElizaAppPic",
        idElizaPic = "elizaPic",
        idElizaPicUploadToNewStack = idElizaPic+"UploadToNewStack",
        idElizaPicRight = idElizaPic+"Right",
        idElizaPicRightScroll = idElizaPic+"Scroll",
        idElizaPicRightBack  = idElizaPicRight+"Back",
        idElizaPicRightPanel = idElizaPicRight+"Panel",
        idElizaPicRightPanelClose = idElizaPicRightPanel+"Close",
        idElizaPicPlupload = idElizaPic+"Plupload",
        idElizaPicPluploadBtn    = idElizaPicPlupload+"Btn",
        idElizaPicPluploadZone   = idElizaPicPlupload+"Zone",
        idElizaPicPluploadCircle = idElizaPicPlupload+"Circle",
        idElizaPicImage = idElizaPic+"Image",
        idElizaPicImageCont  = idElizaPicImage+"Cont",
        idElizaPicImageDescr = idElizaPicImage+"Descr",
        idElizaPicImagePage = idElizaPicImage+"Page",
        idElizaPicImageFooter = idElizaPicImage+"Footer",
        idElizaPicImagePageDownload =  idElizaPicImagePage+"Download",
        idElizaPicImagePageEdit     =  idElizaPicImagePage+"Edit",
        idElizaPicImagePageMeta     =  idElizaPicImagePage+"Meta",
        idElizaPicImagePageDelete   =  idElizaPicImagePage+"Delete",
        idElizaPicImagePageTree     =  idElizaPicImagePage+"Tree",
        idElizaPicImagePageTrash    =  idElizaPicImagePage+"Trash",
        idElizaPicImagePageCrop     =  idElizaPicImagePage+"Crop",
        idElizaPicImageFooterVariations = idElizaPicImageFooter+"Variations",
        idElizaPicImageFooterContent    = idElizaPicImageFooter+"Content",
        idElizaPicImageFooterThumbs     = idElizaPicImageFooter+"Thumbs",
        idElizaPicImageFooterSiblings   = idElizaPicImageFooter+"Siblings",
        idElizaPicImageViewer = idElizaPicImage+"Viewer",
        idElizaPicImageTool = idElizaPicImage+"Tool",
        idElizaPicImageToolGroup = idElizaPicImageTool+"Group",
        idElizaPicImageToolGroupMain      = idElizaPicImageToolGroup+"Main",
        idElizaPicImageToolGroupExpand    = idElizaPicImageToolGroup+"Expand",
        idElizaPicImageToolGroupTransform = idElizaPicImageToolGroup+"Transform",
        idElizaPicImageToolGroupTransformExpand = idElizaPicImageToolGroupTransform+"Expand",
        idElizaPicImageToolGroupTransformMirror = idElizaPicImageToolGroupTransform+"Mirror",
        idElizaPicImageToolGroupTransformRotate = idElizaPicImageToolGroupTransform+"Rotate",
        idElizaPicImageToolGroupTransformMirrorHorizontal = idElizaPicImageToolGroupTransformMirror+"Horizontal",
        idElizaPicImageToolGroupTransformMirrorVertical   = idElizaPicImageToolGroupTransformMirror+"Vertical",
        idElizaPicImageToolGroupTransformRotateLeft       = idElizaPicImageToolGroupTransformRotate+"Left",
        idElizaPicImageToolGroupTransformRotateRight      = idElizaPicImageToolGroupTransformRotate+"Right",
        idElizaPicImageSlider      = idElizaPicImage+"Slider",
        idElizaPicImageSliderList  = idElizaPicImageSlider+"List",
        idElizaPicImageSliderCrop  = idElizaPicImageSlider+"Crop",
        idElizaPicImageSliderTitle = idElizaPicImageSlider+"Title",
        idElizaPicImageCropper       = idElizaPicImage+"Cropper",
        idElizaPicImageCropperOrigin = idElizaPicImageCropper+"Origin",
        idElizaPicImageCropperPoint  = idElizaPicImageCropper+"Point",
        idElizaPicImageCropperSave   = idElizaPicImageCropper+"Save",
        idElizaPicImageCropperCancel = idElizaPicImageCropper+"Cancel",
        idElizaPicImageCropperWidth           = idElizaPicImageCropper+"Width",
        idElizaPicImageCropperHeight          = idElizaPicImageCropper+"Height",
        idElizaPicImageCropperRightPanelClose = idElizaPicImageCropper+"RightPanelClose",
        idElizaPicImageCropperOriginWidth     = idElizaPicImageCropperOrigin+"Width",
        idElizaPicImageCropperOriginHeight    = idElizaPicImageCropperOrigin+"Height",
        idElizaPicImageCropperPointX          = idElizaPicImageCropperPoint+"X",
        idElizaPicImageCropperPointY          = idElizaPicImageCropperPoint+"Y",
        idElizaPicImageEditor            = idElizaPicImage+"Editor",
        idElizaPicImageEditorSwitch      = idElizaPicImageEditor+"Switch",
        idElizaPicImageEditorFilter      = idElizaPicImageEditor+"Filter",
        idElizaPicImageEditorCorrections = idElizaPicImageEditor+"Corrections",
        idElizaPicImageEditorCropper     = idElizaPicImageEditor+"Cropper",
        idElizaPicImageEditorAspects     = idElizaPicImageEditor+"Aspects",
        idElizaPicImageEditorSave        = idElizaPicImageEditor+"Save",
        idElizaPicImageEditorCancel      = idElizaPicImageEditor+"Cancel",
        idElizaPicImageCopyInput       = idElizaPicImage+"CopyInput",
        idElizaPicImageCopyInputClean  = idElizaPicImageCopyInput+"Clean",
        idElizaPicImageCopyInputHtml   = idElizaPicImageCopyInput+"Html",
        idElizaPicImageCopyInputBBCode = idElizaPicImageCopyInput+"BBCode",
        idElizaPicExplorer      = idElizaPic+"Explorer",
        idElizaPicExplorerWP    = idElizaPicExplorer+"WP",
        idElizaPicExplorerClose = idElizaPicExplorer+"Close",
        idElizaPicExplorerUl    = idElizaPicExplorer+"Ul_",
        idElizaPicExplorerLi    = idElizaPicExplorer+"Li_",
        idElizaPicContent = "elizaPicContent",
        idElizaPicContentBookmarks = idElizaPicContent+"Bookmarks",
        idElizaPicContentScroll    = idElizaPicContent+"Scroll",
        idElizaPicContentStackList = idElizaPicContent+"StackList",
        idElizaPicFooter        = idElizaPic+"Footer",
        idElizaPicFooterTitle   = idElizaPicFooter+"Title",
        idElizaPicFooterNext    = idElizaPicFooter+"Next",
        idElizaPicFooterPrev    = idElizaPicFooter+"Prev",
        idElizaPicFooterRoot    = idElizaPicFooter+"Root",
        idElizaPicFooterNumbers = idElizaPicFooter+"Numbers",
        idElizaPicFooterAlbums  = idElizaPicFooter+"Albums",
        idElizaPicFooterContent = idElizaPicFooter+"Content",
        idElizaPicTool         = idElizaPic+"Tool",
        idElizaPicToolStackExp = idElizaPicTool+"Expand",
        idElizaPicToolAddImage = idElizaApp+"_addImage", // К этому айдишнику привязан ЦСС, без надобности не менять.
        idElizaPicToolAddStack = idElizaPicTool+"AddAlbum",
        idElizaPicToolTree     = idElizaPicTool+"MoveToAlbum",
        idElizaPicToolTrash    = idElizaPicTool+"DeleteItems",
        idElizaPicToolUnsel    = idElizaPicTool+"RemoveSelect",
        idElizaPicPopup = idElizaPic+"Popup",
        idElizaPicPopupScroll   = idElizaPicPopup+"Scroll",
        idElizaPicPopupSettings = idElizaPicPopup+"Settings",
        idElizaPicPopupSettingsClose  = idElizaPicPopupSettings+"Close",
        idElizaPicPopupSettingsCancel = idElizaPicPopupSettings+"Cancel",
        idElizaPicPopupContent  = idElizaPicPopup+"Content",
        idElizaPicPopupContentScroll = idElizaPicPopupContent+"Scroll",
        idElizaPicPopupContentBooks  = idElizaPicPopupContent+"Books",
        idElizaPicPopupContentClose  = idElizaPicPopupContent+"Close",
        idElizaPicPopupExplorer       = idElizaPicPopup+"Explorer",
        idElizaPicPopupExplorerScroll = idElizaPicPopupExplorer+"Scroll",
        idElizaPicCorrPreset = idElizaPic+"elizaPicCorrPreset",
        idElizaPicCorrPresetAdd     = idElizaPicCorrPreset+"Add",
        idElizaPicCorrPresetText    = idElizaPicCorrPreset+"Text",
        idElizaPicCorrPresetSave    = idElizaPicCorrPreset+"Save",
        idElizaPicCorrPresetList    = idElizaPicCorrPreset+"List",
        idElizaPicCorrPresetDelete  = idElizaPicCorrPreset+"Delete",
        idElizaPicCorrPresetClose   = idElizaPicCorrPreset+"Close",
        idElizaPicCorrPresetDivList = idElizaPicCorrPreset+"DivList",
        idElizaPicCorrPresetDivForm = idElizaPicCorrPreset+"DivForm",
        idElizaPicContextMenu = idElizaPic+"ContextMenu",
        idElizaPicContextMenuMoveUp   = idElizaPicContextMenu+"MoveUp",
        idElizaPicContextMenuDelete   = idElizaPicContextMenu+"Delete",
        idElizaPicContextMenuEditMeta = idElizaPicContextMenu+"EditMeta",
        idElizaPicContextMenuImageContent = idElizaPicContextMenu+"ImageContent",
        idElizaPicContextMenuStack       = idElizaPicContextMenu+"Stack",
        idElizaPicContextMenuStackUpload = idElizaPicContextMenuStack+"Upload",
        idElizaPicContextMenuStackInsert = idElizaPicContextMenuStack+"Insert",
        idElizaPicContextMenuCopy             = idElizaPicContextMenu+"Copy",
        idElizaPicContextMenuCopyBBCode       = idElizaPicContextMenuCopy+"BBCode",
        idElizaPicContextMenuCopyHtml         = idElizaPicContextMenuCopy+"Html",
        idElizaPicContextMenuCopySlider       = idElizaPicContextMenuCopy+"Slider",
        idElizaPicContextMenuCopySliderLink   = idElizaPicContextMenuCopySlider+"Link",
        idElizaPicContextMenuCopySliderBBCode = idElizaPicContextMenuCopySlider+"BBCode",
        idElizaPicContextMenuCopySliderHTML   = idElizaPicContextMenuCopySlider+"HTML",
        idElizaPicSVG = idElizaPic+"SVG",
        idElizaPicSVGFilters = idElizaPicSVG+"Filters",
        idElizaPicSVGCanvas  = idElizaPicSVG+"Canvas",
        idElizaPicSVGRightPanelClose = idElizaPicSVG+"RightPanelClose",
        idElizaPicThumb =  idElizaPic+"Thumb",
        idElizaPicThumbCreate = idElizaPicThumb+"Create",
        idElizaPicThumbForm   = idElizaPicThumb+"Form",
        idElizaPicThumbZoomSwitch = idElizaPicThumb+"ZoomSwitch",
        idVignetteColor          = "vignetteColor",
        idVignetteColorReset     = idVignetteColor+"Reset",
        idVignetteColorFlood     = idVignetteColor+"Flood",
        idVignetteColorLightning = idVignetteColor+"Lightning",
        $jqStackList   = $("#"+idElizaPicContentStackList),
        $jqStackScroll = $("#"+idElizaPicContentScroll),
        langAppPicRightPanel = "Правая панель", // Правая панель
        langAppPicRightBack  = "Назад",  // Назад
       
        langAppPicForbidden1 = "Изображения и альбомы, удовлетворяющие выбранным фильтрам не найдены", // Изображения и альбомы, удовлетворяющие выбранным фильтрам не найдены
        langAppPicForbidden2 = "Эта страница доступна только её автору", // Эта страница доступна только её автору
        langAppPicForbidden3 = "Эта страница запрещена для просмотра лицам, не достигшим возраста ", // Эта страница запрещена для просмотра лицам, не достигшим возраста
        langAppPicForbidden4 = " лет", //  лет
        langAppPicForbidden5 = "Страница не найдена", // Страница не найдена
        langAppPicForbidden6 = "Для доступа к функционалу требуется регистрация", // Для доступа к функционалу требуется регистрация
        langAppPicImgHtmlTitle = "Изображение с ", // Изображение с
        langAppPicNotificationMoveTo      = "Выберите объекты для перемещения",      // Выберите объекты для перемещения
        langAppPicNotificationMoved       = "Перемещено элементов: ",       // Перемещено элементов:
        langAppPicNotificationImgSize     = "Разрешенные для вставки файлы: JPG, JPEG, GIF, PNG размером не более 10 мегабайт.",     // Разрешенные для вставки файлы: JPG, JPEG, GIF, PNG размером не более 10 мегабайт.
        langAppPicNotificationImgUpl      = "Изображение успешно загружено",      // Изображение успешно загружено
        langAppPicNotificationImgThumb    = "Новая миниатюра создана",    // Новая миниатюра создана
        langAppPicNotificationImgOversize = "Ряд изображений превышает допустимый размер в 10 мегабайт", // Ряд изображений превышает допустимый размер в 10 мегабайт
        langAppPicNotificationImgTypes    = "Ряд изображений не соотвествует разрешенному формату",    // Ряд изображений не соотвествует разрешенному формату
        langAppPicNotificationImgUploads  = "Изображения загружены на первую страницу текущего альбома",  // Изображения загружены на первую страницу текущего альбома
        langAppPicNotificationDel1        = "Удалено элементов: ",        // Удалено элементов:
        langAppPicNotificationDel2        = ". Не удалось удалить: ",        // . Не удалось удалить:
        langAppPicNotificationDel3        = ". Обнаружена связь с контентом",        // . Обнаружена связь с контентом
        langAppPicMenuEditMeta = "Редактировать описание", // Редактировать описание
        langAppPicMenuAddImage = "Загрузить изображения", // Загрузить изображения
        langAppPicMenuAddStack = "Добавить альбом", // Добавить альбом
        langAppPicMenuExplorer = "Проводник по альбомам", // Проводник по альбомам
        langAppPicMenuDeleted  = "Показать удаленное",  // Показать удаленное
        langAppPicMenuRPanel   = "Показать правую панель",   // Показать правую панель
        langAppPicNCoverWait      = "Подождите",      // Подождите
        langAppPicNCoverTransform = "Идет трансформация", // Идет трансформация
        langAppPicNCoverCropping  = "Идет обработка изображения",  // Идет обработка изображения
        langAppPicNCoverFilters   = "Идет обработка использованных фильтров",   // Идет обработка использованных фильтров
        langAppPicNCoverPreparing = "Идет обработка изображения", // Идет обработка изображения
        langAppPicNCoverCropInit  = "Инициализация интерфейса кадрирования",  // Инициализация интерфейса кадрирования
        langAppPicImgSliderTitle1 = "Доступные миниатюры", // Доступные миниатюры
        langAppPicImgSliderTitle2 = "Изображения в альбоме", // Изображения в альбоме
        langAppPicImgSliderTitle3 = "Вариации изображения", // Вариации изображения
        langAppPicImgBtn1  = "Редактировать вариацию",  // Редактировать вариацию
        langAppPicImgBtn2  = "Создать вариацию",  // Создать вариацию
        langAppPicImgBtn3  = "Вариации изображения",  // Вариации изображения
        langAppPicImgBtn4  = "Связи с контентом",  // Связи с контентом
        langAppPicImgBtn5  = "Скачать изображение",  // Скачать изображение
        langAppPicImgBtn6  = "Переместить изображение",  // Переместить изображение
        langAppPicImgBtn7  = "Создать миниатюру",  // Создать миниатюру
        langAppPicImgBtn8  = "Редактирование изображения",  // Редактирование изображения
        langAppPicImgBtn9  = "Создать вариацию",  // Создать вариацию
        langAppPicImgBtn10 = "Редактировать описание", // Редактировать описание
        langAppPicImgBtn11 = "Удалить", // Удалить
        langAppPicImgBtn12 = "Отразить по горизонтали", // Отразить по горизонтали
        langAppPicImgBtn13 = "Отразить по вертикали", // Отразить по вертикали
        langAppPicImgBtn14 = "Повернуть против часовой стрелки", // Повернуть против часовой стрелки
        langAppPicImgBtn15 = "Повернуть по часовой стрелке", // Повернуть по часовой стрелке
        langAppPicImgBtn16 = "Действия", // Действия
        langAppPicImgBtn17 = "Трансформация изображения", // Трансформация изображения
        langAppPicImgBtn18 = "Вернуться к предыдущему состоянию", // Вернуться к предыдущему состоянию
        langAppPicImgTitle1 = "Промежуточное изображение из буфера обмена", // Промежуточное изображение из буфера обмена
        langAppPicImgRight1  = "Добавлено:",  // Добавлено:
        langAppPicImgRight2  = "Разрешение:",  // Разрешение:
        langAppPicImgRight3  = "Просмотры:",  // Просмотры:
        langAppPicImgRight4  = "Уникальные:",  // Уникальные:
        langAppPicImgRight5  = "Размер файла:",  // Размер файла:
        langAppPicImgRight6  = "Ссылка",  // Ссылка
        langAppPicImgRight7  = "HTML",  // HTML
        langAppPicImgRight8  = "BBCode",  // BBCode
        langAppPicImgRight9  = "Информация",  // Информация
        langAppPicImgRight10 = "панель информации", // панель информации
        langAppPicImgRight11 = "Редактирование изображения", // Редактирование изображения
        langAppPicImgRight12 = "Создание новой вариации", // Создание новой вариации
        langAppPicImgRight13 = "панель редактирования", // панель редактирования
        langAppPicImgEdit1  = "Ширина результата",  // Ширина результата
        langAppPicImgEdit2  = "Высота результата",  // Высота результата
        langAppPicImgEdit3  = "Позиция рамки",  // Позиция рамки
        langAppPicImgEdit4  = "Позиция вершины: X",  // Позиция вершины: X
        langAppPicImgEdit5  = "Позиция вершины: Y",  // Позиция вершины: Y
        langAppPicImgEdit6  = "Масштабирование",  // Масштабирование
        langAppPicImgEdit7  = "Ширина изображения",  // Ширина изображения
        langAppPicImgEdit8  = "Высота изображения",  // Высота изображения
        langAppPicImgEdit9  = "Оригинал",  // Оригинал
        langAppPicImgEdit10 = "Произвольно", // Произвольно
        langAppPicImgEdit11 = "Стороны", // Стороны
        langAppPicImgEdit12 = "Сохранить изображение", // Сохранить изображение
        langAppPicImgEdit13 = "Создать миниатюру", // Создать миниатюру
        langAppPicImgEdit14 = "Отмена", // Отмена
        langAppPicImgEdit15 = "Кадрирование изображения", // Кадрирование изображения
        langAppPicImgEdit16 = "Создание новой миниатюры", // Создание новой миниатюры
        langAppPicImgEdit17 = "панель кадрирования", // панель кадрирования
        langAppPicImgEdit18 = "панель создания миниатюры", // панель создания миниатюры
        langAppPicImgEdit19 = "Сохранить изменения", // Сохранить изменения
        langAppPicImgEdit20 = "Создать вариацию", // Создать вариацию
        langAppPicSettingsEdit  = "Изменение настроек",  // Изменение настроек
        langAppPicSettingsClose = "Закрыть", // Закрыть
        langAppPicSettings1     = "альбома",     // альбома
        langAppPicSettings2     = "изображения",     // изображения
        langAppPicSettings3     = "Настройки",     // Настройки
        langAppPicExplorer      = "Проводник по альбомам",      // Проводник по альбомам
        langAppPicExplorerClose = "Закрыть", // Закрыть
        langAppPicStackFooter1 = "Показать только альбомы", // Показать только альбомы
        langAppPicStackFooter2 = "Показать только связанное с контентом", // Показать только связанное с контентом
        langAppPicStackFooter3 = "Сбросить выделение", // Сбросить выделение
        langAppPicPageGoTo1  = "Перейти на первую страницу",  // Перейти на первую страницу
        langAppPicPageGoTo2  = "Перейти в корень",  // Перейти в корень
        langAppPicPageGoTo3  = "Перейти на главную страницу",  // Перейти на главную страницу
        langAppPicPageGoTo4  = "Наверх",  // Наверх
        langAppPicPageGoTo5  = "Предыдущая страница",  // Предыдущая страница
        langAppPicPageGoTo6  = "Перейти в альбом",  // Перейти в альбом
        langAppPicPageGoTo7  = "Перейти к оригиналу",  // Перейти к оригиналу
        langAppPicPageGoTo8  = "Предыдущее изображение",  // Предыдущее изображение
        langAppPicPageGoTo9  = "Следующее изображение",  // Следующее изображение
        langAppPicPageGoTo10 = "Следующая страница", // Следующая страница
        langApiPicSelectionTitle1  = "Добавить альбом",  // Добавить альбом
        langApiPicSelectionTitle2  = "Проводник по альбомам",  // Проводник по альбомам
        langApiPicSelectionTitle3  = "Показать удаленное",  // Показать удаленное
        langApiPicSelectionTitle4  = "Восстановить удаленное",  // Восстановить удаленное
        langApiPicSelectionTitle5  = "Объеденить выбранное в альбом",  // Объеденить выбранное в альбом
        langApiPicSelectionTitle6  = "Переместить выбранное в альбом",  // Переместить выбранное в альбом
        langApiPicSelectionTitle7  = "Восстановить выбранное",  // Восстановить выбранное
        langApiPicSelectionTitle8  = "Удалить выбранное",  // Удалить выбранное
        langApiPicSelectionTitle9  = "Сделать иконкой альбома",  // Сделать иконкой альбома
        langApiPicSelectionTitle10 = "Является иконкой альбома", // Является иконкой альбома
        langApiPicCommon1  = "изображение",  // изображение
        langApiPicCommon2  = "альбом",  // альбом
        langApiPicCommon3  = "выделенное",  // выделенное
        langApiPicCommon4  = "Восстановить",  // Восстановить
        langApiPicCommon5  = "Переместить",  // Переместить
        langApiPicCommon6  = "на уровень выше",  // на уровень выше
        langApiPicCommon7  = "в корень",  // в корень
        langApiPicCommon8  = "Связанный контент",  // Связанный контент
        langApiPicCommon9  = "Загрузить изображения в этот альбом",  // Загрузить изображения в этот альбом
        langApiPicCommon10 = "Поместить выбранное в этот альбом", // Поместить выбранное в этот альбом
        langApiPicCommon11 = "Адрес", // Адрес
        langApiPicCommon12 = "скопирован в буфер обмена", // скопирован в буфер обмена
        langApiPicClip1 = "Копировать адрес", // Копировать адрес
        langApiPicClip2 = "Копировать BBCode", // Копировать BBCode
        langApiPicClip3 = "Копировать Html", // Копировать Html
        langApiPicClip4 = "Адрес скопирован в буфер обмена", // Адрес скопирован в буфер обмена
        langApiPicClip5 = "BBCode скопирован в буфер обмена", // BBCode скопирован в буфер обмена
        langApiPicClip6 = "Html скопирован в буфер обмена", // Html скопирован в буфер обмена
        langApiPicUplZoneTitle1 = "Выберите файлы", // Выберите файлы
        langApiPicUplZoneTitle2 = "В этом альбоме ещё нет изображений", // В этом альбоме ещё нет изображений
        langApiPicUplZoneText1  = "Или перетащите в эту область",  // Или перетащите в эту область
        langApiPicUplZoneText2  = "Вы можете сделать снимок экрана и нажать",  // Вы можете сделать снимок экрана и нажать
        langApiPicUplZoneText3  = "Выберите изображения для загрузки, нажав на эту область, или перетащите файлы сюда",  // Выберите изображения для загрузки, нажав на эту область, или перетащите файлы сюда
        langApiPicUplZoneSize   = "Ограничение на размер файла",   // Ограничение на размер файла
        
        langTmplExplorerLi = {
            title1: "Перейти в альбом", // Перейти в альбом
            title2: "Альбом ID", // Альбом ID
            title3: "Перенести выделенное в этот альбом", // Перенести выделенное в этот альбом
            title4: "Развернуть"  // Развернуть
        },
        langTmplImageCropper = {
            label: "Расширенный режим", // Расширенный режим
            title: "Соотношения сторон"  // Соотношения сторон
        },
        langTmplImageEditor = {
            title1: "Удалить предустановленный фильтр", // Удалить предустановленный фильтр                             
            title2: "Сохранить текущие настройки фильтра", // Сохранить текущие настройки фильтра                                
            title3: "Отмена", // Отмена   
            title4: "Сброс", // Сброс  
            capt1:  "Фильтры",  // Фильтры    
            capt2:  "Цветовая коррекция",  // Цветовая коррекция               
            capt3:  "Цвета виньетирования"   // Цвета виньетирования                
        },
        langTmplImageRightContent = {
            title1: "Автор", // Автор
            title2: "Оригинал", // Оригинал
            title3: "Альбом"  // Альбом
        },
        langTmplImageRightHead = {
            close: "Закрыть" // Закрыть
        },
        langTmplImageSlider = {
            text:   'Изображения в альбоме',   // Изображения в альбоме
            title1: 'Закрыть', // Закрыть
            title2: 'Создать новую миниатюру', // Создать новую миниатюру
            item:   'Новая миниатюра'    // Новая миниатюра
        },
        langTmplImageSliderItem = {
            del: "Удалить" // Удалить
        },
        langTmplItemsItem = {
            title1:    "Размер изображения",    // Размер изображения                                
            title2:    "Вариаций изображения",    // Вариаций изображения                                
            title3:    "Формат изображения",    // Формат изображения                                
            title4p1:  "Является",  // Является                                
            title4p2:  "Сделать",  // Сделать                                
            title4p3:  "иконкой альбома",  // иконкой альбома                                
            title5:    "Альбомов внутри",    // Альбомов внутри                                
            title6:    "Изображений в альбоме",    // Изображений в альбоме                                
            title7:    "Альбом",    // Альбом                                
            title8:    "Дней до удаления",    // Дней до удаления                                
            title9:    "Изображение",    // Изображение                                
            title10:   "Иконка альбома",   // Иконка альбома                                
            title11:   "Доступ ограничен",   // Доступ ограничен                                
            title12p1: "Доступно только пользователям старше", // Доступно только пользователям старше                                
            title12p2: "лет", // лет                                      
            title13:   "Доступно только вам",   // Доступно только вам                                      
            title14:   "Доступно только автору",   // Доступно только автору                                      
            title15:   "Доступно только по прямой ссылке"    // Доступно только по прямой ссылке"
        },
        langTmplItemsLoading = {
            txt: "идет загрузка..." // идет загрузка...
        },
        langTmplPopupContent = {
            txt1: "Автор", // Имя
            txt2: "Оригинал", // Дата
            txt3: "Альбом"  // Автор
        },
        langTmplPopupSettings = {
            holder1: "Введите название", // Введите название
            holder2: "Введите описание", // Введите описание
            label1:  "Название",  // Название
            label2:  "Описание",  // Описание
            label3:  "Применить ко всем вложенным элементам"   // Применить ко всем вложенным элементам
        },
        months = ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь",
                  "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"];
    templateGetPackage(
        "eliza_app_pic",
        [
            tmplPicExplorerLi,
            tmplPicExplorerUl,
            tmplPicExplorerWp,
            tmplPicImage,
            tmplPicImageCropper,
            tmplPicImageEditor,
            tmplPicImageEditorFooter,
            tmplPicImageRightContent,
            tmplPicImageRightHead,
            tmplPicImageSlider,
            tmplPicImageSliderItem,
            tmplPicImageSliderItems,
            tmplPicImageSvg,
            tmplPicItemsGroup,
            tmplPicItemsItem,
            tmplPicItemsList,
            tmplPicItemsLoading,
            tmplPopupContent,
            tmplPopupSettings,
            tmplCmnIcon,
            tmplCmnLoadingCircle,
            tmplCmnUploadZone,
            tmplCmnBookmarks,
            tmplCmnBookmarksItem,
            tmplCmnAvatar,
            tmplTbPanel,
            tmplTbButton,
            tmplTbGroup,
            tmplTbTitle,
            tmplTbNum,
            tmplElzScroll,
            tmplElzForbidden,
            tmplElzFooter,
            tmplCntxItem,
            tmplCntxList
        ],
        function() {
            tmpAppPicExplorerLi = tmpG(tmplPicExplorerLi);
            tmpAppPicExplorerUl = tmpG(tmplPicExplorerUl);
            tmpAppPicExplorerWp = tmpG(tmplPicExplorerWp);
            tmpAppPicImage             = tmpG(tmplPicImage);
            tmpAppPicImageCropper      = tmpG(tmplPicImageCropper);
            tmpAppPicImageEditor       = tmpG(tmplPicImageEditor);
            tmpAppPicImageEditorFooter = tmpG(tmplPicImageEditorFooter);
            tmpAppPicImageRightContent = tmpG(tmplPicImageRightContent);
            tmpAppPicImageRightHead    = tmpG(tmplPicImageRightHead);
            tmpAppPicImageSlider       = tmpG(tmplPicImageSlider);
            tmpAppPicImageSliderItem   = tmpG(tmplPicImageSliderItem);
            tmpAppPicImageSliderItems  = tmpG(tmplPicImageSliderItems);
            tmpAppPicImageSvg          = tmpG(tmplPicImageSvg);
            tmpAppPicItemsGroup   = tmpG(tmplPicItemsGroup);
            tmpAppPicItemsItem    = tmpG(tmplPicItemsItem);
            tmpAppPicItemsList    = tmpG(tmplPicItemsList);
            tmpAppPicItemsLoading = tmpG(tmplPicItemsLoading);
            tmpAppPicPopupContent  = tmpG(tmplPopupContent);
            tmpAppPicPopupSettings = tmpG(tmplPopupSettings);
            tmpAppToolbarPanel  = tmpG(tmplTbPanel);
            tmpAppToolbarButton = tmpG(tmplTbButton);
            tmpAppToolbarGroup  = tmpG(tmplTbGroup);
            tmpAppToolbarTitle  = tmpG(tmplTbTitle);
            tmpAppToolbarNum    = tmpG(tmplTbNum);
            tmpAppCommonIcon          = tmpG(tmplCmnIcon);
            tmpAppCommonLoadingCircle = tmpG(tmplCmnLoadingCircle);
            tmpAppCommonUploadZone    = tmpG(tmplCmnUploadZone);
            tmpAppCommonBookmarks     = tmpG(tmplCmnBookmarks);
            tmpAppCommonBookmarksItem = tmpG(tmplCmnBookmarksItem);
            tmpAppCommonAvatar        = tmpG(tmplCmnAvatar);
            tmpAppScrollContent = tmpG(tmplElzScroll);
            tmpAppFooter        = tmpG(tmplElzFooter);
            tmpAppForbidden     = tmpG(tmplElzForbidden);
            tmpAppFeatureContextMenuItem = tmpG(tmplCntxItem);
            tmpAppFeatureContextMenuList = tmpG(tmplCntxList);
            tmpObjElzIcon = {"common/elz_icon": tmpAppCommonIcon};
            tmpObjItemsItem  = {"app/pic/items_item": tmpAppPicItemsItem};
            tmpObjImgSliderItem = {"app/pic/image_slider_item": tmpAppPicImageSliderItem};
        }
    );
    /**
     * Функция обработчик стэка. Это корневая функция, с которой начинается любой стек. При несовпадении неймов
     * система перестраивает весь html, если же нейм не изменился, то просто вызывается функция инициализации страницы
     * текущего стэка.
     *
     * @param {string} item       - Нейм альбома, семь символов 0-9a-zA-Z
     * @param {string} page       - Параметр постраничности ?page = {start}-{end}
     * @param {boolean}   forcedMeta - Принудительная полная пересборка шаблона стека, с обновлением всех данных
     */
    function picStackHandler(item, page, forcedMeta)
    {
        if (item !== picStatus.name || forcedMeta) { // Если неймы не совпадают, то мы переключились в другой стэк
            picGetAlbumMeta(item, function() {picStackHandlerCallback(page, true);});
        }
        else {
            picStackHandlerCallback(page, false);
        }
    }
    /**
     * Функция-обработчик стэка. Распарсивает постраничность. При необходимости добавляет/пеерсобирает юзер-меню и
     * фуутер. Реинициализирует постраничность и осуществляет запрос актуального списка объект, которые находятся в
     * альбоме.
     *
     * @param {string} page        - Параметр постраничности ?page = {start}-{end}
     * @param {bool}   fullRebuild - Принудительная полная пересборка шаблона стека
     */
    function picStackHandlerCallback(page, fullRebuild) {
        if (page) {
            var pageData = pageParser(page, picStatus.pages.max);
            picStatus.pages.start = pageData.start;
            picStatus.pages.end = pageData.end;
            /*if (picStatus.pages.end > picStatus.pages.max) {
             picStatus.pages.end = parseInt(picStatus.pages.max, 10);
             }*/
        }
        var action = (picStatus.name === "trash" ? "add" : "remove")+"Class";
        if (picStatus.state !== "stack" || fullRebuild) {
            app.layout.content.cnt.content.removeAttr("data-elz-bg");
            app.layout.content.cnt.subfooter.removeAttr("data-elz-bg");
            app.layout.main.right.closest(".tplCLSgrid").removeClass("showside");
            app.layout.content.cnt.subfooter.find(".elzCLSwinslider").removeClass("show");
            //scroller_enabled = false;
            picInsertMenuStack();
            picStatus.state = "stack";
        }
        picInsertFooterStack(fullRebuild);
        $("#"+idElizaPicRightBack)[picStatus.name === "root" ? "addClass" : "removeClass"]("hide");
        $("#"+idElizaPicToolTrash)[action]("active");
        $("#"+idElizaPicFooterAlbums )[action]("hide");
        $("#"+idElizaPicFooterContent)[action]("hide");
        picPaginatingReset();
        if (fullRebuild) {
            picStackRebuildHtml();
        }
        imageEditActive = false;
        imageCropActive = false;
        $("#"+idElizaPicPluploadBtn).find(".elzIc.main").removeClass("ic-images").removeClass("ic-image").addClass(
            $("#"+idElizaApp).attr("data-appstate") === "list album" ? "ic-images" : "ic-image"
        );
        //одкостылим проверочку
        if (picStatus.items) {
            var picCLSupload = $("#"+idElizaPicContentScroll).find(".picCLSupload");
            picCLSupload.removeClass("empty");
            if (picStatus.pages.start === 1 && picStatus.name !== "trash") {
                picCLSupload.removeClass("hide");
            }
            else {
                picCLSupload.addClass("hide");
            }
        }
        if (picGLBContentOnly === "true" || picGLBAlbumsOnly === "true") {
            $("#"+idElizaPicPluploadZone).closest(".picCLSupload").removeClass("empty").addClass("hide");
        }
        /*if (app.standAlone === 1) {
            picStackItemsInit();
            app.standAlone = 2;
        }
        else {*/
        picGetItemsList({type: "replace", page: page, stackId: picStatus.stackId, ownerId: picStatus.ownerId});
        /*}*/
    }
    /**
     * Функция сборки верхней меню пользовательской меню для работы со стеком. Тут же хранятся инициализаторы событий.
     */
    function picInsertMenuStack()
    {
        if (UserHandler.isNotActivated()) {
            return false;
        }
        if (UserHandler.getId() === picStatus.ownerId) {
            var $mid    = app.layout.top.header.find('[data-layout="toolbar_middle"]'),
                btn     = tmpAppToolbarButton,
                list = [],
                funcCompress = function (list, tag, id, title, icon, subIcon, subColor) {
                    var returnObj = {
                        tag: tag, id: id, title: title, align: "right", icon: {svg: {main: icon}, size: 'small'}
                    };
                    if (subIcon) {
                        returnObj.icon.svg.sub = subIcon;
                        returnObj.icon.color   = {subbg: subColor};
                    }
                    list.push(returnObj);
                },
                len;
            if (picGLBAlbumsOnly !== "true"  && picGLBContentOnly !== "true") {
                if (picStatus.name !== "root" && picStatus.name !== "trash") {
                    funcCompress(list, "div", idElizaPicImagePageMeta, langAppPicMenuEditMeta, "ic-pencil");
                }
                funcCompress(list, "label", idElizaPicToolAddImage, langAppPicMenuAddImage, "ic-image",  "ic-plus", "blue");
                funcCompress(list, "div",   idElizaPicToolAddStack, langAppPicMenuAddStack, "ic-folder", "ic-plus", "blue");
            }
            funcCompress(list, "div", idElizaPicToolTree, langAppPicMenuExplorer, "ic-foldertree");
            list.push({
                tag:   "a", id: idElizaPicToolTrash, title: langAppPicMenuDeleted, align: "right",
                border: {
                    enable: 1,
                    lines:  "bottom",
                    color:  "red 800"
                },
                icon: {svg: {main: 'ic-trash'}, size: 'small'},
                href: (!app.standAlone ? "#pic" : "")+ "/trash"
            });
            len = list.length;
            $mid.html(tmpR(tmpAppToolbarGroup, {
                active:   "",
                position: "right",
                xsub:     "320",
                v_pos:    "top",
                h_pos:    "right"
            }));
            $mid.find('[data-layout="tool_trigger"]').prepend(tmpR(btn, {
                id:    idElizaPicToolStackExp,
                tag:   "div",
                title: langAppPicMenuRPanel,
                setts: {type: 'default', align: "right", link: '1'},
                icon:  {svg: {main: 'ic-more1'}, size: 'small', radius: "rad"}
            }, tmpObjElzIcon));
            //$("#"+picIds.toolStackExp).click(function() {$(this).closest(".group").toggleClass("active");});
            var $ins = $mid.find('[data-layout="tool_list"]');
            for(var a = 0, item; a < len; a++) {
                item = list[a];
                list[a] = tmpR(btn, {
                    id:    item.id,
                    tag:   item.tag,
                    href:  item.href,
                    title: item.title,
                    border: item.border ? item.border : {},
                    setts: {type: 'default',    align: item.align, txt: item.txt, link: '1'},
                    text:  {str: item.title, align: 'left'},
                    icon:  item.icon
                }, tmpObjElzIcon);
            }
            $ins.append(list.join(''));
        }
        picFooterFiltersCheck();
        picPluploaderGet(true);
    }
    function userPanelMenus() {
        var $toolbarMiddle = app.layout.top.header.find('[data-layout="toolbar_middle"]'),
            $toolbarRight  = app.layout.top.header.find('[data-layout="toolbar_right"]'),
            $footer        = app.layout.content.cnt.footer.closest("div"),
            $subfooter     = app.layout.content.cnt.subfooter.closest("div"),
            $content       = app.layout.content.cnt.content,
            ids = picIds,
            picItem = tmpAppPicItemsItem,
            funcCompress = function() {
                $("#"+idElizaPicImageToolGroupMain).removeClass("active");
                $("#"+idElizaPicImageToolGroupExpand).removeClass("active");
            };
        //app.layout.content.cnt.content.attr(  "data-elz-bg", "grey 900");
        app.layout.content.cnt.subfooter.attr("data-elz-bg", "grey 900");
        // ФУНКЦИОНАЛ СТЭКА
        // -------------------------------------------------------------------------------------------------------------
        $toolbarMiddle.off("click").on("click", "#"+idElizaPicToolTree, function() {
            picExplorerWindow();
        }).on("click", "#"+idElizaPicToolTrash, function(e) {
            if (!selectedCount) {
                if (app.standAlone) {
                    hApi.pushState(
                        e,
                        $(this).attr("href"),
                        null,
                        {callback: 'picRouter'},
                        appPicStandAloneRouter
                    );
                    DIAppReg.regState(app.name, $(this).attr("href"));
                }
                return this;
            }
            e.preventDefault();
            picStackDelete();
        }).on("click", "#"+idElizaPicToolAddStack, function(e) {
            e.preventDefault();
            var data    = picStatus,
                stackId = data.stackId,
                $stackList = $jqStackList;
            if(selectedCount > 0) {
                data = picAddStack(stackId, 0);
                data.lang = langTmplItemsItem;
                $stackList.prepend(tmpR(picItem, data));
                selectedCount -= 1;
                picMoveToStack($('.fileItem[data-name="'+data.system.name+'"]'));
                picPaginationUpdate();
            }
            else {
                if(data.pages.start === 1) {
                    data = picAddStack(stackId, 0);
                    data.lang = langTmplItemsItem;
                    $stackList.prepend(tmpR(picItem, data));
                }
                picItemListRefresh('add', 1);
                picPaginationUpdate();
            }
            picStackItemsInit();
            if (picStatus.name !== "trash") {
                $("#"+idElizaPicPluploadZone).closest(".picCLSupload").removeClass("empty");
            }
            else {
                $("#"+idElizaPicPluploadZone).closest(".picCLSupload").removeClass("empty").addClass("hide");
            }
        }).on("click", "#"+idElizaPicToolStackExp, function() {
            $(this).closest(".group").toggleClass("active");
        });
        // -------------------------------------------------------------------------------------------------------------
        // ФУНКЦИОНАЛ КАРТИНКИ
        // -------------------------------------------------------------------------------------------------------------
        $toolbarMiddle.on("click", "#"+idElizaPicImageToolGroupTransformExpand, function() {
            var $edit = $("#"+idElizaPicImagePageEdit);
            funcCompress();
            $("#"+idElizaPicImageToolGroupTransform).toggleClass("active");
            $(this).toggleClass("active");
            if ($edit.hasClass("active")) {
                $edit.click();
            }
        }).on("click", "#"+idElizaPicImageToolGroupExpand, function() {
            funcCompress();
            $("#"+idElizaPicImageToolGroupMain).toggleClass("active");
            $(this).toggleClass("active");
            /*if ($edit.hasClass("active")) {
                $edit.click();
            }*/
        }).on("click", "#"+idElizaPicImagePageEdit, function(e) {
            var $this = $(this),
                $viewer = $("#"+idElizaPicImageViewer);
            $viewer.removeAttr("style");
            imageCropActive = false;
            $("#"+idElizaPicImagePageCrop).removeClass("active");
            if ($this.hasClass("active")) {
                imageEditActive = false;
                picImageRightContent();
                if (DICookies.get("rightMenuActive") === "false") {
                    app.layout.main.right.closest(".tplCLSgrid").removeClass("showside");
                }
                $this.removeClass("active");
                $("#"+idElizaPicSVGFilters).addClass("hide");
                $viewer.removeClass("hide");
            }
            else {
                imageEditActive = true;
                picImageRightEditor();
                $("#"+idElizaPicSVGFilters).removeClass("hide");
                $this.addClass("active");
            }
            funcCompress();
        }).on("click", "#"+idElizaPicImagePageMeta, function() {
            if ($("#"+idElizaApp).attr("data-appstate") === "list album") {
                picItemSettings("stack", picStatus.stackId);
            }
            else {
                picItemSettings("image", picStatus.imageData.image.system.id);
                funcCompress();
            }
        }).on("click", "#"+idElizaPicImagePageDelete, function() {
            var stack = status.imageData.stack,
                name  = stack === "root" ? "root" : stack.system.name,
                uri   = (app.standAlone ? "/" : "#pic") + (name === "root" ? "" : (!app.standAlone ? "/" : "")+name),
                deleteList = [{type: "image", id: status.imageData.image.system.id}];
            ajaxSend({
                url: uriPicStack+"deleteList/"+status.stackId,
                data: {list: JSON.stringify(deleteList)},
                success: function(result){
                    if (app.standAlone) {
                        hApi.replaceStateData({callback: "picRouter"}, uri);
                        DIAppReg.regState(app.name, uri);
                        appPicStandAloneRouter();
                    }
                    else {
                        bBone.history.navigate(uri, {trigger: true});
                    }
                }
            });
            funcCompress();
        }).on("click", "#"+idElizaPicImagePageTree, function(e) {
            selectedCount = 1;
            selectedList  = [picStatus.name];
            picExplorerWindow();
            picGetImageMeta(picStatus.name, function() {picImageHandlerCallback(true);});
            appShow();
            funcCompress();
        }).on("click", "#"+idElizaPicImagePageCrop, function(e) {
            var $edit = $("#"+idElizaPicImagePageEdit);
            $("#"+idElizaPicImageViewer).removeAttr("style");
            if ($edit.hasClass("active")) {
                $edit.click();
            }
            if (!$(this).hasClass("active")) {
                $("#"+idElizaPicThumbCreate).click();
            }
            else {
                $("#"+idElizaPicImageCropperRightPanelClose).click();
            }
            funcCompress();
        }).on("click", "#"+idElizaPicImageToolGroupTransformMirrorHorizontal+", " +
                       "#"+idElizaPicImageToolGroupTransformMirrorVertical+", "   +
                       "#"+idElizaPicImageToolGroupTransformRotateLeft+", "       +
                       "#"+idElizaPicImageToolGroupTransformRotateRight,
            function() {
                var $edit = $("#"+idElizaPicImagePageEdit);
                $("#"+idElizaPicImageViewer).removeAttr("style");
                elizaNcoverTexted(langAppPicNCoverWait, langAppPicNCoverTransform, true);
                if ($edit.hasClass("active")) {
                    $edit.click();
                }
                var variants = {}, mode;
                variants[idElizaPicImageToolGroupTransformMirrorHorizontal] = ["transformMirroring", "horizontal"];
                variants[idElizaPicImageToolGroupTransformMirrorVertical]   = ["transformMirroring", "vertical"  ];
                variants[idElizaPicImageToolGroupTransformRotateLeft]       = ["transformRotation",  "left"      ];
                variants[idElizaPicImageToolGroupTransformRotateRight]      = ["transformRotation",  "right"     ];
                mode = variants[$(this).attr("id")];
                ajaxSend({
                    url: uriPicImage+mode[0]+"/"+picStatus.imageData.image.system.id+"/"+mode[1],
                    success: function() {
                        var time = 0,
                            resultImage = picStatus.imageData.image,
                            name = resultImage.system.name,
                            file = resultImage.meta.file;
                        picGetImageMeta(name, function() {
                            var width  = file.width,
                                height = file.height,
                                type   = file.type;
                            setTimeout(function() {
                                var imageUrl = "/upl/" + name + "." + type + "?" + (new Date().getTime());
                                $("#"+idElizaPicImageViewer ).find("img").attr("src", imageUrl).attr("width", width).attr("height", height);
                                $("#"+idElizaPicImageCropper).find("img").attr("src", imageUrl).attr("width", width).attr("height", height);
                                thumbnailReset();
                                setTimeout(function(){elizaNcoverTexted('', '', false);}, 500);
                            }, time);
                        });
                    }
                });
            }
        );
        $toolbarRight.off().on("click", "#"+idElizaPicRightPanel, function() {
            var $this  = $(this),
                $right = app.layout.main.right.closest(".tplCLSgrid");
            $("#"+idElizaPicImageViewer).removeAttr("style");
            if ($this.hasClass("active")) {
                $this.removeClass("active");
                DICookies.set("rightMenuActive", "false", {expires: 365});
                rightMenuActive = false;
                if (imageEditActive) {
                    picImageRightEditor();
                }
                else if(imageCropActive) {
                    picImageRightCropper();
                }
                else {
                    $right.removeClass("showside");
                }
            }
            else {
                $this.addClass("active");
                DICookies.set("rightMenuActive", "true", {expires: 365});
                rightMenuActive = true;
                picImageRightContent();
                $right.addClass("showside");
            }
        }).on("click", "#"+idElizaPicRightBack, function() {
            $("#"+idElizaPicFooterRoot).click();
        }).on("mouseenter", "#"+idElizaPicRightBack, function() {
            $(this).attr("data-elz-title", $("#"+idElizaPicFooterRoot).attr("data-elz-title"));
        });
        // -------------------------------------------------------------------------------------------------------------
        //                                 F O O T E R
        $footer.off("click").on("click", "#"+idElizaPicFooterAlbums, function() {
            scrollLoadSkip = false;
            if (picGLBAlbumsOnly === "false") {
                picGLBAlbumsOnly = "true";
            }
            else {
                picGLBAlbumsOnly = "false";
            }
            picFooterFiltersCheck();
            picStackHandler(picStatus.name, "1", true);
        }).on("click", "#"+idElizaPicFooterContent, function() {
            scrollLoadSkip = false;
            if (picGLBContentOnly === "false") {
                picGLBContentOnly = "true";
            }
            else {
                picGLBContentOnly = "false";
            }
            picFooterFiltersCheck();
            picStackHandler(picStatus.name, "1", true);
        }).on("click", "#"+idElizaPicToolUnsel, function() {
            picSelectionReset();
        });
        if (app.standAlone) {
            var status = picStatus,
                rootButtonId = ", #"+idElizaPicFooterRoot,
                rootBtnName  = (status.parent ? (!app.standAlone ? "/" : "")+status.parent : "");
            if (!UserHandler.getId() && (rootBtnName === "" || rootBtnName === "/")) {
                rootButtonId = "";
            }
            $footer.on("click", "#"+idElizaPicFooterPrev+", #"+idElizaPicFooterNext+rootButtonId, function(e) {
                var $this = $(this);
                if ($this.hasClass("disabled")) {
                    e.preventDefault();
                    return false;
                }
                picSelectionReset();
                (UserHandler.getDevice() === "desktop" ? $jqStackScroll.closest(".scroll-content") : $jqStackScroll.closest(".elzScroll")).scrollTop(0);
                hApi.pushState(
                    e,
                    $this.attr("href"),
                    null,
                    {callback: 'picRouter'},
                    appPicStandAloneRouter
                );
                DIAppReg.regState(app.name, $this.attr("href"));
            });
        }
        $footer.on('click', "#"+idElizaPicImageFooterThumbs, function() {
            var $this         = $(this),
                $cropper      = $("#"+idElizaPicImageCropper).find("img"),
                $slider       = $("#"+idElizaPicImageSlider),
                $sliderList   = $("#"+idElizaPicImageSliderList),
                $btnSibling   = $("#"+idElizaPicImageFooterSiblings),
                $btnVariation = $("#"+idElizaPicImageFooterVariations),
                $sliderCrop   = $("#"+idElizaPicImageSliderCrop);
            imageSiblingsActive   = false;
            imageVariationsActive = false;
            imageThumbnailsActive = true;
            if (!picStatus.imageData.image.access.editing) {
                $sliderCrop.hide();
            }
            ajaxSend({
                url: uriPicImage+"getImageThumbs/"+picStatus.imageData.image.system.id,
                success: function(result) {
                    if ($this.hasClass("active") && !imageActiveIgnore) {
                        $this.removeClass("active");
                        imageThumbnailsActive = false;
                        $slider.removeClass("show");
                        setTimeout(function() {$(window).trigger('resize');}, 50);
                        //$cropper.cropper("destroy");
                    }
                    else {
                        if(picStatus.imageData.image.access.editing) {
                            $sliderCrop.show();
                        }
                        $sliderList.find(".thumbnail").remove();
                        $sliderList.find(".image").remove();
                        $("#"+idElizaPicImageSliderTitle).html(langAppPicImgSliderTitle1);
                        $sliderCrop.nextAll("li").remove();
                        $sliderList.append(tmpR(
                            tmpAppPicImageSliderItems,
                            {
                                list: result,
                                item_type: "thumbnail",
                                target: "_blank",
                                deletable: picStatus.editable ? 1 : 0,
                                lang: langTmplImageSliderItem
                            },
                            tmpObjImgSliderItem
                        ));
                        $sliderList.find(".elzCLSoverControls .cntrlItem.link").click(function() {
                            var $this = $(this);
                            ajaxSend({
                                url: uriPicImage+"deleteThumbByName/"+$this.attr("data-name")+"/"+$this.attr("data-width")+"/"+$this.attr("data-height"),
                                success: function() {
                                    $this.closest(".thumbnail").remove();
                                }
                            });
                        });
                        $this.addClass("active");
                        $slider.addClass("show");
                        $btnSibling.removeClass("active");
                        $btnVariation.removeClass("active");
                        setTimeout(function() {$(window).trigger('resize');}, 50);
                    }
                    imageActiveIgnore = false;
                    return false;
                }
            });
        }).on("click", "#"+idElizaPicImageFooter, function() {
            if (picStatus.imageData.stack === "root") {
                return this;
            }
            var $this = $(this),
                $sliderList   = $("#"+idElizaPicImageSliderList),
                $slider       = $("#"+idElizaPicImageSlider),
                $btnThumbs    = $("#"+idElizaPicImageFooterThumbs),
                $btnContent   = $("#"+idElizaPicImageFooterContent),
                $btnVariation = $("#"+idElizaPicImageFooterVariations);
            imageSiblingsActive   = true;
            imageVariationsActive = false;
            imageThumbnailsActive = false;
            if ($this.hasClass("active")) {
                $this.removeClass("active");
                $slider.removeClass("show");
                imageSiblingsActive = false;
                setTimeout(function() {$(window).trigger('resize');}, 50);
                return false;
            }
            ajaxSend({
                url: uriPicImage+"getImageSiblings/"+picStatus.imageData.stack.system.id,
                success: function(result) {
                    var $sliderCrop = $("#"+idElizaPicImageSliderCrop);
                    $sliderCrop.hide();
                    $sliderList.find(".image").remove();
                    $sliderList.find(".thumbnail").remove();
                    $("#"+idElizaPicImageSliderTitle).html(langAppPicImgSliderTitle2);
                    $sliderCrop.nextAll("li").remove();
                    $sliderList.append(tmpR(tmpAppPicImageSliderItems,
                        {list: result, lang: langTmplImageSliderItem}, tmpObjImgSliderItem
                    ));
                    $this.addClass("active");
                    $slider.addClass("show");
                    $btnThumbs.removeClass("active");
                    $btnVariation.removeClass("active");
                    var $active  = $sliderList.find('.sliderItem[data-name="'+picStatus.name+'"] a').addClass("active"),
                        position = $active.offset();
                    $("#"+idElizaPicImageSlider+" .scroll-content").scrollLeft(position.left);
                    setTimeout(function() {$(window).trigger('resize');}, 50);
                    $(".sliderItem a", $sliderList).off().click(function(e) { // TODO: подъебнуть на слайдер
                        hApi.pushState(
                            e,
                            $(this).attr("href"),
                            null,
                            {callback: 'picRouter'},
                            appPicStandAloneRouter
                        );
                        DIAppReg.regState(app.name, $(this).attr("href"));
                    });
                }
            });
        }).on("click", "#"+idElizaPicImageFooterVariations, function() {
            var $this = $(this),
                $sliderList   = $("#"+idElizaPicImageSliderList),
                $slider       = $("#"+idElizaPicImageSlider),
                $btnThumbs    = $("#"+idElizaPicImageFooterThumbs),
                $btnSibling   = $("#"+idElizaPicImageFooterSiblings);
            imageSiblingsActive   = false;
            imageVariationsActive = true;
            imageThumbnailsActive = false;
            if ($this.hasClass("active")) {
                $this.removeClass("active");
                $slider.removeClass("show");
                imageVariationsActive = false;
                setTimeout(function() {$(window).trigger('resize');}, 50);
                return false;
            }
            ajaxSend({
                url: uriPicImage+"getImageVariations/"+(picStatus.imageData.image.system.parent || picStatus.imageData.image.system.id),
                success: function(result) {
                    var $sliderCrop = $("#"+idElizaPicImageSliderCrop);
                    $sliderCrop.hide();
                    $sliderList.find(".elz.item.image").remove();
                    $("#"+idElizaPicImageSliderTitle).html(langAppPicImgSliderTitle3);
                    $sliderCrop.nextAll("li").remove();
                    $sliderList.append(tmpR(tmpAppPicImageSliderItems,
                        {list: result, lang: langTmplImageSliderItem}, tmpObjImgSliderItem
                    ));
                    $this.addClass("active");
                    $slider.addClass("show");
                    $btnThumbs.removeClass("active");
                    $btnSibling.removeClass("active");
                    setTimeout(function() {$(window).trigger('resize');}, 50);
                    var $active  = $sliderList.find('.sliderItem[data-name="'+picStatus.name+'"] a').addClass("active"),
                        position = $active.offset();
                    $("#"+idElizaPicImageSlider+" .scroll-content").scrollLeft(position.left);
                    setTimeout(function() {$(window).trigger('resize');}, 50);
                    $sliderList.find(".cntrlItem.link").off().click(function() { // TODO: naebnyt'
                        var $this = $(this),
                            name  = $this.attr("data-name");
                        ajaxSend({
                            url: uriPicImage+"deleteVariation/"+name,
                            success: function() {
                                $this.closest("li.item.image").remove();
                            }
                        });
                    });
                    if (app.standAlone) {
                        $(".sliderItem a", $sliderList).off().click(function(e) { // TODO: подъебнуть на слайдер
                            hApi.pushState(
                                e,
                                $(this).attr("href"),
                                null,
                                {callback: 'picRouter'},
                                appPicStandAloneRouter
                            );
                            DIAppReg.regState(app.name, $(this).attr("href"));
                        });
                    }
                }
            });
        }).on("click", "#"+idElizaPicImageFooterContent, function() {picItemContentLinks(picStatus.imageData.image.system.id);});
        //--------------------------------------------------------------------------------------------------------------
        //                  S L I D E R
        $subfooter.off().on("click", "#"+idElizaPicImageSlider+" .elzCLStoolbar .link.right.dtr", function() {
            $("#"+idElizaPicImageFooterThumbs).removeClass("active");
            $("#"+idElizaPicImageFooterSiblings).removeClass("active");
            $("#"+idElizaPicImageFooterVariations).removeClass("active");
            setTimeout(function() {$(window).trigger('resize');}, 50);
            $("#"+idElizaPicImageSlider).removeClass("show");
        }).on("click", "#"+idElizaPicThumbCreate, function() {
            imageEditActive = false;
            imageCropActive = true;
            $("#"+idElizaPicImagePageEdit).removeClass("active");
            $("#"+idElizaPicImagePageCrop).addClass("active");
            picImageRightCropper();
        });
        if (UserHandler.getDevice() !== "desktop") {
            $content.on("swipeleft", function() {
                $("#"+idElizaPicFooterNext).click();
            }).on("swiperight", function() {
                $("#"+idElizaPicFooterPrev).click();
            });
        }
    }
    /**
     * Функция удаления альбома.
     */
    function picStackDelete() {
        var data    = picStatus,
            stackId = data.stackId,
            $stackList = $jqStackList;
        if(selectedCount > 0) {
            var len = selectedList.length, name, a, item, deleteList = [];
            if(!len) {
                return false;
            }
            var $items = $(".fileItem", $stackList);
            for(a = 0; a < len; a++) {
                name = selectedList[a];
                item = $items.filter('[data-name="'+name+'"]');
                deleteList.push({type: item.attr("data-type"), id:item.attr("data-id")});
                if (item.hasClass("orange")) {
                    continue;
                }
                item.remove();
            }
            if (data.name === 'trash') {
                ajaxSend({
                    url: uriPicStack+"restoreList/",
                    data: {list: JSON.stringify(deleteList)},
                    success: function() {
                        picSelectionReset();
                        picPaginationUpdate();
                        picStackHandlerCallback("", false);
                    }
                });
            }
            else {
                ajaxSend({
                    url: uriPicStack+"deleteList/"+stackId,
                    data: {list: JSON.stringify(deleteList)},
                    success: function(result){
                        var selected = 0;
                        for(var a = 0; a < selectedCount; a++) {
                            item = $('.fileItem[data-name="'+selectedList[a]+'"]', $stackList);
                            selected +=1;
                            if (item.hasClass("orange")) {
                                continue;
                            }
                            item.remove();
                        }
                        /** @namespace result.deleted */
                        /** @namespace result.prevented */
                        var deleted   = parseInt(result.deleted, 10),
                            prevented = parseInt(result.prevented, 10);
                        notificationLine(
                            langAppPicNotificationDel1+deleted+(prevented ? langAppPicNotificationDel2+prevented+langAppPicNotificationDel3 : ""),
                            prevented ? "blue" : "red 700", prevented ? 5000 : 2500);
                        picStackHandlerCallback("", false);
                        picSelectionReset();
                        picStackItemsInit();
                        picPaginationUpdate();
                    }
                });
            }
        }
    }
    /**
     * Отображение/сборка всплывающего окна настроек альбома/изображения.
     *
     * @param {string } itemType - тип объекта
     * @param {int}     itemId   - идентификатор объекта
     */
    function picItemSettings(itemType, itemId)
    {
        var id         = idElizaPicPopupSettings,
            idHash     = "#"+id,
            $popup     = $(idHash),
            $window    = $(window),
            baseWidth  = 360,
            baseHeight = 500,
            wHeight    = $window.height(),
            wWidth     = $window.width(),
            posX       = Math.round((wWidth  - baseWidth ) / 2),
            posY       = Math.round((wHeight - baseHeight) / 2);
        if (!$popup.length) {
            var settingsLayouts = popupAssembler({
                setts: {
                    id: id,
                    isDraggable: 1,
                    width:  baseWidth,
                    height: baseHeight
                },
                enable: {
                    content: {cnt: {}}
                }
            });
            $popup = $(idHash);
            settingsLayouts.top.header.html(tmpR(tmpAppToolbarPanel, {
                floated: "floated",
                tone:    "dark",
                withoutbg: 1,
                bordered: "bordered",
                class:    "padded bottom"
            }));
            settingsLayouts.top.header.find('[data-layout="toolbar_app"]').html(tmpR(
                tmpAppToolbarButton, {
                    tag: 'div',
                    setts: {type: 'default', txt: '1'},
                    icon: {svg: {main: 'ic-image', sub: 'ic-pencil'}, size: 'small', color: {subbg: 'blue'}},
                    text: {str: langAppPicSettingsEdit, align: 'right'}
                },
                tmpObjElzIcon
            ));
            settingsLayouts.top.header.find('[data-layout="toolbar_right"]').html(tmpR(
                tmpAppToolbarButton, {
                    tag: 'div',
                    id:  idElizaPicPopupSettingsClose,
                    title: langAppPicSettingsClose,
                    class: 'close',
                    setts: {type: 'default', link: '1', tip_h: 'dtr'},
                    icon: {svg: {main: 'ic-cross'}, size: 'small'}
                },
                tmpObjElzIcon
            ));
            $("#"+idElizaPicPopupSettingsClose+", #"+idElizaPicPopupSettingsCancel).off().click(function() {$popup.addClass("hide");});
            settingsLayouts.content.cnt.content.html(tmpR(
                tmpAppScrollContent, {id: idElizaPicPopupScroll}
            ));
            inputsInitDefault();
            if (UserHandler.getDevice() === "desktop") {
                $popup.draggable({handle: ".elzCLSenginePanel.header"});
            }
        }
        ajaxSend({
            url: uriPicUtils+"getDataForSettings/"+itemType+"/"+itemId,
            success: function(result) {
                result.lang = langTmplPopupSettings;
                $("#"+idElizaPicPopupScroll).html(tmpR(
                    tmpAppPicPopupSettings,
                    result
                ));
                inputsInitDefault();
                var $header = $popup.find('.header[data-layout="top_header"]'),
                    $form   = $popup.find("form"),
                    $app    = $header.find('.wrapInner[data-layout="toolbar_app"]'),
                    $formTitle  = $form.find('input[name="title"]'),
                    $formText   = $form.find('textarea[name="description"]'),
                    $formAge    = $form.find('input[name="age"]'),
                    $formAccess = $form.find('input[name="access"]'),
                    $formAgM    = $form.find('input[name="master_age"]'),
                    $formAcM    = $form.find('input[name="master_access"]');
                /** @namespace result.isAlbum */
                $app.find('.text.right').html(langAppPicSettingsEdit+" "+(result.isAlbum ? langAppPicSettings1 : langAppPicSettings2));
                $app.find('.elzIc.main').removeClass("ic-image").removeClass("ic-folder").addClass(
                    result.isAlbum ? "ic-folder" : "ic-image"
                );
                DIContextMenu.hide();
                $popup.removeClass("hide").css("top", posY).css("left", posX);
                $popup.css("height", $header.height() + $form.height());
                $header.on("submit", function(e) {e.preventDefault();});
                modernTextInput($formTitle, function(callback) {
                    picItemSettingsSendData(itemType, itemId, {field: "title",  value: $formTitle.val()}, callback);
                });
                modernTextInput($formText, function(callback) {
                    picItemSettingsSendData(itemType, itemId, {field: "descr",  value: $formText.val()}, callback);
                });
                $formAccess.on("click", function() {
                    var $this = $(this), $icSpan;
                    if($formAcM.prop("checked")) {
                        $icSpan = $formAcM.next(".checker");
                        if (!$icSpan.html()) {
                            $icSpan.html('');
                        }
                    }
                    picItemSettingsSendData(itemType, itemId, {field: "access", value: $this.val(), master: $formAcM.prop("checked") ? "on" : ""});
                });
                $formAge.on("click", function() {
                    var $this = $(this), $icSpan;
                    if($formAgM.prop("checked")) {
                        $icSpan = $formAgM.next(".checker");
                        if (!$icSpan.html()) {
                            $icSpan.html('');
                        }
                    }
                    picItemSettingsSendData(itemType, itemId, {field: "age",    value: $this.val(), master: $formAgM.prop("checked") ? "on" : ""});
                });
                $formAcM.on("change", function() {
                    var $this = $(this);
                    picItemSettingsSendData(itemType, itemId, {field: "access", value: $formAccess.filter(":checked").val(), master: $this.prop("checked") ? "on" : ""});
                });
                $formAgM.on("change", function() {
                    var $this = $(this);
                    picItemSettingsSendData(itemType, itemId, {field: "age", value: $formAge.filter(":checked").val(),    master: $this.prop("checked") ? "on" : ""});
                });
            }
        });
    }
    function picItemSettingsSendData(itemType, itemId, data, callback)
    {
        ajaxSend({
            url: uriPicUtils+"setDataForSettings/"+itemType+"/"+itemId,
            data: data,
            success: function(result) {
                if ($("#"+idElizaPicImageViewer).length) {
                    picGetImageMeta(picStatus.name, function() {
                        if ($("#"+idElizaPicImageDescr).length) {
                            picImageRightContent();
                        }
                    });
                    $("#"+idElizaPicFooterTitle).find(".text").html(
                        $("#"+idElizaPicPopupSettings).find('input[name="title"]').val()
                    );
                    return false;
                }
                else if ($("#"+idElizaApp).attr("data-appstate") === "list album" && parseInt(itemId, 10) === parseInt(picStatus.stackId, 10)) {
                    $("#"+idElizaPicFooterTitle).find(".text").html(
                        $("#"+idElizaPicPopupSettings).find('input[name="title"]').val()
                    );
                    
                    
                }
                result.lang = langTmplItemsItem;
                $('[data-type="'+itemType+'"][data-id="'+itemId+'"]', $jqStackList).off().replaceWith(
                    tmpR(tmpAppPicItemsItem, result)
                );
                picStackItemsInit();
                if (callback) {
                    callback();
                }
            }
        });
    }
    function modernTextInput($object, callback) {
        var control = $object.elizaIFormsControls(),
            loading = 0, timeout;
        $object.on("input", function() {
            if (!loading) {
                loading = 1;
                control.showLoading();
            }
            clearTimeout(timeout);
            timeout = setTimeout(function() {
                control.showAccept();
                loading = 0;
                callback(function() {timeout = setTimeout(function() {control.resetIconInfo();}, 2000);});
            }, 500);
        });
    }
    /**
     * Отображение/сборка окна связей с контентом
     *
     * @param {int} imageId - идентификатор изображения
     */
    function picItemContentLinks(imageId)
    {
        var id         = idElizaPicPopupContent,
            idHash     = "#"+id,
            scrollId   = idElizaPicPopupContentScroll,
            booksScrl  = idElizaPicPopupContentBooks,
            $popup     = $(idHash),
            $window    = $(window),
            baseWidth  = 640,
            baseHeight = 500,
            wHeight    = $window.height(),
            wWidth     = $window.width(),
            posX       = Math.round((wWidth  - baseWidth ) / 2),
            posY       = Math.round((wHeight - baseHeight) / 2);
        if (!$popup.length) {
            var settingsLayouts = popupAssembler({
                setts: {
                    id: id,
                    isDraggable: 1,
                    width:  baseWidth,
                    height: baseHeight
                },
                enable: {
                    top: {subheader: 1},
                    content: {cnt: {}}
                }
            });
            $popup = $(idHash);
            settingsLayouts.top.header.html(tmpR(tmpAppToolbarPanel, {floated: "floated", popup: 1}));
            settingsLayouts.top.header.find('[data-layout="toolbar_app"]').html(tmpR(
                tmpAppToolbarButton, {
                    tag: 'div',
                    class: 'grow',
                    setts: {type: 'default', txt: '1'},
                    icon: {svg: {main: 'ic-sharedfile'}, size: 'small'},
                    text: {str: langAppPicImgBtn4, align: 'right'}
                },
                tmpObjElzIcon
            ));
            settingsLayouts.top.header.find('[data-layout="toolbar_right"]').html(tmpR(
                tmpAppToolbarButton, {
                    tag: 'div',
                    id:  idElizaPicPopupContentClose,
                    title: langAppPicSettingsClose,
                    class: 'close',
                    setts: {type: 'default', link: '1', tip_h: 'dtr'},
                    icon: {svg: {main: 'ic-cross'}, size: 'small'}
                },
                tmpObjElzIcon
            ));
            $("#"+idElizaPicPopupContentClose).off().click(function() {$popup.addClass("hide");});
            settingsLayouts.top.subheader.html(
                '
'+
                tmpR(tmpAppScrollContent, {id: booksScrl})+
                '
'
            );
            settingsLayouts.content.cnt.content.html(tmpR(
                tmpAppScrollContent, {id: scrollId}
            ));
            inputsInitDefault();
            if (UserHandler.getDevice() === "desktop") {
                $popup.draggable({handle: ".elzCLSenginePanel.header"});
            }
        }
        DIContextMenu.hide();
        $popup.removeClass("hide").css("top", posY).css("left", posX);
        ajaxSend({
            url: uriPicUtils+"getContentLinksFull/"+imageId,
            success: function(result) {
                /** @namespace result.bookmarks */
                /** @namespace result.bookmarks */
                /** @namespace {string} result.status */
                if (result.status === "no_links") {
                    $popup.addClass("hide");
                    return this;
                }
                $("#"+booksScrl).html(tmpR(
                    tmpAppCommonBookmarks,
                    {wrap: {id: idElizaPicContentBookmarks}, list: result.bookmarks},
                    {"common/bookmarks_item": tmpAppCommonBookmarksItem}
                ));
                $("#"+scrollId).html(tmpR(tmpAppPicPopupContent, {list: result.content, lang: langTmplPopupContent}));
                var $books = $("#"+idElizaPicContentBookmarks).find(".bookmarkItem");
                $books.off().click(function() {
                    var $this = $(this);
                    if ($this.hasClass("active")) {
                        return this;
                    }
                    ajaxSend({
                        url: uriPicUtils+"getContentLinksByType/"+imageId+"/"+$this.attr("data-cid"),
                        success: function (result) {
                            $("#"+scrollId).html(tmpR(tmpAppPicPopupContent, {list: result, lang: langTmplPopupContent}));
                            $books.removeClass("active");
                            $this.addClass("active");
                        }
                    });
                });
            }
        });
    }
    var presetListSet = false;
    function picPresetNameListReset(selectOverride)
    {
        ajaxSend({
            url: uriPicUtils+"getCorrectionsPreset/"+picStatus.imageData.image.system.id,
            success: function(result) {
                var len = result.length, a, item, html = "", part;
                for(a = 0; a < len; a++) {
                    item = result[a];
                    part = "";
                    if (item.disabled && item.disabled === 1) {
                        part = ' disabled="disabled"';
                    }
                    else if((item.selected && item.selected === 1 && !selectOverride) || (selectOverride && selectOverride === item.val)) {
                        part = ' selected="selected"';
                    }
                    html += '';
                }
                $("#"+idElizaPicCorrPresetList).html(html).change();
                presetListSet = true;
            }
        });
    }
    /**
     * Сборка/отображение окна проводника по альбомам
     */
    function picExplorerWindow()
    {
        var toolTreeLayouts,
            id       = idElizaPicPopupExplorer,
            idHash   = "#"+id,
            scrollId = idElizaPicPopupExplorerScroll,
            $popup   = $(idHash),
            $window  = $(window),
            baseWidth  = 640,
            baseHeight = 610,
            wHeight = $window.height(),
            wWidth  = $window.width(),
            posX    = Math.round((wWidth  - baseWidth ) / 2),
            posY    = Math.round((wHeight - baseHeight) / 2),
            $explorer;
        if (!$popup.length) {
            toolTreeLayouts = popupAssembler({
                setts: {
                    id: id,
                    isResizable: 1,
                    isDraggable: 1,
                    width:  baseWidth,
                    height: baseHeight
                },
                enable: {content: {cnt: {}}}
            });
            $popup = $(idHash);
            toolTreeLayouts.top.header.html(tmpR(tmpAppToolbarPanel, {
                floated: "floated",
                tone:    "dark",
                withoutbg: 1,
                bordered: "bordered",
                class:    "padded bottom"
            }));
            toolTreeLayouts.top.header.find('[data-layout="toolbar_app"]').html(tmpR(
                tmpAppToolbarButton, {
                    tag: 'div',
                    setts: {type: 'default', txt: '1'},
                    icon: {svg: {main: 'ic-foldertree'}, size: 'small'},
                    text: {str: langAppPicExplorer, align: 'right'}
                },
                tmpObjElzIcon
            ));
            toolTreeLayouts.top.header.find('[data-layout="toolbar_right"]').html(tmpR(
                tmpAppToolbarButton, {
                    tag: 'div',
                    id:  idElizaPicExplorerClose,
                    title: langAppPicExplorerClose,
                    class: 'close',
                    setts: {type: 'default', link: '1', tip_h: 'dtr'},
                    icon: {svg: {main: 'ic-cross'}, size: 'small'}
                },
                tmpObjElzIcon
            ));
            $("#"+idElizaPicExplorerClose).click(function() {$popup.addClass("hide");});
            toolTreeLayouts.content.cnt.content.html(tmpR(
                tmpAppScrollContent, {id: scrollId}
            ));
            inputsInitDefault();
            $("#" + scrollId).html(tmpR(tmpAppPicExplorerWp, {id: idElizaPicExplorerWP}));
            if (UserHandler.getDevice() === "desktop") {
                $popup.draggable({
                    handle: ".elzCLSenginePanel.header"
                }).resizable({
                    handles: 'all', minWidth: 320, minHeight: 320
                });
            }
            $explorer = $("#"+idElizaPicExplorerWP);
            $explorer.on("click", ".elzCLSlabel.link", function() {
                picMoveToStack($(this).closest(".elz.expItem"), true);
                $popup.addClass("hide");
            });
            $explorer.closest(".padSmall").addClass("picExplorer").on("click", ".expNodeShower", function() {
                var $this = $(this),
                    $li   = $this.closest("li"),
                    id    = $this.attr("data-id");
                if(!$("#"+idElizaPicExplorerUl+id).length) {
                    ajaxSend({
                        url: uriPicStack+"getAlbumTree/"+id,
                        async: false,
                        success: function(result) {
                            picExplorerCreateNode(result[id], id, $li);
                        }
                    });
                }
            }).on("click", "a.expLink", function(e) {
                $("#"+idElizaPicExplorerWP).find(".expInner").removeClass("here");
                $(this).closest(".expInner").addClass("here");
                if (app.standAlone) {
                    hApi.pushState(
                        e,
                        $(this).attr("href"),
                        null,
                        {callback: 'picRouter'},
                        appPicStandAloneRouter
                    );
                    (UserHandler.getDevice() === "desktop" ? $jqStackScroll.closest(".scroll-content") : $jqStackScroll.closest(".elzScroll")).scrollTop(0);
                    DIAppReg.regState(app.name, $(this).attr("href"));
                }
            });
        }
        $popup.removeClass("hide").css("top", posY).css("left", posX);
        $explorer = $("#"+idElizaPicExplorerWP);
        ajaxSend({
            url: uriPicStack+"getAlbumTree",
            success: function(result) {
                if (!result["0"]) {
                    return this;
                }
                $explorer.html('');
                picExplorerInsertLi(
                    $explorer.find("ul"),
                    0,
                    picStatus.name === "root" || picStatus.name === "" ? 1 : 0,
                    0,
                    0,
                    "root",
                    "",
                    0,
                    0
                );
                picExplorerCreateNode(result[0], 0, $("#"+idElizaPicExplorerLi+"0"));
                if (selectedCount) {
                    $(".item.picExplorer").removeClass("hide");
                    $("#"+idElizaPicExplorerLi+picStatus.stackId).find(".expInner.here .item.picExplorer").addClass("hide");
                }
            }
        });
    }
    /**
     * Создание узла в проводнике по альбомам. Создает узел и наполняет его, в случае нахождения очередного узла,
     * вызывает себя же рекурсивно
     *
     * @param {object} list  - Массив со всеми узлами. Вложенность узла в узел отсуствует
     * @param {int}    stackId - Индекс узла, который надо добавить
     * @param {object} $li
     */
    function picExplorerCreateNode(list, stackId, $li)
    {
        var length = list.length,
            isExpandable = 0,
            isActive = 0,
            isContent = 0,
            $ul,
            stackName = picStatus.name,
            tplLi  = tmpAppPicExplorerLi,
            icon = {
                svg: {
                    main: 'ic-folder'
                },
                radius: 'rad',
                size:   'small',
                color: {bg: ""}
            };
        $li.append(tmpR(
            tmpAppPicExplorerUl, {
                name: idElizaPicExplorerUl,
                id: stackId
            })
        );
        $ul = $("#"+idElizaPicExplorerUl+stackId);
        for(var a = 0, item; a < length; a += 1) {
            item = list[a];
            if(parseInt(item.stacks, 10)) {
                isExpandable = 1;
            }
            else {
                isExpandable = 0;
            }
            if(stackName === item.url) {
                isActive = 1;
            }
            else {
                isActive = 0;
            }
            isContent = parseInt(item.isContent, 10);
            if (isContent) {
                icon.color.bg = "orange 700";
            }
            else {
                icon.color.bg = "";
            }
            /** @namespace item.stack_id */
            $ul.append(tmpR(tplLi, {
                icon:   icon,
                images: parseInt(item.images, 10),
                stacks: parseInt(item.stacks, 10),
                name:   'picExplorer',
                id:     item.stack_id,
                title:  item.title,
                mode:   app.standAlone ? "/" : "#pic/",
                sname:  item.url,
                isExpandable: isExpandable,
                isActive: isActive,
                isContent: isContent
            }, tmpObjElzIcon));
        }
    }
    function picExplorerInsertLi($ul, isExpandable, isActive, isContent, stackId, title, url, images, stacks) {
        var stackName = picStatus.name,
            icon = {
                svg: {
                    main: 'ic-folder'
                },
                radius: 'rad',
                size:   'small'
            };
            $ul.append(tmpR(tmpAppPicExplorerLi, {
                icon:   icon,
                images: images,
                stacks: stacks,
                name:   idElizaPicExplorerLi,
                id:     stackId,
                title:  title,
                mode:   app.standAlone ? "/" : "#pic/",
                sname:  url,
                isExpandable: isExpandable,
                isActive: isActive,
                isContent: isContent,
                lang: langTmplExplorerLi
            }, tmpObjElzIcon));
    }
    /**
     * Функция сборки и добавления фуутера для стэка
     *
     * @param {bool} fullRebuild - При значении true производится полная пересборка фуутера, включая tml
     */
    function picInsertFooterStack(fullRebuild)
    {
        var $layout  = app.layout.content.cnt.footer,
            btn      = tmpAppToolbarButton,
            icon     = tmpAppCommonIcon,
            footerId = idElizaPicFooter,
            status   = picStatus,
            ids = picIds;
        if (fullRebuild) {
            $layout.html(tmpR(tmpAppFooter, {id: footerId}));
        }
        var $footer = $("#"+footerId),
            $left   = $footer.find('[data-layout="footer_left"]'),
            $right  = $footer.find('[data-layout="footer_right"]'),
            $middle = $footer.find('[data-layout="footer_middle"]'),
            lftArr, rgtArr;
        /*if (!fullRebuild) {
            $middle.off().html("");
        }*/
        picPaginatingResetHtml();
        if (fullRebuild) { // ЭТИ ЧАСТИ НЕ ТАК ЧАСТО МЕНЯЮТСЯ, ОТ СТРАНИЦЫ К СТРАНИЦЕ ОДНИ И ТЕЖЕ
            // Это константа
            lftArr = [
                tmpR(btn, {
                    id:    idElizaPicFooterAlbums, tag: "div", title: langAppPicStackFooter1,
                    class: (picGLBAlbumsOnly === "true" ? "active" : ""),
                    border: {enable: 1, lines:  "top", color: 'blue'},
                    setts: {type: 'default', link: '1', align: "left", tip_v: 'dtb', tip_h: 'dtl'},
                    icon:  {svg: {main: 'ic-foldertree'}, size: 'small'}
                }, tmpObjElzIcon),
                tmpR(btn, {
                    id:    idElizaPicFooterContent, tag: "div", title: langAppPicStackFooter2,
                    class: (picGLBContentOnly === "true" ? "active" : ""),
                    border: {enable: 1, lines:  "top", color: "orange"},
                    setts: {type: 'default', link: '1', align: "left", tip_v: 'dtb', tip_h: 'dtl'},
                    icon:  {svg: {main: 'ic-sharedfile'}, size: 'small'}
                }, tmpObjElzIcon),
                tmpR(tmpAppToolbarTitle, {
                    id:   idElizaPicFooterTitle,
                    text: picStatus.title
                })
            ];
            rgtArr = [
                tmpR(tmpAppToolbarNum, {id: idElizaPicFooterNumbers}),
                tmpR(btn, {
                    id:    idElizaPicToolUnsel, tag: "div", title: langAppPicStackFooter3,
                    class: "hide",
                    setts: {type: 'default', link: '1', align: "right", tip_v: 'dtb', tip_h: 'dtr'},
                    //data:  'data-xhide="320"',
                    icon:  {svg: {main: 'ic-selectremove'}, size: 'small'}
                }, tmpObjElzIcon)
            ];
            $left.html(lftArr.join(""));
            $right.html(rgtArr.join(""));
            picFooterNumbersEditor();
        }
    }
    function picFooterNumbersEditor() {
        var paginationShift = 0,
            status = picStatus;
        $("#"+idElizaPicFooterNumbers+" .current").off().focusout(function(){paginationShift = 0;}).keyup(function(e){
            if(e.which === 16) {
                paginationShift = 0;
            }
        }).keydown(function(e) {
            var $this  = $(this),
                keyNum = e.which,
                toPage,
                keyAllowed = [8,  13, 37, 38, 39, 40, 46, 48,  49,  50,  51,  52,  53,  54,
                              55, 56, 57, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 189];
            if( keyNum === 16 ) {
                paginationShift = 1;
                return false;
            }
            if( $.inArray( keyNum, keyAllowed ) < 0 || paginationShift ) {
                return false;
            }
            if(keyNum === 13) {
                var pages = pageParser($this.html(), picStatus.pages.max),
                    uri   = (app.standAlone ? "/" : "#pic") + (status.name === "root" ? "" : (!app.standAlone ? "/" : "")+status.name)+"?page=";
                /*if (pages.start > picStatus.pages.max) {
                    pages.start = picStatus.pages.max;
                }
                if (pages.end > picStatus.pages.max) {
                    pages.end = picStatus.pages.max;
                }*/
                toPage = (pages.start !== pages.end) ? pages.start+"-"+pages.end : pages.start;
                if (app.standAlone) {
                    hApi.replaceStateData({callback: "picRouter"}, uri+toPage);
                    DIAppReg.regState(app.name, uri+toPage);
                    appPicStandAloneRouter();
                }
                else {
                    bBone.history.navigate(uri+toPage, {trigger: true});
                }
                return false;
            }
        });
    }
    /**
     * Функция проверки состояния фильтров в фуутере для стека. Если фильтры установлены, то скрываются кнопки
     * добавления картинки и альбома. Это делается в той связи, что в режиме только контент||альбомы нельзя добавлять
     * новые изображения/альбомы.
     */
    function picFooterFiltersCheck()
    {
        var ids = picIds,
            toolPair = $("#"+idElizaPicToolAddImage+", #"+idElizaPicToolAddStack);
        if (picGLBAlbumsOnly === "true"  || picGLBContentOnly === "true") {
            toolPair.addClass("hide");
        }
        else {
            toolPair.removeClass("hide");
        }
    }
    /**
     * Функция получения мета-данных поль конкретному альбому.
     * picGLBContentOnly [true|false] - показывать ли только связанное с контентом?
     * picGLBAlbumsOnly  [true|false] - показывать ли только альбомы?
     *
     * @param {string}   name     - Нейм альбома, семь символов 0-9a-zA-Z
     * @param {function} callback - Функция вызываемая после получения данных
     */
    function picGetAlbumMeta(name, callback)
    {
        ajaxSend({
            url: uriPicStack+"getName/"+name+"/"+picGLBContentOnly+"/"+picGLBAlbumsOnly,
            success: function(result) {
                /** @namespace result.id       */
                /** @namespace result.owner    */
                /** @namespace result.name     */
                /** @namespace result.items    */
                /** @namespace result.parent   */
                /** @namespace result.title    */
                /** @namespace result.editable */
                /** @namespace result.pages    */
                /** @namespace result.restricted */
                if (!picParseMetaAlbum(result)) {
                    return false;
                }
                if (callback) {
                    callback();
                }
            }
        });
    }
    function picParseMetaAlbum(result) {
        /** @namespace result.id       */
        /** @namespace result.owner    */
        /** @namespace result.name     */
        /** @namespace result.items    */
        /** @namespace result.parent   */
        /** @namespace result.title    */
        /** @namespace result.editable */
        /** @namespace result.pages    */
        /** @namespace result.restricted */
        if (result.restricted) {
            appCoreRestrictedAccessPage(result.restricted, 'stack');
            return false;
        }
        picStatus.stackId   = parseInt(result.id, 10);
        picStatus.ownerId   = parseInt(result.owner, 10);
        picStatus.name      = result.name;
        picStatus.items     = result.items;
        picStatus.parent    = result.parent;
        picStatus.parent_id = result.parent_id;
        picStatus.title     = result.title;
        picStatus.editable  = parseInt(result.editable, 10);
        picStatus.pages.max = parseInt(result.pages, 10) || 1;
        return true;
    }
    /**
     * Функция сброса отображения постраничности. Приводит все информационные эллементы постраничности к текущему
     * (актуальному) состоянию
     */
    function picPaginatingReset()
    {
        var ids   = picIds,
            $cur  = $("#"+idElizaPicFooterNumbers+" .current"),
            $max  = $("#"+idElizaPicFooterNumbers+" .total"),
            pages = picStatus.pages, cur = pages.start;
        if (pages.start !== pages.end) {
            cur = pages.start+"-"+pages.end;
        }
        $max.html(pages.max);
        $cur.html(cur);
    }
    function picPaginatingResetHtml() {
        var btn      = tmpAppToolbarButton,
            icon     = tmpAppCommonIcon,
            pages    = picStatus.pages,
            midButtons = {
                left:  {class: "", tag: "a"},
                right: {class: "", tag: "a"},
                root:  {class: "", tag: "a"}
            },
            status = picStatus,
            ids = picIds;
        var $middle = $("#"+idElizaPicFooter).find('[data-layout="footer_middle"]'),
            midArr, rooTitle;
        if (pages.start <= 1) {
            midButtons.left  = {class: "disabled", tag: "div"};
        }
        if (pages.end >= pages.max) {
            midButtons.right = {class: "disabled", tag: "div"};
        }
        if (picStatus.name === "root") {
            rooTitle = langAppPicPageGoTo1;
            if (picStatus.pages.end === 1) {
                midButtons.root.class = "disabled";
            }
        }
        else {
            rooTitle = !status.parent ? (UserHandler.getId() ? langAppPicPageGoTo2 : langAppPicPageGoTo3) : langAppPicPageGoTo4;
        }
        var pageStart = !app.standAlone ? "#pic" : "/",
            pageName  = (status.name === "root" ? "" : (!app.standAlone ? "/" : "")+status.name);
        midArr = [
            tmpR(btn, {
                id:    idElizaPicFooterPrev,
                tag:   midButtons.left.tag,
                href:  pageStart + pageName + "?page="+(pages.start-1),
                class: midButtons.left.class,
                title: langAppPicPageGoTo5,
                setts: {type: 'default', link: '1',  tip_v: 'dtb'},
                icon:  {svg: {main: 'ic-move-left'}, size: 'small'}
            }, tmpObjElzIcon),
            tmpR(btn, {
                id:    idElizaPicFooterRoot,
                tag:   midButtons.root.tag,
                href:  pageStart + (status.parent ? (!app.standAlone ? "/" : "")+status.parent : ""),
                class: midButtons.root.class,
                title: rooTitle,
                setts: {type: 'default', link: '1', tip_v: 'dtb'},
                icon:  {svg: {main: 'ic-gallery3'}, size: 'small'}
            }, tmpObjElzIcon),
            tmpR(btn, {
                id:    idElizaPicFooterNext,
                tag:   midButtons.right.tag,
                href:  pageStart + pageName + "?page="+(pages.end+1),
                class: midButtons.right.class, title: langAppPicPageGoTo10,
                setts: {type: 'default', link: '1',  tip_v: 'dtb'},
                icon:  {svg: {main: 'ic-move-right'}, size: 'small'}
            }, tmpObjElzIcon)
        ];
        $middle.html(midArr.join(""));
    }
    /**
     * Функция получения и сброса постраничности. Реализованна через получение мета данных альбома и последующим
     * сбросом постраничности до актуального состояния
     */
    function picPaginationUpdate()
    {
        if (picStatus.state === "stack") {
            picGetAlbumMeta(picStatus.name, function() {picPaginatingReset();});
        }
    }
    /**
     * Универсальная функция для получения списка картинок/альбомов, для указанного альбома. В наличии несколько
     * возможных режимов работы:
     * 1. "Добавление после" - полученные данные вставляются ПОСЛЕ указанного итема, этот режим полезен при подгрузке
     *                         новых изображений при скроллинге;
     *
     * 2. "Добавление перед" - полученные данные вставляются ПЕРЕД указанным итемом, этот режим полезен при добавлении
     *                         новых изображений, когда требуется вставить в начало страници ряд новых итемов и
     *                         одновременно удалить такое-же количество старых, чтобы на странице было постоянное
     *                         количество итемов. Также может быть полезно при добавлении функции предгрузки по
     *                         скроллингу вверх;
     *
     * 3. "append/prepend"   - Режимы просто регулируют метод вставки в контейнер, никак не влияет на способ получения
     *                         данных. Получается снимок по указанным страницам.
     *
     * @param {object} options           - Настройки для получения списка изображений/альбомов
     * @param {string=} options.type      - Режим работы
     * @param {number=} options.ownerId   - Идентификатор хозяина альбома
     * @param {number=} options.stackId   - Идентификатор альбома
     * @param {string=} options.itemName  - Нейм объекта перед/после которого производится вставка
     * @param {int=}    options.itemCount - Количество итем покотрые вставляются перед/после объекта
     * @param {string=} options.page      - Строка постраничности
     * @param {bool=}   options.clear     - Удалить первые PAGES_PER_PAGE итемов
     * @param {object=} options.event     - Объект события, если нужен для работы
     * @param {function=} options.success - Функция обратного вызова, которые вызывается по завершению
     */
    function picGetItemsList(options)
    {
        var type     = options.type,
            memberId = options.ownerId,
            stackId  = options.stackId,
            dPages   = picStatus.pages.start+"-"+picStatus.pages.end,
            $list = $("#"+idElizaPicContentStackList),
            clear = options.clear ? options.clear : false,
            $item, itemName, itemCount, itemId, itemType, page, url;
        if(type === "add_after") {
            itemName  = options.itemName;
            itemCount = options.itemCount;
            $item     = $('#'+ idElizaPicContentStackList+' li.fileItem[data-name="'+itemName+'"]');
            itemId    = $item.attr("data-id");
            itemType  = $item.attr("data-type");
            url = uriPicStack+"getItemsList/after/"+itemType+"/"+itemId+"/"+stackId+"/"+memberId+"/"+itemCount+"/"+picGLBContentOnly+"/"+picGLBAlbumsOnly;
        }
        else if(type === "add_before") {
            itemName  = options.itemName;
            itemCount = options.itemCount;
            $item     = $('#'+ idElizaPicContentStackList+' li.fileItem[data-name="'+itemName+'"]');
            itemId    = $item.attr("data-id");
            itemType  = $item.attr("data-type");
            url = uriPicStack+"getItemsList/before/"+itemType+"/"+itemId+"/"+stackId+"/"+memberId+"/"+itemCount+"/"+picGLBContentOnly+"/"+picGLBAlbumsOnly;
        }
        else {
            page = options.page || dPages;
            url = uriPicStack+"get/"+memberId+"/"+stackId+"/"+page+"/"+picGLBContentOnly+"/"+picGLBAlbumsOnly;
        }
        ajaxSend({
            url: url,
            success: function(result) {
                if      (type === "append"    ) {$list.append( picGetItemsListHtmlList(result));}
                else if (type === "prepend"   ) {$list.prepend(picGetItemsListHtmlList(result));}
                else if (type === "add_after" ) {$item.after(  picGetItemsListHtmlList(result));}
                else if (type === "add_before") {$item.before( picGetItemsListHtmlList(result));}
                else {
                    $list.html(picGetItemsListHtmlList(result));
                }
                if(clear) {
                    $jqStackList.find(".fileItem:lt("+PAGES_PER_PAGE+")").remove();
                    options.event.currentTarget.scrollTop -= 1;
                }
                picStackItemsInit();
                if (options.success) {
                    options.success();
                }
                picStackTopMenuCheck();
                picPluploaderFrame();
                picStackScrollLoader();
                if (!$("li", "#"+idElizaPicContentStackList).length && (picGLBContentOnly === "true" || picGLBAlbumsOnly === "true")) {
                    $("#"+idElizaPicPluploadZone).closest(".picCLSupload").removeClass("empty").addClass("hide");
                    appCoreRestrictedAccessPage({code: "empty", save: 1});
                }
                else if (!$("li", "#"+idElizaPicContentStackList).length && picStatus.name !== "trash" &&
                    (picStatus.name !== "root" || picStatus.pages.start === 1) && picStatus.ownerId === UserHandler.getId()) {
                    $("#"+idElizaPicPluploadZone).closest(".picCLSupload").addClass("empty").removeClass("hide");
                }
                else if (picStatus.name !== "root" && picStatus.pages.start !== 1 && picStatus.name !== "trash") {
                    $("#"+idElizaPicPluploadZone).closest(".picCLSupload").removeClass("empty").addClass("hide");
                }
                scroller_obj.scroll();
            }
        });
    }
    /**
     * Функция пересборки html контентной области стэка
     *
     * @returns {boolean} - возвращает false если нет прав на редактирование
     */
    function picStackRebuildHtml()
    {
        insertStackScroll();
        var ids = picIds, uploadCls = "", cntArr, prev;
        if (picStatus.pages.start !== 1 && picStatus.name !== "root") {
            uploadCls = "hide";
        }
        if (!$("#"+idElizaPicPluploadBtn).length) {
            cntArr = [
                ''+
                tmpR(
                    tmpAppCommonUploadZone, {
                        id: idElizaPicPluploadBtn,
                        parent_id: idElizaPicPluploadZone,
                        description: helperGenUploadZoneText(),
                        icon: {svg: {main: picStatus.name === "root" ? 'ic-image' : 'ic-images', sub:  'ic-plus'}, color: {subbg: 'blue'}},
                        circle: {id: idElizaPicPluploadCircle, size: 'large ', radius: '55', color: 'blue'}
                    },
                    tmpObjElzIcon
                )+"
",
                tmpR(
                    tmpAppPicItemsList, {id: idElizaPicContentStackList, list: {}, lang: langTmplItemsItem},
                    tmpObjItemsItem
                )
            ];
            $jqStackScroll.html(cntArr.join(""));
        }
        else {
            $("#"+idElizaPicContentStackList).closest(".elz.picCLSgrid").replaceWith(tmpR(
                tmpAppPicItemsList, {id: idElizaPicContentStackList, list: {}, lang: langTmplItemsItem},
                tmpObjItemsItem
            ));
        }
        var $stackList = $("#"+idElizaPicContentStackList);
        $jqStackList = $stackList;
        if (!picStatus.editable) {
            return false;
        }
        if (picGLBContentOnly === "true" || picGLBAlbumsOnly === "true") {
            $("#"+idElizaPicPluploadZone).closest(".picCLSupload").removeClass("empty").addClass("hide");
        }
        picStackItemsInitSingle();
        picSelectionReset();
        $stackList.attr("for", $("#"+idElizaPicToolAddImage).attr("for"));
        return true;
    }
    /**
     * Функция производить сборку HTML по списку итемов
     *
     * @param {object} list - Стандартизированный список итемов альбома (картинки и альбомы)
     *
     * @returns {string} - HTML код списка итемов
     */
    function picGetItemsListHtmlList(list)
    {
        return tmpR(
            tmpAppPicItemsGroup,
            {list: list, iconEnabled: picStatus.name !== "root" && picStatus.name !== "trash" ? 1 : 0, lang: langTmplItemsItem},
            tmpObjItemsItem
        );
    }
    /**
     * Сброс выделения в альбомы. Как следствие сброс всех необходимых счетчиков и систем уведомления о количестве
     * выбранных итемов
     */
    function picSelectionReset()
    {
        var status   = picStatus,
            ids      = picIds,
            idUnsel  = idElizaPicToolUnsel,
            idAlbum  = idElizaPicToolAddStack,
            idTree   = idElizaPicToolTree,
            idDelete = idElizaPicToolTrash,
            $delete = $("#"+idDelete),
            $deleteIcg = $delete.find(".icg i:first"),
            $album = $("#"+idAlbum),
            $tree  = $("#"+idTree);
        $jqStackList.find(".ui-selected").removeClass("ui-selected");
        $delete.elizaIIconsControls().setSubBG("").setSubHtml("");
        $album.elizaIIconsControls().setSubBG("send").setSubHtml("");
        $tree.elizaIIconsControls().setSubBG("").setSubHtml("");
        $("#"+idUnsel).elizaIIconsControls().setSubBG("").setSubHtml("");
        $album.attr("data-elz-title", langApiPicSelectionTitle1);
        $tree.attr("data-elz-title",  langApiPicSelectionTitle2);
        if (status.name !== "trash") {
            $deleteIcg.addClass("ic-trash").removeClass("ic-loop");
            $delete.attr("data-elz-title", langApiPicSelectionTitle3);
        }
        else {
            $deleteIcg.removeClass("ic-trash").addClass("ic-loop");
            $delete.attr("data-elz-title", langApiPicSelectionTitle4);
        }
        selectedCount = 0;
        selectedList  = [];
        $("#"+idElizaPicToolUnsel).addClass("hide");
        $(".item.picExplorer").addClass("hide");
    }
    /**
     * Функция инициализации органов управления для итема (картинка/альбом). Управление не доступно в корзине и на
     * мобильных устройства, потому что сорьки и чмаки.
     *
     * @returns {boolean} - Возвращает false если нет прав на редактирование, мобильник или корзина
     */
    function picStackItemsInit()
    {
        var $stackList = $jqStackList,
            $noInited  = $stackList.find(".fileItem.noInit");
        if (!picStatus.editable || UserHandler.getDevice() !== "desktop" || picStatus.name === "trash") {
            return false;
        }
        else {
            $noInited.removeClass("noInit");
        }
        if (UserHandler.getDevice() === "desktop") {
            /**
             * Включаем возможность перетаскивания итема
             */
            $noInited.filter(".draggable").draggable({
                //revert: true,
                revertDuration: 100,
                handle: ".itemLink",
                containment: ".filesList",
                cursor: "move",
                helper: "clone",
                start: function () {
                    var $thisM = $(this),
                        $dragging = $('[data-name="' + $thisM.attr("data-name") + '"]:last', $stackList),
                        $count = $dragging.find(".dragCount");
                    selectedCount = !selectedCount ? 1 : selectedCount;
                    $count.show().html(selectedCount);
                }
            });
            /**
             * Это дроп итема на итем, чтобы стакнуть
             */
            $noInited.find(".itemLink").droppable({
                accept: ".fileItem.draggable",
                tolerance: "pointer",
                over: function () {
                    $(this).closest(".fileItem").addClass("hover");
                },
                out: function () {
                    $(this).closest(".fileItem").removeClass("hover");
                },
                drop: function (event, ui) {
                    var $thisM = $(this),
                        $item = $thisM.closest(".fileItem"), // Сюда бросаем
                        $drag = ui.draggable;
                    selectedList.push($item.attr("data-name"));
                    if (!$drag.hasClass("ui-selected")) {
                        $drag.remove();
                        selectedList.push($drag.attr("data-name"));
                    }
                    picMoveToStack($item);
                }
            });
            /**
             * Это дроп на зону пересортировки
             */
            $noInited.find(".reorder").droppable({
                accept: ".fileItem.draggable",
                hoverClass: "hover",
                tolerance: "pointer",
                drop: function (event, ui) {
                    var $thisM = $(this),
                        $item = $thisM.closest(".fileItem"),
                        $drag = ui.draggable,
                        a,
                        sel,
                        $list = $stackList,
                        orderFirst = 0;
                    orderFirst = parseInt($(".fileItem:first", $stackList).first().attr("data-order"), 10);
                    if (!$drag.hasClass("ui-selected")) {
                        if ($thisM.hasClass("left")) {
                            $item.before($drag);
                        }
                        else {
                            $item.after($drag);
                        }
                    }
                    if (selectedCount > 0) {
                        if ($thisM.hasClass("left") || ($thisM.hasClass("right") && $item.next("li").attr("data-id"))) {
                            for (a = 0; a < selectedCount; a++) {
                                sel = selectedList[a];
                                if (!sel) {
                                    continue;
                                }
                                $item.before($('.ui-selected[data-name="' + sel + '"]', $list));
                            }
                        }
                        else {
                            for (a = 0; a < selectedCount; a++) {
                                sel = selectedList[a];
                                if (!sel) {
                                    continue;
                                }
                                $list.append($('.ui-selected[data-name="' + sel + '"]', $list));
                            }
                        }
                    }
                    var orderObject = {};
                    $stackList.find(".fileItem").removeClass("hover").removeClass("ui-selected").each(function () {
                        var $this = $(this);
                        $this.attr("data-order", orderFirst);
                        if (!orderObject.hasOwnProperty($this.attr("data-name"))) {
                            orderObject[$this.attr("data-name")] = {
                                type: $this.attr('data-type'),
                                order: orderFirst,
                                id: $this.attr('data-id')
                            };
                        }
                        orderFirst--;
                    });
                    ajaxSend({
                        url: uriPicStack+"reorder/" + picStatus.ownerId + '/' + picStatus.stackId,
                        data: {order: JSON.stringify(orderObject)},
                        success: function (result) {
                        }
                    });
                    orderFirst = 0;
                    selectedCount = 0;
                    selectedList = [];
                    picSelectionReset();
                }
            });
        }
        // Удаляем класс "Не инициализированно", чтобы потом не инициализировать
        $noInited.removeClass("noInit");
        return true;
    }
    function picStackItemsInitSingle()
    {
        var $stackList = $("#"+idElizaPicContentStackList), prev, ids = picIds;
        if (DISite.getPackageName() === "Pic") {
            $stackList.on("click", "a", function(e) {
                hApi.pushState(
                    e,
                    $(this).attr("href"),
                    null,
                    {callback: 'picRouter'},
                    appPicStandAloneRouter
                );
                DIAppReg.regState(app.name, $(this).attr("href"));
            });
        }
        if (UserHandler.getDevice() === "desktop") {
            $stackList.filter(".selectable").selectable({
                filter: 'li.fileItem',
                //autoRefresh: false,
                cancel: ".itemLink, .itemTitle, .thumb",
                selecting: function (e, ui) {
                    var curr = $(ui.selecting.tagName, e.target).index(ui.selecting);
                    if (e.shiftKey && prev > -1) {
                        $(ui.selecting.tagName, e.target).slice(Math.min(prev, curr), 1 + Math.max(prev, curr)).addClass('ui-selected');
                        prev = -1;
                    } else {
                        prev = curr;
                    }
                },
                start: function () {
                    DIContextMenu.hide();
                },
                stop: function () {
                    var $selected = $stackList.find("li.fileItem.ui-selected"),
                        $tree  = $("#"+idElizaPicToolTree),
                        $trash = $("#"+idElizaPicToolTrash),
                        $unsel = $("#"+idElizaPicToolUnsel),
                        $addStack = $("#"+idElizaPicToolAddStack);
                    selectedCount = parseInt($selected.length, 10);
                    selectedList = [];
                    $selected.each(function () {
                        var $thisM = $(this);
                        if ($thisM.attr("data-name")) {
                            selectedList.push($thisM.attr("data-name"));
                        }
                    });
                    if (selectedCount) {
                        var name = picStatus.name,
                            trashColor = name === 'trash' ? 'success' : 'error';
                        $trash.elizaIIconsControls().setSubBG(trashColor).setSubHtml(selectedCount);
                        $tree.elizaIIconsControls().setSubBG("success").setSubHtml(selectedCount);
                        $addStack.elizaIIconsControls().setSubBG("success").setSubHtml(selectedCount);
                        $unsel.elizaIIconsControls().setSubBG("send").setSubHtml(selectedCount);
                        $addStack.attr("data-elz-title", langApiPicSelectionTitle5);
                        $tree.attr("data-elz-title", langApiPicSelectionTitle6);
                        if (name === 'trash') {
                            $trash.attr("data-elz-title", langApiPicSelectionTitle7);
                        }
                        else {
                            $trash.attr("data-elz-title", langApiPicSelectionTitle8);
                        }
                        $(".item.picExplorer").removeClass("hide");
                        $("#"+idElizaPicExplorerLi+picStatus.stackId).find(".expInner.here .item.picExplorer").addClass("hide");
                        $unsel.removeClass("hide");
                    }
                    else {
                        picSelectionReset();
                    }
                }
            });
        }
        /**
         * Это редактирование тайтла у итема
         */
        $stackList.on("keydown", ".itemTitle", function(e) {
            var $this  = $(this),
                keyNum = e.which,
                $item  = $this.closest(".fileItem"),
                type   = $item.attr("data-type") === "album" ? "stack" : "image";
            if(keyNum === 13) {
                ajaxSend({
                    url: uriPic+type+"/setTitle/"+$item.attr("data-id"),
                    data: {title: $this.html()},
                    success: function(){}
                });
                $this.blur();
                return false;
            }
        });
        $stackList.on("click", ".makeStackIcon", function() {
            var $this = $(this);
            if ($this.hasClass("active")) {
                return true;
            }
            ajaxSend({
                url: uriPicStack+"setIcon/"+picStatus.name+"/"+$this.closest(".fileItem").attr("data-id"),
                success: function() {
                    $stackList.find(".makeStackIcon").removeClass("active").attr("title", langApiPicSelectionTitle9);
                    $this.addClass("active").attr("title", langApiPicSelectionTitle10);
                }
            });
        });
    }
    var pluploadObject; // Объект плуплоадера
    var pluploadFromContext = 'false'; // Если установлено 'true'  это значит, что включена контекстная меню
    /**
     * Инициализирует плуплоадер и возвращает ссылку на объект. Если плуплоадер был инициализирован, то
     * просто возвращает ссылку
     *
     * @returns {object} - Возвращает ссылку на объект плуплоадера
     */
    function picPluploaderGet(forceRebuild)
    {
        var type = typeof pluploadObject;
        if (type === "object" && !forceRebuild) {
            return pluploadObject;
        }
        if (type === "object") {
            pluploadObject.plupload.destroy();
            pluploadObject = "";
        }
        var loadToStack = false,
            loadStackNm = '',
            config      = picStatus,
            pages       = config.pages,
            autoGroupEnable = UserHandler.getSetting("pic", "autogroup_enable"),
            autoGroupCount  = UserHandler.getSetting("pic", "autogroup_size"),
            picItem     = tmpAppPicItemsItem,
            loadingCircles = {},
            PPP = PAGES_PER_PAGE,
            jqIndex = 0,
            pBar     = ProgressBar.getInstance(),
            uploader = new plupload.Uploader({
                runtimes:  'html5,html4',
                url:       uriPicImage+'add',
                dragdrop:  true,
                browse_button : document.getElementById(idElizaPicToolAddImage),
                filters : {
                    max_file_size : '10mb',
                    mime_types: [{title : "Image files", extensions : "jpg,jpeg,gif,png"}]
                },
                init: {
                    FilesAdded: function (up) {
                        var stackName = picStatus.name;
                        jqIndex = ((pages.end - (pages.start - 1)) * PPP) - 1;
                        pBar.reset(1);
                        $("#"+idElizaPicPluploadBtn).removeClass("hover");
                        if (up.total.queued >= autoGroupCount && pluploadFromContext === 'false' && autoGroupEnable ) {
                            if(pages.start === 1) {
                                picStackAddLoader('album', idElizaPicUploadToNewStack, false);
                                loadingCircles[idElizaPicUploadToNewStack] = new LoadingCircle(idElizaPicUploadToNewStack+"_circle");
                                $jqStackList.find(".fileItem:gt("+jqIndex+")").remove(); // удаляет лишние картинки
                            }
                            var data = picAddStack(picStatus.stackId, 0);
                            loadStackNm = data.system.name;
                            uploader.settings.url = uriPicImage+"add/"+loadStackNm;
                            loadToStack = true;
                        }
                        else {
                            loadToStack = false;
                            loadStackNm = '';
                            if (pluploadFromContext !== 'false') {
                                stackName = pluploadFromContext;
                                $jqStackList.find('.fileItem[data-name="'+pluploadFromContext+'"]').replaceWith(
                                    picStackAddLoader('album', idElizaPicUploadToNewStack, true)
                                );
                                loadingCircles[idElizaPicUploadToNewStack] = new LoadingCircle(idElizaPicUploadToNewStack+"_circle");
                            }
                            uploader.settings.url = uriPicImage+"add/"+stackName;
                        }
                        up.total.queueLen = up.total.queued;
                        uploader.start();
                        DIContextMenu.hide();
                        if (picStatus.name !== "trash") {
                            $("#"+idElizaPicPluploadZone).closest(".picCLSupload").removeClass("empty");
                        }
                        else {
                            $("#"+idElizaPicPluploadZone).closest(".picCLSupload").removeClass("empty").addClass("hide");
                        }
                    },
                    UploadFile: function(up, file) {
                        if (!loadToStack) {
                            if(pages.start === 1 && pluploadFromContext === 'false') {
                                picStackAddLoader('image', file.id, false);
                                loadingCircles[file.id] = new LoadingCircle(file.id+"_circle");
                                $jqStackList.find(".fileItem:gt("+jqIndex+")").remove(); // удаляет лишние картинки
                            }
                        }
                    },
                    FileUploaded: function(up, file, info) {
                        var jsonData = JSON.parse(info.response),
                            $this = $("#"+file.id);
                        jsonData.lang = langTmplItemsItem;
                        $this.replaceWith(tmpR(picItem, jsonData.data));
                        picStackItemsInit();
                    },
                    UploadProgress: function (up, file) {
                        var total = up.total,
                            perImg = 100 / total.queueLen,
                            perOne = perImg / 100,
                            percent = Math.ceil((total.uploaded + total.failed) * perImg + perOne * file.percent);
                        if(percent > 100) {
                            percent = 100;
                        }
                        pBar.setProgress(percent);
                        if ((total.queueLen < autoGroupCount || !autoGroupEnable) && pluploadFromContext === 'false') {
                            if(pages.start === 1) {
                                loadingCircles[file.id].setPercentage(file.percent);
                            }
                        }
                        else {
                            if(pages.start === 1 || pluploadFromContext !== 'false') {
                                loadingCircles[idElizaPicUploadToNewStack].setPercentage(percent);
                            }
                        }
                    },
                    UploadComplete: function() {
                        var result;
                        if (loadToStack || pluploadFromContext !== 'false') {
                            if (pluploadFromContext !== 'false') {
                                result = picStackResetIcon(pluploadFromContext);
                            }
                            else {
                                result = picStackResetIcon(loadStackNm);
                            }
                            result.lang = langTmplItemsItem;
                            $("#"+idElizaPicUploadToNewStack).replaceWith(tmpR(picItem, result));
                            picStackItemsInit();
                        }
                        if (pluploadFromContext === 'false') {
                            picStackHandlerCallback("", false);
                            if (pages.start > 1) {
                                notificationLine(langAppPicNotificationImgUploads, "blue", 2500);
                            }
                        }
                        pBar.reset(200);
                        picPaginationUpdate();
                        pluploadFromContext = 'false';
                    },
                    error: function(up, error) {
                        $("#"+idElizaPicPluploadBtn).removeClass("hover");
                        if (error.code === -600) {
                            notificationLine(langAppPicNotificationImgOversize, "red 700", 1500);
                        }
                        else if (error.code === -601) {
                            notificationLine(langAppPicNotificationImgTypes, "red 700", 1500);
                        }
                    },
                    PostInit: function() {
                        var $addImage = $("#"+idElizaPicToolAddImage);
                        $addImage.attr("for", $addImage.closest(".groupInner").find(".moxie-shim input").attr("id"));
                        $("#"+idElizaPicPluploadBtn).attr("for", $addImage.attr("for"));
                    }
                }
            });
        uploader.init();
        pluploadObject = {
            plupload: uploader,
            loadZone: {
                zone:  '',
                input: ''
            },
            context: '',
            inited: {
                zone:  false,
                input: false
            }
        };
        if (forceRebuild) {
            fromClipBoard = false;
            picPluploaderFrame();
        }
        return pluploadObject;
    }
    /**
     * Функция подключения кнопки "Добавить изображение" и зоны для дропа картинок.
     * Зона дропа картинок доступна только в корне пика и на странице 1, также на страницах 1-хх.
     * Предусмотрена функция уничтожения областей, при необходимости.
     */
    function picPluploaderFrame()
    {
        var uplId  = idElizaPicPluploadZone,
            btnId  = idElizaPicPluploadBtn,
            $uplZn = $("#"+uplId),
            statusData = picStatus,
            pages      = statusData.pages,
            plupload   = picPluploaderGet(),
            uploader   = plupload.plupload/*,
            inited     = plupload.inited.zone && plupload.inited.input*/;
        if (picStatus.ownerId !== UserHandler.getId()) {
            $uplZn.closest(".picCLSupload").addClass("hide");
            return;
        }
        if (statusData.name !== 'trash' && pages.start === 1 && (picGLBAlbumsOnly === "false" && picGLBContentOnly === "false")) {
            $uplZn.closest(".picCLSupload").removeClass("hide");
            if ($("#"+idElizaPicContentStackList+" li").length) {
                $uplZn.closest(".picCLSupload").removeClass("empty");
                $uplZn.find(".description").html(helperGenUploadZoneText());
            }
            else {
                $uplZn.find(".description").html(helperGenUploadZoneText(1));
            }
        }
        else if ($uplZn.length) {
            if(($("li", "#"+idElizaPicContentStackList).length && pages.start !== 1) || statusData.name === "trash" || !statusData.editable) {
                $uplZn.closest(".picCLSupload").addClass("hide");
                if (plupload.inited.zone) {
                    plupload.loadZone.zone.destroy();
                }
                if (plupload.inited.input) {
                    plupload.loadZone.input.destroy();
                }
                $("#"+idElizaPicPluploadZone+" input").each(function() {$(this).closest(".moxie-shim").remove();});
                return false;
            }
            $uplZn.closest(".picCLSupload").addClass("empty");
            $uplZn.find(".description").html(helperGenUploadZoneText(1));
        }
        if (picGLBContentOnly === "true" || picGLBAlbumsOnly === "true") {
            $("#"+idElizaPicPluploadZone).closest(".picCLSupload").removeClass("empty").addClass("hide");
        }
        if ($uplZn.length && $("#"+btnId).length) {
            if (plupload.inited.zone) {
                plupload.loadZone.zone.destroy();
            }
            if (plupload.inited.input) {
                plupload.loadZone.input.destroy();
            }
            $("#"+idElizaPicPluploadZone+" input").each(function() {$(this).closest(".moxie-shim").remove();});
            if (fromClipBoard) {
                plupload = picPluploaderGet(true);
            }
            var drop = new mOxie.FileDrop({
                drop_zone: document.getElementById(uplId)
            });
            fromClipBoard = false;
            drop.ondrop = function() {uploader.addFile(drop.files);};
            drop.init();
            var input = new mOxie.FileInput({
                    browse_button: document.getElementById(btnId),
                    container:     document.getElementById(uplId),
                    multiple:      true
                });
            input.onchange = function() {uploader.addFile(input.files);};
            input.init();
            plupload.loadZone = {
                zone:  drop,
                input: input
            };
            plupload.inited = {
                zone:  true,
                input: true
            };
            $("#"+idElizaPicPluploadBtn).off("dragenter").off("dragleave").bind("dragenter", function() {
                $("#"+idElizaPicPluploadBtn).addClass("hover");
            }).bind("dragleave", function() {
                $("#"+idElizaPicPluploadBtn).removeClass("hover");
            });
        }
        $("#"+idElizaPicPluploadBtn).attr("for", $("#"+idElizaPicToolAddImage).attr("for"));
    }
    /**
     *
     * @param $item
     * @param noReplace
     * @param dataOverride
     * @param skipSelfExclude
     */
    function picMoveToStack($item, noReplace, dataOverride, skipSelfExclude)
    {
        var name, id, type;
        if (dataOverride) {
            id   = dataOverride.id;
            name = dataOverride.name;
            type = dataOverride.type;
        }
        else {
            id   = $item.attr("data-id");
            name = $item.attr("data-name");
            type = $item.attr("data-type");
        }
        type   = type === "album" ? "stack" : "image";
        if (_.indexOf(selectedList, name) !== -1 && !skipSelfExclude) {
            selectedCount -=1;
            selectedList.splice(_.indexOf(selectedList, name), 1);
        }
        var localList = !skipSelfExclude ? selectedList.slice(0) : selectedList,
            stackId   = picStatus.stackId;
        if(localList.length) {
            ajaxSend({
                url: uriPicStack+"moveItems/"+type+'/'+id+'/'+stackId,
                data: {list: JSON.stringify(localList)},
                success: function (result) {
                    var $stackList = $jqStackScroll;
                    result.lang = langTmplItemsItem;
                    if (!noReplace) {
                        $item.replaceWith(tmpR(tmpAppPicItemsItem, result));
                    }
                    else {
                        $stackList.find('li[data-name="'+name+'"]').replaceWith(
                            tmpR(tmpAppPicItemsItem, result)
                        );
                    }
                    picStackItemsInit();
                    picItemListRefresh('del', selectedCount);
                    var $fileItems = $(".fileItem", $stackList);
                    $fileItems.filter(".hover").removeClass("hover");
                    $fileItems.filter(".ui-selected").remove();
                    var len = localList.length;
                    for(var a = 0; a < len; a++) {
                        $stackList.find('li[data-name="'+localList[a]+'"]').remove();
                    }
                    notificationLine(langAppPicNotificationMoved+localList.length);
                    picSelectionReset();
                    picPaginationUpdate();
                }
            });
        }
    }
    /**
     * Функция обновления списка итемов. Для добавления новых итемов или удаления старых
     *
     * @param {string} actionFlag - add||del, добавление или удаление
     * @param {int}    number     - количество итемов
     */
    function picItemListRefresh(actionFlag, number)
    {
        var $items     = $(".fileItem", $jqStackList),
            name       = $items.filter(":last").attr("data-name"),
            itemsCount = $items.length,
            data       = picStatus,
            pages      = picStatus.pages,
            pagesNum   = pages.end - pages.start + 1,
            pagesPics  = pagesNum * PAGES_PER_PAGE;
        if (actionFlag === 'add') {
            if (pages.start === 1 && (itemsCount - pagesPics ) > 0) {
                $items.slice(pagesPics).remove();
            }
            else if (pages.start > 1) {
                // Здесь добавляем НУМБЕР предыдущих картинок
                picGetItemsList({
                    type:      'add_before',
                    ownerId:   data.ownerId,
                    stackId:   data.stackId,
                    itemName:  name,
                    itemCount: number
                });
                $items.slice(pagesPics).remove();
            }
        }
        else if (actionFlag === 'del') {
            picGetItemsList({
                type:      'add_after',
                ownerId:   data.ownerId,
                stackId:   data.stackId,
                itemName:  name,
                itemCount: number
            });
        }
    }
    /**
     * Функция включения/выключения кнопок в юзер меню альбома. При переходе в корзину надо отключать некоторые кнопки
     */
    function picStackTopMenuCheck()
    {
        var status   = picStatus,
            ids      = picIds;
        if (status.editable && status.name !== "trash") {
            $("#"+idElizaPicToolAddImage).removeClass("hide");
            $("#"+idElizaPicToolAddStack).removeClass("hide");
            $("#"+idElizaPicToolTree).removeClass("hide");
        }
        else {
            $("#"+idElizaPicToolAddImage).addClass("hide");
            $("#"+idElizaPicToolAddStack).addClass("hide");
            $("#"+idElizaPicToolTree).addClass("hide");
        }
    }
    /**
     * Функция добавление нового альбома
     *
     * @param {int} parentStackId - Идентификатор альбома-родителя
     * @param {int} order         - Позиция сортировки, куда надо установить альбом
     *
     * @returns {object} - Объект пик итема
     */
    function picAddStack(parentStackId, order)
    {
        var data = {};
        ajaxSend({
            url: uriPicStack+"add/"+parentStackId+"/"+order,
            async: false,
            success: function (result) {data = result;}
        });
        return data;
    }
    /**
     * Добавление лоадер-кружка на то место, куда будет вставлена картинка/альбом. Потом мы управляем этим лоадером.
     *
     * @param {string} type - Тип итема album||image
     * @param {string} id   - Идентификатор загрузки
     * @param {boolean} html - Если не ноль, то отдасть html, иначе установит лоадер в начало стэк-листа
     *
     * @returns {string} - html лоадера-кружка
     */
    function picStackAddLoader(type, id, html)
    {
        var render = tmpR(
            tmpAppPicItemsLoading,
            {lang: langTmplItemsLoading, type: type || "image", id: id, circle: {id: id+"_circle", radius: '43', size: 'medium', color: 'blue'}},
            {"common/elz_loading_circle": tmpAppCommonLoadingCircle}
        );
        if (html) {
            return render;
        }
        $jqStackList.prepend(render);
    }
    /**
     * Функция сброса иконки у альбома. В качестве изображения иконки выбирается случайная картинка из альбома.
     *
     * @param {string} stackName - Нейм альбома 0-1a-zA-Z
     *
     * @returns {object} - Объект пик итема
     */
    function picStackResetIcon(stackName)
    {
        var data = {};
        ajaxSend({
            url: uriPicStack+"resetIcon/"+stackName,
            async: false,
            success: function (result) {data = result;}
        });
        return data;
    }
    var stackScrollerTimeout = 0;
    var stackScrollerTimeoutEnabled = false;
    var scrollLoadSkip   = false;
    /**
     * Функция обработчик скроллера, обслуживает всю магию связанную с дозагрузками страниц и всем таким прочим
     *
     * @returns {boolean} - Возвращает
     */
    function picStackScrollLoader()
    {
        if (scroller_enabled) {
            return true;
        }
        var $scrlId          = $jqStackScroll,
            statusData       = picStatus,
            scrollLoadEnable = parseInt(UserHandler.getSetting("pic", "autoload_enable"), 10),
            scrollLoadMaxlen = parseInt(UserHandler.getSetting("pic", "autoload_maxlen"), 10),
            scrollLoadWindow = UserHandler.getSetting("pic", "autoload_window"),
            scrollScroller   = UserHandler.getDevice() === "desktop" ? $scrlId.closest(".scroll-content") : $scrlId.closest(".elzScroll");
        scroller_enabled = true;
        scroller_obj     = scrollScroller;
        scrollScroller.scroll(function(e) {
            var target  = e.currentTarget,
                scrollY = target.scrollTop;
            scroller_axis_y = scrollY;
            if(scrollLoadSkip || !scrollLoadEnable) {//
                return this;
            }
            var newEndPage  = 0,
                enableClear = false,
                pages       = statusData.pages,
                scrollYMax  = target.scrollHeight - target.offsetHeight;
            if(scrollY >= scrollYMax && pages.end < pages.max) {
                newEndPage = pages.end + 1;
                if(scrollLoadMaxlen && !scrollLoadWindow && newEndPage > (pages.start + scrollLoadMaxlen)) {
                    return this;
                }
                if(scrollLoadMaxlen &&  scrollLoadWindow && newEndPage > (pages.start + scrollLoadMaxlen)) {
                    enableClear = true;
                    pages.start += scrollLoadMaxlen;
                }
                else {
                    enableClear = false;
                }
                pages.end = newEndPage;
                if (stackScrollerTimeout) {
                    clearTimeout(stackScrollerTimeout);
                }
                stackScrollerTimeout = setTimeout(picStackScrollTimeout, 300);
                stackScrollerTimeoutEnabled = true;
                scrollLoadSkip = true;
                picGetItemsList({
                    type: "append",
                    page: pages.end,
                    stackId: picStatus.stackId,
                    ownerId: picStatus.ownerId,
                    clear: enableClear,
                    event: e,
                    success:function(){scrollLoadSkip = false;}});
            }
            else if(stackScrollerTimeoutEnabled) {
                if (stackScrollerTimeout) {
                    clearTimeout(stackScrollerTimeout);
                }
                stackScrollerTimeout = setTimeout(picStackScrollTimeout, 300);
            }
        });
    }
    /**
     * Функция обновления URI постраничности
     */
    function picStackScrollTimeout()
    {
        var pages     = picStatus.pages,
            stackName = picStatus.name,
            curUri    = (!app.standAlone ? "#pic" : "/") + ((stackName === "" || stackName === "root")? "" : (!app.standAlone ? "/" : "")+stackName),
            pageEnd   = pages.end;
        if (pages.end >= pages.max) {
            pages.end  = pages.max;
            pageEnd    = pages.end;
            picPaginatingResetHtml();
        }
        else if (pages.start <= 1) {
            picPaginatingResetHtml();
        }
        var pageStr = pages.start+"-"+pageEnd;
        $("#"+idElizaPicFooterNumbers+" .current").html(pageStr);
        $("#"+idElizaPicFooterNext).attr("href", curUri+"?page="+pageEnd);
        if (app.standAlone) {
            hApi.replaceStateData({callback: "picRouter"}, curUri+"?page="+pageStr);
            DIAppReg.regState(app.name, curUri+"?page="+pageStr);
        }
        else {
            bBone.history.navigate(curUri+"?page="+pageStr, {trigger: false, replace: true});
            DIAppReg.regState(app.name, curUri+"?page="+pageStr);
        }
        stackScrollerTimeoutEnabled = false;
    }
    /*
    --------------------------------------------------------------------------------------------------------------------
    |                                                                                                                  |
    |                                             IMAGE SECTION                                                        |
    |                                                                                                                  |
    --------------------------------------------------------------------------------------------------------------------
    */
    /**
     * Функция обработчик обращения к странице изображения
     *
     * @param {string} item - нейм изображения
     * @param forced
     */
    function picImageHandler(item, forced)
    {
        clearTimeout(stackScrollerTimeout);
        scroller_enabled = false;
        if (item !== picStatus.name || forced) { // Если неймы не совпадают, то мы переключились в другой стэк
            picGetImageMeta(item, function() {picImageHandlerCallback(true);});
        }
        else {
            picImageHandlerCallback();
        }
    }
    /**
     * Функция молучения мета-данных по изображению. Включая альбом, родителя и тд и тп
     *
     * @param {string}   item     - нейм изображения
     * @param {function} callback - функция обратного вызова
     */
    function picGetImageMeta(item, callback)
    {
        ajaxSend({
            url: uriPicImage+"getPageData/"+item,
            success: function (result) {
                if (!picParseMetaImage(result)) {
                    return this;
                }
                callback();
            }
        });
    }
    function picParseMetaImage(result) {
        /** @namespace result.stack */
        /** @namespace result.stack.system.id */
        /** @namespace result.restricted */
        /** @namespace result.image */
        /** @namespace result.image.system */
        /** @namespace result.image.system.id */
        /** @namespace result.image.system.owner */
        /** @namespace result.image.system.name */
        /** @namespace result.image.meta */
        /** @namespace result.image.meta.file */
        /** @namespace result.image.meta.file.type */
        /** @namespace result.image.meta.title */
        /** @namespace result.image.access */
        /** @namespace result.image.access.editing */
        if (result.restricted) {
            appCoreRestrictedAccessPage(result.restricted, 'image');
            return false;
        }
        picStatus.stackId   = result.stack === "root" ? 0 : parseInt(result.stack.system.id, 10);
        picStatus.ownerId   = parseInt(result.image.system.owner, 10);
        picStatus.name      = result.image.system.name;
        picStatus.format    = result.image.meta.file.type;
        picStatus.title     = result.image.meta.title;
        picStatus.editable  = parseInt(result.image.access.editing, 10);
        picStatus.imageData = result;
        return true;
    }
    /**
     * Функция сборки страницы изображения
     */
    function picImageHandlerCallback(forced)
    {
        var clickForFooter = false;
        if (picStatus.state !== "image" || forced) {
            if (typeof pluploadObject === "object") {
                pluploadObject.plupload.destroy();
                pluploadObject = '';
            }
            picInsertMenuImage();
            picStatus.state = "image";
            clickForFooter = true;
        }
        $("#"+idElizaPicRightBack).removeClass("hide");
        var contentHtml   = app.layout.content.cnt.content,
            subfooterHtml = app.layout.content.cnt.subfooter,
            ids    = picIds,
            result = picStatus.imageData,
            $pageEdit = $("#"+idElizaPicImagePageEdit);
        picStatus.name = result.image.system.name;
            //$gspot = $edit.find(".gspot");
        if (DICookies.get("rightMenuActive") === "true") {
            app.layout.main.right.closest(".tplCLSgrid").addClass("showside");
        }
        if (picStatus.ownerId === UserHandler.getId()) {
            var $edit  = $pageEdit,
                controls = $edit.elizaIIconsControls();
            if (result.image.system.parent) {
                $edit.attr("data-elz-title", langAppPicImgBtn1);
                //$gspot.removeClass("ic-plus").addClass("ic-pencil");
                controls.setSubIcon("ic-pencil");
                $("#"+idElizaPicImagePageTree).addClass("hide");
            }
            else {
                $edit.attr("data-elz-title", langAppPicImgBtn2);
                //$gspot.removeClass("ic-pencil").addClass("ic-plus");
                controls.setSubIcon("ic-plus");
                $("#"+idElizaPicImagePageTree).removeClass("hide");
            }
        }
        var fileName = result.image.system.name+"."+result.image.meta.file.type;
        $("#"+idElizaPicImagePageDownload).attr("href", "/upl/"+fileName).attr("download", fileName);
        contentHtml.attr(  "data-elz-bg", "grey 900");
        subfooterHtml.attr("data-elz-bg", "grey 900");
        contentHtml.html(tmpR(tmpAppPicImage, {
            vcont:   idElizaPicImageCont,
            viewer:  idElizaPicImageViewer,
            cropper: idElizaPicImageCropper,
            title:  result.image.meta.title,
            name:   result.image.system.name,
            type:   result.image.meta.file.type,
            width:  result.image.meta.file.width,
            height: result.image.meta.file.height
        }));
        if (!$("#"+idElizaPicImageSlider).length) {
            subfooterHtml.html(tmpR(tmpAppPicImageSlider, {
                id: {
                    main:  idElizaPicImageSlider,
                    list:  idElizaPicImageSliderList,
                    crop:  idElizaPicImageSliderCrop,
                    title: idElizaPicImageSliderTitle,
                    crop_create: idElizaPicThumbCreate,
                    crop_form:   idElizaPicThumbForm
                },
                lang: langTmplImageSlider
            }));
        }
        picImageRightContent();
        $("img", $("#"+idElizaPicImageViewer)).click(function(event) {
            console.log(event);
            if (event.shiftKey || event.ctrlKey) {
                window.open($(this).attr("src"), '_blank');
            }
            else {
                window.open($(this).attr("src"), '_blank');
            }
        }).mousedown(function(e) {
            if (e.which === 2) {
                e.preventDefault();
                e.stopPropagation();
                window.open($(this).attr("src"), '_blank');
            }
            return true;
        });
        //--------------------------------------------------------------------------------------------------------------
        // СБОРКА ФУУТЕРА
        //--------------------------------------------------------------------------------------------------------------
        picInsertFooterImage(clickForFooter);
        $pageEdit.removeClass("active");
        $("#"+idElizaPicImagePageCrop).removeClass("active");
        imageEditActive = false;
        //picImageThumbsVarsSiblings();
        /*if (app.standAlone === 1) {
            $("#ElizaAppPicFake").remove();
            app.standAlone = 2;
        }*/
    }
    var imageActiveIgnore     = false,
        imageThumbnailsActive = false,
        imageSiblingsActive   = false,
        imageVariationsActive = false;
    /**
     * Сборка футера страницы с изображением
     */
    function picInsertFooterImage(clickForFooter) {
        var $layout  = app.layout.content.cnt.footer,
            btn      = tmpAppToolbarButton,
            icon     = tmpAppCommonIcon,
            footerId = idElizaPicImageFooter,
            ids      = picIds,
            result   = picStatus.imageData,
            image    = result.image,
            page     = result.page;
        $layout.html(tmpR(tmpAppFooter, {id: footerId}));
        var $footer = $("#"+footerId),
            $left   = $footer.find('[data-layout="footer_left"]'),
            $right  = $footer.find('[data-layout="footer_right"]'),
            $middle = $footer.find('[data-layout="footer_middle"]'),
            parent  = image.system.parent,
            upButton, upTitle;
        if (parent) {
            upButton = (!app.standAlone ? "/" : "")+image.system.prow.name;
            upTitle  = langAppPicPageGoTo7;
        }
        else {
            upButton = page.up !== "root" ? (!app.standAlone ? "/" : "")+page.up : "";
            upTitle  = page.up !== "root" ? langAppPicPageGoTo6 : (UserHandler.getId() ? langAppPicPageGoTo2 : langAppPicPageGoTo3);
        }
        var arrMid = [
            tmpR(btn, {
                id:    idElizaPicFooterPrev,
                tag:   page.prev !== "" ? "a" : "div",
                href:  page.prev !== "" ? (!app.standAlone ? "#pic/" : "/" )+page.prev : "",
                class: page.prev !== "" && !parent ? "" : "disabled",
                title: langAppPicPageGoTo8,
                setts: {type: 'default', link: page.prev !== "" ? "1" : "",  tip_v: 'dtb'},
                icon:  {svg: {main: 'ic-move-left'}, size: 'small'}
            }, tmpObjElzIcon),
            tmpR(btn, {
                id:    idElizaPicFooterRoot,
                tag:   "a",
                href:  (!app.standAlone ? "#pic" : "/")+upButton,
                title:  upTitle,
                setts: {type: 'default', link: '1',  tip_v: 'dtb'},
                icon:  {svg: {main: 'ic-gallery3'}, size: 'small'}
            }, tmpObjElzIcon),
            tmpR(btn, {
                id:    idElizaPicFooterNext,
                tag:   page.next !== "" ? "a" : "div",
                href:  page.next !== "" ? (!app.standAlone ? "#pic/" : "/" )+page.next : "",
                class: page.next !== "" && !parent ? "" : "disabled",
                title: langAppPicPageGoTo9,
                setts: {type: 'default', link: page.next !== "" ? "1" : "",  tip_v: 'dtb'},
                icon:  {svg: {main: 'ic-move-right'}, size: 'small'}
            }, tmpObjElzIcon)
        ];
        // Это константа
        var arrLft = [
            tmpR(btn, {
                id:    idElizaPicImageFooterVariations,
                tag:  "div",
                border: {enable: 1, lines:  'top', color:  'green'},
                class: !result.image.meta.numbs.variations && !image.system.parent ? "hide" : "", /** @namespace result.image.meta.numbs.variations */
                title: langAppPicImgBtn3,
                setts: {type: 'default', link: '1', align: "left", tip_v: 'dtb', tip_h: 'dtl'},
                icon:  {svg: {main: 'ic-wand'}, size: 'small'}
            }, tmpObjElzIcon),
            tmpR(btn, {
                id:    idElizaPicImageFooterContent,
                tag: "div",
                border: {enable: 1, lines:  'top', color:  'orange'},
                class: !result.image.flags.isContent ? "hide" : "", /** @namespace result.image.flags */
                title: langAppPicImgBtn4,
                setts: {type: 'default', link: '1', align: "left", tip_v: 'dtb', tip_h: 'dtl'},
                icon:  {svg: {main: 'ic-sharedfile'}, size: 'small'}
            }, tmpObjElzIcon),
            tmpR(tmpAppToolbarTitle, {id: idElizaPicFooterTitle, text: picStatus.title})
        ];
        var arrRgt = [
            tmpR(btn, {
                id:    idElizaPicImageFooterThumbs, tag: "div", title: langAppPicImgSliderTitle1,
                border: {enable: 1, lines:  'top', color:  'blue'},
                setts: {type: 'default', link: '1', align: "right", tip_v: 'dtb', tip_h: 'dtr'},
                //data:  'data-xhide="480"',
                icon:  {svg: {main: 'ic-crop2'}, size: 'small'}
            }, tmpObjElzIcon),
            tmpR(btn, {
                id:    idElizaPicImageFooterSiblings, tag: "div", title: langAppPicImgSliderTitle2,
                border: {enable: 1, lines:  'top', color:  'blue'},
                class: ((!page.next && !page.prev) || result.stack === "root" || image.system.parent ) ? "hide" : "",
                setts: {type: 'default', link: '1', align: "right", tip_v: 'dtb', tip_h: 'dtr'},
                icon:  {svg: {main: 'ic-gallery1'}, size: 'small'}
            }, tmpObjElzIcon)
        ];
        $middle.html(arrMid.join(""));
        $left.html(arrLft.join(""));
        $right.html(arrRgt.join(""));
        //TODO: на кнопарь навернуть проверку на эдитинг
        //if ($slider.hasClass("show") && (imageSiblingsActive || imageVariationsActive || imageThumbnailsActive)) {
        //    if (imageThumbnailsActive) {
        //        imageActiveIgnore = true;
        //        $btnThumbs.click();
        //    }
        //    else if (imageSiblingsActive) {
        //        $btnSibling.addClass("active");
        //    }
        //    else {
        //        $btnVariation.addClass("active");
        //    }
        //
        //    $sliderList.find("a").removeClass("active");
        //    $sliderList.find('a[href="/'+picStatus.name+'"]').addClass("active");
        //}
        //else if(!imageSiblingsActive && !imageVariationsActive && !imageThumbnailsActive) {
        //    $slider.removeClass("show");
        //    imageActiveIgnore = false;
        //}
        picImageThumbsVarsSiblings(clickForFooter);
    }
    function picImageThumbsVarsSiblings(clickForFooter) {
        var ids = picIds,
            $sliderList   = $("#"+idElizaPicImageSliderList),
            $slider       = $("#"+idElizaPicImageSlider),
            $btnThumbs    = $("#"+idElizaPicImageFooterThumbs),
            $btnSibling   = $("#"+idElizaPicImageFooterSiblings),
            $btnVariation = $("#"+idElizaPicImageFooterVariations);
        if ($slider.hasClass("show") && (imageSiblingsActive || imageVariationsActive || imageThumbnailsActive)) {
            if (imageThumbnailsActive) {
                imageActiveIgnore = true;
                $btnThumbs.click();
            }
            else if (imageSiblingsActive) {
                $btnSibling.addClass("active");
                /*if (clickForFooter) {
                    $btnSibling.click();
                }*/
            }
            else {
                $btnVariation.addClass("active");
                /*if (clickForFooter) {
                    $btnVariation.click();
                }*/
            }
            $sliderList.find("a").removeClass("active");
            $sliderList.find('a[href="/'+picStatus.name+'"]').addClass("active");
        }
        else if(!imageSiblingsActive && !imageVariationsActive && !imageThumbnailsActive) {
            $slider.removeClass("show");
            imageActiveIgnore = false;
        }
    }
    /**
     * Функция сборки пользовательского меню страницы с изображением
     */
    function picInsertMenuImage()
    {
        var $mid     = app.layout.top.header.find('[data-layout="toolbar_middle"]'),
            btn      = tmpAppToolbarButton,
            ids      = picIds,
            list     = [],
            transforms = [],
            result       = picStatus.imageData,
            type         = result.image.meta.file.type,
            parentId = picStatus.imageData.image.system.parent,
            funcPush = function(arrayList, id, title, icon) {
                arrayList.push({
                    tag: "div", id: id, title: title, align: "right", icon: {svg: {main: icon}, size: 'small'}
                });
            },
            len;
        list.push({
            tag: "a", id: idElizaPicImagePageDownload , title: langAppPicImgBtn5,  align: "right",
            icon: {svg: {main: 'ic-download'}, size: 'small'},
            href: "/"+picStatus.name+"."+picStatus.format,
            data: ' download='+picStatus.name+'.'+picStatus.format+''
        });
        if (picStatus.imageData.image.access.editing) {
            list.push({
                tag: "div", id: idElizaPicImagePageTree, title: langAppPicImgBtn6, align: "right",
                icon: {svg: {main: 'ic-foldertree', sub: 'ic-arrow-left'}, size: 'small', color: {subbg: 'blue'}}
            });
            list.push({
                tag: "div", id: idElizaPicImagePageCrop, title: langAppPicImgBtn7, align: "right",
                icon: {svg: {main: 'ic-crop'}, size: 'small'},
                border: {
                    enable: 1,
                    lines:  'bottom',
                    color:  'green'
                }
            });
            list.push({
                tag: "div", id: idElizaPicImagePageEdit,
                title:  parentId ? langAppPicImgBtn8 : langAppPicImgBtn9,  align: "right",
                icon: {
                    svg: {main: 'ic-wand', sub:  parentId ? "ic-pencil" : "ic-plus"},
                    size: 'small',
                    color: {subbg: "blue"}},
                border: {
                    enable: 1,
                    lines:  'bottom',
                    color:  'green'
                }
            });
            funcPush(list, idElizaPicImagePageMeta,   langAppPicImgBtn10, "ic-pencil");
            funcPush(list, idElizaPicImagePageDelete, langAppPicImgBtn11, "ic-trash");
            funcPush(transforms, idElizaPicImageToolGroupTransformMirrorHorizontal, langAppPicImgBtn12, "ic-mirror-h");
            funcPush(transforms, idElizaPicImageToolGroupTransformMirrorVertical,   langAppPicImgBtn13, "ic-mirror-v");
            funcPush(transforms, idElizaPicImageToolGroupTransformRotateLeft,       langAppPicImgBtn14, "ic-rotateclockcw");
            funcPush(transforms, idElizaPicImageToolGroupTransformRotateRight,      langAppPicImgBtn15, "ic-rotateclockw");
        }
        $mid.html("");
        var midHtml = "";
        if (picStatus.imageData.image.access.editing) {
            midHtml += tmpR(tmpAppToolbarGroup, {
                id:     idElizaPicImageToolGroupTransform,
                active: "",
                ordered: "ordered",
                position:  "right",
                xsub:      "768",
                v_pos:     "top",
                h_pos:     "right"
            });
        }
        midHtml += tmpR(tmpAppToolbarGroup, {
            id:     idElizaPicImageToolGroupMain,
            active: "",
            ordered: "ordered",
            position:  "right",
            xsub:      "540",
            v_pos:     "top",
            h_pos:     "right"
        });
        $mid.append(midHtml);
        //$("#"+picIds.toolStackExp).click(function() {$( this ).closest(".group").toggleClass( "active" );});
        len  = list.length;
        for(var a = 0, item; a < len; a++) {
            item = list[a];
            list[a] = tmpR(btn, {
                id:    item.id,
                tag:   item.tag,
                href:  item.href,
                title: item.title,
                setts: {type: 'default', align: item.align, link: '1'},
                text:  {str: item.title, align: 'left'},
                border: item.border ? item.border : {},
                icon:  item.icon,
                data:  item.data
            }, tmpObjElzIcon);
        }
        var $toolGroupMain = $("#"+idElizaPicImageToolGroupMain);
        $toolGroupMain.find('[data-layout="tool_list"]').append(list.join(""));
        $toolGroupMain.prepend(
            tmpR(btn, {
                id:    idElizaPicImageToolGroupExpand,
                tag:   "div",
                title: langAppPicImgBtn16,
                setts: {type: 'default', align: item.align, link: '1'},
                icon:  {svg: {main: 'ic-more1'}, size: 'small'},
                border: {
                    enable: 1,
                    lines:  'bottom',
                    color:  'blue'
                }
            }, tmpObjElzIcon)
        );
        len  = transforms.length;
        for(a = 0; a < len; a++) {
            item = transforms[a];
            transforms[a] = tmpR(btn, {
                id:    item.id,
                tag:   item.tag,
                href:  item.href,
                title: item.title,
                setts: {type: 'default', align: item.align, link: '1'},
                text:  {str: item.title, align: 'left'},
                border: item.border ? item.border : {},
                icon:  item.icon,
                data:  item.data
            }, tmpObjElzIcon);
        }
        transforms[a+1] = tmpR(btn, {
            tag:    "div",
            class:  "sep",
            sep:    1,
            default: 0,
            setts:  {align: "right"}
        });
        var $transform = $("#"+idElizaPicImageToolGroupTransform);
        $transform.find('[data-layout="tool_list"]').append(transforms.join(""));
        $transform.prepend(
            tmpR(btn, {
                id:    idElizaPicImageToolGroupTransformExpand,
                tag:   "div",
                title: langAppPicImgBtn17,
                setts: {type: 'default', align: item.align, link: '1'},
                icon:  {svg: {main: 'ic-fix'}, size: 'small'},
                border: {
                    enable: 1,
                    lines:  'bottom',
                    color:  'blue'
                }
            }, tmpObjElzIcon)
        );
    }
    /**
     * Функция отображения правой панели с мета-данными
     */
    function picImageRightContent()
    {
        var result   = picStatus.imageData,
            member   = result.member,
            stack    = {
                id:    0,
                url:   '',
                title: ''
            },
            rightHead     = app.layout.right.header,
            rightContent  = $("#"+idElizaPicRightScroll),
            rightFooter   = app.layout.right.footer,
            links, info,
            status = picStatus,
            copyPage   = "http://"+hostName+"/"+ picStatus.name,
            copyUrl    = copyPage+"."+picStatus.format,
            copyThumb  = "http://"+hostName+"/upl/t/"+ picStatus.name+"_150x150."+picStatus.format,
            copyHtml   = "
",
            copyBBCode = "[url="+copyPage+"][img]"+copyThumb+"[/img][/url]",
            resolution = result.image.meta.file.width+"×"+result.image.meta.file.height,
            fileSize   = result.image.meta.file.size,
            addDate    = result.image.system.date,
            dSplit1    = addDate.split(" "),
            dSplit2    = dSplit1[0].split("-"),
            textDate   = dSplit2[2]+" "+months[(dSplit2[1]-1)]+" "+dSplit2[0]+" в "+dSplit1[1],
            imageParent;
        if (!rightContent.length) {
            app.layout.right.cnt.content.html(tmpR(tmpAppScrollContent, {
                id: idElizaPicRightScroll
            }));
            rightContent  = $("#"+idElizaPicRightScroll);
        }
        if (result.stack !== "root") {
            stack.id    = result.stack.system.id;
            stack.title = result.stack.meta.title;
            stack.url   = (app.standAlone ? "/" : "#pic/")+result.stack.system.name;
        }
        if (result.image.system.parent) {
            /** @namespace result.image.system.prow */
            imageParent = {
                url:   (app.standAlone ? "/" : "#pic/")+result.image.system.prow.name,
                title: result.image.system.prow.title
            };
        }
        info = [
            {tag: "time", title: langAppPicImgRight1,  value: textDate, attrs: 'datetime="'+addDate.replace(" ", "T")+'"'},
            {tag: "span", title: langAppPicImgRight2, value: resolution},
            {tag: "span", title: langAppPicImgRight3,  value: result.image.meta.views.count},
            //{tag: "span", title: langAppPicImgRight4,  value: result.image.meta.views.unic},
            {tag: "span", title: langAppPicImgRight5, value: numeral(fileSize).format('b')}
        ];
        links = [
            {id: idElizaPicImageCopyInputClean,  title: langAppPicImgRight6, value: copyUrl   },
            {id: idElizaPicImageCopyInputHtml,   title: langAppPicImgRight7, value: copyHtml  },
            {id: idElizaPicImageCopyInputBBCode, title: langAppPicImgRight8, value: copyBBCode}
        ];
        rightHead.html(tmpR(
            tmpAppPicImageRightHead, {
                texted: {
                    text: langAppPicImgRight9,
                    icon: {svg: {main: "ic-info"}, size: "small"}
                },
                close: {
                    id:    idElizaPicRightPanelClose,
                    title: langAppPicImgRight10
                },
                lang: langTmplImageRightHead
        }, tmpObjElzIcon));
        rightContent.html(tmpR(tmpAppPicImageRightContent, {
                id_descr: idElizaPicImageDescr,
                isChild: result.image.system.parent ? 1 : 0,
                parent: imageParent,
                member: member,
                stack: stack,
                restrict: result.restrict,
                description: result.description,
                meta: {
                    title:       result.image.meta.title,
                    description: ""
                },
                info:  info,
                links: links,
                lang:  langTmplImageRightContent
            },
            {"common/scl_avatar": tmpAppCommonAvatar}
        ));
        rightFooter.html("");
        inputsInitDefault();
        $("#"+idElizaPicRightPanelClose).click(function() {
            $("#"+idElizaPicRightPanel).click();
        });
        $("#"+idElizaPicImageCopyInputClean+", #"+idElizaPicImageCopyInputHtml+", #"+idElizaPicImageCopyInputBBCode).off().click(function() {
            $(this).select();
        });
        if (DICookies.get("rightMenuActive") === "false") {
            app.layout.main.right.closest(".tplCLSgrid").removeClass("showside");
        }
        else if(DICookies.get("rightMenuActive") === "true") {
            app.layout.main.right.closest(".tplCLSgrid").addClass("showside");
            $("#"+idElizaPicRightPanel).addClass("active");
        }
    }
    /**
     * Функция отображения кроппера в правой панели
     */
    function picImageRightCropper(forClipboard, clipData)
    {
        var isClipboard  = forClipboard ? true : false,
            rightHead    = app.layout.right.header,
            rightContent = $("#"+idElizaPicRightScroll),
            rightFooter  = app.layout.right.footer,
            result       = picStatus.imageData,
            width        = isClipboard ? parseInt(clipData.width, 10)  : result.image.meta.file.width,
            height       = isClipboard ? parseInt(clipData.height, 10) : result.image.meta.file.height,
            type         = isClipboard ? clipData.type   : result.image.meta.file.type,
            aspectOrig   = width / height,
            imgRatio     = width / height;
        if (!rightContent.length) {
            app.layout.right.cnt.content.html(tmpR(tmpAppScrollContent, {
                id: idElizaPicRightScroll
            }));
            rightContent  = $("#"+idElizaPicRightScroll);
        }
        app.layout.main.right.closest(".tplCLSgrid").addClass("showside");
        var $viewer    = $("#"+idElizaPicImageViewer),
            $cropper   = $("#"+idElizaPicImageCropper),
            cropperImg = $cropper.find("img"),
            href       = isClipboard ?
                             "/upl/temp/temporary_clipboard_member_"+UserHandler.getId()+".png?"+(new Date().getTime()) :
                             "/upl/"+result.image.system.name+"."+result.image.meta.file.type;
        rightContent.html(tmpR(tmpAppPicImageCropper,
            {
                editor: idElizaPicImageEditorCropper,
                aratio: idElizaPicImageEditorAspects,
                zoom:   idElizaPicThumbZoomSwitch,
                width:  150,
                height: parseInt(150 / imgRatio, 10),
                controls: [
                    {
                        mode: "simple", disabled: "", title: "",
                        fields: [
                            {id: idElizaPicImageCropperWidth,  title: langAppPicImgEdit1, val: 150},
                            {id: idElizaPicImageCropperHeight, title: langAppPicImgEdit2, val: parseInt(150 / imgRatio, 10)}
                        ]
                    },
                    {
                        mode: "advanced", disabled: "disabled", title: langAppPicImgEdit3,
                        fields: [
                            {id: idElizaPicImageCropperPointX, title: langAppPicImgEdit4, val: ""},
                            {id: idElizaPicImageCropperPointY, title: langAppPicImgEdit5, val: ""}
                        ]
                    },
                    {
                        mode: "advanced", disabled: "disabled", title: langAppPicImgEdit6,
                        fields: [
                            {id: idElizaPicImageCropperOriginWidth,  title: langAppPicImgEdit7, val: ""},
                            {id: idElizaPicImageCropperOriginHeight, title: langAppPicImgEdit8, val: ""}
                        ]
                    }
                ],
                aspect_ratio: [
                    {type: "aspect", value: aspectOrig, title: langAppPicImgEdit9,    icon:  "ic-image", active: "active"},
                    {type: "aspect", value: 1,          title: "1:1",         class: "x1x1"    },
                    {type: "aspect", value: "free",     title: langAppPicImgEdit10, free:  "1"       },
                    {type: "lock",                      title: langAppPicImgEdit11,     icon:  "ic-lock", active: "active" },
                    {type: "aspect", value: 16/9,       title: "16:9", class: "x16x9"},
                    {type: "aspect", value: 3/2,        title: "3:2",  class: "x3x2" },
                    {type: "aspect", value: 4/3,        title: "4:3",  class: "x4x3" },
                    {type: "aspect", value: 5/4,        title: "5:4",  class: "x5x4" },
                    {type: "aspect", value: 9/16,       title: "9:16", class: "x9x16"},
                    {type: "aspect", value: 2/3,        title: "2:3",  class: "x2x3" },
                    {type: "aspect", value: 3/4,        title: "3:4",  class: "x3x4" },
                    {type: "aspect", value: 4/5,        title: "4:5",  class: "x4x5" }
                ],
                lang: langTmplImageCropper
            },
            tmpObjElzIcon
        ));
        rightFooter.html(tmpR(
            tmpAppPicImageEditorFooter,
            {
                save:   {id: idElizaPicImageCropperSave,   text: isClipboard ? langAppPicImgEdit12 : langAppPicImgEdit13},
                cancel: {id: idElizaPicImageCropperCancel, text: langAppPicImgEdit14           }
            }
        ));
        rightHead.html(tmpR(
            tmpAppPicImageRightHead, {
                texted: {
                    text: isClipboard ? langAppPicImgEdit15 : langAppPicImgEdit16,
                    icon: {
                        svg: {main: "ic-crop", sub: "ic-plus"},
                        size:   "small",
                        color: {subbg: "blue"}
                    }
                },
                close: {
                    id:    idElizaPicImageCropperRightPanelClose,
                    title:  isClipboard ? langAppPicImgEdit17 : langAppPicImgEdit18
                },
                lang: langTmplImageRightHead
        }, tmpObjElzIcon));
        $("#"+idElizaPicImageCropperRightPanelClose).click(function() {
            $("#"+idElizaPicImageCropperCancel).click();
            $("#"+idElizaPicImagePageCrop).removeClass("active");
        });
        inputsInitDefault();
        cropperImg.attr("src", href);
        $("#"+idElizaPicImageFooterThumbs).removeClass("active");
        $("#"+idElizaPicImageSlider).removeClass("show");
        var $cropWidth    = $("#"+idElizaPicImageCropperWidth),
            $cropHeight   = $("#"+idElizaPicImageCropperHeight),
            $originWidth  = $("#"+idElizaPicImageCropperOriginWidth),
            $originHeight = $("#"+idElizaPicImageCropperOriginHeight),
            $pointX       = $("#"+idElizaPicImageCropperPointX),
            $pointY       = $("#"+idElizaPicImageCropperPointY),
            percent100,
            baseCanvasData = {},
            percentCurr   = 1,
            cropperInited = false,
            $aspectEd    = $("#"+idElizaPicImageEditorAspects),
            aspectFree   = false,
            $aspectList  = $aspectEd.find("li"),
            $switchZoom = $("#"+idElizaPicThumbZoomSwitch),
            setDataToCropper = function() {
                if (!cropperInited) {
                    return false;
                }
                var pointX     = parseInt($pointX.val(),       10),
                    pointY     = parseInt($pointY.val(),       10),
                    cropWidth  = parseInt($cropWidth.val(),    10),
                    cropHeight = parseInt($cropHeight.val(),   10),
                    cropBox    = cropperImg.cropper("getData");
                cropBox.x = parseInt(pointX / percentCurr, 10);
                cropBox.y = parseInt(pointY / percentCurr, 10);
                cropBox.width  = parseInt(cropWidth  / percentCurr, 10);
                cropBox.height = parseInt(cropHeight / percentCurr, 10);
                cropperImg.cropper("setData", cropBox);
            },
            changeCrop = function() {
                var $this   = $(this),
                    id      = $this.attr("id"),
                    compare = idElizaPicImageCropperWidth,
                    value   = parseInt($this.val(), 10),
                    cropRatio = width / height;
                if (!value || value < 0) {
                    value = 150;
                }
                if (id === compare) {
                    if (width < value) {
                        value = width;
                    }
                }
                else {
                    if (height < value) {
                        value = height;
                    }
                }
                if (cropperInited) {
                    var cropData  = cropperImg.cropper("getCropBoxData");
                    cropRatio = cropData.width / cropData.height;
                }
                if (!aspectFree) {
                    if (id === compare) {
                        $cropHeight.val(parseInt(value / cropRatio, 10));
                    }
                    else {
                        $cropWidth.val(parseInt(value * cropRatio, 10));
                    }
                }
                $this.val(value);
                if (!cropperInited) {
                    $("#"+idElizaPicImageViewer).attr("style", "width:"+$cropWidth.val()+"px;height:"+$cropHeight.val()+"px;");
                }
                setDataToCropper();
            };
        cropperImg.cropper("destroy");
        $cropWidth.keyup(changeCrop);
        $cropHeight.keyup(changeCrop);
        $switchZoom.click(function() {
            var $this = $(this),
                cropModeA = $("#"+idElizaPicImageEditorCropper).find(".cropMode.advanced"),
                stopZoom = false;
            $originWidth.off();
            $originHeight.off();
            $pointX.off();
            $pointY.off();
            cropperImg.cropper("destroy");
            $("#"+idElizaPicImageViewer).removeAttr("style");
            if ($this.prop("checked")) {
                cropModeA.removeClass("disabled");
                $viewer .addClass("hide");
                $cropper.removeClass("hide");
                cropperImg.cropper({
                    aspectRatio:   "free",
                    highlight:      false,
                    background:     false,
                    zoomable:       true,
                    //wheelZoomRatio: 0.1,
                    autoCropArea:   1,
                    viewMode:       1,
                    dragMode:       "move",
                    movable:        true,
                    built: function() {
                        var contData   = cropperImg.cropper("getContainerData"),
                            imageData  = cropperImg.cropper("getImageData"),
                            canvasData = cropperImg.cropper("getCanvasData"),
                            left = (contData.width  - imageData.naturalWidth ) / 2,
                            top  = (contData.height - imageData.naturalHeight) / 2;
                        $aspectList.filter('[data-value="free"]').click();
                        cropperInited = true;
                        if (imageData.naturalWidth < contData.width && imageData.naturalHeight < contData.height) {
                            canvasData.width  = imageData.naturalWidth;
                            canvasData.height = imageData.naturalHeight;
                            canvasData.left   = left;
                            canvasData.top    = top;
                        }
                        cropperImg.cropper("setCropBoxData", {
                            left:   left,
                            top:    top,
                            width:  imageData.naturalWidth,
                            height: imageData.naturalHeight
                        });
                        cropperImg.cropper("setCanvasData", canvasData);
                        percent100  = imageData.width / imageData.naturalWidth;
                        percentCurr = 1;
                        $originWidth.val(parseInt(imageData.naturalWidth, 10));
                        $originHeight.val(parseInt(imageData.naturalHeight, 10));
                        baseCanvasData = canvasData;
                        var originRatio  = imageData.naturalWidth / imageData.naturalHeight,
                            changeOrigin = function() {
                                var $this   = $(this),
                                    id      = $this.attr("id"),
                                    compare = idElizaPicImageCropperOriginWidth,
                                    origin  = id === compare ? imageData.naturalWidth : imageData.naturalHeight,
                                    value   = parseInt($this.val(), 10);
                                if (!value) {
                                    if (id === compare) {
                                        value = width;
                                    }
                                    else {
                                        value = height;
                                    }
                                }
                                value = value < 0 ? 0 : value;
                                value = value > origin ? origin : value;
                                if (id === compare) {
                                    $originHeight.val(parseInt(value / originRatio, 10));
                                }
                                else {
                                    $originWidth.val(parseInt(value * originRatio, 10));
                                }
                                percentCurr = value / origin;
                                $cropWidth.val(parseInt($cropWidth.val()   * percentCurr, 10));
                                $cropHeight.val(parseInt($cropHeight.val() * percentCurr, 10));
                                $pointX.val(parseInt($pointX.val() * percentCurr, 10));
                                $pointY.val(parseInt($pointY.val() * percentCurr, 10));
                                $this.val(value);
                                setDataToCropper();
                            },
                            changePoint = function() {
                                var $this   = $(this),
                                    value   = parseInt($this.val(), 10);
                                if(!value) {
                                    value = 0;
                                }
                                $this.val(value);
                                setDataToCropper();
                            };
                        $originWidth.stopTyping(changeOrigin);
                        $originHeight.stopTyping(changeOrigin);
                        $pointX.stopTyping(changePoint);
                        $pointY.stopTyping(changePoint);
                        if (isClipboard) {
                            setTimeout(function() {
                                elizaNcoverTexted("", "", 0);
                            }, 500);
                        }
                    }
                }).on('crop.cropper', function (e) {
                    var
                        width     = parseInt(e.width  * percentCurr, 10),
                        height    = parseInt(e.height * percentCurr, 10),
                        pointX    = parseInt(e.x * percentCurr, 10),
                        pointY    = parseInt(e.y * percentCurr, 10);
                    $cropWidth.val(width);
                    $cropHeight.val(height);
                    $pointX.val(pointX);
                    $pointY.val(pointY);
                }).on('zoom.cropper', function (e) {
                    if (e.ratio > e.oldRatio && e.ratio > 1) {
                        e.preventDefault();
                    }
                });
            }
            else {
                cropModeA.addClass("disabled");
                cropperImg.cropper('destroy');
                cropperInited = false;
                $aspectList.removeClass("active");
                $aspectList.find(".ic-image").closest("li").addClass("active");
                $aspectList.find(".ic-lock").closest("li").addClass("active");
                $originWidth.val("");
                $originHeight.val("");
                $pointX.val("");
                $pointY.val("");
                $viewer .removeClass("hide");
                $cropper.addClass("hide");
                aspectFree = false;
                $cropWidth.keyup();
            }
        });
        if (isClipboard) {
            $switchZoom.click().attr("disabled", "disabled");
        }
        $aspectList.click(function() {
            var $this    = $(this), cropData, aspect,
                beforeData = cropperImg.cropper("getCropBoxData");
            aspectFree = false;
            if ($this.attr("data-type") === "aspect") {
                aspect = parseFloat($this.attr("data-value"));
                $aspectList.removeClass("active");
                $this.addClass("active");
                if ($this.attr("data-value") !== "free") {
                    $aspectEd.find('li[data-type="lock"]').addClass("active");
                }
                else {
                    aspectFree = true;
                }
            }
            else if($this.attr("data-type") === "lock") {
                if ($this.hasClass("active")) {
                    aspect = NaN;
                    aspectFree = true;
                    $this.removeClass("active");
                    $aspectList.removeClass("active");
                    $aspectEd.find('li[data-type="aspect"][data-value="free"]').addClass("active");
                }
                else {
                    cropData = cropperImg.cropper("getCropBoxData");
                    aspect = cropData.width / cropData.height;
                    $this.addClass("active");
                }
            }
            cropperImg.cropper("setAspectRatio", aspect);
            cropperImg.cropper("setCropBoxData", beforeData);
        });
        $("#"+idElizaPicImageCropperSave).click(function() {
            var mode   = $("#"+idElizaPicThumbZoomSwitch).prop("checked") ? "complex" : "simple",
                crop   = {width: $cropWidth.val(), height: $cropHeight.val()},
                point  = {x: $pointX.val(), y: $pointY.val()},
                resize = {width: $originWidth.val(), height: $originHeight.val()},
                data   = {
                    crop:   JSON.stringify(crop),
                    point:  JSON.stringify(point),
                    resize: JSON.stringify(resize)
                };
            $("#"+idElizaPicImageViewer).removeAttr("style");
            if (isClipboard) {
                elizaNcoverTexted(langAppPicNCoverWait, langAppPicNCoverCropping, 1);
                setTimeout(function() {
                    ajaxSend({
                        url: uriPicImage+"addTempClipBoardCrop/"+picStatus.stackId,
                        data: data,
                        success: function(result) {
                            notificationLine(langAppPicNotificationImgUpl);
                            var pages = picStatus.pages,
                                type  = picStatus.state !== "image" ? "album" : "image",
                                sett = parseInt(UserHandler.getSetting("pic", "clipboard_after_"+type), 10);
                            fromClipBoard = true;
                            if (sett) {
                                if (app.standAlone) {
                                    hApi.pushState(
                                        {},
                                        result,
                                        null,
                                        {callback: 'picRouter'},
                                        appPicStandAloneRouter,
                                        true
                                    );
                                }
                                else {
                                    bBone.history.navigate("#pic/"+result, {trigger: true});
                                    DIAppReg.regState(app.name, result);
                                }
                            }
                            else {
                                if (picStatus.name === "root") {
                                    appPicIndex(pages.start+"-"+pages.end, true);
                                }
                                else {
                                    appPicItem(picStatus.name, pages.start+"-"+pages.end, true);
                                }
                            }
                            elizaNcoverTexted("", "", 0);
                        }
                    });
                }, 300);
            }
            else {
                var id = result.image.system.id;
                ajaxSend({
                    url: uriPicImage+"createThumbnail/"+id+"/"+mode,
                    data: data,
                    success: function() {
                        $("#"+idElizaPicImageCropperCancel).click();
                        notificationLine(langAppPicNotificationImgThumb, false, 2000);
                    }
                });
            }
        });
        $("#"+idElizaPicImageCropperCancel).click(function() {
            $("#"+idElizaPicImageViewer).removeAttr("style");
            if (isClipboard) {
                var pages = picStatus.pages;
                if (picStatus.name === "root") {
                    appPicIndex(pages.start+"-"+pages.end, true);
                }
                else {
                    appPicItem(picStatus.name, pages.start+"-"+pages.end, true);
                }
            }
            else {
                picImageRightContent();
                if (DICookies.get("rightMenuActive") === "false") {
                    app.layout.main.right.closest(".tplCLSgrid").removeClass("showside");
                }
                $viewer.removeClass("hide");
                $cropper.addClass("hide");
                $("#"+idElizaPicImagePageCrop).removeClass("active");
                $("#"+idElizaPicImageFooterThumbs).removeClass("active");
                $("#"+idElizaPicImageSlider).removeClass("show");
                $cropWidth.keyup();
            }
        });
    }
    /**
     * Отображение редактора в правой панели
     */
    function picImageRightEditor()
    {
        var rightHead    = app.layout.right.header,
            rightContent = $("#"+idElizaPicRightScroll),
            rightFooter  = app.layout.right.footer,
            result       = picStatus.imageData,
            name         = result.image.system.name,
            type         = result.image.meta.file.type,
            parentId     = result.image.system.parent,
            width        = result.image.meta.file.width,
            height       = result.image.meta.file.height,
            cropData     = "",
            cropBox      = "",
            cropCanvas   = "",
            cropImage    = "",
            filterImagePath = "/upl/t/"+result.image.system.name+"_48x48."+result.image.meta.file.type;
        app.layout.main.right.closest(".tplCLSgrid").addClass("showside");
        var $vcont     = $("#"+idElizaPicImageCont),
            $viewer    = $("#"+idElizaPicImageViewer),
            $cropper   = $("#"+idElizaPicImageCropper),
            href       = "/upl/"+name+"."+type+"?"+(new Date().getTime());
        if (parentId) {
            href = uriPicImage+"getVariationOriginal/"+result.image.system.id+"/"+parentId;
            filterImagePath = uriPicImage+"getVariationOriginal/"+result.image.system.id+"/"+parentId+"/48x48";
            /** @namespace result.image.meta.file.width */
            /** @namespace result.image.meta.file.height */
            width  = result.image.meta.file.width;
            height = result.image.meta.file.height;
        }
        $viewer.addClass("hide");
        $cropper.addClass("hide");
        if (!$("#"+idElizaPicSVGFilters).length) {
            $vcont.append(tmpR(
                tmpAppPicImageSvg, {
                id:  idElizaPicSVGFilters,
                svg: idElizaPicSVGCanvas,
                width:   width,
                height:  height,
                href:   href
            }));
        }
        rightHead.html(tmpR(
            tmpAppPicImageRightHead, {
                texted: {
                    text: parentId ? langAppPicImgRight11 : langAppPicImgRight12,
                    icon: {
                        svg: {main: "ic-wand", sub:  parentId ? "ic-pencil" : "ic-plus"},
                        size:   "small",
                        color: {subbg: "blue"}
                    }
                },
                close: {
                    id:    idElizaPicSVGRightPanelClose,
                    title: langAppPicImgRight13
                },
                lang: langTmplImageRightHead
        }, tmpObjElzIcon));
        $("#"+idElizaPicSVGRightPanelClose).click(function() {
            $("#"+idElizaPicImageEditorCancel).click();
        });
        svgHandler.reset();
        ajaxSend({
            url: uriPicImage+"getVariationMeta/"+result.image.system.id,
            async: false,
            success: function(res) {
                var corrections = "", filters = "", data;
                /** @namespace data.svg_corrections */
                /** @namespace data.svg_filters */
                /** @namespace data.crop_data   */
                /** @namespace data.crop_box    */
                /** @namespace data.crop_canvas */
                /** @namespace data.crop_image  */
                if (res.status === "success") {
                    data = res.settings;
                    corrections = data.svg_corrections ? $.parseJSON(data.svg_corrections) : "";
                    filters     = data.svg_filters     ? $.parseJSON(data.svg_filters)     : "";
                    cropData   = data.crop_data   ? $.parseJSON(data.crop_data)   : "";
                    cropBox    = data.crop_box    ? $.parseJSON(data.crop_box)    : "";
                    cropCanvas = data.crop_canvas ? $.parseJSON(data.crop_canvas) : "";
                    cropImage  = data.crop_image  ? $.parseJSON(data.crop_image)  : "";
                }
                svgHandler.setDimensions(result.image.meta.file.width, result.image.meta.file.height);
                svgHandler.input({
                    corrections: corrections,
                    filters:     filters,
                    href: href,
                    name: result.image.system.name,
                    type: result.image.meta.file.type
                });
            }
        });
        rightContent.html(tmpR(
            tmpAppPicImageEditor,
            {
                editor: idElizaPicImageEditor,
                switch: idElizaPicImageEditorSwitch,
                filter: idElizaPicImageEditorFilter,
                id1:  idElizaPicCorrPresetDivList,
                id2:  idElizaPicCorrPresetDelete,
                id3:  idElizaPicCorrPresetList,
                id4:  idElizaPicCorrPresetSave,
                id5:  idElizaPicCorrPresetDivForm,
                id6:  idElizaPicCorrPresetClose,
                id7:  idElizaPicCorrPresetText,
                id8:  idElizaPicCorrPresetAdd,
                id9:  idElizaPicImageEditorCorrections,
                id10: idVignetteColorReset,
                id11: idVignetteColorFlood,
                id12: idVignetteColorLightning,
                id13: "picFilterValNamed_",
                img:  {
                    name: result.image.system.name,
                    type: result.image.meta.file.type
                },
                switcher: [
                    {name: "filters",    title: "Фильтр",    icon: {svg: {main:"ic-wand"},    size: 'small'}},
                    {name: "correction", title: "Коррекция", icon: {svg: {main:"ic-sliders"}, size: 'small'}, class: " active"}
                ],
                trash: {svg: {main: 'ic-trash'}, size: 'small'},
                save:  {svg: {main: 'ic-plus2'}, size: 'small'},
                loop:  {svg: {main: 'ic-loop'},  size: 'small'},
                add:   {svg: {main: 'ic-check'}, size: 'small'},
                close: {svg: {main: 'ic-cross'}, size: 'small'},
                filter_image: filterImagePath,
                filters:     svgHandler.getFiltersMenu(),
                corrections: svgHandler.getCorrectionsMenu(),
                lang: langTmplImageEditor
            },
            tmpObjElzIcon
        ));
        svgHandler.inputPrepareFilters();
        rightFooter.html(tmpR(
            tmpAppPicImageEditorFooter, {
            save: {
                id: idElizaPicImageEditorSave,
                text: parentId ? langAppPicImgEdit19 : langAppPicImgEdit20
            },
            cancel: {
                id: idElizaPicImageEditorCancel,
                text: langAppPicImgEdit14
            }
        }));
        inputsInitDefault();
        var $switch     = $("#"+idElizaPicImageEditorSwitch),
            $switches   = $switch.find(".elzF.item.button"),
            $containers = $("#"+idElizaPicImageEditor).find(".strCLSitem");
        $switches.click(function() {
            var $this = $(this),
                name  = $this.attr("data-name");
            if ($this.hasClass("active")) {
                return this;
            }
            $switches.removeClass("active");
            $this.addClass("active");
            $containers.addClass("hide");
            $containers.filter('[data-name="'+name+'"]').removeClass("hide");
        });
        var $editorCorrection = $("#"+idElizaPicImageEditorCorrections);
        $editorCorrection.find(".reset.link.clk").click(function() {
            var $this   = $(this),
                $slider = $this.closest("li").find(".elzCLScorrectSlider"),
                name    = $slider.attr("data-name"),
                value   = parseFloat($slider.attr("data-default"));
            $this.closest("li").find(".eSkip input").val(value);
            $slider.slider("option", "value", value);
            correctionSlide($slider, name, value, value);
        });
        var funcSliderSlide, funcSliderStop;
        if (parseInt(UserHandler.getSetting("pic", "editor_online"), 10)) {
            funcSliderStop  = function() {};
            funcSliderSlide = function(event, ui) {
                var $this = $(this),
                    value = ui.value,
                    name  = $this.attr("data-name"),
                    def   = parseFloat($this.slider("option", "default"));
                $this.slider("option", "valField").val(value);
                correctionSlide($this, name, value, def);
                if (presetListSet) {
                    $("#"+idElizaPicCorrPresetList).val(0).change();
                    presetListSet = false;
                }
            };
        }
        else {
            funcSliderStop  = function(event, ui) {
                var $this = $(this),
                    value = ui.value,
                    name  = $this.attr("data-name"),
                    def   = parseFloat($this.slider("option", "default"));
                $this.slider("option", "valField").val(value);
                correctionSlide($this, name, value, def);
                if (presetListSet) {
                    $("#"+idElizaPicCorrPresetList).val(0).change();
                    presetListSet = false;
                }
            };
            funcSliderSlide = function(event, ui) {
                var $this = $(this),
                    value = ui.value,
                    name  = $this.attr("data-name"),
                    def   = parseFloat($this.slider("option", "default"));
                $this.slider("option", "valField").val(value);
                correctionSlide($this, name, value, def, 0, 1);
            };
        }
        $(".elzCLScorrectSlider", $editorCorrection).slider({
            orientation: "horizontal",
            range: "min",
            min: 0,
            max: 100,
            value: 50,
            doubled: "1",
            create: function() {
                var $this = $(this),
                    name  = $this.attr("data-name"),
                    valId = "picFilterValNamed_"+name,
                    $valField = $("#"+valId),
                    min = parseFloat($this.attr("data-min")),
                    max = parseFloat($this.attr("data-max")),
                    def = parseFloat($this.attr("data-default"));
                $this.slider("option", "min",     min);
                $this.slider("option", "max",     max);
                $this.slider("option", "step",    parseFloat($this.attr("data-step")));
                $this.slider("option", "value",   parseFloat($this.attr("data-value")));
                $this.slider("option", "default", def);
                $this.slider("option", "valField", $valField);
                correctionSlide($this, name, parseFloat($this.attr("data-value")), parseFloat($this.attr("data-default")), 1);
                $valField.off().stopTyping(function() {
                    var $that = $(this),
                        value = parseFloat($that.val());
                    if (isNaN(value)) {
                        value = def;
                    }
                    else if (value < min) {
                        value = min;
                    }
                    else if(value > max) {
                        value = max;
                    }
                    $that.val(value);
                    $this.slider("value", value);
                    correctionSlide($this, name, value, def);
                });
            },
            slide: funcSliderSlide,
            stop: funcSliderStop
        });
        var $filterEd  = $("#"+idElizaPicImageEditorFilter),
            $filterLi  = $filterEd.find("li");
        $filterLi.click(function() {
            var $this  = $(this);
            if (!$this.hasClass("active")) {
                $this.addClass("active");
            }
            else {
                $this.removeClass("active");
            }
            filtersConstruction();
        });
        $filterEd.sortable({
            axis: "y",
            handle: ".handler",
            stop: function() {
                filtersConstruction();
            }
        });
        $filterEd.disableSelection();
        var svgHandlerLoc = svgHandler;
        $("#"+idVignetteColorFlood).spectrum({
            color: svgHandlerLoc.getCorrection("vignetteFlood").value,
            preferredFormat: "hex",
            showInput: true,
            showInitial: true,
            change: function(color) {
                svgHandlerLoc.setColor("vignetteFlood", color.toHexString());
                if (presetListSet) {
                    $("#"+idElizaPicCorrPresetList).val(0).change();
                    presetListSet = false;
                }
            }
        });
        $("#"+idVignetteColorLightning).spectrum({
            color: svgHandlerLoc.getCorrection("vignetteLight").value,
            preferredFormat: "hex",
            showInput: true,
            showInitial: true,
            change: function(color) {
                svgHandlerLoc.setColor("vignetteLight", color.toHexString());
                if (presetListSet) {
                    $("#"+idElizaPicCorrPresetList).val(0).change();
                    presetListSet = false;
                }
            }
        });
        svgHandlerLoc.setColor("vignetteFlood", svgHandlerLoc.getCorrection("vignetteFlood").value);
        svgHandlerLoc.setColor("vignetteLight", svgHandlerLoc.getCorrection("vignetteLight").value);
        $("#"+idVignetteColorReset).click(function() {
            $("#"+idVignetteColorFlood    ).spectrum("set", svgHandlerLoc.getCorrection("vignetteFlood").default);
            $("#"+idVignetteColorLightning).spectrum("set", svgHandlerLoc.getCorrection("vignetteLight").default);
            svgHandlerLoc.setColor("vignetteFlood", svgHandlerLoc.getCorrection("vignetteFlood").default);
            svgHandlerLoc.setColor("vignetteLight", svgHandlerLoc.getCorrection("vignetteLight").default);
        });
        picPresetNameListReset();
        $("#"+idElizaPicCorrPresetDelete).click(function() {
            var val = parseInt($("#"+idElizaPicCorrPresetList).val(), 10);
            if (val) {
                ajaxSend({
                    url: uriPicUtils+"deleteCorrectionsPreset/"+val,
                    success: function() {picPresetNameListReset();}
                });
            }
        });
        $("#"+idElizaPicCorrPresetList).change(function() {
            var $this = $(this);
            if (parseInt($this.val(), 10)) {
                ajaxSend({
                    url: uriPicUtils+"getCorrectionsPresetById/"+$this.val(),
                    success: function(result) {
                        svgHandler.input({corrections: $.parseJSON(result)}, true);
                        presetListSet = true;
                    }
                });
            }
        });
        $("#"+idElizaPicCorrPresetSave).click(function() {
            $("#"+idElizaPicCorrPresetDivList).addClass("hide");
            $("#"+idElizaPicCorrPresetDivForm).removeClass("hide");
            $("#"+idElizaPicCorrPresetText).focus().val("");
        });
        $("#"+idElizaPicCorrPresetClose).click(function() {
            $("#"+idElizaPicCorrPresetDivList).removeClass("hide");
            $("#"+idElizaPicCorrPresetDivForm).addClass("hide");
        });
        var triggered = false;
        $("#"+idElizaPicCorrPresetAdd).click(function() {
            var title = $("#"+idElizaPicCorrPresetText).val();
            if (title && !triggered ) {
                triggered = true;
                ajaxSend({
                    url: uriPicUtils+"saveCorrectionsPreset",
                    data: {
                        title:       title,
                        corrections: JSON.stringify(svgHandler.output().corrections)
                    },
                    success: function(result) {
                        picPresetNameListReset(parseInt(result));
                        $("#"+idElizaPicCorrPresetClose).click();
                        triggered = false;
                    }
                });
            }
        });
        $("#"+idElizaPicImageEditorSave).click(function() {
            var dataInput = JSON.stringify(svgHandler.output()),
                phpMethod = parentId ? "saveVariation" : "addVariation";
            elizaNcoverTexted(langAppPicNCoverWait, langAppPicNCoverFilters, true);
            setTimeout(function() {
                DVP_IN_DA_HOUSE(document.getElementById(idElizaPicSVGCanvas), {}, function(uri) {
                    ajaxSend({
                        url:  uriPicImage+phpMethod+"/"+result.image.system.id,
                        data: {
                            input: dataInput,
                            image: uri,
                            preset: $("#"+idElizaPicCorrPresetList).val()
                        },
                        success: function(result) {
                            if (parentId) {
                                var imageUrl = "/upl/"+name+"."+type+"?"+(new Date().getTime());
                                $("#"+idElizaPicImageViewer ).find("img").attr("src", imageUrl);
                                $("#"+idElizaPicImageCropper).find("img").attr("src", imageUrl);
                                $vcont.addClass("hide");
                                $viewer.removeClass("hide");
                                $("#"+idElizaPicImagePageEdit).click();
                                thumbnailReset();
                            }
                            else {
                                if (app.standAlone) {
                                    hApi.replaceStateData({callback: "picRouter"}, "/"+result.name);
                                    appPicStandAloneRouter();
                                }
                                else {
                                    bBone.history.navigate("#pic/"+result.name, {trigger: true});
                                }
                            }
                            elizaNcoverTexted('', '', false);
                        }
                    });
                });
            }, 300);
        });
        $("#"+idElizaPicImageEditorCancel).click(function() {
            $vcont.addClass("hide");
            $viewer.removeClass("hide");
            $("#"+idElizaPicImagePageEdit).click();
        });
    }
    /**
     * Функция добавляет таймстамп ко всем изображениям миниатюр, если присутствуют
     */
    function thumbnailReset()
    {
        var date = "?"+(new Date().getTime());
        $("#"+idElizaPicImageSliderList).find(".thumbnail img").each(function() {
            var $this = $(this),
                src   = $this.closest("a").attr("href");
            $this.attr("src", src+date);
        });
    }
    /**
     * Подготовка фильтров
     */
    function filtersConstruction() {
        var filtersList = [];
        $("#"+idElizaPicImageEditorFilter).find("li").each(function() {
            var $this = $(this);
            filtersList.push({
                name: $this.attr("data-id"),
                checked: $this.hasClass("active") ? 1 : 0
            });
        });
        svgHandler.checkFilter(filtersList);
    }
    /**
     * Обработчик слайдера в коррекциях
     *
     * @param $slider - объект слайдера
     * @param name    - нейм коррекции
     * @param value   - текущее значение
     * @param def     - значение по умолчанию
     * @param forInit - если false, то значение сохраняется в контроллер SVG
     * @param skip
     */
    function correctionSlide($slider, name, value, def, forInit, skip) {
        if ($slider.hasClass("middle")) {
            if (value < def) {
                $slider.addClass("minus").removeClass("plus");
            }
            else {
                $slider.removeClass("minus").addClass("plus");
            }
        }
        var $handlers = $slider.find(".ui-slider-handle");
        if (def === value) {
            $handlers.addClass("default");
        }
        else {
            $handlers.removeClass("default");
        }
        $handlers.attr("data-elz-title", value);
        if (skip) {
            return true;
        }
        if (!forInit) {
            svgHandler.setCorrection(name, value, $slider);
        }
        else {
            svgHandler.setSlider(name, $slider);
        }
    }
    /*
    --------------------------------------------------------------------------------------------------------------------
    |                                                                                                                  |
    |                                              CORE SECTION                                                        |
    |                                                                                                                  |
    --------------------------------------------------------------------------------------------------------------------
    */
    function appCorePasteImage(event, item)
    {
        var result = item,
            cropping = parseInt(UserHandler.getSetting("pic", "clipboard_cropping"), 10);
        if (picStatus.name === "trash" || !picStatus.editable) {
            return false;
        }
        if (appCorePasteImageCheckFormat(result)) {
            elizaNcoverTexted(langAppPicNCoverWait, langAppPicNCoverPreparing, 1);
            setTimeout(function() {
                if (cropping) {
                    appCorePasteImageCropper(result);
                }
                else {
                    ajaxSend({
                        url:  uriPicImage+"addFromClipBoard/"+picStatus.stackId,
                        data: {image: result},
                        success: function(result) {
                            var pages = picStatus.pages,
                                type  = picStatus.state !== "image" ? "album" : "image",
                                sett = parseInt(UserHandler.getSetting("pic", "clipboard_after_"+type), 10);
                            notificationLine(langAppPicNotificationImgUpl);
                            if (sett) {
                                if (app.standAlone) {
                                    hApi.pushState(
                                        {},
                                        result,
                                        null,
                                        {callback: 'picRouter'},
                                        appPicStandAloneRouter
                                    );
                                }
                                else {
                                    bBone.history.navigate("#pic/"+result, {trigger: true});
                                    DIAppReg.regState(app.name, result);
                                }
                            }
                            else {
                                if (picStatus.name === "root") {
                                    appPicIndex(pages.start+"-"+pages.end);
                                }
                                else {
                                    appPicItem(picStatus.name, pages.start+"-"+pages.end);
                                }
                            }
                            elizaNcoverTexted("", "", 0);
                        }
                    });
                }
            }, 200);
        }
        else {
            notificationLine(langAppPicNotificationImgSize, "red 700", 3000);
        }
    }
    function appCorePasteImageCheckFormat(result)
    {
        return result.match(/^data:image\/(png|jpg|jpeg|gif);base64,/i) ? true : false;
    }
    function appCorePasteImageCropper(result)
    {
        ajaxSend({
            url:  uriPicImage+"addTempClipBoard",
            data: {image: result},
            success: function(result) {
                elizaNcoverTexted(langAppPicNCoverWait, langAppPicNCoverCropInit, 1);
                scroller_enabled = false;
                setTimeout(function() {
                    appCorePasteImageCropperBuild(result);
                }, 300);
            }
        });
    }
    function appCorePasteImageCropperBuild(result)
    {
        var $footer = app.layout.content.cnt.footer,
            $left   = $footer.find('[data-layout="footer_left"]'),
            $right  = $footer.find('[data-layout="footer_right"]'),
            $middle = $footer.find('[data-layout="footer_middle"]');
        app.layout.top.header.find('[data-layout="toolbar_middle"]').html("");
        app.layout.content.cnt.subfooter.html("");
        $left.html("");
        $right.html("");
        app.layout.main.right.closest(".tplCLSgrid").addClass("showside");
        var contentHtml   = app.layout.content.cnt.content,
            loc = window.location;
        contentHtml.attr(  "data-elz-bg", "grey 900");
        $middle.html(tmpR(tmpAppToolbarButton, {
            id:    idElizaPicFooterRoot,
            tag:   "a",
            href:  loc.pathname+(loc.search !== "?" ? loc.search : "")+(loc.hash !== "#" ? loc.hash : ""),
            title: langAppPicImgBtn18,
            setts: {type: 'default', link: '1',  tip_v: 'dtb'},
            icon:  {svg: {main: 'ic-gallery3'}, size: 'small'}
        }, tmpObjElzIcon));
        $("#"+idElizaPicFooterRoot).off().click(function(e) {
            e.preventDefault();
            var pages = picStatus.pages;
            if (app.standAlone) {
                appPicStandAloneRouter({forced:true});
            }
            else {
                if (picStatus.name === "root") {
                    appPicIndex(pages.start+"-"+pages.end, true);
                }
                else {
                    appPicItem(picStatus.name, pages.start+"-"+pages.end, true);
                }
            }
        });
        contentHtml.html(tmpR(
            tmpAppPicImage, {
            vcont:   idElizaPicImageCont,
            viewer:  idElizaPicImageViewer,
            cropper: idElizaPicImageCropper,
            title:   langAppPicImgTitle1,
            name:    "upl/temp/temporary_clipboard_member_"+UserHandler.getId(),
            type:    "png?"+(new Date().getTime()),
            width:   "",
            height:  ""
        }));
        picImageRightCropper(1, result);
    }
    function appCoreContextMenu($contextElement, event, params)
    {
        var $this  = $contextElement,
            type   = $this.attr("data-type"),
            device = UserHandler.getDevice(),
            status = picStatus,
            id     = $this.attr("data-id"),
            name   = $this.attr("data-name"),
            format = $this.attr("data-format"),
            isContent    = $this.hasClass("orange") ? true : false,
            templateIcon = tmpAppCommonIcon,
            templateItem = tmpAppFeatureContextMenuItem,
            templateList = tmpAppFeatureContextMenuList,
            itemsList    = [],
            httpHost = "http://"+hostName,
            urlToCopy    = httpHost+"/"+name+(format ? "."+format : ""),
            contextMenu  = DIContextMenu,
            funcClipBoardBuild = function(id, title, copy) {
                new Clipboard("#"+id, {
                    text: function() {
                        notificationLine(title, false, 1000);
                        contextMenu.hide();
                        return copy;
                    }
                });
            },
            funcItemObjGen = function(id, title, icon, subIcon, subColor) {
                var obj = {
                    id:  id,
                    tag: "div",
                    icon: {svg: {main: icon}, size: "small"},
                    title: title
                };
                if (subIcon) {
                    obj.icon.svg.sub = subIcon;
                }
                if (subColor) {
                    obj.icon.color = {subbg: subColor};
                }
                return obj;
            };
        if (type === "slider" && device !== "desktop") {
            return "prevent";
        }
        var isSelected  = _.indexOf(selectedList, name) !== -1,
            gspotColor  = status.name === "trash" ? "success" : "error",
            deleteItem  = !selectedCount ? (type === "image" ? langApiPicCommon1 : langApiPicCommon2) : langApiPicCommon3,
            deleteTitle = (status.name === "trash" ? langApiPicCommon4+" " : langAppPicImgBtn11+" ") + deleteItem,
            locCount = selectedCount + (isSelected ? -1 : 0),
            withSelect = !isSelected ? 1 + selectedCount : selectedCount;
            contextMenu.setHideCallback(function() {
                pluploadFromContext = 'false';
            });
        if (type !== "slider") {
            if (device === "desktop") {
                itemsList.push(funcItemObjGen(idElizaPicContextMenuCopy, langApiPicClip1, "ic-copy"));
                if (type === "image" ) {
                    itemsList.push(funcItemObjGen(idElizaPicContextMenuCopyBBCode, langApiPicClip2, "ic-copy"));
                    itemsList.push(funcItemObjGen(idElizaPicContextMenuCopyHtml,   langApiPicClip3, "ic-copy"));
                    itemsList.push({isSep: 1});
                }
            }
            if (status.editable && status.name !== "trash") {
                itemsList.push(funcItemObjGen(
                    idElizaPicContextMenuEditMeta, langAppPicSettings3+" "+(type === "image" ? langAppPicSettings2 : langAppPicSettings1), "ic-pencil"
                ));
            }
        }
        if (type === "image") {
            if (isContent) {
                itemsList.push(funcItemObjGen(idElizaPicContextMenuImageContent, langApiPicCommon8, "ic-sharedfile"));
            }
        }
        else if (type === "album") {
            if (status.editable && status.name !== "trash") {
                itemsList.push({isSep: 1});
                itemsList.push(funcItemObjGen(idElizaPicContextMenuStackUpload, langApiPicCommon9, "ic-image"));
                if (locCount) {
                    itemsList.push(funcItemObjGen(idElizaPicContextMenuStackInsert, langApiPicCommon10, "ic-folder"));
                }
            }
        }
        else if (type === "slider" && device === "desktop") {
            itemsList.push(funcItemObjGen(idElizaPicContextMenuCopySliderLink,   langApiPicClip1, "ic-copy"));
            itemsList.push(funcItemObjGen(idElizaPicContextMenuCopySliderBBCode, langApiPicClip2, "ic-copy"));
            itemsList.push(funcItemObjGen(idElizaPicContextMenuCopySliderHTML,   langApiPicClip3, "ic-copy"));
        }
        if (status.editable && type !== "slider") {
            if (status.stackId && status.name !== "trash" || $contextElement.hasClass("draggable")) {
                itemsList.push({isSep: 1});
            }
            if (status.stackId && status.name !== "trash") {
                itemsList.push(funcItemObjGen(
                    idElizaPicContextMenuMoveUp,
                    langApiPicCommon5+" "+(status.parent ? langApiPicCommon6 : langApiPicCommon7),
                    "ic-folder",
                    "ic-up",
                    "blue"
                ));
            }
            if ($contextElement.hasClass("draggable")) {
                itemsList.push(funcItemObjGen(
                    idElizaPicContextMenuDelete,
                    (status.name !== "trash" ? langAppPicImgBtn11+" " : langApiPicCommon4+" ") +
                    (type === "image" ? langApiPicCommon1 : langApiPicCommon2),
                    status.name !== "trash" ? 'ic-trash' : "ic-loop",
                    0,
                    "red 700"
                ));
            }
        }
        contextMenu.insertHtml(tmpR(
            templateList,
            {list: itemsList},
            {"feature/contextmenu_item": templateItem, "common/elz_icon": templateIcon}
        ));
        if (type === "slider" && device === "desktop") {
            funcClipBoardBuild(
                idElizaPicContextMenuCopySliderLink,
                langApiPicClip4,
                httpHost+$this.find("a").attr("href")
            );
            funcClipBoardBuild(
                idElizaPicContextMenuCopyBBCode,
                langApiPicClip5,
                helperGenImgBBCode(urlToCopy, httpHost+$this.find("a").attr("href"))
            );
            funcClipBoardBuild(
                idElizaPicContextMenuCopyHtml,
                langApiPicClip6,
                helperGenImgHtml(urlToCopy, httpHost+$this.find("a").attr("href"))
            );
            return;
        }
        var $delete = $("#"+idElizaPicContextMenuDelete),
            $moveTo = $("#"+idElizaPicContextMenuStackInsert);
        if (type === "image" && device === "desktop") {
            funcClipBoardBuild(
                idElizaPicContextMenuCopyBBCode,
                langApiPicClip5,
                helperGenImgBBCode(urlToCopy, httpHost+$this.find("img").attr("src"))
            );
            funcClipBoardBuild(
                idElizaPicContextMenuCopyHtml,
                langApiPicClip6,
                helperGenImgHtml(urlToCopy, httpHost+$this.find("img").attr("src"))
            );
        }
        if(device === "desktop") {
            funcClipBoardBuild(
                idElizaPicContextMenuCopy,
                langApiPicCommon11+" " + (type === "image" ? langAppPicSettings2 : langAppPicSettings1) + " "+langApiPicCommon12,
                urlToCopy
            );
        }
        $("#"+idElizaPicContextMenuImageContent).click(function() {
            picItemContentLinks(id);
            contextMenu.hide();
        });
        if (!status.editable) {
            return false;
        }
        $delete.elizaIIconsControls().setSubBG(gspotColor).setSubHtml(withSelect);
        //$delete.find(".gspot").html(withSelect).attr("data-elz-bg", gspotColor);
        $delete.find(".cell.name").find(".title").html(deleteTitle);
        if (locCount) {
            $moveTo.elizaIIconsControls().setSubBG("success").setSubHtml(locCount);
            //$moveTo.find(".gspot").html(locCount).attr("data-elz-bg", "green");
        }
        $delete.click(function() {
            if (!isSelected) {
                selectedCount += 1;
                selectedList.push(name);
            }
            picStackDelete();
            contextMenu.hide();
        });
        if (status.name === "trash") {
            return false;
        }
        $("#"+idElizaPicContextMenuEditMeta).click(function() {
            picItemSettings(type, id);
            contextMenu.hide();
        });
        $moveTo.click(function() {
            if (!locCount) {
                notificationLine(langAppPicNotificationMoveTo, "blue", 2500);
                return this;
            }
            picMoveToStack($this);
            picPaginationUpdate();
            contextMenu.hide();
        });
        $("#"+idElizaPicContextMenuMoveUp).click(function() {
            selectedList.push($this.attr("data-name"));
            selectedCount += 1;
            picMoveToStack(null, 1, {id: status.parent_id, name: status.parent, type: 'album'}, true);
            picPaginationUpdate();
            contextMenu.hide();
        });
        if ($("#"+idElizaPicContextMenuStackUpload).length) {
            var pluploader = picPluploaderGet(),
                uploader   = pluploader.plupload;
            if (typeof pluploader.context === "object") {
                pluploader.context.destroy();
            }
            var input = new mOxie.FileInput({
                browse_button: document.getElementById(idElizaPicContextMenuStackUpload),
                multiple: true
            });
            input.onchange = function() {
                uploader.addFile(input.files);
            };
            input.init();
            pluploader.context = input;
            pluploadFromContext = $this.attr('data-name');
        }
    }
    function helperGenImgBBCode(href, src) {
        return "[url="+href+"][img]"+src+"[/img][/url]";
    }
    function helperGenImgHtml(href, src) {
        return "
";
    }
    function helperGenUploadZoneText(withoutImages) {
        var title = langApiPicUplZoneTitle1,
            text  = langApiPicUplZoneText1+'
'+langApiPicUplZoneText2+' [Ctrl + V]';
        if (withoutImages) {
            title = langApiPicUplZoneTitle2;
            text  = langApiPicUplZoneText3;
        }
        return ''+
        ''+
            ''+title+''+
            '
'+text+'
'+
            ''+langApiPicUplZoneSize+': 10 mb'+
        '
';
    }
    /**
     * Вставляет кастомизированный скроллер в контент область, необходимо для скроллирования альбомов
     */
    function insertStackScroll() {
        var scrollId = idElizaPicContentScroll;
        if (!$("#"+scrollId).length) {
            app.layout.content.cnt.content.html(tmpR(
                tmpAppScrollContent, {id: scrollId, abs: "abs"}
            ));
            $jqStackScroll = $("#"+idElizaPicContentScroll);
            inputsInitDefault();
        }
    }
    function appPicIndex(page, forced)
    {
        DIPaste.setContextApp("picImagePaste");
        picStatus.ownerId = UserHandler.getId();
        picStackHandler("root", page ? page : "1", !!forced/* ? true : false*/);
        elizaBlur(false);
        appShow();
        $("#"+idElizaPicRightPanel).addClass("hide");
    }
    function appPicItem(item, page, forced)
    {
        DIPaste.setContextApp("picImagePaste");
        if (item.length === 7) {
            picStackHandler(item, page ? page : "1", !!forced/* ? true : false*/);
            appSetState("list album");
            $("#"+idElizaPicRightPanel).addClass("hide");
        }
        else {
            picImageHandler(item, !!forced/* ? true : false*/);
            appSetState("image");
            $("#"+idElizaPicRightPanel).removeClass("hide");
        }
        elizaBlur(false);
        appShow();
    }
    function appPicTrash(page)
    {
        DIPaste.setContextApp("picImagePaste");
        picStackHandler("trash", page ? page : "1", false);
        $("#"+idElizaPicRightPanel).addClass("hide");
        elizaBlur(false);
        appShow();
        DIAppReg.regState(app.name, window.location.hash);
    }
    function appPicStandAloneRouter(params)
    {
        var forced = typeof params === "object" && params.hasOwnProperty("forced") ? params.forced : false;
        if (!app.standAlone) {
            return;
        }
        var loc  = window.location,
            path = loc.pathname,
            page = loc.search;
        path = path.replace(/\//gi, "");
        page = page.replace(/\?page=/gi, "");
        page = page ? page : "1";
        if (!path) {
            if (picStatus.name !== "root") {
                forced = true;
            }
            appPicIndex(page, !!forced);
            appSetState("list root");
        }
        else if (path === "trash") {
            appPicTrash(page);
            appSetState("list trash");
        }
        else {
            appPicItem(path, page, !!forced);
        }
        DIAppReg.regState(app.name, window.location.pathname, "picImagePaste");
        DIAppReg.setActiveApp(app.name);
        DIPaste.setContextApp("picImagePaste");
    }
    function appCoreStandAloneWindowAttach()
    {
        var $window = $("#"+idElizaApp);
        app.layout = {
            main: {
                right: $window.find('div[data-layout="right"]')
            },
            top: {
                header: $window.find('div[data-layout="top_header"]')
            },
            content: {
                cnt: {
                    content:   $window.find('div[data-layout="cnt_content_content"]'),
                    subfooter: $window.find('div[data-layout="cnt_content_subfooter"]'),
                    footer:    $window.find('div[data-layout="cnt_content_footer"]')
                }
            },
            right: {
                header: $window.find('div[data-layout="right_header"]'),
                cnt: {
                    content: $window.find('div[data-layout="right_cnt_content"]')
                },
                footer: $window.find('div[data-layout="right_footer"]')
            }
        };
    }
    function appCoreRestrictedAccessPage(info, type) {
        var layout   = app.layout,
            $mid     = layout.top.header.find('[data-layout="toolbar_middle"]'),
            $right   = layout.top.header.find('[data-layout="toolbar_right"]'),
            $footer  = layout.content.cnt.footer,
            $content = layout.content.cnt.content,
            clr1 = "blue",
            clr2 = "red",
            icEye = "ic-eye-blocked",
            compressFunc = function(name, bg, descr, txt) {
                return {icon:  {name: name, bg: bg+" 700", txt: txt}, descr: descr};
            },
            statuses = {
                empty:   compressFunc(icEye,     clr1, langAppPicForbidden1),
                private: compressFunc(icEye,     clr2, langAppPicForbidden2),
                age:     compressFunc("",        clr2, langAppPicForbidden3+info.data+langAppPicForbidden4, info.data+"+"),
                missing: compressFunc("",        clr2, langAppPicForbidden5, "404"),
                guest:   compressFunc("ic-user", clr2, langAppPicForbidden6)
            },
            data = statuses[info.code];
        picStatus.state = "error";
        if (!info.save) {
            picStatus.name  = "error";
            $mid.html("");
            $right.html("");
            $footer.html("");
        }
        $content.off().html(tmpR(
            tmpAppForbidden,
            {
                tone: type === 'image' ? 'light' : 'dark',
                icon: {
                    svg:   {main: info.code === "empty" ? "ic-image" : "ic-lock", sub:  data.icon.name},
                    txt:   {sub: data.icon.txt},
                    color: {subbg: data.icon.bg}
                },
                description: data.descr
            },
            tmpObjElzIcon
        ));
        if (type === 'image') {
            app.layout.content.cnt.content.attr("data-elz-bg", "grey 900");
        }
        else {
            app.layout.content.cnt.content.removeAttr("data-elz-bg");
        }
        //$("#ElizaAppPicFake").remove();
    }
    function appCoreInitStandAlone() {
        appCoreStandAloneWindowAttach();
        inputsInitDefault();
        //DIAppReg.registerApp(app.id, app.name);
    }
    function appCoreInit() {
        app.layout = windowAssembler({
            setts: {
                id:    idElizaApp,
                app:   app.name,
                state: app.state,
                isFullscreen: 1
            },
            enable: {
                content: {
                    cnt: {
                        subfooter: 1,
                        footer:    1
                    }
                },
                right: {
                    cnt: {},
                    footer: 1
                }
            }
        });
        var layout = app.layout;
        layout.top.header.html(tmpR(tmpAppToolbarPanel, {floated: "floated", size: "contentLarge"}));
        insertStackScroll();
        var rightSide = layout.top.header.find('[data-layout="toolbar_right"]');
        rightSide.append(tmpR(tmpAppToolbarButton, {
                tag:   'div',
                class: 'sep',
                default: 0
            }
        ));
        
        var compressFunc = function(id, title, cls, icon) {
            rightSide.append(tmpR(tmpAppToolbarButton, { 
                    tag:   "div",
                    id:    id,
                    title: title,
                    class: cls,
                    setts: {
                        type: "default",
                        link:  "1",
                        tip_h: "dtr"
                    },
                    icon: {svg: {main: icon}, size: "small"},
                    border: {
                        enable: 1,
                        lines:  "bottom",
                        color:  "blue"
                    }
                },
                tmpObjElzIcon
            ));
        };
        compressFunc(idElizaPicRightPanel, langAppPicRightPanel, "rpanel", "ic-rpanel");
        compressFunc(idElizaPicRightBack,  langAppPicRightBack,  "back",   "ic-arrow-left2");
        if (DISite.getPackageName() !== "Pic") {
            toolbarBtnClose(rightSide, idElizaApp, app.name);
        }
        layout.right.cnt.content.html(tmpR(tmpAppScrollContent, {
            id: idElizaPicRightScroll
        }));
        layout.content.cnt.content.closest(".markContent").addClass("grow");
        inputsInitDefault();
        userPanelMenus();
        //DIAppReg.registerApp(app.id, app.name);
    }
    function appShow() {
        $("#"+idElizaApp).removeClass("hide");
        DIContextMenu.hide();
        $("#"+idElizaPicPopupSettings).addClass("hide");
        $("#"+idElizaPicPopupContent).addClass("hide");
    }
    function appSetState(state) {
        $("#"+idElizaApp).attr("data-appstate", state);
        app.state = state;
    }
    function appActionWrapper(callback, state) {
        callback();
        if (state) {
            appSetState(state);
        }
        DIAppReg.regState(app.name, window.location.hash, "picImagePaste");
        DIAppReg.setActiveApp(app.name);
    }
    
    function appCoreRouter() {
        var router = bBone.Router.extend({
            routes: {
                "pic(/)(?page=:page)":      'indexAction',
                "pic(/)trash(?page=:page)": 'trashAction',
                "pic(/):item(?page=:page)": 'itemAction'
            },
            indexAction: function (page) {
                appActionWrapper(function() {appPicIndex(page);}, "list root");
            },
            itemAction: function (item, page) {
                appActionWrapper(function() {appPicItem(item, page);});
            },
            trashAction: function(page) {
                appActionWrapper(function() {appPicTrash(page);}, "list trash");
            }
        });
        new router();
    }
    function appCoreRouterStanAlone() {
        app.standAlone = 1;
        var $app    = $("#"+idElizaApp),
            hasMeta = $app.attr("data-meta") ? 1 : 0,
            state   = $app.attr("data-appstate"),
            meta    = hasMeta ? $.parseJSON($app.attr("data-meta")) : '';
        if (hasMeta && state !== "image") {
            picParseMetaAlbum(meta);
        }
        var pages   = hasMeta ? pageParser(getParameterByName("page"), picStatus.pages.max) : pageParser(getParameterByName("page"));
        picStatus.pages.start = pages.start;
        picStatus.pages.end   = pages.end;
        $app.removeAttr("data-meta");
        $jqStackScroll = $("#"+idElizaPicContentScroll);
        $jqStackList   = $("#"+idElizaPicContentStackList);
        appSetState(state);
        var $rightPanel = $("#"+idElizaPicRightPanel);
        $rightPanel.addClass("hide");
        if (hasMeta) {
            if (state === "list root") {
                picStatus.ownerId = UserHandler.getId();
                //picParseMetaAlbum(meta);
                picStackItemsInit();
                picStackItemsInitSingle();
                picStackScrollLoader();
                scroller_obj.scroll();
                picFooterNumbersEditor();
            }
            else if (state === "list album" || state === "list trash") {
                //picParseMetaAlbum(meta);
                picStackItemsInit();
                picStackItemsInitSingle();
                picStackScrollLoader();
                scroller_obj.scroll();
                picFooterNumbersEditor();
            }
            else if (state === "image") {
                picParseMetaImage(meta);
                $rightPanel.removeClass("hide");
                $("img", $("#"+idElizaPicImageViewer)).click(function(event) {
                    if (event.shiftKey || event.ctrlKey) {
                        window.open($(this).attr("src"), '_blank');
                    }
                    else {
                        window.open($(this).attr("src"), '_blank');
                    }
                }).mousedown(function(e) {
                    if (e.which === 2) {
                        e.preventDefault();
                        e.stopPropagation();
                        window.open($(this).attr("src"), '_blank');
                    }
                    return true;
                });
                picImageRightContent();
                //picImageHandler(item, forced ? true : false);
            }
            appShow();
            picPluploaderGet();
            picPluploaderFrame();
            userPanelMenus();
        }
        elizaBlur(false);
        DIPaste.setContextApp("picImagePaste");
        hApi.registerPopCallback("picRouter", appPicStandAloneRouter, {forced: true});
        hApi.replaceStateData({callback: "picRouter"});
    }
    function picMainFunc() {
        DIContextMenu.registerContext("pic", appCoreContextMenu, {initPaste: 1});
        DIPaste.registerContext("file", "picImagePaste", appCorePasteImage);
    }
    return {
        main: function() {
            appCoreInit();
            DIAppReg.registerApp(idElizaApp, "pic");
            appCoreRouter();
            picMainFunc();
        },
       mainStandAlone: function() {
           appCoreInitStandAlone();
           DIAppReg.registerApp(idElizaApp, "pic", function(url) {
               hApi.replaceStateData({callback: "picRouter"}, url);
           });
           appCoreRouterStanAlone();
           picMainFunc();
       }
    };
}