Вход Регистрация
Файл: plugins/photo/static/js/photo.js
Строк: 2167
<?php
(function( window, $, params ) {'use strict';
    var 
utils = window.photoUtils;
    var 
_vars = $.extend({}, (params || {}),
        {
cache: {}, minSize: {width: 400, height: 400}, spacing: 30, infoBar: 400, cmpListForDeleting: [], curPos: 0, fullScreen: (function()
        {
            if ( !
params.isEnableFullscreen )
            {
                return 
false;
            }
            
            var 
val, valLength;
            var 
fnMap = [
                [
'requestFullscreen','exitFullscreen','fullscreenElement','fullscreenEnabled','fullscreenchange','fullscreenerror'],
                [
'webkitRequestFullscreen','webkitExitFullscreen','webkitFullscreenElement','webkitFullscreenEnabled','webkitfullscreenchange','webkitfullscreenerror'],
                [
'webkitRequestFullScreen','webkitCancelFullScreen','webkitCurrentFullScreenElement','webkitCancelFullScreen','webkitfullscreenchange','webkitfullscreenerror'],
                [
'mozRequestFullScreen','mozCancelFullScreen','mozFullScreenElement','mozFullScreenEnabled','mozfullscreenchange','mozfullscreenerror'],
                [
'msRequestFullscreen','msExitFullscreen','msFullscreenElement','msFullscreenEnabled','MSFullscreenChange','MSFullscreenError']
            ];
            var 
i = 0;
            var 
ret = {};

            for ( ; 
i < fnMap.length; i++ )
            {
                
val = fnMap[i];

                if ( 
val && val[1] in document )
                {
                    for ( 
i = 0, valLength = val.length; i < valLength; i++ )
                    {
                        
ret[fnMap[0][i]] = val[i];
                    }

                    return 
ret;
                }
            }

            return 
false;
        })()},
        {
globalList: [], lists: [], ID_LIST_LIMIT: 2, DEFAULT_LIST: 'latest'},
        {
toString: Object.prototype.toString},
        {
            
commentEvents: [
                
'base.comments_list_init',
                
'base.comment_add', 
                
'base.comment_delete',
                
'base.attachment_added',
                
'base.attachment_deleted',
                
'base.comment_added',
                
'base.comment_textarea_resize',
                
'base.comment_attachment_added',
                
'base.comment_button_show',
                
'base.add_photo_attachment_submit',
                
'base.comment_attachment_deleted',
                
'base.comment_video_play',
                
'base.comment_attach_media'
            
],
            
commentUnknownEntity: [
                
'base.add_photo_attachment_submit',
                
'base.comment_video_play',
                
'base.comment_attach_media'
            
]
        }
    ),
    
_elements = {
        
preloader: $('<div>').addClass('peep_floatbox_preloader peep_photo_preload')
    },
    
_methods = {
        
isLoading: function()
        {
            return 
_vars.fetchRequest && _vars.fetchRequest.readyState !== 4;
        },
        
setId: function( photoId, listType, extend, data, photo )
        {
            if ( 
_methods.isLoading() )
            {
                return 
false;
            }
            
            
_methods.history.replaceState(photoId, listType, extend, data, photo);
        },
        
isCached: function( photoId )
        {
            return !
isNaN(+photoId) && _vars.cache.hasOwnProperty(+photoId);
        },
        
cachePhotoComponents: function( photos )
        {
            var 
keys, idList = [];
                
            if ( !
photos || utils.getObjectType(photos) !== 'Object' || (keys = Object.keys(photos)).length === 0 )
            {
                return 
false;
            }
            
            
keys.forEach(function( item )
            {
                if ( !
_methods.isCached(item) )
                {
                    var 
cmp = _vars.cache[item] = photos[item];
                    
idList.push(item);

                    if ( 
cmp.photo.dimension )
                    {
                        try
                        {
                            
cmp.photo.dimension = JSON.parse(cmp.photo.dimension);
                        }
                        catch ( 
ignore ) { }
                    }
                    
                    
PEEP.trigger('photo.afterPhotoCached', [cmp.photo.id, cmp], _methods);
                }
            });

            
_methods.backgroundLoadPhotos(idList, _methods.fullscreen.isFullscreen() ? 'fullscreen' : 'main');
        },
        
backgroundLoadPhotos: function( photoIdList, type )
        {
            if ( !Array.
isArray(photoIdList) || photoIdList.length === 0 ) return;

            
photoIdList.forEach(function( item )
            {
                if ( 
_methods.isCached(item) )
                {
                    var 
cmp = _methods.getPhotoCmp(item);
                    var 
url = (type === 'fullscreen' && +cmp.photo.hasFullsize) ? cmp.photo.urlFullscreen : cmp.photo.url;
                    
                    
setTimeout(function( url )
                    {
                        new 
Image().src = url;
                    }, 
1, url);
                }
            });
        },
        
setState: function( loading )
        {
            if ( 
utils.getObjectType(loading) !== 'Boolean' )
            {
                
loading = true;
            }
            
            switch ( 
loading )
            {
                case 
false:
                    
_methods.utils.hidePreloader();
                    break;
                case 
true:
                default:
                    
_methods.utils.showPreloader();
                    break;
            }
        },
        
getPhotoCmp: function( photoId )
        {
            if ( !
_methods.isCached(photoId) )
            {
                return 
null;
            }
            
            return 
_vars.cache[photoId];
        },
        
deletePhotoCmp: function( photoId )
        {
            
delete _vars.cache[photoId];
        },
        
getIsLoadPrevList: function( index )
        {
            return !
_vars.isPrevCompleted && index < _vars.ID_LIST_LIMIT;
        },
        
getIsLoadNextList: function( index, list )
        {
            return !
_vars.isNextCompleted && list.length - index < _vars.ID_LIST_LIMIT;
        },
        
getPrevId: function( index, list )
        {
            if ( [
'most_discussed', 'toprated'].indexOf(_vars.listType) !== -1 )
            {
                return 
index === 0 ? list[list.length - 1] : list[index - 1];
            }

            return 
index === 0 ?
                (
_vars.lists.length === 0 ?
                    
_vars.globalList[_vars.globalList.length - 1] :
                    
_methods.arrayUtils.getMinInList(_vars.lists)) :
                list[
index - 1];
        },
        
getNextId: function( index, list )
        {
            if ( [
'most_discussed', 'toprated'].indexOf(_vars.listType) !== -1 )
            {
                return 
index === list.length - 1 ? list[0] : list[index + 1];
            }

            return 
index === list.length - 1 ?
                (
_vars.lists.length === 0 ?
                    
_vars.globalList[0] :
                    
_methods.arrayUtils.getMaxInList(_vars.lists)) :
                list[
index + 1];
        },
        
clearHistory: function()
        {
            
_vars.globalList.length = 0;
            
_vars.lists.length = 0;
        },
        
showFloatBox: function()
        {
            if ( 
_elements.hasOwnProperty('photoFB') || _vars.layout === 'page' )
            {
                return;
            }
            
            var 
options = {};
                
            if ( 
_vars.isClassic )
            {
                
options.addClass = 'peep_photoview_overlay_pint';
                
options.$title = '';
            }
            else
            {
                
options.addClass = 'peep_photoview_overlay floatbox_overlayBG';
                
options.layout = 'empty';
            }

            
_elements.photoFB = new PEEP_FloatBox(options);
            
_elements.photoFB.bind('show', function()
            {
                
_vars.fbHasContent = true;
            });
            
_elements.photoFB.bind('close', function()
            {
                
_methods.history.goInitState();
                
_methods.beforeLoadCmp(_vars.photoId);

                
delete _elements.photoFB;
                
delete _elements.content;
                
delete _vars.direction;
                
delete _vars.photoId;

                
_vars.minSize.width = 400;
                
_vars.minSize.height = 400;
                
_vars.fbHasContent = false;

                
_vars.cmpListForDeleting.forEach(function( item )
                {
                    
_methods.deletePhotoCmp(item);
                });
                
_vars.cmpListForDeleting.length = 0;
                
                if ( 
_methods.fullscreen.isFullscreen() )
                {
                    
_methods.fullscreen.exit();
                }
                
                
PEEP.trigger('photo.onFloatboxClose', [], _methods);
            });
        },
        
getDataToSend: function( photoId, listType )
        {
            var 
dataToSend = {photos: [], photoId: photoId, layout: _vars.layout}, params = {};
            var 
index = _vars.globalList.indexOf(photoId);

            if ( 
index === -1 )
            {
                var 
listIndex = -1, keyInListIndex = -1;
                
                
_vars.lists.some(function( index, i )
                {
                    
listIndex = i;
                    
                    return (
keyInListIndex = index.indexOf(photoId)) !== -1;
                });
                
                if ( 
listIndex === -1 || keyInListIndex === -1 )
                {
                    
params.photoId = photoId;
                    
                    
dataToSend.photoId = photoId;
                    
dataToSend.loadPrevList = 1;
                    
dataToSend.loadPrevPhoto = 1;
                    
dataToSend.loadNextList = 1;
                    
dataToSend.loadNextPhoto = 1;
                    
dataToSend.photos.push(photoId);
                }
                else
                {
                    var list = 
_vars.lists.slice(0);
                    list.
push(_vars.globalList);

                    
params.prevId = keyInListIndex === 0 ?
                        
_methods.arrayUtils.getMinInList(list) :
                        
_vars.lists[listIndex][keyInListIndex - 1];
                    
params.nextId = keyInListIndex === _vars.lists[listIndex].length - 1 ?
                        
_methods.arrayUtils.getMaxInList(list) :
                        
_vars.lists[listIndex][keyInListIndex + 1];
                    
params.listIndex = listIndex;
                
                    if ( 
_vars.hasOwnProperty('direction') )
                    {
                        switch ( 
_vars.direction )
                        {
                            case 
'left':
                                
dataToSend.loadPrevList = keyInListIndex < _vars.ID_LIST_LIMIT ? 1 : 0;
                                break;
                            case 
'right':
                            default:
                                
dataToSend.loadNextList = _vars.lists[listIndex].length - keyInListIndex < _vars.ID_LIST_LIMIT ? 1 : 0;
                                break;
                        }
                    }
                    else
                    {
                        
dataToSend.loadPrevList = keyInListIndex < _vars.ID_LIST_LIMIT ? 1 : 0;
                        
dataToSend.loadNextList = _vars.lists[listIndex].length - keyInListIndex < _vars.ID_LIST_LIMIT ? 1 : 0;
                    }
                }
            }
            else
            {
                
params.prevId = _methods.getPrevId(index, _vars.globalList);
                
params.nextId = _methods.getNextId(index, _vars.globalList);

                if ( 
_vars.hasOwnProperty('direction') )
                {
                    switch ( 
_vars.direction )
                    {
                        case 
'left':
                            
dataToSend.loadPrevList = _methods.getIsLoadPrevList(index) ? 1 : 0;
                            break;
                        case 
'right':
                        default:
                            
dataToSend.loadNextList = _methods.getIsLoadNextList(index, _vars.globalList) ? 1 : 0;
                            break;
                    }
                }
                else
                {
                    
dataToSend.loadPrevList = _methods.getIsLoadPrevList(index) ? 1 : 0;
                    
dataToSend.loadNextList = _methods.getIsLoadNextList(index, _vars.globalList) ? 1 : 0;
                }
            }
            
            if ( !
_methods.isCached(photoId) )
            {
                
params.photoId = photoId;
                
params.loadCurrent = true;

                
dataToSend.photos.push(photoId);
            }

            if ( !
_methods.isCached(params.prevId) )
            {
                
dataToSend.photos.push(params.prevId);
            }

            if ( !
_methods.isCached(params.nextId) )
            {
                
dataToSend.photos.push(params.nextId);
            }
            
            if ( [
'hash', 'user', 'desc', 'all'].indexOf(listType) !== -1 )
            {
                var 
listData = {};
                
                if ( 
window.hasOwnProperty('browsePhoto') )
                {
                     
listData = window.browsePhoto.getListData();
                }
                else
                {
                    var 
searchParse = _methods.locationUtils.parseSearch(location.search.substr(1));
                    
                    if ( 
searchParse.hasOwnProperty('searchVal') )
                    {
                        
listData = searchParse;
                    }
                }
                    
                $.
extend(dataToSend, listData);
            }
            
            return {
                
dataToSend: dataToSend,
                
params: params
            
};
        },
        
showPhotoCmp: function( photoId, listType, data, photo )
        {
            
PEEP.trigger('photo.onBeforeShow', [photoId, listType], _methods);
            
            if ( 
photoId !== _vars.photoId )
            {
                
PEEP.trigger('photo.onBeforePhotoChange', [_vars.photoId, photoId], _methods);
            }
            
            
_methods.showFloatBox();
            
            if ( 
_vars.isDisabled && _vars.layout !== 'page')
            {
                
_elements.photoFB.setContent($(document.getElementById('peep-photo-view-error')));
                
_elements.photoFB.fitWindow({width: 500, height: 300});
                
                return;
            }
            
            
_methods.beforeLoadCmp(_vars.photoId);
            
_vars.photoId = +photoId;
            
_vars.listType = listType || _vars.DEFAULT_LIST;
            
            if ( 
data && data.main && data.main.length === 2 && data.mainUrl )
            {
                
_methods.createFloatboxContent();
                
_elements.photoFB.setContent(_elements.content);
                
                var 
dimension = _methods.getScreenDimension(data.main[0], data.main[1]),
                    
imgCss = {}, floatboxCss = {width: dimension.width + _vars.infoBar, height: dimension.height}, stageCss = {height: dimension.height};
                var 
proportion = _methods.utils.getScreenProportion(dimension.width, dimension.height, data.main[0], data.main[1]);
                
                if ( 
proportion[0] > dimension.imageWeight && proportion[1] > dimension.imageHeight )
                {
                    
imgCss.width = dimension.imageWeight;
                    
imgCss.height = dimension.imageHeight;
                }
                else
                {
                    
imgCss.width = proportion[0];
                    
imgCss.height = proportion[1];
                }
                
                if ( 
_vars.isClassic )
                {
                    
stageCss.float = 'none';
                    
floatboxCss.height = 0;
                }
                else
                {
                    
floatboxCss.top = dimension.screenHeight / 2 - dimension.height / 2;
                    
stageCss.width = dimension.width;
                    
_elements.content.find('.peep_photoview_info_wrap').height(floatboxCss.height);
                }

                
PEEP.trigger('photo.setStage', [photo, data, stageCss, imgCss], _elements.content);

                
_elements.photoFB.fitWindow(floatboxCss);
                
_elements.content.find('.peep_photoview_stage_wrap').css(stageCss);
                
_elements.content.find('img.peep_photo_view').css(imgCss).attr('src', data.mainUrl);
            }

            
_methods.setState(true);

            var 
send = _methods.getDataToSend(_vars.photoId, _vars.listType);
            
            if ( 
_methods.isCached(send.dataToSend.photoId) )
            {
                
_methods.loadCachedComponent(send.dataToSend.photoId);
            }
            
            
_methods.backgroundLoadPhotos([send.params.nextId, send.params.prevId], _methods.fullscreen.isFullscreen() ? 'fullscreen' : 'main');
            
            if ( 
_methods.utils.isNotEmptyObject(send.dataToSend) )
            {
                $.
extend(send.dataToSend, {ajaxFunc: 'getFloatbox', listType: _vars.listType});
                
_methods.fetchCmp(send.dataToSend, send.params);
            }
        },
        
fetchCmp: function( dataToSend, params )
        {
            
_vars.fetchRequest = $.ajax(
            {
                
url: _vars.ajaxResponder,
                
type: 'POST',
                
cache: false,
                
data: dataToSend,
                
dataType: 'json',
                
beforeSend: function( jqXHR, settings )
                {
                    
PEEP.trigger('photo.onBeforeLoadPhoto', [dataToSend.photoId], _methods);
                },
                
success : function( responce )
                {
                    if ( !
responce || !responce.result )
                    {
                        return;
                    }
                    
                    
PEEP.trigger('photo.onRequestComplete', [dataToSend, params, responce], _methods);
                    
utils.includeScriptAndStyle(responce.scripts);
                    
_methods.cachePhotoComponents(responce.photos);
                        
                    if ( 
params.loadCurrent )
                    {
                        
_methods.loadCachedComponent(params.photoId);
                    }

                    if ( 
responce.prevCompleted && !_vars.isPrevCompleted )
                    {
                        
_vars.isPrevCompleted = true;
                        
_methods.arrayUtils.push(_vars.lists, _methods.arrayUtils.unionToList(responce.firstList));
                    }

                    if ( 
responce.nextCompleted && !_vars.isNextCompleted )
                    {
                        
_vars.isNextCompleted = true;
                        
_methods.arrayUtils.push(_vars.lists, _methods.arrayUtils.unionToList(responce.lastList));
                    }

                    var list = 
_methods.arrayUtils.unionToList(responce.prevList, params.photoId, responce.nextList);

                    if ( 
_vars.globalList.length === 0 )
                    {
                        
_vars.globalList = list;
                    }
                    else
                    {
                        if ( 
_methods.arrayUtils.isMatch(_vars.globalList, list) )
                        {
                            
_vars.globalList = _methods.arrayUtils.unionToList(_vars.globalList, list);
                        }
                        else
                        {
                            if ( 
params.listIndex )
                            {
                                
_vars.lists[params.listIndex] = _methods.arrayUtils.unionToList(_vars.lists[params.listIndex], list);
                                
_vars.lists.sort(_methods.arrayUtils.sortBySum);
                            }
                            else
                            {
                                
_methods.arrayUtils.push(_vars.lists, list);
                            }
                            
                            while ( 
true )
                            {
                                var 
listIndex;
                                var 
match = _vars.lists.some(function( item, i )
                                {
                                    
listIndex = i;

                                    return 
_methods.arrayUtils.isMatch(_vars.globalList, item);
                                });

                                if ( 
match )
                                {
                                    
_vars.globalList = _methods.arrayUtils.unionToList(_vars.globalList, _vars.lists[listIndex]);
                                    
_vars.lists.splice(listIndex, 1);
                                }
                                else
                                {
                                    var 
index, innerIndex;
                                    var 
some = _vars.lists.some(function( item, i )
                                    {
                                        
index = i;
                                        
                                        for ( var 
j = i + 1; j < _vars.lists.length; j++ )
                                        {
                                            
innerIndex = j;
                                            
                                            if ( 
_vars.lists[j][0] + 1 >= item[item.length -1] )
                                            {
                                                return 
true;
                                            }
                                        }
                                    });
                                    
                                    if ( 
some )
                                    {
                                        
_vars.lists[index] = _methods.arrayUtils.unionToList(_vars.lists[index], _vars.lists[innerIndex]);
                                        
_vars.lists.splice(innerIndex);
                                    }
                                    else
                                    {
                                        break;
                                    }
                                }
                            }
                        }
                    }
                },
                
error: function( jqXHR, textStatus, errorThrown )
                {
                    throw 
textStatus;
                },
                
complete: function( jqXHR, textStatus )
                {

                }
            });
        },
        
loadCachedComponent: function( photoId )
        {
            
_methods.createFloatboxContent();
            
PEEP.trigger('photo.onBeforeLoadFromCache', [photoId], _methods);
            
            if ( 
_vars.layout === 'page' )
            {
                var 
contant = $(document.getElementById('peep-photo-view-page'));

                if ( 
contant.is(':empty') )
                {
                    
contant.html(_elements.content);
                }
            }
            else if ( 
_elements.photoFB.$body[0] && !_elements.photoFB.$body[0].children.length )
            {
                
_elements.photoFB.setContent(_elements.content);

                if ( 
_vars.isClassic )
                {
                    
_elements.photoFB.fitWindow({width: _vars.minSize.width});
                }
                else
                {
                    
_elements.photoFB.fitWindow({width: _vars.minSize.width, height: _vars.minSize.height});
                }
            }

            
_methods.setContent(photoId);
            
_methods.setComment(photoId);
            
_methods.addCmpMarkup(photoId);

            
PEEP.trigger('photo.markupReady', [_methods.getPhotoCmp(photoId)], _elements.content);
            
            
_methods.fitSize(photoId, function( offset )
            {
                
PEEP.trigger('photo.beforeResize', [photoId], _methods);

                if ( !
_methods.fullscreen.isFullscreen() )
                {
                    if ( 
_vars.layout !== 'page' )
                    {
                        var 
options = {};

                        if ( 
_vars.isClassic )
                        {
                            
_elements.content.find('.peep_photoview_stage_wrap').css({float: 'none', height: _vars.minSize.height});
                            
options.width = offset.width;
                        }
                        else
                        {
                            
_elements.content.find('.peep_photoview_stage_wrap').css({width: _vars.minSize.width, height: _vars.minSize.height});
                            
_elements.content.css('height', _vars.minSize.height);
                            
options = offset;
                        }

                        
_elements.photoFB.fitWindow(options);
                        
_methods.updateComment({entityType: 'photo_comments', entityId: _vars.photoId});
                    }
                    else
                    {
                        
_elements.content.find('.peep_photoview_stage_wrap').css({float: 'none', height: _vars.minSize.height});
                    }
                }

                
PEEP.bindAutoClicks(_elements.content);
                
PEEP.bindTips(_elements.content);

                
PEEP.trigger('photo.afterResize', [photoId], _methods);
                
PEEP.trigger('photo.photo_show', {photoId: photoId}, _methods);
                
                
_methods.setState(false);
            });
        },
        
fitSize: function( photoId, callback, resize )
        {
            if ( !
_methods.isCached(photoId) )
            {
                return;
            }

            var 
cmp = _methods.getPhotoCmp(photoId);
            var 
complete = function()
            {
                if ( !
_vars.isRunSlideshow  )
                {
                    var 
img = _elements.content.find('img.peep_photo_view').css({width: 'auto', height: 'auto'})[0];
                    
                    if ( 
_methods.fullscreen.isFullscreen() && +cmp.photo.hasFullsize )
                    {
                        
img.src = cmp.photo.urlFullscreen;
                    }
                    else
                    {
                        
img.src = cmp.photo.url;
                    }
                }
                
                var 
imageWeight = this.naturalWidth;
                var 
imageHeight = this.naturalHeight;
                
                var 
screnWeight = _vars.layout === 'page' ? $(document.getElementById('peep-photo-view-page')).width() : $(window).width();
                var 
screnHeight = $(window).height();
                
                var 
minWidth = screnWeight < 400 ? (screnWeight - 2 * _vars.spacing) : 400;
                var 
minHeight = screnHeight < 400 ? (screnHeight - 2 * _vars.spacing) : 400;

                var 
maxWidth = _vars.layout === 'page' ? screnWeight : (screnWeight - 2 * _vars.spacing - 400);
                var 
maxHeight = screnHeight - 2 * _vars.spacing;
                
                if ( 
_vars.layout === 'page' )
                {
                    
callback({width: maxWidth, height: maxHeight});
                    
                    return;
                }

                var 
width = (imageWeight > minWidth && imageWeight < maxWidth) ? imageWeight : (imageWeight < minWidth) ? minWidth : maxWidth;
                var 
height = (imageHeight > minHeight && imageHeight < maxHeight) ? imageHeight : (imageHeight < minHeight) ? minHeight : maxHeight;

                if ( 
resize )
                {
                    
_vars.minSize.width = (_vars.minSize.width + _vars.infoBar > screnWeight) ? maxWidth : (width <= _vars.minSize.width) ? _vars.minSize.width : (width >= maxWidth) ? maxWidth: width;
                    
_vars.minSize.height = (_vars.minSize.height > screnHeight) ? maxHeight : (height <= _vars.minSize.height) ? _vars.minSize.height : (height >= maxHeight) ? maxHeight : height;
                }
                else
                {
                    
_vars.minSize.width = (_vars.minSize.width + _vars.infoBar > screnWeight) ? maxWidth : (width > _vars.minSize.width) ? width : _vars.minSize.width;
                    
_vars.minSize.height = (_vars.minSize.height > screnHeight) ? maxHeight : (height > _vars.minSize.height) ? height : _vars.minSize.height;
                }

                
PEEP.trigger('photo.fitSize', [_methods.getPhotoCmp(photoId), _vars.minSize], _elements.content);

                
width = _vars.minSize.width + _vars.infoBar;
                
height = _vars.minSize.height;

                
callback({width: width, height: height, top: screnHeight / 2 - (_vars.minSize.height / 2)});
            };
            
            var 
img = new Image();
            
            if ( 
_methods.fullscreen.isFullscreen() && +cmp.photo.hasFullsize )
            {
                
img.src = cmp.photo.urlFullscreen;
            }
            else
            {
                
img.src = cmp.photo.url;
            }

            
img.complete ? complete.call(img) : img.onload = complete;
        },
        
getScreenDimension: function( imgWidth, imgHeight, screenMinWidth, screenMinHeight )
        {
            var 
screenWidth = _vars.layout === 'page' ? $(document.getElementById('peep-photo-view-page')).width() : $(window).width(),
                
screenHeight = $(window).height(),

                
minWidth = screenMinWidth || 400,
                
minHeight = screenMinHeight || 400,

                
maxWidth = _vars.layout === 'page' ? screenWidth : (screenWidth - 2 * _vars.spacing - _vars.infoBar),
                
maxHeight = screenHeight - 2 * _vars.spacing,

                
width = imgWidth > maxWidth ? maxWidth : imgWidth < minWidth ? minWidth : imgWidth,
                
height =  imgHeight > maxHeight ? maxHeight : imgHeight < minHeight ? minHeight : imgHeight;
            
            return {
                
imageWeight: imgWidth,
                
imageHeight: imgHeight,
                
maxWidth: maxWidth,
                
maxHeight: maxHeight,
                
width: width,
                
height: height,
                
minWidth: minWidth,
                
minHeight: minHeight,
                
screenWidth: screenWidth,
                
screenHeight: screenHeight
            
};
        },
        
setContent: function( photoId )
        {
            var 
content = _elements.content;
            var 
cmp = _methods.getPhotoCmp(photoId);
            
            $(
'.peep_user_list_picture a', content).attr('href', cmp.avatar.url);
            $(
'.peep_user_list_picture img', content).attr({alt: cmp.avatar.title, src: cmp.avatar.src}).show();
            $(
'.peep_photoview_albumlink', content).attr('href', cmp.albumUrl).html(
                
"'" + utils.truncate(cmp.album.name) + "': " + cmp.photoIndex + ' ' + PEEP.getLanguageText('photo', 'of') + ' ' + cmp.photoCount
            
);
            $(
'.peep_user_list_data a.peep_photo_avatar_url', content).attr('href', cmp.avatar.url).html(cmp.avatar.title);
            $(
'.peep_user_list_data .peep_timestamp', content).html(cmp.photo.addDatetime);
            $(
'.peep_user_list_data .peep_photo_album_url', content).attr('href', cmp.albumUrl)
                .
find('.peep_photo_album_name').html(
                    
PEEP.getLanguageText('photo', 'album') + ': ' + utils.truncate(cmp.album.name, 60)
            );
            
            if ( 
cmp.contextAction.length )
            {
                $(
cmp.contextAction).addClass('peep_photo_context_action').insertAfter($('.peep_photoview_bottom_menu_wrap', content)).show();
            }

            $(
'.peep_photo_share', content).empty().html(function()
            {
                return 
cmp.share || '';
            });
            
            if ( !
_methods.fullscreen.enabled() )
            {
                $(
'.peep_photoview_fullscreen', content).attr({target: '_blank', href: (cmp.photo.urlFullscreen ? cmp.photo.urlFullscreen : cmp.photo.url)});
            }
            
            $(
'#btn-photo-edit').off().on('click', function()
            {
                var 
photoId = $(this).attr('rel');
                
                
_elements.editFB = PEEP.ajaxFloatBox('PHOTO_CMP_EditPhoto', {photoId: photoId}, {width: 580, iconClass: 'peep_ic_edit', title: PEEP.getLanguageText('photo', 'tb_edit_photo'),
                    
onLoad: function()
                    {
                        
peepForms['photo-edit-form'].bind('success', function( data )
                        {
                            
_elements.editFB.close();

                            if ( 
data && data.result )
                            {
                                if ( 
data.photo.status !== 'approved' )
                                {
                                    
PEEP.info(data.msgApproval);

                                    if ( 
_elements.photoFB )
                                    {
                                        
_elements.photoFB.close();
                                    }

                                    $(
'#photo-description').html(PEEP.getLanguageText('photo', 'pending_approval'));

                                    if ( 
window.hasOwnProperty('browsePhoto') )
                                    {
                                        
browsePhoto.removePhotoItems(['photo-item-' + photoId]);
                                    }
                                }
                                else
                                {
                                    
PEEP.info(data.msg);

                                    
cmp.albumUrl = data.albumUrl;
                                    
cmp.album.name = data.albumName;
                                    
cmp.photo.description = data.description;

                                    $(
'.peep_user_list_data .peep_photo_album_url', content).attr('href', data.albumUrl)
                                        .
find('.peep_photo_album_name').html(
                                            
PEEP.getLanguageText('photo', 'album') + ': ' + utils.truncate(data.albumName, 60)
                                        );

                                    var 
event = {text: utils.descToHashtag(cmp.photo.description, utils.getHashtags(cmp.photo.description), params.tagUrl)};
                                    
PEEP.trigger('photo.onSetDescription', event);
                                    $(
'.peep_photoview_description span', content).html(event.text);

                                    if ( 
window.hasOwnProperty('browsePhoto') )
                                    {
                                        
browsePhoto.updateSlot('photo-item-' + data.id, data);
                                        
browsePhoto.reorder();
                                    }
                                }
                            }
                            else if ( 
data.msg )
                            {
                                
PEEP.error(data.msg);
                            }
                            
                            
delete _elements.editFB;
                        });
                    }}
                );
            });

            $(
'#photo-mark-featured').off().on('click', function()
            {
                var 
status = $(this).attr('rel');
                var 
photoId = $(this).attr('photo-id');
                var 
$this = $(this);

                $.
ajax(
                {
                    
url: _vars.ajaxResponder,
                    
type: 'POST',
                    
data: {ajaxFunc: 'ajaxSetFeaturedStatus', entityId: photoId, status: status},
                    
dataType : 'json',
                    
success : function(data)
                    {
                        if ( 
data.result === true )
                        {
                            var 
newStatus = status === 'remove_from_featured' ? 'mark_featured' : 'remove_from_featured';
                            var 
newLabel = status === 'remove_from_featured' ? PEEP.getLanguageText('photo', 'mark_featured') : PEEP.getLanguageText('photo', 'remove_from_featured');
                            
$this.html(newLabel);
                            
$this.attr('rel', newStatus);
                            
_vars.cmpListForDeleting.push(+photoId);
                            
PEEP.info(data.msg);
                        }
                        else if ( 
data.error != undefined )
                        {
                            
PEEP.warning(data.error);
                        }
                    }
                });
            });

            $(
"#photo-delete").off().on('click', function( event )
            {
                var 
photoId = $(this).attr("rel");

                if ( 
confirm(PEEP.getLanguageText('photo', 'confirm_delete')) )
                {
                    $.
ajax(
                    {
                        
url: _vars.ajaxResponder,
                        
type: 'POST',
                        
data: {ajaxFunc: 'ajaxDeletePhoto', entityId: photoId},
                        
dataType: 'json',
                        
success: function( data )
                        {
                            if ( 
data.result === true )
                            {
                                
PEEP.info(data.msg);
                                if ( 
data.url )
                                {
                                    
document.location = data.url;
                                };
                            }
                            else if ( 
data.error != undefined )
                            {
                                
PEEP.warning(data.error);
                            }
                        }
                    });
                }
            });

            $(
'#btn-photo-flag').off().on('click', function()
            {
                
PEEP.flagContent('photo_comments', $(this).attr("rel"));
            });

            $(
'#photo-approve').off().on('click', function()
            {
                $.
ajax({
                    
url: $(this).attr('url'),
                    
cache: false,
                    
type: 'POST',
                    
dataType: 'json',
                    
success: function( data )
                    {
                        
// TODO show message
                        
PEEP.info(PEEP.getLanguageText('photo', 'approve_success_message'));
                        $(
'#photo-approve').parent().remove();
                    }
                })
            });

            if ( !
_methods.fullscreen.enabled() )
            {
                
_elements.content.find('.peep_photoview_fullscreen').attr({target: '_blank', href: cmp.photo.url});
            }

            if ( 
cmp.photo.status !== 'approved' )
            {
                $(
'.peep_photoview_description span', content).html(PEEP.getLanguageText('photo', 'pending_approval'));

                return;
            }

            var 
event = {text: utils.descToHashtag(cmp.photo.description, utils.getHashtags(cmp.photo.description), params.tagUrl)};
            
PEEP.trigger('photo.onSetDescription', event);
            $(
'.peep_photoview_description span', content).html(event.text);

            var 
userScore = cmp.userScore;
            var 
rateInfo = cmp.rateInfo;
            var 
rateItems = $('.peep_rates_wrap', content).show().find('.rate_item').off();
            
            if ( +
userScore > 0 )
            {
                
content.find('.rate_title').html(
                    
PEEP.getLanguageText('photo', 'rating_your', {count: rateInfo.rates_count, score: userScore})
                );
            }
            else
            {
                
content.find('.rate_title').html(
                    
PEEP.getLanguageText('photo', 'rating_total', {count: rateInfo.rates_count})
                );
            }

            
content.find('.active_rate_list').css('width', (rateInfo.avg_score * 20) + '%');

            var 
eventRate = {
                
canRate: true,
                
photo: cmp.photo
            
};
            
PEEP.trigger('photo.canRate', eventRate, this.node);

            if ( !
eventRate.canRate )
            {
                
rateItems.on('click', function( e )
                {
                    
e.stopPropagation();

                    var 
event = {
                        
msg: ''
                    
};
                    
PEEP.trigger('photo.canRateMessage', event, self.node);
                    
PEEP.error(event.msg);
                });
            }
            else
            {
                
rateItems.on('click', function()
                {
                    var 
ownerError;

                    if ( +
_vars.rateUserId === 0 )
                    {
                        
PEEP.error(PEEP.getLanguageText('base', 'rate_cmp_auth_error_message'));

                        return;
                    }
                    else if ( +
cmp.ownerId === +_vars.rateUserId )
                    {
                        
PEEP.error(PEEP.getLanguageText('base', 'rate_cmp_owner_cant_rate_error_message'));

                        return;
                    }

                    var 
event = {
                        
canRate: true,
                        
photo: cmp.photo
                    
};
                    
PEEP.trigger('photo.canRate', event, this.node);

                    if ( !
event.canRate ) return;

                    var 
rate = $(this).index() + 1;

                    $.
ajax({
                        
url: _vars.ajaxResponder,
                        
dataType: 'json',
                        
data: {
                            
ajaxFunc: 'ajaxRate',
                            
entityId: cmp.photo.id,
                            
rate: rate,
                            
ownerId: cmp.ownerId
                        
},
                        
cache: false,
                        
type: 'POST',
                        
success: function( result, textStatus, jqXHR )
                        {
                            if ( 
result )
                            {
                                switch ( 
result.result )
                                {
                                    case 
true:
                                        
PEEP.info(result.msg);

                                        
content.find('.active_rate_list').css('width', (result.rateInfo.avg_score * 20) + '%');
                                        
content.find('.rate_title').html(
                                            
PEEP.getLanguageText('photo', 'rating_your', {count: result.rateInfo.rates_count, score: rate})
                                        );

                                        
cmp.userScore = rate;
                                        
rateInfo.avg_score = result.rateInfo.avg_score;
                                        
rateInfo.rates_count = result.rateInfo.rates_count;

                                        
PEEP.trigger('photo.onSetRate', {
                                            
entityId: cmp.photo.id,
                                            
userScore: cmp.userScore,
                                            
avgScore: rateInfo.avg_score,
                                            
ratesCount: rateInfo.rates_count
                                        
}, _methods);
                                        break;
                                    case 
false:
                                    default:
                                        
PEEP.error(result.error);
                                        break;
                                }
                            }
                            else
                            {
                                
PEEP.error('Server error');
                            }
                        },
                        
error: function( jqXHR, textStatus, errorThrown )
                        {
                            throw 
textStatus;
                        }
                    });
                })
                    .
hover(function()
                    {
                        $(
this).prevAll().add(this).addClass('active');
                        
content.find('.active_rate_list').css('width', '0px');
                    }, function()
                    {
                        $(
this).prevAll().add(this).removeClass('active');
                        
content.find('.active_rate_list').css('width', (rateInfo.avg_score * 20) + '%');
                    });
            }
        },
        
setComment: function( photoId )
        {
            var 
cmp = _methods.getPhotoCmp(photoId);

            $(
'.peep_feed_comments', _elements.content).append(cmp.comment);

            
_vars.commentEvents.forEach(function( item )
            {
                
PEEP.bind(item, function( data )
                {
                    
_methods.updateComment(data, item);
                });
            });
        },
        
updateComment: function( data, eventName )
        {
            if ( !
_elements.hasOwnProperty('photoFB') || (_vars.commentUnknownEntity.indexOf(eventName) === -1 && (data.entityType !== 'photo_comments' || data.entityId !== _vars.photoId)) )
            {
                return;
            }

            var 
height, cmp = _methods.getPhotoCmp(_vars.photoId),
                
scrollCont = _elements.content.find('.peep_photo_scroll_cont'),
                
padding = parseInt(_elements.content.find('.peep_photoview_info').css('padding-top')),
                
appendTo = _elements.content.find('.peep_feed_comments_input_sticky');

            if ( 
eventName  == 'base.comment_textarea_resize' )
            {
                var 
textarea;

                if ( !
cmp.isMoved )
                {
                    
textarea = $('textarea', scrollCont)[0];
                }
                else
                {
                    
textarea = $('textarea', appendTo)[0];
                }

                if ( 
textarea.selectionStart || textarea.selectionStart == '0' )
                {
                    
_vars.curPos = textarea.selectionStart;
                }
                else if ( 
document.selection )
                {
                    
textarea.focus();

                    var 
sel = document.selection.createRange();

                    
sel.moveStart('character', -textarea.value.length);
                    
_vars.curPos = sel.text.length;
                }
            }

            if ( !
_vars.isClassic && _vars.layout !== 'page' )
            {
                
PEEP.addScroll(scrollCont, {autoReinitialise: true}).scrollToBottom();

                
scrollCont.css('height', '');

                var 
jsp = scrollCont.data('jsp'), scrollContHeight = jsp.getContentHeight();

                if ( 
_methods.fullscreen.isFullscreen() )
                {
                    
height = _elements.content.find('.peep_photoview_info_wrap').height();
                }
                else
                {
                    
height = _elements.content.find('.peep_photoview_info_wrap').height() - appendTo.height() - padding;
                }
            
                if ( 
scrollContHeight >= height )
                {
                    if ( !
cmp.isMoved )
                    {
                        
PEEP.trigger('base.move_comments_form', 
                        {
                            
entityType: 'photo_comments',
                            
entityId: data.entityId || _vars.photoId,
                            
customId: cmp.customId,
                            
appendTo: appendTo
                        
});
                        
cmp.isMoved = true;
                        
_elements.content.find('.peep_photoview_info_wrap').addClass('sticked');
                    }

                    
scrollCont.height(_elements.content.find('.peep_photoview_info_wrap').height() - appendTo.height() - padding);
                    
jsp.reinitialise();
                    
jsp.scrollToBottom();
                    
                    if ( 
eventName == 'base.comment_textarea_resize' )
                    {
                        $(
'textarea', appendTo).photoFocus();
                    }
                }
                else
                {
                    if ( 
jsp != null && jsp.getContentHeight() >= height )
                    {
                        
_elements.content.find('.peep_photo_scroll_cont').height(height);
                    }
                    else
                    {
                        if ( 
cmp.isMoved )
                        {
                            
PEEP.trigger('base.move_comments_form', 
                            {
                                
entityType: 'photo_comments',
                                
entityId: data.entityId,
                                
customId: cmp.customId
                            
});
                            
cmp.isMoved = false;
                        }
                        
                        
PEEP.removeScroll(scrollCont);
                        
_elements.content.find('.peep_photo_scroll_cont').css('height', 'auto');
                    }
                    
                    if ( 
eventName == 'base.comment_textarea_resize' )
                    {
                        $(
'textarea', _elements.content.find('.peep_photo_scroll_cont')).photoFocus();
                    }
                }
            }
            
            if ( 
jsp && ['base.comment_added', 'base.comment_textarea_resize'].indexOf(eventName) !== -1 )
            {
                
setTimeout(function()
                {   
                    
jsp.scrollToBottom(true);
                }, 
400);
                
                
_elements.content.find('.peep_feed_comments_input_sticky textarea').photoFocus();
            }
            
            if ( [
'base.comment_add', 'base.comment_delete'].indexOf(eventName) !== -1 )
            {
                
_vars.cmpListForDeleting.push(+data.entityId);
            }
        },
        
loadPhoto: function( direction, listType )
        {
            if ( 
_methods.isLoading() )
            {
                return;
            }
            
            
_vars.direction = (['left', 'right'].indexOf(direction) === -1) ? 'right' : direction;
            
            var 
data = _methods.getDataToSend(_vars.photoId, _vars.listType), photoId, extend;
            
            switch ( 
direction )
            {
                case 
'left':
                    
photoId = +data.params.prevId;
                    break;
                case 
'right':
                    
photoId = +data.params.nextId;
                    break;
            }
            
            if ( 
isNaN(photoId) )
            {
                return 
false;
            }
            
            
PEEP.trigger('photo.onPhotoSwitch', [photoId, _vars.direction], _methods);
            
            if ( 
window.hasOwnProperty('browsePhoto') )
            {
                
extend = browsePhoto.getMoreData();
            }
            
            
_methods.setId(photoId, listType, extend);
            
_methods.updateSlideshow();
        },
        
loadPrevPhoto: function()
        {
            
_methods.loadPhoto('left', _vars.listType);
        },
        
loadNextPhoto: function()
        {
            
_methods.loadPhoto('right', _vars.listType);
        },
        
addCmpMarkup: function( photoId )
        {
            if ( !
_methods.isCached(photoId) )
            {
                return;
            }
            
            var 
cmp = _methods.getPhotoCmp(photoId);
            
            if ( 
cmp.css )
            {
                
PEEP.addCss(cmp.css);
            }
            
            if ( 
cmp.cssFiles )
            {
                $.
each(cmp.cssFiles, function( key, value )
                {
                    
PEEP.addCssFile(value);
                });
            }
            
            if ( 
cmp.scriptFiles )
            {
                
PEEP.addScriptFiles(cmp.scriptFiles, function()
                {
                    if ( 
cmp.onloadScript )
                    {
                        
PEEP.addScript(cmp.onloadScript);
                    }
                });
            }
            else
            {
                if ( 
cmp.onloadScript )
                {
                    
PEEP.addScript(cmp.onloadScript);
                }
            }

            if ( 
cmp.meta )
            {
                
Object.keys(cmp.meta).forEach(function( item )
                {
                    var 
_meta = cmp.meta[item];

                    
Object.keys(_meta).forEach(function( attr )
                    {
                        $(
'meta[' + item + '="' + attr + '"]').remove();
                        $(
document.head).append('<meta ' + item + '="' + attr + '" content="' + _meta[attr] + '">');
                    });
                });
            }
        },
        
beforeLoadCmp: function( photoId )
        {
            if ( 
_methods.isCached(photoId) )
            {
                var 
cmp = _methods.getPhotoCmp(photoId);

                if ( 
cmp.isMoved )
                {
                    if ( 
_vars.fbHasContent )
                    {
                        
PEEP.removeScroll(_elements.content.find('.peep_photo_scroll_cont'));
                    }
                    
                    if ( 
cmp.isMoved )
                    {
                        
PEEP.trigger('base.move_comments_form', 
                        {
                            
entityType: 'photo_comments',
                            
customId: cmp.customId,
                            
entityId: photoId
                        
});
                        
cmp.isMoved = false;
                        
_elements.content.find('.peep_photoview_info_wrap').removeClass('sticked');
                    }
                }
                
                
PEEP.trigger('base.comments_destroy',
                {
                    
entityType: 'photo_comments',
                    
customId: cmp.customId,
                    
entityId: photoId
                
});
                
                $(
'.peep_feed_comments', _elements.content).empty();
                
_elements.content.find('.peep_photoview_info_wrap').height('');
                $(
'.peep_rates_wrap', _elements.content).hide();
                
                var 
index;
                
                if ( (
index = _vars.cmpListForDeleting.indexOf(photoId)) !== -1 )
                {
                    
_methods.deletePhotoCmp(photoId);
                    
_vars.cmpListForDeleting.splice(index, 1);
                }
                
                $(
'.peep_photo_context_action', _elements.content).remove();
            }
            
            [
'base.move_comments_form', 'base.comments_destroy'].concat(_vars.commentEvents).forEach(function( item )
            {
                
PEEP.unbind(item);
            });
            
            if ( 
_elements.hasOwnProperty('editFB') )
            {
                
_elements.editFB.close();
            }
        },
        
fullscreen: {
            
request: function( elem )
            {
                var 
keyboardAllowed = typeof Element !== 'undefined' && 'ALLOW_KEYBOARD_INPUT' in Element;
                
elem = elem || document.documentElement;

                if ( /
5.1[.d]* Safari/.test(navigator.userAgent))
                {
                    
elem[_vars.fullScreen.requestFullscreen]();
                }
                else
                {
                    
elem[_vars.fullScreen.requestFullscreen](keyboardAllowed && Element.ALLOW_KEYBOARD_INPUT);
                }
            },
            exit: function()
            {
                
document[_vars.fullScreen.exitFullscreen]();
            },
            
isFullscreen: function()
            {
                return !!
document[_vars.fullScreen.fullscreenElement];
            },
            
enabled: function()
            {
                return 
_vars.fullScreen && !!document[_vars.fullScreen.fullscreenEnabled];
            },
            
getFullscreenElement: function()
            {
                return 
document[_vars.fullScreen.fullscreenElement];
            },
            
isPhotoInit : function()
            {
                return 
_methods.fullscreen.getFullscreenElement() === document.documentElement || _vars.isPhotoFullscreenInit;
            },
            
onchange: function( event )
            {
                if ( !
_methods.fullscreen.isPhotoInit() ) return;

                var 
content = _elements.content, cmp = _methods.getPhotoCmp(_vars.photoId);
                
                if ( 
_methods.fullscreen.isFullscreen() )
                {
                    
_vars.isPhotoFullscreenInit = true;
                    $(
window).off('resize.photo');
                    
                    
content.height('');
                    
content.find('.peep_photoview_stage_wrap').addClass('peep_photoview_stage_wrap_fullscreen');
                    
content.find('.peep_photoview_info_wrap').css({height: screen.height});
                    
content.find('.peep_photoview_play_btn').removeClass('stop');
                    
                    if ( 
_vars.layout === 'page' || _vars.isClassic )
                    {
                        $(
document.body).addClass('peep_photo_page_fullscreen');
                        
content.find('.peep_photoview_stage_wrap').css({float: 'left', width: screen.width, height: screen.height});
                        
content.find('.peep_photoview_info').removeClass('peep_photoview_info_onpage');
                    }
                    else
                    {
                        
_elements.photoFB.fitWindow({top: '0', width: screen.width, height: screen.height});
                        
content.find('.peep_photoview_stage_wrap').css({width: screen.width, height: screen.height});
                    }

                    if ( 
cmp.photo.hasFullsize && cmp.photo.dimension )
                    {
                        var 
dimension = cmp.photo.dimension;

                        if ( 
dimension.fullscreen && dimension.fullscreen.length === 2 )
                        {
                            var 
css = {};

                            if ( 
dimension.fullscreen[0] > screen.width && dimension.fullscreen[1] > screen.height )
                            {
                                var 
proportion = _methods.utils.getScreenProportion(dimension.fullscreen[0], dimension.fullscreen[1]);

                                
css.width = proportion[0];
                                
css.height = proportion[1];
                            }
                            else
                            {
                                
css.width = dimension.fullscreen[0];
                                
css.height = dimension.fullscreen[1];
                            }

                            
_elements.content.find('img.peep_photo_view').css(css).attr('src', cmp.photo.url);
                            
_methods.fitSize(_vars.photoId, function(){});
                        }
                    }
                    
                    if ( 
_vars.fbHasContent )
                    {
                        
PEEP.removeScroll(_elements.content.find('.peep_photo_scroll_cont'));
                    }
                }
                else
                {
                    
_vars.isPhotoFullscreenInit = false;
                    
_vars.isRunSlideshow = false;
                    
_methods.stopSlideshow();
                    
                    
content.find('.peep_photoview_info_btn').removeClass('close').addClass('open');
                    
content.find('.peep_photoview_stage_wrap').removeClass('peep_photoview_stage_wrap_fullscreen');
                    
content.find('.peep_photoview_info_wrap').css({height: ''});
                    
content.find('.peep_photoview_play_btn').addClass('stop');
                    
                    if ( 
_vars.layout === 'page' || _vars.isClassic )
                    {
                        
_elements.content.find('.peep_photoview_stage_wrap').css({float: 'none'});
                        
_elements.content.find('.peep_photoview_info').addClass('peep_photoview_info_onpage');
                        $(
document.body).removeClass('peep_photo_page_fullscreen');
                    }
                    
                    if ( 
_vars.isClassic )
                    {
                        
_elements.content.find('.peep_photoview_info').addClass('peep_photoview_pint_mode');
                    }
                    
                    
setTimeout(function()
                    {
                        var 
dimension = _methods.getScreenDimension(), css = {};
                        
                        if ( 
_vars.isClassic )
                        {
                            
css.width = 'auto';
                            
css.height = dimension.maxHeight;
                        }
                        else
                        {
                            
css.width = dimension.maxWidth;
                            
css.height = dimension.maxHeight;
                            
_vars.minSize.width = dimension.maxWidth;
                            
_vars.minSize.height = dimension.maxHeight;
                        }
                        
                        
content.find('.peep_photoview_stage_wrap').css(css);
                        
_methods.updateComment({entityType: 'photo_comments', entityId: _vars.photoId});

                        if ( 
_vars.layout != 'page' )
                        {
                            
content.height(css.height);
                            
_elements.photoFB.fitWindow({width: dimension.maxWidth + _vars.infoBar, height: dimension.maxHeight, top: dimension.screenHeight / 2 - (dimension.maxHeight / 2)});
                        }
                        
                        $(
window).on('resize.photo', _methods.resizeWindow);
                    }, 
100);
                }

                
content.find('.jspPane').css('left', 0);
                
content.find('.peep_photoview_info_wrap').height('');
                
                var 
dataToSend = _methods.getDataToSend(_vars.photoId, _vars.listType);
                    
                
_methods.backgroundLoadPhotos([dataToSend.params.nextId, dataToSend.params.prevId], _methods.fullscreen.isFullscreen() ? 'fullscreen' : 'main');
                
                
PEEP.trigger('photo.onSizeChange', [_vars.photoId, _methods.fullscreen.isFullscreen()], _methods);
            }
        },
        
utils:
        {
            
showPreloader: function()
            {
                if ( 
_vars.layout !== 'page' || _elements.photoFB )
                {
                    if ( !
_elements.photoFB.$canvas.hasClass('peep_floatbox_loading') )
                    
_elements.photoFB.$canvas.prepend(_elements.preloader.css('left', $(window).width() / 2 - 160));
                }
            },
            
hidePreloader: function()
            {
                
_elements.preloader.detach();
            },
            
isNotEmptyObject: function( object )
            {
                var 
keys;
                
                if ( !
object || object !== Object(object) || (keys = Object.keys(object)).length === 0 )
                {
                    return 
false;
                }
                
                return 
keys.some(function( item )
                {
                    if ( [
'photoId', 'layout', 'searchVal', 'id'].indexOf(item) !== -1 )
                    {
                        return 
false;
                    }
                    
                    switch ( 
_vars.toString.call(object[item]) )
                    {
                        case 
'[object Array]':
                            return 
object[item].length !== 0;
                        case 
'[object Number]':
                            return !
isNaN(object[item]) && object[item] > 0;
                        default:
                            return 
object[item] != null;
                    }
                });
            },
            
getScreenProportion: function( width, height, screenWidth, screenHeight )
            {
                
screenWidth = screenWidth || window.screen.width;
                
screenHeight = screenHeight || window.screen.height;
                
                var 
rw = screenWidth / width, rh = screenHeight / height, ratio = rw > rh ? rw : rh;
                
                return [
Math.round(screenWidth / ratio), Math.round(screenHeight / ratio)];
            }
        },
        
arrayUtils:
        {
            
unionToList: function()
            {
                var 
arr = [].splice.call(arguments, 0)
                    .
reduce(function( previousValue, currentItem )
                    {
                        return 
previousValue.concat(currentItem);
                    }, [])
                    .
map(function( item )
                    {
                        return +
item;
                    })
                    .
filter(function( item, i, arr )
                    {
                        return !
isNaN(item) && item > 0 && arr.indexOf(item) === i;
                    });
                    
                var 
event = {listType: []};
                
PEEP.trigger('photo.collectListType', event, _methods);
                
                if ( [
'most_discussed', 'toprated'].concat(event.listType).indexOf(_vars.listType) !== -1 )
                {
                    return 
arr;
                }
                
                return 
arr.sort(function( a, b )
                {
                    return 
b - a;
                });
            },
            
isMatch: function( array1, array2 )
            {
                if ( 
array1.length === 0 || array2.length === 0 )
                {
                    return 
false;
                }

                return (
array1[array1.length - 1] <= array2[0] + 1 || array1[0] + 1 <= array2[array2.length - 1]);
            },
            
push: function( dst, src )
            {
                if ( 
src.length )
                {
                    
dst.push(src);
                    
dst.sort(_methods.arrayUtils.sortBySum);
                }
            },
            
getMinInList: function( list )
            {
                var 
min;
                
                list.forEach(function( 
item )
                {
                    var 
_min = Math.min.apply(0, item);
                    
                    if ( 
min === undefined )
                    {
                        
min = _min;
                    }
                    else
                    {
                        if ( 
_min < min )
                        {
                            
min = _min;
                        }
                    }
                });
                
                return 
min;
            },
            
getMaxInList: function( list)
            {
                var 
max;
                
                list.forEach(function( 
item )
                {
                    var 
_max = Math.max.apply(0, item);
                    
                    if ( 
max === undefined )
                    {
                        
max = _max;
                    }
                    else
                    {
                        if ( 
_max > max )
                        {
                            
max = _max;
                        }
                    }
                });
                
                return 
max;
            },
            
sortBySum: function( a, b )
            {
                return 
b.reduce(function( p, c ){return p + c}) - a.reduce(function( p, c){return p + c});
            }
        },
        
locationUtils: {
            
splitPath: function( pathname )
            {
                
pathname = pathname || location.pathname.substr(1);
                
                return 
pathname.split('/');
            },
            
parseSearch: function( search )
            {
                
search = search || location.search.substr(1);
                
                var 
chunks = search.split('&'), result = {}, chunk;
                
                
chunks.forEach(function( item )
                {
                    
chunk = item.split('=');
                    
                    if ( 
chunk.length === 2 )
                    {
                        
result[decodeURIComponent(chunk[0])] = decodeURIComponent(chunk[1]);
                    }
                });

                return 
result;
            },
            
compile: function ( uriComponents )
            {
                var 
keys;
                
                if ( !
uriComponents || uriComponents !== Object(uriComponents) || (keys = Object.keys(uriComponents)).length === 0 )
                {
                    return 
'';
                }
                
                var 
result = [];

                
keys.forEach(function( item )
                {
                    
result.push(encodeURIComponent(item) + '=' + encodeURIComponent(uriComponents[item]));
                });
                
                return 
result.join('&');
            },
            
parseUrl: function( url, component )
            {
                var 
a = document.createElement('a'), result = {};
                
a.href = url;
                
                
component.forEach(function( item )
                {
                    
result[item] = a[item];
                });
                
                return 
result;
            }
        },
        
history: {
            
replaceState: function( photoId, listType, extend, data, photo )
            {
                if ( !
photoId || isNaN(+photoId) )
                {
                    return 
false;
                }
                
                
listType = listType || _vars.DEFAULT_LIST;
                
                var 
state;

                if ( (
state = window.history.state) == null )
                {
                    
state = {
                        
initPath: location.pathname,
                        
initSearch: location.search
                    
};
                }

                var 
url = _methods.locationUtils.parseUrl(_vars.urlHome, ['pathname'])['pathname'] + 'photo/view/' + photoId + '/' + listType, search;

                if ( 
url.charAt(0) != '/' )
                {
                    
url = '/' + url;
                }
                
                if ( 
extend && (search = _methods.locationUtils.compile(extend)).length )
                {
                    
url += '?' + search;
                }
                
                if ( !
_methods.fullscreen.isFullscreen() )
                {
                    
window.history.replaceState(state, null, url);
                }
                
                $(
window).triggerHandler('popstate.photo', {
                    
photoId: photoId,
                    
listType: listType,
                    
data: data,
                    
photo: photo
                
});
            },
            
popstate: function( event, data )
            {
                if ( 
data && data.photoId && !isNaN(+data.photoId) )
                {
                    
_methods.showPhotoCmp(+data.photoId, data.listType, data.data, data.photo);
                }
            },
            
goInitState: function()
            {
                var 
state = window.history.state;
                var 
url = (state.initPath ? state.initPath : _methods.locationUtils.parseUrl(_vars.urlHome, ['pathname'])['pathname'] + 'photo/viewlist/' + _vars.DEFAULT_LIST) + state.initSearch;
                
                
window.history.replaceState(null, null, url);
            }
        },
        
createFloatboxContent: function()
        {
            if ( 
_elements.hasOwnProperty('content') )
            {
                return 
_elements.content;
            }
            
            
_elements.content = $(document.getElementById('peep-photo-view')).clone(true).removeAttr('id');
            
_elements.content.find('.peep_photoview_slide_time').slider({min: 3, max:10, range: 'min',
                
slide: function( event, ui )
                {
                    var 
tip = $(this).data('peepTip');
                    
                    
tip.find('.peep_tip_title').html(PEEP.getLanguageText('photo', 'slideshow_interval') + ui.value);
                    
_vars.interval = ui.value * 1000;
                    
_methods.updateSlideshow();
                }
            });
            
PEEP.trigger('photo.onAfterContentRender', [_elements.content], _methods);
            
            return 
_elements.content;
        },
        
resizeWindow: function(event)
        {
            if ( 
_methods.fullscreen.isFullscreen() || !_methods.fullscreen.isPhotoInit() ) return;

            if ( 
_vars.timerId )
            {
                
clearTimeout(_vars.timerId);
            }
            
            
_vars.timerId = setTimeout(function()
            {
                
_methods.fitSize(_vars.photoId, function( offset )
                {
                    
PEEP.trigger('photo.beforeResize', [_vars.photoId], _methods);

                    if ( 
_vars.layout !== 'page' )
                    {
                        var 
options = {};

                        if ( 
_vars.isClassic )
                        {
                            
_elements.content.find('.peep_photoview_stage_wrap').css({float: 'none', height: _vars.minSize.height, width: ''});
                            
options.width = offset.width;
                        }
                        else
                        {
                            
_elements.content.find('.peep_photoview_stage_wrap').css({width: _vars.minSize.width, height: _vars.minSize.height});
                            
_elements.content.css('height', _vars.minSize.height);
                            
options = offset;
                        }

                        
_elements.photoFB.fitWindow(options);
                    }
                    else
                    {
                        
_elements.content.find('.peep_photoview_stage_wrap').css({height: offset.height, width: offset.width});
                    }
                    
                    
_methods.updateComment({entityType :'photo_comments', entityId: _vars.photoId});
                    
                    
PEEP.trigger('photo.afterResize', [_vars.photoId], _methods);
                }, 
true);
            }, 
100);
        },
        
runSlideshow: function()
        {
            
_vars.isRunSlideshow = true;
            
_vars.slideshowTimeId = setInterval(function()
            {
                if ( 
_vars.animate )
                {
                    return;
                }

                
_vars.animate = true;
                var 
dataToSend = _methods.getDataToSend(_vars.photoId, _vars.listType);
                
                if ( !
_methods.isCached(dataToSend.params.nextId) )
                {
                    
_vars.animate = false;
                    var 
dataForNext = _methods.getDataToSend(dataToSend.params.nextId, _vars.listType);
                
                    if ( 
_methods.utils.isNotEmptyObject(dataForNext.dataToSend) )
                    {
                        $.
extend(dataForNext.dataToSend, {ajaxFunc: 'getFloatbox', listType: _vars.listType});
                        
dataForNext.params.loadCurrent = false;
                        
_methods.fetchCmp(dataForNext.dataToSend, dataForNext.params);
                    }
                }
                else
                {
                    
_methods.setId(dataToSend.params.nextId);
                    
                    var 
nextCmp = _methods.getPhotoCmp(dataToSend.params.nextId), image = new Image(), url;
                    
                    if ( +
nextCmp.photo.hasFullsize )
                    {
                        
url = nextCmp.photo.urlFullscreen;
                    }
                    else
                    {
                        
url = nextCmp.photo.url;
                    }
                    
                    
image.src = url;
                    
                    if ( !
image.complete )
                    {
                        
_vars.animate = false;
                        
_methods.stopSlideshow();
                        
_methods.runSlideshow();
                        
                        return;
                    }
                    
                    var 
css = {display: 'inline-block'}, properties = {};

                    if ( 
_vars.effect === 'slide' )
                    {
                        
css.top = 0;
                        
css.right = screen.width;
                        
properties = {left: 0};
                    }
                    else
                    {
                        
css.opacity = 0;
                        
properties = {opacity: 1};
                    }

                    var 
img = _elements.content.find('img.peep_photo_view');
                    var 
slideImg = $('img.slide', _elements.content).css(css);

                    
slideImg[0].src = url;
                    
img.animate({opacity: 0}, {duration: 300});
                    
slideImg.animate(properties, {duration: 300, complete: function()
                    {
                        var 
complete = function()
                        {
                            
img.css({opacity: 1});
                            
slideImg.hide();
                            
_vars.animate = false;
                        };

                        
img[0].src = url;
                        
img[0].complete ? complete.call(img) : img[0].onload = complete;
                    }});
                }
            }, 
_vars.interval || 3000);
        },
        
stopSlideshow: function()
        {
            if ( 
_vars.slideshowTimeId )
            {
                
clearInterval(_vars.slideshowTimeId);
            }
        },
        
updateSlideshow: function()
        {
            
_methods.stopSlideshow();
            
            if ( 
_vars.isRunSlideshow )
            {
                
_methods.runSlideshow();
            }
        },
        
init: function()
        {
            if ( 
_vars.isInitialized )
            {
                return;
            }
            
            
_vars.isInitialized = true;

            $(
window).on({'resize.photo': _methods.resizeWindow, 'popstate.photo': _methods.history.popstate});
            $(
document).on(_vars.fullScreen.fullscreenchange + '.photo', _methods.fullscreen.onchange);

            var 
content = $(document.getElementById('peep-photo-view'));
            
            if ( 
_methods.fullscreen.enabled() )
            {
                $(
'.peep_photoview_fullscreen', content).on('click', function()
                {
                    
_methods.fullscreen.isFullscreen() ? _methods.fullscreen.exit() : _methods.fullscreen.request();
                });
                
                $(
'.peep_photoview_info_btn', content).on('click', function( event )
                {
                    if ( !
_methods.fullscreen.isFullscreen() )
                    {
                        
event.stopImmediatePropagation();
                    }
                    
                    
PEEP.trigger('photo.beforeResize', [_vars.photoId], _methods);
                    
                    if ( $(
this).hasClass('open') )
                    {
                        $(
this).removeClass('open').addClass('close');
                        var 
wrap = _elements.content.find('.peep_photoview_stage_wrap');
                        
                        
wrap.width(screen.width - 400);
                        
                        if ( 
_vars.isClassic )
                        {
                            
wrap.css('float', 'left');
                            
_elements.content.find('.peep_photoview_info').removeClass('peep_photoview_pint_mode');
                        }
                        else
                        {
                            
_elements.content.find('.jspPane').css('left', 0);
                        }
                        
                        
_methods.updateComment({entityType: 'photo_comments', entityId: _vars.photoId});
                        
                        
PEEP.trigger('photo.afterInfoShow', [_vars.photoId], _methods);
                    }
                    else
                    {
                        $(
this).removeClass('close').addClass('open');
                        
_elements.content.find('.peep_photoview_stage_wrap').width(screen.width);
                        
                        if ( 
_vars.fbHasContent )
                        {
                            
PEEP.removeScroll(_elements.content.find('.peep_photo_scroll_cont'));
                        }
                        
                        
PEEP.trigger('photo.afterInfoHide', [_vars.photoId], _methods);
                    }
                    
                    
PEEP.trigger('photo.afterResize', [_vars.photoId], _methods);
                });
                
                var 
timerId;
                
                $(
'.peep_photoview_slide_settings', content).on({
                    
mouseenter: function()
                    {
                        if ( 
timerId )
                        {
                            
clearTimeout(timerId);
                        }
                        
                        $(
'.peep_photoview_slide_settings_controls', _elements.content).stop(true).css({display: 'inline-block', opacity: 1});
                    }
                });
                $(
'.peep_photoview_bottom_menu_wrap', content).on({
                    
mouseleave: function()
                    {
                        if ( 
timerId )
                        {
                            
clearTimeout(timerId);
                        }
                        
                        
timerId = setTimeout(function()
                        {
                            $(
'.peep_photoview_slide_settings_controls', _elements.content).fadeOut(1000);
                        }, 
5000);
                    }
                });
                
                $(
'.peep_photoview_slide_settings_effect', content).on('click', function()
                {
                    $(
'.peep_photoview_slide_settings_effect', _elements.content).removeClass('active');
                    
_vars.effect = $(this).addClass('active').attr('effect');
                    
_methods.updateSlideshow();
                });
                
                $(
'.peep_photoview_play_btn', _elements.content).on('click', function( event )
                {
                    if ( !
_methods.fullscreen.isFullscreen() )
                    {
                        
event.stopImmediatePropagation();
                    }
                    
                    if ( $(
this).hasClass('stop') )
                    {
                        
_vars.isRunSlideshow = false;
                        
_methods.stopSlideshow();
                        $(
this).removeClass('stop');
                    }
                    else
                    {
                        
_methods.runSlideshow();
                        $(
this).addClass('stop');
                    }
                });
            }

            
PEEP.bind('photo.onAfterEditPhoto', function( photoId )
            {
                
_methods.deletePhotoCmp(photoId);
            });
            
PEEP.bind('photo.onChangeListType', function( listType )
            {
                if ( 
listType != _vars.listType )
                {
                    
_methods.clearHistory();
                }
            });
            
PEEP.bind('photo.deleteCache', function( photos )
            {
                if ( !Array.
isArray(photos) || photos.length === 0 ) return;

                
photos.forEach(function( photoId )
                {
                    
_methods.deletePhotoCmp(photoId);
                });
            });

            var 
event = {
                
selectors: [
                    
'.peep_photoview_stage_wrap',
                    
'img.peep_photo_img'
                
]
            };
            
PEEP.trigger('photo.collectChangePhotoSelectors', event);
            
content.on('click', event.selectors.join(','), function( event )
            {
                if ( !$(
event.target).is(event.currentTarget) )
                {
                    return;
                }

                if ( (
event.pageX - $(this).offset().left) > ($(this).width() / 2) )
                {
                    
_methods.loadNextPhoto();
                }
                else
                {
                    
_methods.loadPrevPhoto();
                }

                
event.stopImmediatePropagation();
            });

            $(
'.peep_photoview_arrow_left', content).on('click', _methods.loadPrevPhoto);
            $(
'.peep_photoview_arrow_right', content).on('click', _methods.loadNextPhoto);


            $.
fn.extend({
                
photoFocus: function () {
                    
this.each(function () {
                        try
                        {
                            if(
this.setSelectionRange)
                            {
                                
this.focus();
                                
this.setSelectionRange(_vars.curPos, _vars.curPos);
                            }
                            else if (
this.createTextRange)
                            {
                                var 
range = this.createTextRange();

                                
range.collapse(true);
                                
range.moveEnd('character', _vars.curPos);
                                
range.moveStart('character', _vars.curPos);
                                
range.select();
                            }
                        }
                        catch ( 
e ){ }
                    });

                    return 
this;
                }
            });
        }
    };
    
    
window.photoView = Object.defineProperties({}, {
        
init: {value: _methods.init},
        
setId: {value: _methods.setId}
    });
    
})(
window, window.jQuery, window.photoViewParams);
?>
Онлайн: 1
Реклама