String.prototype.trim=function() {return this.replace(/(^\s+)|(\s+$)/g, "");}


var updateWall = 60; // Интервал обновления стены

if (typeof MyUser == 'undefined') MyUser = {}

$.preloadImages = function(images) {

    for (var i in images)
        $('<img>').attr('src', images[i]);
}

$.preloadImages([
        '/s/images/loading.gif',
        '/s/images/loading-gray.gif',
        '/s/images/loading-small.gif',
        '/s/images/process.gif',
        '/s/images/backgrounds/bg_red.gif',
        '/s/images/backgrounds/bg_salad.gif',
        '/s/images/backgrounds/bg_black.gif',
        '/s/images/backgrounds/bg_yellow.gif',
        '/s/images/backgrounds/popup-quest-border.png',
        '/s/images/backgrounds/treasury.png',
        '/s/images/backgrounds/obj-info-t.png',
        '/s/images/backgrounds/obj-info-b.png',
        '/s/images/backgrounds/modify-price-list.png',
        '/s/images/backgrounds/price-list-b.png',
        '/s/images/backgrounds/modify-carousel-body.png',
        '/s/images/backgrounds/cdoka-field.png',
        '/s/images/icons/modify-carousel-larr.png',
        '/s/images/icons/modify-carousel-rarr.png',
        '/s/images/icons/actions-full-info.png',
        '/s/images/icons/actions-short-info.png',
        '/s/images/icons/icons-shop.png',
        '/s/images/icons/info.png',
        '/s/images/icons/icon-reward.png'
    ]);


/**
 * Модальное окно
 */
$.modal = function(o) {

    //console.time('modal');

    // Настройки по умолчанию
    var o = $.extend({
        name        : '',                // Идентификатор окна
        skin        : '',                // Скин окна : дополнительный класс
        icon        : '',                // Иконка    : дополнительный класс
        type        : 'normal',          // Тип окна  : normal, dialog
        header      : false,             // Заголовок окна
        description : false,             // Текст под заголовком
        content     : '',                // Контент
        width       : 450,               // Ширина окна в пикселях
        height      : null,              // Высота окна в пикселях
        fade        : 250,               // Скорость появления/затухания тени
        opacity     : .5,                // Прозрачность тени
        close       : true,              // Отображение кнопки "Закрыть"
        closeall    : false,             // Закрыть все окна
        onOpen      : function() {},     // Выполняется после открытия окна
        onClose     : function() {},     // Выполняется после закрытия окна
        buttons     : []                 // Массив объектов дополнительных кнопок
    }, o);

    // Функция закрытия окон
    var close = function() {
        if (o.close)
            if (o.closeall) {
                $('body > div.modal').remove();
            } else {
                $('body > div.modal:eq(0)').remove();

                if (o.type != 'dialog')
                    $('body > div.modal:eq(0)').show();
            }

            if (!$('body > div.modal:eq(0)').size())
                $('body > div.modal-shadow:eq(0)')
                    .fadeTo(o.fade, 0, function() { $(this).remove() });

            $('body > div.modal-shadow:eq(0)').css({
                zIndex: $('body > div.modal:eq(0)').css('zIndex') - 1
            });

            o.onClose();
    }

    // Если нет открытого окна с таким именем,
    // то открываем новое окно
    if (!$('.'+o.name).size()) {
        var obj         = $('<div/>').addClass('modal');
        var body        = $('<div/>').addClass('m-body');
        var icon        = $('<div/>').addClass('m-icon').addClass(o.icon);
        var header      = $('<div/>').addClass('m-header');
        var description = $('<div/>').addClass('m-description');
        var content     = $('<div/>').addClass('m-content');
        var clear       = $('<div/>').addClass('m-clear');
        var footer      = $('<div/>').addClass('m-footer');
        var shadow      = $('<div/>').addClass('modal-shadow');

        // Изменение позиции окна
        var position = function() {
            var pos;
            var top = (parseInt($(window).height()) - parseInt(obj.outerHeight())) / 2;

            if (top < 0) {
                top = 0;
                pos = 'absolute';
            } else {
                pos = 'fixed';
            }

            obj.css({top: top, position: pos});
        }

        // Скрытие предыдущего окна
        if (o.type != 'dialog')
            $('body > div.modal:eq(0)').hide();

        // z-index
        var zIndex = 999990 + ($('body > div.modal').size() * 2);

        // Компоновка элементов
        icon.appendTo(body);
        header.css({display:'none'}).appendTo(body);
        description.css({display:'none'}).appendTo(body);
        content.css({display:'none'}).appendTo(body);
        clear.appendTo(body);
        footer.appendTo(body);
        body.appendTo(obj);

        obj.css({
                width: o.width,
                height: o.height,
                marginLeft: -(o.width / 2),
                zIndex: zIndex
            })
            .addClass(o.name)
            .addClass(o.skin)
            .prependTo('body');

        // Установка заголовка
        if (o.header)
            header.html(o.header).css({display:'block'}).wrapInner('<h2/>');

        // Установка текста под заголовком
        if (o.description)
            description.css({display:'block'}).html(o.description);

        // Установка контента
        if (o.content)
            content.css({display:'block'}).html(o.content);

        // Отображение кнопки "Закрыть"
        if (o.close) {
            o.buttons = o.buttons.concat({title: 'Закрыть', action: close});
        }

        // Добавление кнопок
        for (var i in o.buttons) {

            if (o.buttons[i].type == 'link') {

                var element = $('<a/>').attr({
                        href: '#'
                    })
                    .addClass(o.buttons[i].name)
                    .addClass(o.buttons[i].position)
                    .text(o.buttons[i].title);

            } else {

                var element = $('<input/>').attr({
                        type: 'button',
                        value: o.buttons[i].title
                    }).addClass(o.buttons[i].name);

            }

            element.bind('click', o.buttons[i].action);

            footer.append(element);
        }

        // Отображение тени под окном
        if (!$('body > div.modal-shadow:eq(0)').size())
            shadow
                .fadeTo(0, 0)
                .prependTo($('body'))
                .fadeTo(o.fade, o.opacity);

        // Установка z-index и биндов для тени
        $('body > div.modal-shadow:eq(0)').css({
            zIndex: $('body > div.modal:eq(0)').css('zIndex') - 1
        }).unbind().bind('click', close);

        // Изменение позиции окна, при
        // изменении размеров окна браузера
        $(window).bind('resize', position);

        o.onOpen(obj);

        // Установка позиции окна при открытии
        position();
    }

    var methods = {
        close: close
    }

    //console.timeEnd('modal');

    return methods;
}








$(document).ready(function() {

    /* >>> TOOLTIP */
    if ($(".short-info").length) {
        var tooltipBox = $(".short-info");
        var tooltipContent = $(".oi-body",popupBox);
        var tooltipObj=null;
        var tooltipLinkOffset=null;
        var tooltipLinkParentOffset=null;

        function tooltipShow(){
            tooltipBox.addClass("short-info_loading").show();
        }
        function tooltipHide(){
            tooltipBox.hide();
        }
        function tooltipLoad(linkUrl){
            tooltipContent.load(linkUrl, function() {
                if ($('#short-info-error').length) {
                    var msg={
                        type: 'error',
                        message: $('#short-info-error').html(),
                        description: '',
                        icon: 'e_error'
                    };
                    popupMsgAddMessage(msg);
                    tooltipHide();
                }
                else {
                    tooltipBox.removeClass("short-info_loading");
                    tooltipBox.css({
                        "left": ( tooltipLinkOffset.left-tooltipLinkParentOffset.left-( tooltipBox.width() - tooltipObj.width() )/2 ),
                        "top": (tooltipLinkOffset.top-tooltipLinkParentOffset.top-tooltipBox.height())
                    });

                    $(".obj-info-a-info",tooltipContent).click(function(){
                        popupContent.html('');
                        popupShow();
                        popupLoad('/ajax'+$(this).attr("href"));
                        $(".short-info").hide();
                        return false;
                    })
                    .trigger('click');

                    $(".obj-act:not(.obj-info-a-disable)",tooltipContent).click(actionOnObject);
                    $(".obj-info-a-disable",tooltipContent).click(function(){return false});
                }
            });
        }








        /**
         * Пожертвовать монетку в Цдоку.
         */
        $('#user-cdoka-link').bind('click', function() {
            // Открытие всплывающего окна
            tooltipHide();
            tooltipObj = $(this);
            var ttCss={ 'left': -103, 'top': 100 };
            switch (MyUser.island) {
                case 1: ttCss={ 'left': -103, 'top': 100 }; break;
                case 2: ttCss={ 'left': -90,  'top': 140 }; break;
                case 3: ttCss={ 'left': -40,  'top': 159 }; break;
            }
            tooltipBox.css(ttCss);
            tooltipShow();
            tooltipBox.removeClass("short-info_loading");

            // Общее количество монет
            var total = parseInt($('#user-coins').text());

            // Контейнер для формы
            var html = $('<div>').attr({ 'id':'cdoka-form' });

            // Кнопка декремента монет
            var btnDown = $('<a>').attr({
                                'class' : 'down',
                                'href'  : '#'
                            }).appendTo(html).html('-');

            // Кнопка инкремента монет
            var btnUp = $('<a>').attr({
                                'class' : 'up',
                                'href'  : '#'
                            }).appendTo(html).html('+');

            // Поле для ввода количества монет
            var field = $('<input>').attr({
                                'type'  : 'text',
                                'name'  : 'count',
                                'class' : 'count',
                                'value' : '1'
                            }).appendTo(html);

            // Блок для кнопок
            var buttons = $('<div>').addClass('buttons').appendTo(html);

            // Кнопка "Пожертвовать"
            var button = $('<input>').attr({
                                'type'  : 'button',
                                'class' : 'put',
                                'value' : ' Пожертвовать '
                            }).removeAttr('disabled')
                            .appendTo(buttons);

            // Если нет монет, устанавливаем значение поля в ноль
            // и отключаем кнопку "Пожертвовать"
            if (total <= 0) {
                field.val(0);
                button.attr({ 'disabled':'disabled' });
            }

            // Инкремент/декремент количества монет
            var change = function(direction) {
                var count = parseInt(field.val());

                if (direction == 'down' && count > 1)
                    field.val(count - 1);

                if (direction == 'up' && count < total)
                    field.val(count + 1);
            }

            // Автоматический инкремент/декремент количества монет
            var scroll = function(direction, run) {
                if (run)
                    t = setInterval(function() { change(direction) }, 250);
                else
                    clearInterval(t);
            }

            // Действия кнопки декремента
            btnDown.bind('click', function() {
                change('down');
                return false;
            }).bind('mousedown', function(e) {
                scroll('down', true);
            }).bind('mouseup', function(e) {
                scroll('down', false);
            });

            // Действия кнопки инкремента
            btnUp.bind('click', function() {
                change('up');
                return false;
            }).bind('mousedown', function(e) {
                scroll('up', true);
            }).bind('mouseup', function(e) {
                scroll('up', false);
            });

            // Действия поля ввода
            field.bind('focus blur', function() {
                var count = parseInt(field.val());

                if (field.val() == '' || count < 1 && count != 0)
                    field.val(1);

                if (count > total)
                    field.val(total);
            }).bind('keyup', function() {
                var value = field.val();
                var re = /[^0-9]/gi;

                if (re.test(value)) {
                    value = value.replace(re, '');
                    field.val(value);
                }
            }).bind('keypress', function(e) {
                if (e.keyCode == 38)
                    change('up');

                if (e.keyCode == 40)
                    change('down');
            });

            // Установка контента
            tooltipContent.html(html);

            // Действия кнопки "Пожертвовать"
            button.bind('click', function() {
                if (field.val() == '0')
                    return false;

                $(this).prop('disabled', true);

                $(document).unbind('click');

                $.ajax({
                    url        : '/ajax/user/id' + MyUser.id + '/cdoka/',
                    data       : { 'count' : parseInt(field.val()) },
                    dataType   : 'json',
                    type       : 'post',
                    success: function(data) {

                        if (data.isOk) {
                            $.modal({
                                name    : 'cdoka',
                                skin    : 'm-success',
                                header  : data.messages[0].message,
                                content : false
                            });

                            updateUser(data);
                        }
                    },
                    complete: function() {
                        tooltipHide();
                    }
                });

            });

            // Закрытие окна по клику на документе
            $(document).bind('click', dialogBlur);

            return false;
        });



        // Экшн объекта
        $(".short-info-link").click( function(){

            tooltipHide();

            tooltipObj = $(this);
            tooltipLinkOffset = tooltipObj.offset();
            tooltipLinkParentOffset = tooltipObj.offsetParent().offset();

            tooltipContent.html('');
            tooltipShow();
            tooltipBox.css({
                'left': ( tooltipLinkOffset.left-tooltipLinkParentOffset.left-( tooltipBox.width() - tooltipObj.width() )/2 ),
                'top': (tooltipLinkOffset.top-tooltipLinkParentOffset.top-tooltipBox.height())
            });

            tooltipLoad('/ajax'+$(this).attr("href"));

            $(document).bind('click', dialogBlur);

            return false;

        });

        var dialogBlur = function(event){

            var target = $(event.target);
            if (
                target.is('.short-info-link') || target.is('.short-info') || target.parents('.short-info').length
             || target.parents('.popup-box-msg').length
                ) {
                return;
            }
            tooltipHide();
            $(document).unbind('click');
        }
    }
    /* <<< TOOLTIP */






    /* >>> POPUP shop */
    if ($('.setup-info-link').length) {
        var popupHtmlM = '<div class="popup-box-m" style="display:none"><div class="box-shadow" style="display:none"></div><div class="popup-modify"><div class="popup-modify-body"></div></div></div>';
        $("body").append(popupHtmlM);

        var popupBoxM = $(".popup-box-m");
        var popupShadowM = $(".box-shadow",popupBoxM).bind('click', function() {popupHideM()});
        var popupContentM = $(".popup-modify-body",popupBoxM);

        function popupShowM(){
            popupBoxM.addClass("popup-box_loading").show();
            popupShadowM.css({
                "width":$(document).width(),
                "height":$(document).height(),
                "display":"block",
                "opacity":0
            })
            .animate({opacity: 0.5});
        }
        function popupHideM(){
            popupShadowM.animate({opacity: 0});
            popupBoxM.hide();
        }
        function popupLoadM(linkUrl){
            popupContentM.load(linkUrl, function() {
                if ($('#setup-error').length) {
                    var msg={
                        type: 'error',
                        message: $('#setup-error').html(),
                        description: '',
                        icon: 'e_error'
                    };
                    popupMsgAddMessage(msg);
                    popupHideM();
                }
                else {
                    popupBoxM.removeClass("popup-box_loading");
                    $("#price-close",popupBoxM).click(popupHideM);
                }
            });
        }

        function popupLoadMClick() {
            popupContentM.html('');
            popupShowM();
            popupLoadM('/ajax'+$(this).attr("href"));
            return false;
        }

        $(".setup-info-link").click(popupLoadMClick);

        $.fn.modifyGallery = function(current){
            var gallery = $(this);
            var galleryPrev = $(".larr",gallery);
            var galleryNext = $(".rarr",gallery);
            var galleryItems = $(".modify-carousel-body ul",gallery);
            var galleryItem = $("li",galleryItems);
            var galleryItemsCount = galleryItem.length
            var galleryItemWidth = galleryItem.eq(0).width();

            var galleryCuren = (!current) ? 1 : current;
            var galleryCurenNew = (!current) ? 1 : current;
            var galleryCurenTmp = 0;
            var userCurrent = current;

            galleryItems.css({"left": -galleryItemWidth*(galleryCurenNew-2)});
            galleryItems.width( galleryItemWidth*galleryItemsCount );

            galleryNext.click(function(){
                galleryMove( 1 )
            })

            galleryPrev.click(function(){
                galleryMove( 0 )
            })

            function galleryMove(key){
                galleryCurenTmp = galleryCurenNew;
                key ? galleryCurenTmp++ : galleryCurenTmp--;
                if ( galleryCurenTmp >= (galleryCuren) && galleryCurenTmp <= (galleryItemsCount) ){
                    galleryCurenNew = galleryCurenTmp;
                    galleryCreateItem();
                    galleryItems.animate({left: -(galleryItemWidth*(galleryCurenNew-2))});
                }
            }

            function galleryCreateItem(){

                // подтягиваем из массива данные
                var objInfo = objParams[galleryCurenNew];

                // название
                $('.price-title').html(objInfo.title);
                // устанавливаем цены и подгоняем размер списка
                var c=0;
                var noMoney=false;
                if (objInfo.experience.need>0) {
                    c++;
                    $('.treasury #price-experience').show();
                    $('.treasury #price-experience .c').html(objInfo.experience.need);
                    if (objInfo.experience.need>MyUser.experience) {
                        $('.treasury #price-experience .d').html(objInfo.experience.need-MyUser.experience);
                        $('.treasury #price-experience em').addClass('n');
                        noMoney=true;
                    }
                    else {
                        $('.treasury #price-experience em').removeClass('n');
                    }
                }
                else {
                    $('.treasury #price-experience').hide();
                }
                for (var i in objInfo.cost) {
                    eval('var cost=objInfo.cost.'+i+'; var have=MyUser.'+i);
                    if (cost>0) {
                        c++;
                        $('.treasury #price-'+i).show();
                        $('.treasury #price-'+i+' .c').html(cost);
                        if (cost>have) {
                            $('.treasury #price-'+i+' .d').html(cost-have);
                            $('.treasury #price-'+i+' em').addClass('n');
                            noMoney=true;
                        }
                        else {
                            $('.treasury #price-'+i+' em').removeClass('n');
                        }
                    }
                    else {
                        $('.treasury #price-'+i).hide();
                    }
                }
                // устанавливаем данные требуемых объетов
                $('.cost-properties .require a').unbind('click');
                $('.cost-properties .require').remove();
                if (objInfo.require) {
                    var nHtml='';
                    var required=' (отсутствует)';
                    for (var i in objInfo.require) {
                        eval('var requireInfo=objInfo.require.'+i);
                        nHtml+='<li class="require"><a href="/user/id'+MyUser.id+'/game/'+requireInfo.keyname+'/setup/" title="'+requireInfo.title+(requireInfo.haveit?'':required)+'"><img class="" alt="" src="/s/skins/skin-1/i/'+requireInfo.keyname+'/require-'+(requireInfo.haveit?'ok':'no')+'.png"></a></li>';
                        c++;
                    }
                    $('.cost-properties').prepend(nHtml);
                    $(".cost-properties .require a").click(popupLoadMClick);
                }
                else {}
                $('.treasury').attr('id','ul-price-'+c);

                // если эта версия объекта уже у меня или нет денег - блокируем покупку
                if (!objInfo.canBuy || galleryCurenNew == userCurrent || noMoney) {
                    $('#price-buy').attr("disabled", true); ;
                }
                else {
                    $('#price-buy').removeAttr("disabled");
                }


                c=0;
                // устанавливаем данные урожая
                if (objInfo.production) {
                    $('#price-harvest').attr('title',objInfo.production.title).show();
                    $('#price-harvest img').attr('class','p-icon '+objInfo.production.keyname);
                    $('#price-harvest em').html(objInfo.production.quantity.max);
                    $('#price-time').show();
                    $('#price-time em').html(objInfo.production.phases.ripen+' мин');
                    c=2;
                }
                else {
                    $('#price-harvest').hide();
                    $('#price-time').hide();
                }

                // устанавливаем данные ресурсов
                $('.price-properties .price-resource').remove();
                if (objInfo.resources) {
                    $('#price-resources').show();
                    var nHtml='';
                    for (var i=0;i<objInfo.resources.length;i++) {
                        var resInfo=objInfo.resources[i];
                        nHtml+='<li class="price-resource"><span class="'+resInfo.keyname+'" title="'+resInfo.title+'"><img src="/s/images/common/x.gif" alt="" class="p-icon '+resInfo.keyname+'"/></span></li>';
                        c++;
                    }
                    $('.price-properties').append(nHtml);
                    //$('#price-resources').html(nHtml).show();
                    //c++;
                }
                else {
                    //$('#price-resources').hide();
                }

                $('.inform').attr('id','ul-price-'+c);
            }

            galleryCreateItem();

            galleryItems.find("a").click(function(){return false;})

            $('#price-buy').click(function (){
                var objInfo=objParams[galleryCurenNew];

                var post = {
                    ajax: 'ajax',
                    level: objInfo.level
                };
                $.ajax({
                    url: '/ajax'+$('.object-setup-'+objInfo.keyname).attr('href').replace(/\/setup\/$/,'/buy/'),
                    type: 'post',
                    data: post,
                    success: buyDone
                });

            });
            function buyDone(data) {
                updateObjects(data);
                updateUser(data);
                popupHideM();
            }
        }
    }
    /* <<< POPUP shop */


    /* >>> POPUP message */

    var popupMsgHtml = '<div class="popup-box-msg" style="display:none"><div class="box-shadow" style="display:none"></div><div class="popup-info-msg"><div class="popup-info-msg_i"><div class="popup-info-msg-body clearfix"><div class="msg-icon"><span></span></div><div class="msg-content"><div class="msg-title"></div><div class="msg-message"></div></div><div class="popup-info-msg-foot"><input type="button" id="msg-close" value="закрыть" /></div></div></div></div></div>';
    $("body").append(popupMsgHtml);
    var popupMsgBox = $(".popup-box-msg");
    var popupMsgBorder = $(".popup-info-msg");
    var popupMsgShadow = $(".box-shadow",popupMsgBox).bind('click', function() {popupMsgHide()});
    var popupMsgContent = $(".popup-info-msg_i",popupMsgBox);

    var popupMsgStack=new Array();
    var popupMsgOpened=false;

    $("#msg-close",popupMsgBox).bind('click', function() {popupMsgHide()});


    function popupMsgShow(noClose){
        //popupMsgBox.addClass("popup-box_loading").show();
        popupMsgOpened=true;

        popupMsgBox.show();

        popupMsgBorder.css({
            top: ($(window).height() / 2) + (popupMsgBorder.outerHeight() / 2),
            position: 'fixed'
        })

        popupMsgShadow.css({
            "width":$(document).width(),
            "height":$(document).height(),
            "display":"block",
            "opacity":0
        })
        .animate({opacity: 0.5});
    }

    function popupMsgHide(){
        // если есть еще не показанные сообщения, то показать верхнее
        // иначе закрыть окно
        if (!popupMsgCheckStack(true)) {
            popupMsgShadow.animate({opacity: 0});
            popupMsgBox.hide();
            popupMsgOpened=false;
        }
    }

    function popupMsgSetMessage(msg) {
        popupMsgBorder.attr('class','popup-info-msg');
        switch (msg.type) {
            case 'message':popupMsgBorder.addClass('popup-info-msg-message');break;
            case 'error':popupMsgBorder.addClass('popup-info-msg-error');break;
        }
        $('.msg-title',popupMsgBox).html(msg.message);
        $('.msg-message',popupMsgBox).html(msg.description);
        if (msg.icon=='') {msg.icon='empty';}
        $('.msg-icon span',popupMsgBox).attr('class',msg.icon);
        if (msg.noClose) {
            // открепить события закрытия окна
            $("#msg-close, .box-shadow",popupMsgBox).unbind('click');
            $('.popup-info-msg-foot',popupMsgBox).hide();
        }
    }

    function popupMsgAddMessages(msgArray) {
        // пробегаем по массиву и выбираем не игноренные сообщения
        // их вносим в стэк показа
        for (var i=0;i<msgArray.length;i++) {
            if (!msgArray[i].ignore && (msgArray[i].message.length>0 || msgArray[i].description.length>0)) {
                popupMsgStack.push(msgArray[i]);
            }
        }
        // если стэк не пустой и окно закрыто, то надо показать сообшение
        if (!popupMsgOpened) {
            popupMsgCheckStack();
        }
    }
    function popupMsgAddMessage(msg) {
        // если не игноренное сообщение, то добавляем
        if (!msg.ignore && (msg.message.length>0 || msg.description.length>0)) {
            popupMsgStack.push(msg);
        }
        // если стэк не пустой и окно закрыто, то надо показать сообшение
        if (!popupMsgOpened) {
            popupMsgCheckStack();
        }
    }
    function popupMsgCheckStack(showNew) {
        var msg=popupMsgStack.shift();
        var ok=false;
        if (msg) {
            if (!popupMsgOpened || showNew) {
                popupMsgSetMessage(msg);
            }
            if (!popupMsgOpened) {
                popupMsgShow();
            }
            ok=true;
        }
        return ok;
    }
    /* <<< POPUP message */


    /* >>> POPUP object info */

    var popupHtml = '<div class="popup-box" style="display:none"><div class="box-shadow" style="display:none"></div><div class="popup-info"><div class="popup-info_i"></div></div></div>';
    $("body").append(popupHtml);
    var popupBox = $(".popup-box");
    var popupShadow = $(".box-shadow",popupBox).bind('click', function() {popupHide()});

    var popupContent = $(".popup-info_i",popupBox);

    function popupShow(){
        popupBox.addClass("popup-box_loading").show();
        popupShadow.css({
            "width":$(document).width(),
            "height":$(document).height(),
            "display":"block",
            "opacity":0
        })
        .animate({opacity: 0.5});
    }
    function popupHide(){
        popupShadow.animate({opacity: 0});
        popupBox.hide();
    }
    function popupLoad(linkUrl){
        popupContent.load(linkUrl, function() {
            if ($('#full-info-error').length) {
                var msg={
                    type: 'error',
                    message: $('#full-info-error').html(),
                    description: '',
                    icon: 'e_error'
                };
                popupMsgAddMessage(msg);
                popupHide();
            }
            else {
                popupBox.removeClass("popup-box_loading");
                // добавить события на клик для действий
                $('.act',popupBox).unbind('click');
                $(".act:not(.act-disable)",popupBox).bind('click', actionOnObject);
                $("#full-info-close",popupBox).click(popupHide);

                // Анимация загрузки ингридиента
                $.fn.animateLoad = function() {
                    var obj = $(this);

                    $('[id|="obj-details-ingredient"]').addClass('act-disable');
                    $('.statusbar-with-text > .text', obj).fadeOut(300, function() { $(this).remove() });
                    $('.statusbar-with-text > .scale', obj).animate({ 'width': 0 }, 1000);
                }

                /**
                 * Типы:
                 *
                 * auto   — загрузить ингридиент и запустить производство автоматически
                 * manual — загрузить ингридиент и запустить производство вручную
                 */

                /**
                 * Рецепты
                 */
                var recipes = {
                    wine           : ['grapes'],
                    tallith        : ['wool'],
                    oliveoil       : ['olive'],
                    wheatflour     : ['wheat'],
                    barleyflour    : ['barley'],
                    matzowheat     : ['wheatflour', 'water'],
                    matzobarley    : ['barleyflour', 'water'],
                    matzoeggwheat  : ['wheatflour', 'egg', 'water'],
                    matzoeggbarley : ['barleyflour', 'egg', 'water'],
                }

                // Выбранный рецепт
                var recipe  = false;

                // Запуск производства
                var process = function(user, manufacture, ingredients) {
                    $.ajax({
                        url: '/ajax/user/id'+user+'/manufacture',
                        type: 'post',
                        data: {
                            manufacture: manufacture,
                            ingredients: ingredients
                        },
                        //dataType: 'json',
                        success: function(data) {
                            $.modal({
                                name    : 'message',
                                skin    : 'm-success',
                                header  : 'Производство запущено.',
                                content : false
                            });
                        },
                        error: function() {
                            $.modal({
                                name    : 'error',
                                skin    : 'm-error',
                                header  : 'Произошла ошибка!',
                                content : false
                            });
                        }
                    });
                }

                // Клик на кнопке ингридиента
                $('.load-manual > [id|=obj-details-ingredient]').unbind().bind('click', function() {
                    var obj = $(this);
                    var checked = [];
                    var key = obj.data('object');

                    if (!obj.hasClass('check') && !obj.hasClass('act-disable'))
                        obj.addClass('check');
                    else
                        obj.removeClass('check');

                    // Массив отмеченных ингридиентов
                    $('.load-manual > .check').each(function() {
                        var key = $(this).data('key').substr(2);
                        checked.push(key);
                    });

                    // Определение рецепта
                    for (var id in recipes) {
                        var object = ('#' + recipes[id].join('#,#') + '#'),
                            array  = ('#' + checked.join('#,#') + '#');

                            if (object == array) {
                                recipe = id;
                                break;
                            } else {
                                recipe = false;
                            }
                    }

                    // Если рецепт верный ...
                    if (recipe) {
                        // Клик на кнопке "Загрузить"
                        $('.load-manual > .act-load')
                            .removeClass('act-disable')
                            .css({ backgroundColor: '#79e818' })
                            .animate({ backgroundColor: '#d6f0b6' })
                            .unbind()
                            .bind('click', function() {
                                var obj = $(this);
                                var user = obj.data('user');

                                // Анимация загрузки ингридиентов
                                $('.load-manual > .check').removeClass('check').animateLoad();

                                // Удаление действия с кнопки "Загрузить"
                                obj.addClass('act-disable')
                                    .unbind()
                                    .bind('click', function() { return false })
                                    .css({ backgroundColor: '#f4f3f0' });

                                process(user, key, recipes[recipe]);

                                return false;
                            });
                    } else {
                        // Отключение кнопки "Загрузить"
                        $('.load-manual > .act-load')
                            .addClass('act-disable')
                            .css({ backgroundColor: '#f4f3f0' })
                            .unbind()
                            .bind('click', function() { return false });
                    }

                    return false;
                });

                // Клик на кнопке ингридиента
                $('.load-auto > [id|=obj-details-ingredient]').unbind().bind('click', function() {
                    var obj = $(this);

                    var user = obj.data('user');
                    var key = obj.data('object');
                    var ingredients = [ obj.data('ingredient').substr(2) ]

                    // Анимация загрузки ингридиентов
                    obj.animateLoad();

                    $('.load-auto > [id|=obj-details-ingredient]').unbind().bind('click', function() { return false; });

                    process(user, key, ingredients);

                    return false;
                });

                $('.collect').unbind().bind('click', function() {
                    var obj = $(this),
                        user = obj.data('user'),
                        pid = obj.data('pid'),
                        oid = obj.data('oid');

                    $.ajax({
                        url: '/ajax/user/id'+user+'/collect',
                        data: {
                            user: user,
                            prod_id: pid,
                            obj_id: oid
                        },
                        //dataType: 'json',
                        type: 'post',
                        success: function(data) {
                            obj.unbind().addClass('act-disable');
                            $('.statusbar-with-text > .text', obj).fadeOut(300, function() { $(this).remove() });
                            $('.statusbar-with-text > .scale', obj).animate({ 'width': 0 }, 1000);
                        },
                        error: function() {
                            // --- code ---
                        }
                    });

                    return false;
                });

                $(".act-disable",popupBox).unbind().bind('click', function() { return false; });
            }
        });
    }



    function popupLoadStore(linkUrl) {
        popupContent.load(linkUrl, function() {
            popupBox.removeClass("popup-box_loading");
            // добавить события на клик для элементов продукции
            $('.act',popupBox).unbind('click');
            $(".act:not(.act-disable)",popupBox).click(actionSell);
            $(".act-disable",popupBox).click(function(){
                return false;
            });
            $("#store-close",popupBox).click(popupHide);
        });
    }


    // Отключение интерфейса во время
    // выполнения AJAX запроса
    function disableUI() {
        $('<div/>')
            .addClass('disable-ui')
            .css({
                'position': 'absolute',
                'top': 0,
                'left': 0,
                'width': '100%',
                'height': '100%',
                'z-index': 999999
            })
            .ajaxStop(function() {
                $('.disable-ui').remove();
                $(document).bind('click', dialogBlur);
            })
            .prependTo('body');

        $(document).unbind('click');
    }


    function actionOnObject(e) {
        // отправить запрос на ajax-обработчик урла ссылки
        var post = {
            ajax: 'ajax'
        };
        $.ajax({
            url: '/ajax'+$(this).attr('href'),
            type: 'post',
            data: post,
            beforeSend: function() {

                if ($(e.target)[0].nodeName == 'P')
                    $(e.target).parent('a').addClass('loading');
                else
                    $(e.target).addClass('loading');

                disableUI();

            },
            complete: function() {

                if ($(e.target)[0].nodeName == 'P')
                    $(e.target).parent('a').removeClass('loading');
                else
                    $(e.target).removeClass('loading');

            },
            success: function(data) {

                updateObjects(data);

                if( $(e.target).parent('a').attr('id').indexOf('p_wheat') + 1
                        || $(e.target).parent('a').attr('id').indexOf('p_barley') + 1 ) {
                    $(e.target).parent('a').addClass('act-disable').find('.scale').css({width: '0%'}).unbind().bind('click', function() { return false; });
                }

                updateUser(data);
            }
        });
        return false;
    }

    function actionSell() {
        // отправить запрос на ajax-обработчик урла ссылки
        var post = {
            ajax: 'ajax'
        };
        $.ajax({
            url: '/ajax'+$(this).attr('href'),
            type: 'post',
            data: post,
            success: function(data) {
                updateStore(data);
                updateUser(data);
            }
        });
        return false;
    }

    function updateStore(data) {
        eval('var answer='+data);

        popupMsgAddMessages(answer.messages);

        for (var prodId in answer.store) {
            eval('var prodInfo=answer.store.'+prodId);
            var prodKey = prodInfo.keyname;

            if (prodInfo.store <= 0) {
                //выключаем кнопку

                $('#prod-sell-'+prodInfo.keyname,popupBox).addClass('act-disable');
                $('#prod-sell-'+prodInfo.keyname,popupBox).unbind('click');
                $('#prod-sell-'+prodInfo.keyname,popupBox).click( function() { return false } );
                $('#prod-sell-'+prodInfo.keyname+' .cur_store_cost',popupBox).hide();

                $('#prod-separate-'+prodInfo.keyname,popupBox).addClass('act-disable');
                $('#prod-separate-'+prodInfo.keyname,popupBox).unbind('click');
                $('#prod-separate-'+prodInfo.keyname,popupBox).click( function() { return false } );
                $('#prod-separate-'+prodInfo.keyname+' .cur_store_cost',popupBox).hide();
            }
            $('#prod-sell-'+prodInfo.keyname+' .cur_store_value',popupBox).html(prodInfo.store);
            $('#prod-separate-'+prodInfo.keyname+' .cur_store_value',popupBox).html(prodInfo.store);
        }
    }

    function updateObjects(data) {
        try {
            var answer = $.parseJSON(data);
        }
        catch(e) { return false; }

        if (answer && answer.messages[1] && !answer.messages[1].ignore) {
            $.modal({
                name        : 'info',
                skin        : 'm-message',
                icon        : 'icon-torakid',
                width       : 600,
                //type        : 'dialog',
                header      : answer.messages[1].message,
                description : answer.messages[1].description
            });
        }

        // Уведомление о собранных или продуктах
        if (answer && answer.messages.length > 0 && answer.messages[0].icon && !answer.messages[0].ignore) {
            var icon = answer.messages[0].icon;
            icon = (icon.split('_')[1]) ? icon.split('_')[1] : icon;
            $.modal({
                name        : 'get',
                skin        : 'm-get',
                icon        : 'icon-' + icon,
                //type        : 'dialog',
                header      : answer.messages[0].message,
                description : answer.messages[0].description
            });
        }

        if (answer && answer.isOk) {
            //console.info( answer.objects );
            for (var objId in answer.objects) {

                eval('var objInfo=answer.objects.'+objId);
                var objKey=objInfo.keyname;

                if (objInfo.removeIt) {
                    // удаляем объект с острова
                    $('.island .object-'+objKey).remove();
                    // чистим окно
                    //popupHide();
                }
                else {
                    if (!$('.island .object-'+objKey).size()) {
                        // нужнодобавить объект на остров
                        if (SetupMode) {
                            var objHtml='<a href="/user/id'+User.id+'/game/'+objKey+'/setup/" class="object-'+objKey+' object-'+objKey+'-'+objInfo.level+' setup-info-link"><span>'+objInfo.title+'</span></a>';
                            //'<a href="/user/id'+User.id+'/game/'+objKey+'/setup/" class="object-setup-'+objKey+' setup-info-link"><img src="/s/images/icons/object-setup.png" class="setup-icon"/></a>';
                        }
                        else {
                            var objHtml='<a href="/user/id'+User.id+'/game/'+objKey+'/" class="object-'+objKey+' object-'+objKey+'-'+objInfo.level+' short-info-link"><span>'+objInfo.title+'</span><img src="/s/images/icons/object-alert.png" class="alert-icon"/></a>';
                        }
                        $('.island-body').append(objHtml);
                    } else {
                        $('.island .object-'+objKey).addClass('object-'+objKey+'-'+objInfo.level);
                    }

                    // обновляем данные объекта
                    if (objInfo.production) {
                        var prodInfo=objInfo.production;
                        // меняем основную картинку объекта в окне информации
                        $('#obj-details-'+objKey+' #obj-details-phase').attr('class',prodInfo.pahseKey+'-'+prodInfo.pahseStage);

                        //console.group(objKey);
                        //console.log( 'harvest: ' + objInfo.harvest );
                        //console.log( 'phase: ' + objInfo.production.phase );
                        //console.log( 'level: ' + objInfo.level );
                        //console.log( objInfo.harvest == 1 && objInfo.production.phase == 2 && objInfo.level == 2 );
                        //console.groupEnd();

                        // Изменение картинки в окне информации при сборе урожая
                        if (objInfo.harvest == 1 && objInfo.production.phase == 2 && objInfo.level == 2) {
                            $('#obj-details-phase').attr('class','harvest');
                        }

                        // меняем прогресс-бар урожая в блоке действий
                        $('#obj-details-'+objKey+' #obj-details-prod-'+prodInfo.keyname+' .scale',popupBox).css({'width': prodInfo.w+'%'});
                        if (prodInfo.phase<3) {
                            $('#obj-details-'+objKey+' #obj-details-prod-'+prodInfo.keyname,popupBox).addClass('act-disable');
                            $('#obj-details-'+objKey+' #obj-details-prod-'+prodInfo.keyname,popupBox).unbind('click');
                            $('#obj-details-'+objKey+' #obj-details-prod-'+prodInfo.keyname,popupBox).click(function(){return false;});
                        }
                        else {
                            $('#obj-details-'+objKey+' #obj-details-prod-'+prodInfo.keyname,popupBox).removeClass('act-disable');
                            $('#obj-details-'+objKey+' #obj-details-prod-'+prodInfo.keyname,popupBox).unbind('click');
                            $('#obj-details-'+objKey+' #obj-details-prod-'+prodInfo.keyname,popupBox).click(actionOnObject);
                        }



                        // меняем прогресс-бар урожая в короткой инфе
                        $('#obj-'+objKey+'-prod-'+prodInfo.keyname+' .scale').css({'width': prodInfo.w+'%'});

                    }
                    if (objInfo.resources) {
                        // меняем основную картинку объекта в окне информации
                        $('#obj-details-'+objKey+' #obj-details-status').attr('class',objInfo.statusStyle);
                        // меняем данные по состоянию ресурсов в блоке действий
                        for (var resId in objInfo.resources) {
                            eval('var resInfo=objInfo.resources.'+resId);
                            // меняем прогресс-бар ресурса в блоке действий
                            $('#obj-details-'+objKey+' #obj-details-res-'+resInfo.keyname+' .scale').css({'width': resInfo.w+'%'});
                        }

                        // показываем/прячем иконку проблмы на острове
                        if (objInfo.haveProblem) {
                            $('.island .object-'+objKey).addClass('obj-alert');
                        }
                        else {
                            $('.island .object-'+objKey).removeClass('obj-alert');
                        }
                    }
                }
            }
        }
    }

    function updateUser(data) {
        if (typeof(data)=='object') {
            answer=data;
        }
        else {
            try {
                eval('var answer='+data);
            }
            catch(e) { return false; }
        }

        if (answer.isOk) {

            var userInfo=answer.user;
            $('#user-experience').html(MyUser.experience=userInfo.experience);
            $('#user-emeralds').html(MyUser.emeralds=userInfo.emeralds);
            $('#user-diamonds').html(MyUser.diamonds=userInfo.diamonds);
            $('#user-rubies').html(MyUser.rubies=userInfo.rubies);
            $('#user-coins').html(MyUser.coins=userInfo.coins);
            $('#user-rank-img').attr('src','/s/images/levels/'+userInfo.rank_id+'.png');
            $('a.a-flag','div.user-info').attr('title',userInfo.rank_img_title);
            MyUser.rank_id=userInfo.rank_id;

            Lib.User.notificationAdd(userInfo.notification);

        }
    }










    /**
     * Загрузка контента в мешок, магазин и отделенное
     */
    //function loadContent(url) {
        //popupContent.html('');
        //popupShow();
        //popupLoadStore('/ajax'+url);
        //return true;
    //}


















    /**
     * Открытие мешка
     */
    $("#user-bag-link").bind('click', function(e) {
        var url = $(this).attr('href');
        var type = url.split('/')[3];

        if (type == 'bag') {

            $.ajax({
                url      : '/ajax' + url,
                dataType : 'html',
                type     : 'post',
                success: function(data) {

                    $.modal({
                        name    : 'bag',
                        skin    : 'm-store',
                        header  : 'Мешок',
                        content : data,
                        width   : 400,
                        onOpen: function(obj) {

                            // --- Временный хак ---
                            $('.popup-info-title', obj).remove();
                            $('.popup-info-foot', obj).remove();

                            $('#warehouse').bind('click', openWarehouse);
                            $('#shop').bind('click', openShop);
                            $('#separated').bind('click', openSeparated);

                            //$('#separated').trigger('click');
                            //$('#warehouse').trigger('click');
                        }
                    });

                }
            });

        } else {
            $(this).unbind().bind('click', openShop);
            $(this).trigger('click');
        }

        return false;
    });

    //$('#user-bag-link').trigger('click');




    /**
     * Склад
     */
    function openWarehouse() {
        var url = $(this).attr('href');

        $.ajax({
            url      : '/ajax' + url,
            dataType : 'html',
            type     : 'post',
            success: function(data) {

                $.modal({
                    name        : 'store',
                    skin        : 'm-store',
                    width       : 640,
                    header      : 'Склад',
                    description : 'Чтобы продать товар, нужно отделить продукты и перенести в магазин.',
                    content     : data,
                    onOpen: function(obj) {

                        // --- Временный хак ---
                        $('.popup-info-title', obj).remove();
                        $('.popup-info-foot', obj).remove();

                        $('a[class~=act]').bind('click', openSeparate);
                        $('a[class~=act-disable]').unbind('click').attr('href', '#');

                    }
                });

            }
        });

        return false;
    }



    /**
     * Магазин
     */
    function openShop() {
        var url = $(this).attr('href');

        $.ajax({
            url      : '/ajax' + url,
            dataType : 'html',
            type     : 'post',
            success: function(data) {

                $.modal({
                    name    : 'store',
                    skin    : 'm-store',
                    width   : 640,
                    header  : 'Магазин',
                    content : data,
                    onOpen: function(obj) {

                        $('a[class~=act]').bind('click', function() {
                            var item = $(this);

                            $.ajax({
                                url      : '/ajax' + item.attr('href'),
                                dataType : 'json',
                                type     : 'post',
                                success: function(data) {

                                    // Если всё прошло успешно...
                                    if (data.isOk) {

                                        // Удаление биндов с продукта
                                        item.unbind()
                                            .addClass('act-disable')
                                            .attr('href', '#');

                                        // Удаление информации продукта
                                        $('p.title', item).remove();
                                        $('p.caption', item).remove();

                                        // Уведомление о проданных товарах
                                        $.modal({
                                            name   : 'sell-' + data.messages[0].icon,
                                            skin   : 'm-sell',
                                            icon   : 'icon-' + data.messages[0].icon.split('_')[1],
                                            type   : 'dialog',
                                            header : data.messages[0].message
                                        });

                                        // Обновление профайла
                                        updateUser(data);
                                    }
                                }
                            });

                            return false;
                        });

                        $('#toggles-sale').bind('click', function() {
                            var $obj = $(this),
                                state;

                            state = ($obj.hasClass('toggles-sale-disable')) ? 1 : 0;

                            $.ajax({
                                url      : '/ajax/user/id' + $obj.data('user') + '/sale',
                                data     : { state: state },
                                dataType : 'json',
                                type     : 'post',
                                success: function(data) {
                                    if (state == 1)
                                        $obj.val('Продажа вкл.').removeClass().addClass('toggles-sale-enable');
                                    else
                                        $obj.val('Продажа откл.').removeClass().addClass('toggles-sale-disable');
                                },
                            });

                            $obj.blur();
                        });

                        $('a[class~=act-disable]').unbind('click').attr('href', '#');
                    }
                });

            }
        });

        return false;
    }



    /**
     * Ярмарка
     */
    $('#user-fair-link').bind('click', function() {
        var $link = $(this),
            url = $link.attr('href');

        $.ajax({
            url      : '/ajax' + url,
            dataType : 'html',
            type     : 'post',
            success: function(data) {

                $.modal({
                    name        : 'store',
                    skin        : 'm-store',
                    width       : 640,
                    header      : 'Ярмарка',
                    //description : 'Чтобы продать товар, нужно отделить продукты и перенести в магазин.',
                    content     : data,
                    onOpen: function(obj) {

                        // --- Временный хак ---
                        $('.popup-info-title', obj).remove();
                        $('.popup-info-foot', obj).remove();

                        $('.modal').delegate('.act-buy:not(.act-disable)', 'click', function(e) {
                            e.preventDefault();

                            var $link = $(this),
                                href  = $link.attr('href');

                            $.ajax({
                                url      : href,
                                dataType : 'json',
                                type     : 'post',
                                success: function(data) {
                                    if (data.success == true) {
                                        $.modal({
                                            name    : 'success',
                                            skin    : 'm-success',
                                            icon    : data.icon,
                                            type    : 'dialog',
                                            header  : 'Поздравляем с покупкой!',
                                            content : data.text + $link.find('.caption').text()
                                        });

                                        $('#user-coins').fadeOut(function() {
                                            $(this).text(data.coins).fadeIn();
                                        });

                                        $link.addClass('act-disable').find('.title').empty().end().find('.caption').empty();
                                    }
                                }
                            });
                        });

                        $('.modal').delegate('.act-disable', 'click', function(e) {
                            e.preventDefault();
                        });

                        //$('a[class~=act]').bind('click', openSeparate);
                        //$('a[class~=act-disable]').unbind('click').attr('href', '#');

                    }
                });

            }
        });

        return false;
    });



    /**
     * Отделенные товары
     */
    function openSeparated() {
        var url  = $(this).attr('href');
        var user = url.split('/')[2];

        $.ajax({
            url: '/ajax' + url,
            dataType: 'html',
            type: 'post',
            success: function(data) {

                $.modal({
                    name        : 'store',
                    skin        : 'm-store',
                    width       : 640,
                    header      : 'Отделенные продукты',
                    description : true,
                    content     : data,
                    onOpen: function(obj) {

                        // Объекты контентной области и области описания
                        var description = $('.m-description', obj);
                        var content = $('.m-content', obj);

                        $('<p>').html('Перед отправкой кликни на выбранные продукты').prependTo(description);

                        // Массив объектов ссылок
                        var links = [
                            {
                                type  : 'coen',
                                title : 'Коэну'
                            },
                            {
                                type  : 'levit',
                                title : 'Левиту'
                            },
                            {
                                type  : 'bum',
                                title : 'Бедным'
                            },
                            {
                                type  : 'jerusalem',
                                title : '2-я десятина'
                            }
                        ];

                        // Контейнер
                        var list = $('<ul/>').addClass('m-tabs');

                        // Формирование списка, добавление списка в контейнер
                        // и добавление в область контента блоков
                        for (var i in links) {
                            var li = $('<li/>').addClass(links[i].type);
                            var item = $('<a/>')
                                            .attr({ href: '#' })
                                            .html(links[i].title);

                            item.appendTo(li);
                            li.appendTo(list);

                            // Раскомментировать, когда серверная часть будет
                            // отдавать JSON формат, для генерирования блоков.
                            //
                            //var body = $('<div/>').addClass('tab-box').html(links[i].content);
                            //body.appendTo(content);

                        }

                        // Добавление списка в область описания
                        list.appendTo(description);

                        // Установка дефолтной активной вкладки
                        $('li:eq(0)', list).addClass('current');
                        $('body').data('type', links[0].type);
                        $('body').data('products', []);

                        // Установка дефолтного активного блока
                        $('div.tab-box:eq(0)', obj).addClass('visible');

                        // Назначение действий не активным вкладкам
                        list.delegate('li:not(.current)', 'click', function() {
                            $(this).addClass('current')
                                .siblings()
                                .removeClass('current')
                                .parents(obj)
                                .find('div.tab-box')
                                .removeClass('visible')
                                .eq($(this).index())
                                .addClass('visible');

                            $('.tab-box > div > a', obj).removeClass('check');
                            $('body').data('products', []);
                            $('body').data('type', $(this).attr('class').split(' ')[0]);

                            return false;
                        });


                        // Назначение действий при нажатии на продукт
                        var type = $('body').data('type');

                        $('.tab-box > div > a:not(".act-disable")', obj).bind('click', function() {

                            var object   = $(this);
                            var key      = $(this).attr('id').split('_')[1];
                            var products = $('body').data('products');

                            if ( object.hasClass('check') ) {

                                products.splice(products.indexOf(key), 1);
                                object.removeClass('check');

                            } else {

                                products.push(key);
                                object.addClass('check');

                            }

                            $('body').data('products', products);
                        });


                    },
                    buttons: [
                        {
                            title: 'Отдать',
                            action: function() {

                                var obj      = $(this).parents('.modal');
                                var type     = $('body').data('type');
                                var products = $('body').data('products');
                                var userto   = $('div.' + type, obj).find('select').val();

                                if (type && userto) {

                                    $.ajax({
                                        url: '/ajax/user/' + user + '/game/' + userto + '/give/',
                                        dataType: 'html',
                                        type: 'post',
                                        data: {
                                            type: type,
                                            products: products
                                        },
                                        success: function(response) {

                                            for (var i in products) {
                                                var object = $('a[id*='+products[i]+']', obj.find('.'+type));
                                                var title = $('.caption', object);

                                                object
                                                    .unbind()
                                                    .removeClass('check')
                                                    .addClass('act-disable');

                                                title.remove();
                                            }

                                        }
                                    });


                                } else {

                                    $.modal({
                                        name    : 'error',
                                        skin    : 'm-error',
                                        type    : 'dialog',
                                        header  : 'Ошибка',
                                        content : 'Нужно указать, кому отдавать продукты.'
                                    });

                                }

                            }
                        }
                    ]
                });

            }
        });

        return false;
    }



    /**
     * Окно отделения товаров
     */
    function openSeparate() {

        var selected = $(this).attr('class').split(' ')[0].substr(2);

        $.ajax({
            url      : '/ajax/user/id74/toseparate',
            dataType : 'json',
            type     : 'post',
            success: function(data) {

                // Открытие окна разделения
                $.modal({
                    name        : 'separate',
                    skin        : 'm-store',
                    header      : 'Склад',
                    description : 'Чтобы продать товар, нужно отделить продукты и перенести в магазин.',
                    content     : true,
                    width       : 630,
                    closeall    : true,
                    onOpen: function(obj) {

                        var content = $('.m-content', obj);

                        var clear = $('<div/>').addClass('m-clear');

                        // DOM объекты панелей для кнопок
                        var topPanel = $('<div/>').addClass('m-top-panel');
                        var btmPanel = $('<div/>').addClass('m-btm-panel');

                        // Кнопка переключения продукта "Вверх"
                        var btnUpProduct = $('<a/>')
                                .addClass('m-btn-up')
                                .addClass('m-btn-up-product')
                                .attr({ href: '#' });

                        // Кнопка переключения типа разделения "Вверх"
                        var btnUpSeparate = $('<a/>')
                                .addClass('m-btn-up')
                                .addClass('m-btn-up-separate')
                                .attr({ href: '#' });

                        // Кнопка переключения продукта "Вниз"
                        var btnDownProduct = $('<a/>')
                                .addClass('m-btn-down')
                                .addClass('m-btn-down-product')
                                .attr({ href: '#' });

                        // Кнопка переключения типа разделения "Вниз"
                        var btnDownSeparate = $('<a/>')
                                .addClass('m-btn-down')
                                .addClass('m-btn-down-separate')
                                .attr({ href: '#' });

                        // DOM объекты блоков "Продукты" и "Типы разделения"
                        var products = $('<div/>').addClass('products');
                        var types    = $('<div/>').addClass('types');
                        var shop     = $('<div/>').addClass('shop');


                        // Тип разделения по умолчанию
                        obj.data('separate', 'maiser');
                        //obj.data('himself', data.user.himself);



                        // Установка начального продукта при открытии окна
                        function setSelect(product) {

                            var box   = $('.products > ul', obj);
                            var step  = $('li:eq(0)', box).outerHeight();
                            var index = data.products[product].index;

                            obj.data('product', product);

                            box.css({ top: -(step * index) });

                            separate(product, 'products');
                        }


                        // Установка количества отделяемых товаров
                        function setText(object, text) {

                            if (object.is(':animated'))
                                return false;

                            //object.fadeTo(250, .25);
                            object.html(text);
                            //object.fadeTo(250, 1);
                        }


                        // Подстановка значений отделяемых продуктов
                        function separate(object, type) {

                            var maiserCoen    = $('.maiser-coen > div', obj);
                            var maiserLevit   = $('.maiser-levit > div', obj);
                            var maiserHimself = $('.maiser-himself > div', obj);
                            var coen          = $('.coen-coen > div', obj);
                            var shopDesc      = $('.shop div.desc', obj);
                            var shopCount     = $('.shop div.count', obj);
                            var product       = obj.data('product');
                            var separate      = obj.data('separate');

                            if (type == 'products') {
                                var sep = data.products[object].separate;

                                setText(maiserCoen, sep.maiser.coen);
                                setText(maiserLevit, sep.maiser.levit);
                                setText(maiserHimself, sep.maiser.himself);

                                setText(coen, sep.coen.coen);

                                setText(shopDesc, data.products[object].name);
                                setText(shopCount, data.products[product].separate[separate].shop);
                            }

                            if (type == 'types') {
                                setText(shopCount, data.products[product].separate[separate].shop);
                            }

                        }



                        // Изменение состояния кнопки "Перенести"
                        function changeButtonState(object) {

                            var count = $('.' + object, obj).find('.product-count').text();

                            if (count != 0) {
                                $('input.separate', obj).removeAttr('disabled');
                            } else {
                                $('input.separate', obj).attr('disabled', 'disabled');
                            }
                        }



                        // Перелистывание товаров и типов разделения
                        function slide(direction, object) {

                            var box = $('ul:eq(0)', object);

                            if (box.is(':animated'))
                                return false;

                            var count    = $('li', object).size();
                            var step     = $('li:eq(0)', object).outerHeight();
                            var height   = step * count;
                            var position = parseInt(box.css('top'));

                            if (direction == 'up' && position - step < 0 && position - step > -(height)) {
                                box.stop(true).animate({ top: position - step }, 250, function() {

                                    var current    = (Math.abs(position) / step) + 1;
                                    var currentObj = $('li:eq('+current+')', box).attr('class');

                                    if (object.attr('class') == 'products') {
                                        obj.data('product', currentObj);

                                        changeButtonState(currentObj);
                                    } else {
                                        obj.data('separate', currentObj);
                                    }

                                    separate(currentObj, object.attr('class'));
                                });
                            }

                            if (direction == 'down' && position < 0 && position + step > -(height)) {
                                box.stop(true).animate({ top: position + step }, 250, function() {

                                    var current    = (Math.abs(position) / step) - 1;
                                    var currentObj = $('li:eq('+current+')', box).attr('class');

                                    if (object.attr('class') == 'products') {
                                        obj.data('product', currentObj);

                                        changeButtonState(currentObj);
                                    } else {
                                        obj.data('separate', currentObj);
                                    }

                                    separate(currentObj, object.attr('class'));
                                });
                            }
                        }



                        // Заполнение данными блока "Продукты"
                        for (var i in data.products) {

                            var wrap  = $('<div/>').addClass('product');
                            var icon  = $('<div/>').addClass('product-icon icon-' + i).appendTo(wrap);
                            var desc  = $('<div/>').addClass('product-desc').appendTo(wrap);
                            var count = $('<div/>').addClass('product-count').appendTo(wrap);

                            desc.html( data.products[i].name );
                            count.html( data.products[i].count);

                            wrap.appendTo(products).wrap('<li/>').parent().addClass(i);
                        }

                        // Заполнение данными блока "Типы разделения"
                        for (var i in data.types) {

                            var wrap = $('<div/>').addClass('type type-' + i);

                            // Коэну, Левиту, Бедным, Иерусалим
                            if (i == 'maiser') {
                                var coen    = $('<div/>').addClass('maiser-coen').appendTo(wrap);
                                var levit   = $('<div/>').addClass('maiser-levit').appendTo(wrap);
                                var himself = $('<div/>').addClass('maiser-himself').appendTo(wrap);

                                coen.html(data.types[i].coen.name).append('<div/>');
                                levit.html(data.types[i].levit.name).append('<div/>');
                                //himself.html(data.types[i].himself.name[obj.data('himself')]).append('<div/>');
                                himself.html(data.types[i].himself.name[data.user.himself]).append('<div/>');

                                wrap.appendTo(types).wrap('<li/>').parent().addClass(i);
                            }

                            // Коэну
                            if (i == 'coen') {
                                var coen = $('<div/>').addClass('coen-coen').appendTo(wrap);

                                coen.html(data.types[i].name).append('<div/>');
                                wrap.appendTo(types).wrap('<li/>').parent().addClass(i);
                            }

                            // Напрямую
                            if (i == 'directly') {
                                var directly = $('<div/>').addClass('directly').appendTo(wrap);

                                wrap.appendTo(types).wrap('<li/>').parent().addClass(i);
                            }

                        }

                        // Иконка магазина
                        var shopIcon  = $('<div/>').addClass('icon');
                        var shopDesc  = $('<div/>').addClass('desc');
                        var shopCount = $('<div/>').addClass('count');

                        $('<div/>')
                            .addClass('box')
                            .append(shopIcon)
                            .append(shopDesc)
                            .append(shopCount)
                            .appendTo(shop);

                        // Добавление блоков "Продукты", "Типы разделения"
                        // и иконки магазина в контентную область окна
                        products.wrapInner('<ul/>').appendTo(content);
                        types.wrapInner('<ul/>').appendTo(content);
                        shop.appendTo(content);
                        clear.appendTo(content);

                        // Добавление кнопки вверх - "Продукты"
                        btnUpProduct.bind('click', function() {
                            slide('down', products);
                            return false;
                        }).appendTo(topPanel);

                        // Добавление кнопки вниз - "Продукты"
                        btnDownProduct.bind('click', function() {
                            slide('up', products);
                            return false;
                        }).appendTo(btmPanel);

                        // Добавление кнопки вверх - "Типы разделения"
                        btnUpSeparate.bind('click', function() {
                            slide('down', types);
                            return false;
                        }).appendTo(topPanel);

                        // Добавление кнопки вниз - "Типы разделения"
                        btnDownSeparate.bind('click', function() {
                            slide('up', types);
                            return false;
                        }).appendTo(btmPanel);

                        // Компоновка панелей
                        topPanel.insertBefore(content);
                        btmPanel.insertAfter(content);

                        setSelect(selected);
                    },
                    buttons: [
                        {
                            title: 'Вернуться на склад',
                            action: function() {

                                $.modal({ name: 'separate' }).close();

                            }
                        },
                        {
                            title: 'Перенести',
                            name: 'separate',
                            action: function() {

                                var obj      = $(this).parents('.modal');
                                var product  = obj.data('product');
                                var separate = obj.data('separate');
                                var stype    = data.products[product].stype;

                                // Если тип отделения верный...
                                if (separate == stype) {

                                    var post = {
                                        product  : product,
                                        separate : stype,
                                        //himself  : himself
                                    }

                                    $.ajax({
                                        url      : '/ajax/user/id' + data.user.id + '/game/p_' + product + '/separate/',
                                        data     : post,
                                        dataType : 'json',
                                        type     : 'post',
                                        success: function(response) {

                                            if (response.success) {

                                                var key = response.object.split('_')[1];
                                                var product = data.products[key];
                                                var item = $('a[id*=' + response.object + ']');

                                                // Обнуление данных перенесенного товара
                                                product.count                   = '';
                                                product.separate.coen.coen      = '';
                                                product.separate.coen.shop      = '';
                                                product.separate.directly.shop  = '';
                                                product.separate.maiser.coen    = '';
                                                product.separate.maiser.levit   = '';
                                                product.separate.maiser.himself = '';
                                                product.separate.maiser.shop    = '';

                                                // Удаление товара со склада
                                                item.addClass('act-disable').unbind().attr('href', '#');
                                                $('p[class=caption]', item).remove();

                                                // Удаление количества товара
                                                $('li[class=' + key + ']', obj).find('.product-count').html('');
                                                $('.maiser-coen > div').html('');
                                                $('.maiser-levit > div').html('');
                                                $('.maiser-himself > div').html('');

                                                $('.maiser-himself').html(data.types.maiser.himself.name[response.himself]).append('<div>');

                                                $('.coen-coen > div').html('');
                                                $('.shop', obj).find('.count').html('');

                                                // Отключение кнопки "Переместить"
                                                $('input.separate', obj).attr('disabled', 'disabled');

                                                // Анимация переноса
                                                var item    = $('li[class=' + key + ']', obj).clone().children().css({ width: 140 });
                                                var content = $('.m-content', obj);

                                                item = $('<div class="' + key + '">').html(item).css({ margin: 0 });

                                                item
                                                    .appendTo(content)
                                                    .animate({
                                                        'margin-left': '+=480'
                                                    }, 500, 'swing', function() {
                                                        $(this).remove();
                                                    });

                                            }

                                        }
                                    });

                                // Если тип отделения не верный...
                                } else {

                                    $.modal({
                                        name    : 'error',
                                        skin    : 'm-error',
                                        type    : 'dialog',
                                        header  : 'Не верное отделение',
                                        content : 'Ты не верно отделил(а) продукты. Выбери правильный тип отделения.'
                                    });

                                }
                            }
                        }
                    ]
                });
            }
        });

        return false;
    }

























    /* <<< POPUP object info */


    /* >>> динамическое обновление страницы */
    resetTimeout = updateWall; // в секундах

    world = $('.island-body');
    world.data('refresh', 0);

    function resetSendRequest() {
        // отправить запрос на ajax-обработчик
        post = {
            ajax: 'ajax'
        };
        id=0;

        if (User.id) { id=User.id; }
        else if (MyUser.id) { id=MyUser.id; }

        if ($('.island-front').size() && id && !world.data('refresh')) {
            $.ajax({
                url: '/ajax/user/id'+id+'/game/status/',
                type: 'post',
                data: post,
                beforeSend: function() {
                    world.data('refresh', 1);
                },
                success: function(data) {
                    updateObjects(data);
                    updateUser(data);
                    world.data('refresh', 0);
                }
            });
        }
    }

    if (world.size()) {
        if (!SetupMode && MyUser.id) {
            world.everyTime(resetTimeout*1000,resetSendRequest);
        }
    }

    /* <<< динамическое обновление страницы */

















    /* >>>> POPUP QUEST */
    /*
    var popupQstHtml = '<div class="popup-box-q" style="display:none"><div class="box-shadow" style="display:none"></div><div class="popup-quest"><div class="popup-quest_i"></div></div></div>';
    $("body").append(popupQstHtml);
    var popupQstBox = $(".m-quest");
    var popupQstShadow = $(".box-shadow", popupQstBox);
    var popupQstContent = $(".m-content", popupQstBox);
    var popupQstCurId= 1;

    function popupQstShow(closable){
        //if (closable) {
            //popupQstShadow.bind('click', function() {popupQstHide()});
        //}
        //else {
            //popupQstShadow.unbind('click');
        //}
        //
        //popupQstBox.addClass("popup-box_loading").show();
        //
        //popupQstShadow.css({
            //'width': $(document).width(),
            //'height': $(document).outerHeight(),
        //}).stop().fadeIn();
        //
        //$(window).bind('resize', function() {
            //popupQstResize();
        //});
    }

    function popupQstHide(){
        popupQstShadow.stop().fadeOut();
        popupQstBox.hide();
        popupQstContent.html('');

        $(window).unbind('resize');
    }

    function popupQstResize() {
        obj = $(".popup-box-q .popup-quest");
        top = ($(window).height() - obj.height()) / 2;
        if (top < 0) top = 0;
        obj.css({ 'top': top });
    }

    function popupQstLoad(linkUrl){
        popupQstContent.load(linkUrl, function() {
            //popupQstBox.removeClass("popup-box_loading");
            //$("#quests-close",popupQstBox).click(popupQstHide);
            //$("#quest-take",popupQstBox).click(popupQstTake);
            //$("#quest-drop",popupQstBox).click(popupQstDrop);

            //popupQstResize();
        });
    }
    */

    /*
    function updateQuests(data) {
        eval('var answer='+data);

        popupMsgAddMessages(answer.messages);

        if (answer.isOk) {
            // обновляем окно квеста
            // если это отказ: убираем из окна, уменьшаем счетчик в инфе
            // если это подтверждение нового: убираем из окна
            if (answer.removeIt || MyUser.haveNewQuests) {
                // убираем блок инфы
                $('#quest-info-'+answer.keyname).remove();
                // перестраиваем массив информации
                for (var i=answer.posId;i<quests.length;i++) {
                    quests[i]=quests[i+1];
                }
                quests[quests.length-1]=null;
                // перестраиваем прокрутку
                $(".desck-gallery").descGallry(answer.posId);
            }
            if (answer.removeIt) {
                // уменьшаем счетчик
                var curQuestsCount=parseInt($('#user-quests').html())-1;
                if (curQuestsCount) {
                    $('#user-quests').html(curQuestsCount);
                }
                else {
                    $('#user-quests').parent().hide();
                }
            }

            // если окно пустое - закрываем его
            if ($(".desc-item",popupQstBox).length==0) {
                popupQstHide();
            }
        }

    }
    */

    //function popupQstTake() {
         //отправить запрос на взятие квеста
        //var post = {
            //ajax: 'ajax',
            //pos: popupQstCurId,
            //quest: quests[popupQstCurId].keyname
        //};
        //$.ajax({
            //url: '/ajax/user/id'+MyUser.id+'/quest/take/',
            //type: 'post',
            //data: post,
            //success: function(data){updateQuests(data);}
        //});
    //}

    //function popupQstDrop() {
         //отправить запрос на отказ от квеста
        //var post = {
            //ajax: 'ajax',
            //pos: popupQstCurId,
            //quest: quests[popupQstCurId].keyname
        //};
        //$.ajax({
            //url: '/ajax/user/id'+MyUser.id+'/quest/drop/',
            //type: 'post',
            //data: post,
            //success: function(data){updateQuests(data);}
        //});
    //}

    //$(".i-rubik").click(function(){
        //popupQstContent.html('');
        //popupQstShow(true);
        //popupQstLoad('/ajax'+$(this).attr("href"));
        //return false;
    //});

    // проверяем наличие новых квестов и если надо выдаем их в окне для подтверждения
    //if (MyUser.haveNewQuests) {
        //popupQstContent.html('');
        // показали окно, но без возможности его закрыть
        //popupQstShow(false);
        //popupQstLoad('/ajax'+$(".i-rubik").attr("href")+'?unconfirm=1');
    //}

    // галерея квестов
    //var galleryNavHtml = '<div class="quest-pager"><div class="larr gallery-btn"></div><div class="rarr gallery-btn"></div><span><span class="gallery-count"></span> из <span class="gallery-summ"></span></span></div>';

    //$.fn.descGallry = function(startItem) {
        //
        //var gallery = $(this);
        //var galleryList = $(".desc-list",gallery);
        //var galleryItem = $(".desc-item",galleryList);
        //var galleryListLenght = galleryItem.length;
        //
        //galleryList.width( galleryListLenght * galleryItem.width() );
        //if ($(".quest-pager",gallery).length) {
             //удаляем старую прокрутку
            //$(".quest-pager",gallery).remove();
        //}
        //
         //если один элемент - нафиг эту прокрутку!
        //if (galleryListLenght<=1) {return;}
        //
        //gallery.append(galleryNavHtml);
        //var galleryNav = $(".quest-pager",gallery);
        //var galleryCount = $(".gallery-count",galleryNav);
        //var gallerySumm = $(".gallery-summ",galleryNav);
        //var galleryCurent = (typeof(startItem)=='undefined')?1:startItem;
        //
        //if (galleryCurent<1) {galleryCurent=1;}
        //else if (galleryCurent>galleryListLenght) {
            //galleryCurent=galleryListLenght;
        //}
        //
        //galleryList.css({
            //left: -( (galleryCurent-1) *galleryItem.width())
        //});
        //
        //gallerySumm.html( galleryListLenght );
        //galleryCount.html( galleryCurent );
        //popupQstCurId=galleryCurent;
        //
        //$(".gallery-btn",galleryNav).click(function(){
            //
            //var btn = $(this);
            //var galleryCurentNew = 1;
            //if ( btn.hasClass("larr") ){
                //galleryCurentNew = galleryCurent-1;
            //}
            //else{
                //galleryCurentNew = galleryCurent+1;
            //}
            //
            //if ( galleryCurentNew > 0 && galleryCurentNew <= galleryListLenght ){
                //popupQstCurId = galleryCurent = galleryCurentNew;
                //
                //galleryList.animate({
                    //left: -( (galleryCurent-1) *galleryItem.width())
                //});
                //galleryCount.html( galleryCurent );
            //}
            //
         //})
         //
    //}
    /* <<<< POPUP QUEST */











    /**
     * Загрузка квестов
     * @param string url Адрес
     * @param bool Список квестов или список полученных квестов
     */
    function getQuests(url, accept) {

        $.ajax({
            url      : url,
            dataType : 'json',
            type     : 'post',
            success  : function(data) {

                // Слайдер
                function slide(direction, cur, all) {

                    var obj = $('.quest:eq(0)');
                    var box = $('.quests');

                    if (box.is(':animated'))
                        return false;

                    var count    = $('>li', box).size();
                    var step     = $('>li:eq(0)', box).outerWidth();
                    var width    = step * count;
                    var position = parseInt(box.css('left'));

                    if (direction == 'left' && position - step < 0 && position - step > -(width)) {
                        box.stop(true).animate({ left: position - step }, 250, function() {

                            var current = (Math.abs(position) / step) + 1;
                            var key     = $('>li:eq('+current+')', box).attr('class').split(' ')[1];

                            obj.data('current', current + 1);

                            cur.html(obj.data('current'));
                            all.html($('>li', box).size());

                            $('.accept', obj).data('key', key).removeAttr('disabled');
                        });
                    }

                    if (direction == 'right' && position < 0 && position + step > -(width)) {
                        box.stop(true).animate({ left: position + step }, 250, function() {

                            var current = (Math.abs(position) / step) - 1;
                            var key = $('>li:eq('+current+')', box).attr('class').split(' ')[1];

                            obj.data('current', current + 1);

                            cur.html(obj.data('current'));
                            all.html($('>li', box).size());

                            $('.accept', obj).data('key', key).removeAttr('disabled');
                        });
                    }
                }

                $.modal({
                    name    : 'quest',
                    skin    : 'm-quest',
                    content : true,
                    width   : 600,
                    close   : (accept) ? false : true,
                    onOpen  : function(obj) {

                        var content = $('.m-content', obj);
                        var slider  = $('<div>').addClass('quests-slider').appendTo(content);
                        var ul      = $('<ul>').addClass('quests').addClass('clearfix');
                        var nav     = $('<div>').addClass('navigate').appendTo(content);
                        var counter = $('<div>').addClass('counter').appendTo(nav);
                        var current = $('<span>').addClass('current');
                        var all     = $('<span>').addClass('all');

                        obj.data('current', 1);

                        if (!accept)
                            counter.html(' из ').prepend(current).append(all);

                        // Формирование списка квестов
                        for (var i in data) {
                            var li     = $('<li>').addClass('item').addClass(i).appendTo(ul);
                            var header = $('<h2>').appendTo(li);
                            var text   = $('<div>').addClass('content').wrapInner('<p>').appendTo(li);
                            var reward = $('<ul>').addClass('reward').appendTo(li);

                            header.html(data[i].title);
                            text.html(data[i].description);

                            if (data[i].reward.experience)
                                $('<li>')
                                    .addClass('experience')
                                    .html(data[i].reward.experience)
                                    .appendTo(reward);

                            if (data[i].reward.coin)
                                $('<li>')
                                    .addClass('coin')
                                    .html(data[i].reward.coin)
                                    .appendTo(reward);

                            if (data[i].reward.emerald)
                                $('<li>')
                                    .addClass('emerald')
                                    .html(data[i].reward.emerald)
                                    .appendTo(reward);

                            if (data[i].reward.diamond)
                                $('<li>')
                                    .addClass('diamond')
                                    .html(data[i].reward.diamond)
                                    .appendTo(reward);

                            if (data[i].reward.ruby)
                                $('<li>')
                                    .addClass('ruby')
                                    .html(data[i].reward.ruby)
                                    .appendTo(reward);
                        }



                        // Кнопка "Предыдущий квест"
                        $('<a>')
                            .addClass('right')
                            .attr('href','#')
                            .bind('click', function() {
                                slide('left', current, all);
                                return false;
                            })
                            .prependTo(nav);

                        // Следующий квест
                        $('<a>')
                            .addClass('left')
                            .attr('href','#')
                            .bind('click', function() {
                                slide('right', current, all);
                                return false;
                            })
                            .prependTo(nav);

                        current.html(obj.data('current'));
                        all.html($('>li', ul).size());

                        ul.css({ width: slider.width() * $('li', ul).size() }).appendTo(slider);

                        $('.accept', obj).data('key', $('li.item:eq(0)', obj).attr('class').split(' ')[1]);
                        $('.drop', obj).data('key', $('li.item:eq(0)', obj).attr('class').split(' ')[1]);
                    },
                    buttons: (accept) ? [
                        {
                            title: 'Принять',
                            name: 'accept',
                            action: function() {

                                var btn = $(this);
                                var obj = $(this).parents('.modal');
                                var key = $(this).data('key');

                                $.ajax({
                                    url      : '/ajax/user/id' + MyUser.id + '/quest/take/',
                                    dataType : 'json',
                                    type     : 'post',
                                    data     : {
                                        ajax: 'ajax',
                                        quest: key
                                    },
                                    beforeSend: function() {
                                        btn.attr('disabled', 'disabled');
                                    },
                                    success: function(data) {

                                        function removeQuest(object) {

                                            var parent = object.parent();
                                            var step   = object.width();

                                            if (object.next().size()) {

                                                btn.data('key', li.next().attr('class').split(' ')[1]);
                                                object.remove();

                                            } else if (object.prev().size()) {

                                                btn.data('key', li.prev().attr('class').split(' ')[1]);
                                                parent.css({ left: parseInt(parent.css('left')) + step });
                                                object.remove();

                                            }

                                        }

                                        if (data && data.success) {

                                            var li      = $('li.' + data.key, obj);
                                            var current = li.attr('class').split(' ')[1];

                                            removeQuest(li);

                                            var close   = ($('.quests>li', obj).size() <= 1) ? true : false;

                                            $.modal({
                                                name     : 'success',
                                                skin     : 'm-success',
                                                type     : 'dialog',
                                                header   : 'Квест "' + data.title + '" принят!',
                                                content  : false,
                                                closeall : close
                                            });

                                        }
                                    },
                                    complete: function() {
                                        btn.removeAttr('disabled');
                                    }
                                });

                            }
                        },
                        {
                            title: 'Отказаться',
                            name: 'drop',
                            action: dropQuest
                        }
                    ] : [
                        {
                            title: 'Отказаться',
                            name: 'drop',
                            action: dropQuest
                        }
                    ]
                });

            }
        });
    }


    function dropQuest() {

        var btn = $(this);
        var obj = $(this).parents('.modal');
        var key = $(this).data('key');

        $.ajax({
            url      : '/ajax/user/id' + MyUser.id + '/quest/drop/',
            dataType : 'json',
            type     : 'post',
            data     : {
                ajax: 'ajax',
                quest: key
            },
            beforeSend: function() {
                btn.attr('disabled', 'disabled');
            },
            success: function(data) {

                function removeQuest(object) {

                    var parent = object.parent();
                    var step   = object.width();

                    if (object.next().size()) {

                        btn.data('key', li.next().attr('class').split(' ')[1]);
                        object.remove();

                    } else if (object.prev().size()) {

                        btn.data('key', li.prev().attr('class').split(' ')[1]);
                        parent.css({ left: parseInt(parent.css('left')) + step });
                        object.remove();

                    }

                    var box = $('.quests');
                    var count=$('>li', box).size();
                    if (count==0) {
                        $('.quest').close();
                        return;
                    }
                    $('.quest .all').html(count);
                }

                if (data && data.success) {

                    var li      = $('li.' + data.key, obj);
                    var current = li.attr('class').split(' ')[1];

                    removeQuest(li);

                    var close   = ($('.quests>li', obj).size() <= 1) ? true : false;

                    $.modal({
                        name     : 'success',
                        skin     : 'm-success',
                        type     : 'dialog',
                        header   : 'Квест "' + data.title + '" отклонен!',
                        content  : false,
                        closeall : close
                    });

                }
            },
            complete: function() {
                btn.removeAttr('disabled');
            }
        });

    }


    /**
     * Открытие окна квестов
     */
    $('.i-rubik').bind('click', function() {
        getQuests('/ajax' + $(this).attr('href'));
        return false;
    });



    /**
     * Отображение новых квестов
     */
    if (MyUser.haveNewQuests) {
        getQuests('/ajax' + $(".i-rubik").attr("href") + '?unconfirm=1', true);
    }


























































    /* >>>> User profile */

    $(".ui-close,.ui-open").click(function(){
        $(".user-info .dds").slideToggle(function(){
            $(this).parents(".user-info").toggleClass("folded")
        });
        return false;
    })
    //if ($('.user-details-link').length>0) {


        //function popupLoadPClick() {
            //Lib.PopupForm.init();
            //Lib.PopupForm.ContentP.html('');
            //Lib.PopupForm.ShowP();
            //Lib.PopupForm.LoadP('/ajax'+$(this).attr("href"));


            //return false;
        //}

        //$(".user-details-link").click(popupLoadPClick);

    //}







    /**
     * Цдока
     */
    /*
    $('#user-cdoka-link').bind('click', function() {
        var obj = $(this);


        return false;
    });
    */






    //popupMsgAddMessages([
        //{
            //isOk: true,
            //type: 'message',
            //title: '',
            //description: '',
            //message: 'Ты правильно ответил на вопрос. Молодец!',
            //icon: '',
            //ignore: false
        //},
        //{
            //isOk: true,
            //type: 'message',
            //title: '',
            //description: 'За выполнение ты получил 2 рубина',
            //message: 'Ты выполнил квест «Горлицы»',
            //icon: 'e_ok',
            //ignore: false
        //}
    //]);





    //$('#user-cdoka-link').trigger('click');


    //if ($('#user-cdoka-link').length > 0) {
        //function cdokaPutCoin() {
            //var url='/ajax/user/id'+MyUser.id+'/cdoka/';
            //var post = {
                //ajax: 'ajax'
            //};
            //$.ajax({
                //url: url,
                //type: 'post',
                //data: post,
                //success: cdokaPutResult
            //});
            //return false;
        //}
        //function cdokaPutResult(data) {
            //eval('var answer='+data);
            //
            //popupMsgAddMessages(answer.messages);
            //
            //if (answer.isOk) {
                //updateUser(data);
            //}
        //}
        //$('#user-cdoka-link').click(cdokaPutCoin);
    //}






    if (($('.welcome').length>0 && User.id==MyUser.id) || MyUser.is_admin ) {
        // делаем клик на приветствие
        var welcomeBox=$('.welcome span').css({cursor: 'pointer'});

        // для добавления
        var popupWelcomeHtml = '<div class="popup-box-msg popup-box-welcome" style="display:none"><div class="box-shadow" style="display:none"></div><div class="popup-info-msg popup-info-msg-form"><div class="popup-info-msg_i"><div class="popup-info-msg-body clearfix"><div class="msg-form"><div class="msg-title">Новое приветствие</div><div class="msg-message"><textarea name="wall_msg" id="welcome" rows="3" cols="40"></textarea><span class="error-text"></span></div></div><div class="popup-info-msg-foot"><input type="button" id="msg-send" title="Измненить твое приветствие" value="добавить" /><input type="button" id="msg-close" value="закрыть" /><input type="button" id="msg-del" title="Удалить приветствие" value="убрать" /></div></div></div></div></div>';
        $("body").append(popupWelcomeHtml);
        var popupWelcomeBox = $(".popup-box-welcome");
        var popupWelcomeBorder = $(".popup-info-msg",popupWelcomeBox);
        var popupWelcomeShadow = $(".box-shadow",popupWelcomeBox).bind('click', function() {popupWelcomeHide()});
        var popupWelcomeContent = $(".popup-info-msg_i",popupWelcomeBox);
        var popupWelcomeForm = $(".msg-form",popupWelcomeBox);

        $("#msg-close",popupWelcomeBox).bind('click', function() {popupWelcomeHide()});

        function popupWelcomeShow(){
            //popupMsgBox.addClass("popup-box_loading").show();
            popupWelcomeOpened=true;
            popupWelcomeBox.show();
            popupWelcomeShadow.css({
                "width":$(document).width(),
                "height":$(document).height(),
                "display":"block",
                "opacity":0
            })
            .animate({opacity: 0.5});
        }
        function popupWelcomeHide(){
            popupWelcomeShadow.animate({opacity: 0});
            popupWelcomeBox.hide();
            popupWelcomeOpened=false;
        }

        function popupWelcomeOpen() {
            if(!Lib.User.checkStatus()){
                return false;
            }
            //$('.msg-title span',popupWallContent).html(User.nickname);
            $('#welcome',popupWelcomeContent).val('');
            popupWelcomeForm.removeClass('with-error');
            popupWelcomeShow();

            return false;
        }


        function welcomeSet() {
            var welcomeVal=$('#welcome',popupWelcomeForm).val().trim();

            // проверить наличие текста в форме
            if (welcomeVal.length<2) {
                // выдать ошибку
                $('.error-text',popupWelcomeForm).html((welcomeVal.length==0)?'нужно ввести приветствие':'приветствие слишком короткое');
                popupWelcomeForm.addClass('with-error');
                return false;
            }
            popupWelcomeForm.removeClass('with-error');

            var url='/ajax/user/id'+User.id+'/welcome/';
            var post = {
                ajax: 'ajax',
                welcome: welcomeVal
            };
            $.ajax({
                url: url,
                type: 'post',
                data: post,
                success: welcomeResult
            });
        }

        function welcomeDel() {

            popupWelcomeForm.removeClass('with-error');

            var url='/ajax/user/id'+User.id+'/welcome/delete/';
            var post = {
                ajax: 'ajax'
            };
            $.ajax({
                url: url,
                type: 'post',
                data: post,
                success: welcomeResult
            });
        }

        function welcomeResult(data) {
            eval('var answer='+data);

            if (answer.isOk) {
                // обновить данные
                if (answer.welcome) {
                    welcomeBox.html(answer.welcome);
                    welcomeBox.removeClass('welcome-empty');
                }
                else {
                    welcomeBox.html('добавить приветствие');
                    welcomeBox.addClass('welcome-empty');
                }
                updateUser(data);
                popupWelcomeHide();
            }
            else {
                // выдать ошибку
                $('.error-text',popupWelcomeForm).html(answer.errorText);
                popupWelcomeForm.addClass('with-error');
            }
        }

        welcomeBox.click(popupWelcomeOpen);
        $("#msg-send",popupWelcomeBox).click(welcomeSet);
        $("#msg-del",popupWelcomeBox).click(welcomeDel);
    }

    /* <<<< User profile */





    /* >>>>> Clouds gallery */
    $.fn.wallGallry = function() {
        var gallery = $(this);
        if (gallery.length==0) {return;}

        // для добавления записей на стену
        var popupWallHtml = '<div class="popup-box-msg popup-box-form" style="display:none"><div class="box-shadow" style="display:none"></div><div class="popup-info-msg popup-info-msg-form"><div class="popup-info-msg_i"><div class="popup-info-msg-body clearfix"><div class="msg-form"><div class="msg-title">Новая запись на стену</div><div class="msg-message"><textarea name="wall_msg" id="wall-comment" rows="3" cols="40"></textarea><span class="error-text"></span></div><div class="msg-message" id="wall-send-friends-box"><input type="checkbox" name="send_friends" id="wall-send-friends" value="1"/><label for="wall-send-friends">разослать на стены друзьям</label></div></div><div class="popup-info-msg-foot"><input type="button" id="msg-send" value="добавить" /><input type="button" id="msg-close" value="закрыть" /></div></div></div></div></div>';
        $("body").append(popupWallHtml);
        var popupWallBox = $(".popup-box-form");
        var popupWallBorder = $(".popup-info-msg",popupWallBox);
        var popupWallShadow = $(".box-shadow",popupWallBox).bind('click', function() {popupWallHide()});
        var popupWallContent = $(".popup-info-msg_i",popupWallBox);
        var popupWallForm = $(".msg-form",popupWallBox);

        $("#msg-close",popupWallBox).bind('click', function() {popupWallHide()});
        var popupWallWriteLink=$('#wall-write-link');

        function popupWallShow(){
            //popupMsgBox.addClass("popup-box_loading").show();
            popupWallOpened=true;
            popupWallBox.show();
            popupWallShadow.css({
                "width":$(document).width(),
                "height":$(document).height(),
                "display":"block",
                "opacity":0
            })
            .animate({opacity: 0.5});
        }
        function popupWallHide(){
            popupWallShadow.animate({opacity: 0});
            popupWallBox.hide();
            popupWallOpened=false;
        }

        function popupWallOpen() {
            //$('.msg-title span',popupWallContent).html(User.nickname);
            if(!Lib.User.checkStatus()){
                return false;
            }

            $('#wall-comment',popupWallContent).val('');
            $('#wall-send-friends',popupWallContent).removeAttr('checked');
            if (User.id!=MyUser.id) {
                $('#wall-send-friends-box',popupWallContent).hide();
            }
            else {
                $('#wall-send-friends-box',popupWallContent).show();
            }
            popupWallForm.removeClass('with-error');
            popupWallShow();

            return false;
        }

        function popupWallSendMsg() {
            var commentVal=$('#wall-comment',popupWallForm).val().trim();

            // проверить наличие текста в форме
            if (commentVal.length<2) {
                // выдать ошибку
                $('.error-text',popupWallForm).html((commentVal.length==0)?'нужно ввести комментарий':'комментарий слишком короткий');
                popupWallForm.addClass('with-error');
                return false;
            }
            popupWallForm.removeClass('with-error');

            var sendFriends=($('#wall-send-friends:checked',popupWallForm).size()>0)?1:0;
            if (User.id!=MyUser.id) { sendFriends=0; }
            var url='/ajax/user/id'+User.id+'/wall/write/';
            var post = {
                ajax: 'ajax',
                comment: commentVal,
                send_friends: sendFriends
            };
            $.ajax({
                url: url,
                type: 'post',
                data: post,
                success: popupWallSendResult
            });
            return true;
        }

        function popupWallSendResult(data) {
            eval('var answer='+data);

            if (answer.isOk) {
                // добавить комментарий
                galleryAddNewItem(answer.comments[0]);
                updateUser(data);
                popupWallHide();
            }
            else {
                // выдать ошибку
                $('.error-text',popupWallForm).html(answer.errorText);
                popupWallForm.addClass('with-error');
            }
        }

            popupWallWriteLink.click(popupWallOpen);
            $("#msg-send",popupWallBox).click(popupWallSendMsg);





        // непосредственно прокрутка стены
        var galleryItemHTML = '<li class="cm-item cloud-item"><div class="cm-body"><div class="cm-top"><div class="cm-content">'+
        '<h4><a href="#" class="nc-user"></a> <span class="nc-says"></span></h4>'+
        '<p class="nc-text"></p>'+
        '<span class="date nc-date"></span><span class="delete nc-delete">удалить</span>'+
        '</div></div></div></li>';
        var galleryItemsWrap = gallery.find(".cloud-items-wrap");
        var galleryItems = gallery.find(".cloud-items").css({"left":0});
        var galleryItem = galleryItems.find(".cloud-item");
        var galleryItemNew ;
        var galleryNext = gallery.find(".rarr");
        var galleryPrev = gallery.find(".larr");

        var galleryCount = $('.cloud-item',gallery).length; // кол-во элементов на стене
        var galleryCuren = 3;
        var gallerySize = 3; // кол-во видимых элементов
        var galleryCurenNew = 3; // маркер текущего положения
        var galleryCurenTmp = 0;

        var galleryFirstId=WallGallery.firstId; // ID самоголевого коммента
        var galleryLastId=WallGallery.lastId; // ID самого правого коммента
        var galleryMoreCount=WallGallery.moreCount; // кол-во оставшихся не загруженных комментов
        var galleryLoadingMore=false;

        $('.cloud-item .delete',gallery).click(galleryDeleteItem);

        galleryItem.width( Math.floor((galleryItemsWrap.width()-1)/gallerySize) );
        var galleryItemWidth = galleryItem.width();
        galleryItems.width( galleryItemWidth*galleryCount );

        $(window).resize(function() {
            galleryItem.width( Math.floor((galleryItemsWrap.width()-1)/gallerySize) );
            galleryItemWidth = galleryItem.width();
        });

        galleryNext.click(function(){
            galleryMove( 1, $(this) )
        })
        galleryPrev.click(function(){
            galleryMove( 0, $(this) )
        })

        function galleryMove(key,obj){
            galleryCurenTmp = galleryCurenNew;
            key ? galleryCurenTmp++ : galleryCurenTmp--;

            if (galleryCurenTmp>=gallerySize && galleryCurenTmp<=galleryCount) {
                galleryCurenNew = galleryCurenTmp;

                // проверить наличие незагруженных элементов и при необходимости загрузить
                galleryCheckLater();

                // выполняем прокрутку
                galleryItems.animate({left: -(galleryItemWidth*(galleryCurenNew - gallerySize))});
            }

            galleryCheckBtns();
        }

        function galleryCheckLater() {
            if (galleryCount-galleryCurenNew<=2 && galleryMoreCount>0 && !galleryLoadingMore) {
                // близко к краю списка, есть что загрузить и нет активной загрузки -
                // загружаем
                var url='/ajax/user/id'+User.id+'/wall/';
                var post = {
                    ajax: 'ajax',
                    comment_id: galleryLastId,
                    load_type: 'next'
                };
                galleryLoadingMore=true;
                $.ajax({
                    url: url,
                    type: 'post',
                    data: post,
                    success: function() {} //galleryAddElement
                });
            }
        }

        function galleryCheckNew() {
            var url='/ajax/user/id'+User.id+'/wall/';
            var post = {
                ajax: 'ajax',
                comment_id: galleryFirstId,
                load_type: 'new'
            };
            galleryLoadingMore=true;
            $.ajax({
                url: url,
                type: 'post',
                data: post,
                success: function() {} //galleryAddElement
            });

        }

        function galleryAddElements(data) {
            var tmpCont=$('#tmp-load-container',gallery);
            tmpCont.append(data);
            tmpCont.find(".cloud-item").width(galleryItemWidth);
            $(".cloud-item .delete",tmpCont).click(galleryDeleteItem);
            switch (WallGallery.addType) {
                case 'next': {
                    // добавление в конец списка более старых записей
                    galleryItems.append($('#tmp-load-container li',gallery));

                    galleryCount = $('.cloud-item',gallery).length; // кол-во элементов на стене
                    galleryItems.width( galleryItemWidth*galleryCount );

                    galleryLastId=WallGallery.lastId;
                    galleryMoreCount=WallGallery.moreCount;

                    galleryCheckBtns();
                    break;
                }
                case 'new': {
                    // добавление в начала списка ранних записей
                    if (WallGallery.firstId) {
                        galleryItems.prepend($('#tmp-load-container li',gallery));

                        var oldCount=galleryCount;
                        galleryCount = $('.cloud-item',gallery).length; // кол-во элементов на стене
                        galleryItems.width( galleryItemWidth*galleryCount );

                        // передвинуть маркер текущего
                        galleryCurenNew+=galleryCount-oldCount;
                        galleryItems.css({left: -(galleryItemWidth*(galleryCurenNew - gallerySize))});

                        galleryFirstId=WallGallery.firstId;

                        galleryCheckBtns();
                    }
                    break;
                }
            }
            WallGallery.addType=false;
            galleryLoadingMore=false;
        }

        function galleryCheckBtns() {
            if( galleryCurenNew < galleryCount ){
                galleryNext.removeClass("r-disable");
            }else{
                galleryNext.addClass("r-disable");
            }

            if( galleryCurenNew <= gallerySize ){
                galleryPrev.addClass("l-disable");
            }else{
                galleryPrev.removeClass("l-disable");
            }
        }

        function galleryDeleteItem() {
            var idRel=$(this).parents('.cloud-item').attr('id').replace(/[^\d]+/g,'');

            var url='/ajax/user/id'+User.id+'/wall/c'+idRel+'/delete/';
            var post = {
                ajax: 'ajax'
            };
            $.ajax({
                url: url,
                type: 'post',
                data: post,
                success: galleryDeleteResult
            });

        }
        function galleryDeleteResult(data) {
            eval('var answer='+data);

            popupMsgAddMessages(answer.messages);

            if (answer.isOk) {
                // убираем блок
                galleryRemoveItem(answer.comment_id);
            }

        }

        function galleryAddNewItem(commentInfo){

            galleryItemNew = $(galleryItemHTML)
                .prependTo(galleryItems)
                .width(galleryItemWidth)
                .attr("id","c"+commentInfo.comment_id)
                .addClass( "s"+ Math.round(Math.random()*2+1) );
            galleryItemNew.find(".cm-body")
                .css({"margin-top": ( Math.random()*40 ) + "px"});

            $('.nc-user',galleryItemNew).html(commentInfo.user.nickname);
            $('.nc-user',galleryItemNew).attr('href','/user/id'+commentInfo.user.id+'/');
            $('.nc-says',galleryItemNew).html(commentInfo.say_text);
            $('.nc-text',galleryItemNew).html(commentInfo.text);
            $('.nc-date',galleryItemNew).html(commentInfo.date);

            if (commentInfo.my_wall) {
                // добавляем возможность удаления
                $('.delete',galleryItemNew).click(galleryDeleteItem);
            }
            else {
                // убираем кнопку удаления
                $('.nc-delete',galleryItemNew).remove();
            }

            galleryCount++;
            galleryItems.width( galleryItemWidth*galleryCount );

            galleryFirstId=commentInfo.comment_id;
            galleryCheckBtns();
        }

        function galleryRemoveItem(commentId) {
            $('#c'+commentId).remove();
            galleryCount--;
            galleryItems.width( galleryItemWidth*galleryCount );
            if (galleryCurenNew>galleryCount) {
                galleryCurenNew--;
                galleryItems.css({left: -(galleryItemWidth*(galleryCurenNew - gallerySize))});
            }
            if (galleryCurenNew<=gallerySize) {
                galleryItems.css({left: 0});
            }
            galleryCheckLater();
            galleryCheckBtns();
        }

        galleryCheckBtns();
        gallery.everyTime(180*1000,galleryCheckNew);
    }
    if ($(".clouds-messages").length) {
        if (!SetupMode) {
            $(".clouds-messages").wallGallry();
        }
    }
    /* <<<<< Clouds gallery */


    /* >>>>> Auth & Remember */
    if ($('back-to-island').length > 0) {

    }
    /* <<<<< Auth & Remember */


    /* ALBUM */

    if ($('.b-gallery-list').length){

        var album = $('.b-gallery-list');
        var albumWrap = $('.b-gallery-list_wrap',album);
        var albumItems = $('ul',album);
        var albumItem = $('li',albumItems);

        var heihtWin = albumWrap.height();
        var heihtList = albumItems.height();

        if ( heihtList > heihtWin ){

            album.append('<div class="larr l-disable"></div><div class="rarr"></div>');

            var galleryPrev = album.find(".larr");
            var galleryNext = album.find(".rarr");

            galleryPrev.live("click", function(){
                AlbumMove( 1, $(this) )
            })
            galleryNext.live("click", function(){
                AlbumMove( 0, $(this) )
            })

        }

        function AlbumMove(key,obj){

            var dY = 200;
            var dT = 0;

            var itemsTop = parseInt(albumItems.css("top"))

            if ( !key && -itemsTop <= (heihtList-heihtWin) ){
                if( dY > (heihtList-heihtWin+itemsTop) ){dY=(heihtList-heihtWin+itemsTop)}
                dT = itemsTop-dY
            }

            if ( (-itemsTop) >= 0 && key){
                if( dY > (-itemsTop) ){dY=(-itemsTop)}
                dT = itemsTop+dY
            }

                if( (-itemsTop) >= (heihtList-heihtWin)){
                    galleryNext.addClass("r-disable");
                }else{
                    galleryNext.removeClass("r-disable");
                }

                if( (-itemsTop) <= 0 ){
                    galleryPrev.addClass("l-disable");
                }else{
                    galleryPrev.removeClass("l-disable");
                }

            albumItems.animate({top: dT});



        }

    }


    /* >>>> Comments */
    $.fn.commentsForm=function(){
        var commentFormBox=$('#comment-form-block');
        var commentFormLink=$('#comment-form-link');
        var commentForm=$('form',commentFormBox);

        var commentHTML='<li class="comments-item" id="comment#ID#" style="display: none;">'+
            '<dl class="clearfix">'+
                '<dt><a href="/user/id/"><img src="" alt="" /></a></dt>'+
                '<dd id="comment#ID#-content"><div>'+

                    '<p></p>'+
                    '<span><span class="say-text"></span> <a href="/user/id/" class="comment-nickname"></a> <span class="comment-date"></span>'+
                        '<span class="comment-answer" rel="#ID#">ответить</span>'+
                        '<span class="comment-delete" rel="#ID#">удалить</span>'+
                    '</span>'+
                    '<div class="says"></div>'+
                '</div></dd>'+
            '</dl>'+
            '<ol class="nm"></ol>'+
        '</li>';

        /**
         * выполняет ответ на комментарий
         */
        function commentAnswer(commentId) {
            // подставляем данные родителя
            $('#comment-parent',commentForm).val(commentId);

            // переместить форму в нужное место
            if (commentId) {
                $('#comments #comment'+commentId+'  .nm:first').prepend(commentFormBox);
                commentFormLink.show();
            }
            else {
                // если это клик на "написать" - то в самый низ
                commentFormLink.after(commentFormBox);
                commentFormLink.hide();
            }

            commentFormBox.removeClass('with-error');
            // показать форму
            commentFormBox.show();
        }

        /**
         * прячет форму при отмене
         */
        function commentHideForm() {
            commentFormBox.hide();
            commentFormLink.show();
            // чистим форму
            $('#comment-text',commentForm).val('');
            $('#comment-parent',commentForm).val(0);
        }

        /**
         * Выполняет удаление коммента
         */
        function commentDelete(commentId) {
            // прячем форму
            commentHideForm();
            // отправляем запрос
            var url='/ajax/user/id'+User.id+'/album/photo'+SelPhoto+'/c'+commentId+'/delete/';
            var post = {
                ajax: 'ajax'
            };
            $.ajax({
                url: url,
                type: 'post',
                data: post,
                success: commentDeleteResult
            });
        }

        function commentDeleteResult(data) {
            eval('var answer='+data);

            popupMsgAddMessages(answer.messages);

            if (answer.isOk) {
                // делаем из коммента удаленный
                var commentContainer=$('#comment'+answer.comment_id+'-content');
                $('p, span',commentContainer).remove();
                commentContainer.prepend('<p class="del-message">комментарий удален</p>');
            }

        }

        /**
         * выполняет проверку и отправку формы
         */
        function commentSend() {
            var commentVal=$('#comment-text',commentForm).val().trim();
            var parentVal=$('#comment-parent',commentForm).val();

            // проверить наличие текста в форме
            if (commentVal.length<2) {
                // выдать ошибку
                $('.error-text',commentFormBox).html((commentVal.length==0)?'нужно ввести комментарий':'комментарий слишком короткий');
                commentFormBox.addClass('with-error');
                return false;
            }
            commentFormBox.removeClass('with-error');

            // отправить запрос на ajax-обработчик
            var post = {
                ajax: 'ajax',
                comment: commentVal,
                parent_id: parentVal
            };
            $.ajax({
                url: '/ajax'+commentForm.attr('action'),
                type: 'post',
                data: post,
                success: commentSendResult
            });
        }

        /**
         * выполняет обработку результата добавления
         */
        function commentSendResult(data) {
            eval('var answer='+data);

            if (answer.isOk) {
                updateComments(answer.comments);
                updateUser(data);

                commentHideForm();
            }
            else {
                // выдать ошибку
                $('.error-text',commentFormBox).html(answer.errorText);
                commentFormBox.addClass('with-error');
            }

        }

        function updateComments(comments) {
            for (var i=0;i<comments.length;i++) {
                var commentInfo=comments[i];
                // добавляем блок коммента
                var newComment=commentHTML.replace(/#ID#/ig,commentInfo.comment_id);
                if (commentInfo.parent_id==0) {
                    // добавляем на верхний уровень
                    $('#comments').append(newComment);
                }
                else {
                    // добавляем как вложеный
                    var parentCommentItem=$('#comment'+commentInfo.parent_id);
                    if (!$('ol.nm',parentCommentItem).length) {
                        // еще не было вложенных. нужно добавить блок
                        parentCommentItem.append('<ol class="nm">'+newComment+'</ol>');
                    }
                    else {
                        // вложенные есть - просто добавляем в конец
                        $('ol.nm:first',parentCommentItem).append(newComment);
                    }
                }

                // заполнить данные
                var newCommentItem=$('#comment'+commentInfo.comment_id);
                $('p',newCommentItem).html(commentInfo.text);
                $('.say-text',newCommentItem).html(commentInfo.say_text);
                $('.comment-date',newCommentItem).html(commentInfo.date);
                $('.comment-nickname',newCommentItem).html(commentInfo.user.nickname);
                $('a',newCommentItem).attr('href','/user/id'+commentInfo.user.id+'/');
                $('img',newCommentItem).attr('src',commentInfo.user.avatar_s);
                if (commentInfo.user.id == MyUser.id) {
                    $('dl',newCommentItem).addClass('my-comment');
                }
                $('.comment-answer',newCommentItem).click(function(){commentAnswer($(this).attr('rel'));});
                if (commentInfo.allowDelete) {
                    $('.comment-delete',newCommentItem).click(function(){commentDelete($(this).attr('rel'));});
                }
                else {
                    $('.comment-delete',newCommentItem).remove();
                }

                // показать
                newCommentItem.show();
            }
        }

//        $('#comment-send',commentFormBox).click(commentSend);
//        $('#comment-hide-form',commentFormBox).click(commentHideForm);
//        $('#comments span.comment-answer').click(function(){ commentAnswer($(this).attr('rel')); });
//        $('#comments span.comment-delete').click(function(){ commentDelete($(this).attr('rel')); });
//        $('.comment-form-link').click(function(){ commentAnswer(0); });
    }

    if ($('#comment-form-block').length){
        $('#comment-form-block').commentsForm();
    }
    /* <<<< Comments */


    /* >>>> Article question */
    if ($('#AnswerForm').length) {

        function answerSend() {
            var selAnswer=$('#AnswerForm :radio[name=answer]:checked').val();
            if (!selAnswer) {
                var msg={
                    type: 'error',
                    message: 'Нужно выбрать ответ из предложенных вариантов',
                    description: '',
                    icon: 'e_error',
                    noClose: false
                };
                popupMsgAddMessage(msg);
                return;
            }
            var url='/ajax'+$('#AnswerForm').attr('action');
            var post = {
                ajax: 'ajax',
                answer: selAnswer
            };
            $.ajax({
                url: url,
                type: 'post',
                data: post,
                success: answerResult
            });
        }

        function answerResult(data) {
            eval('var answer='+data);

            popupMsgAddMessages(answer.messages);

            if (answer.isOk) {
                // убрать форму вопроса
                $('.a-question, .a-question-title').remove();
            }
        }

        $('#answer-question').click(answerSend);
    }
    /* <<<< Article question */

    /* >>>> Photos */
    if ($('#new-photo-link').length) {

        var popupPhotoHtml = '<div class="popup-box-msg popup-box-form" style="display:none"><div class="box-shadow" style="display:none"></div><div class="popup-info-msg popup-info-msg-form"><div class="popup-info-msg_i"><div class="popup-info-msg-body clearfix"><div class="msg-form">'+
        '<div class="msg-title">Новая фотография</div>'+
        '<div class="msg-message">'+
            '<form id="PhotoForm" action="" method="post" enctype="multipart/form-data" target="photo-uploader">'+
            '<p class="caption">Выберите фотографию:</p>'+
            '<p><input type="file" name="photo" id="photo-file" /><span class="error-text" id="photo-file-error"></span></p>'+
            '<p class="caption">Описание:</p>'+
            '<p><textarea name="description" id="photo-comment" rows="3" cols="40"></textarea><span class="error-text" id="photo-comment-error"></span></p>'+
            '</form>'+
            '<iframe name="photo-uploader" id="photo-uploader" src="" style="display: none"/>'+
        '</div></div><div class="popup-info-msg-foot"><input type="button" id="photo-send" value="добавить" /><input type="button" id="photo-close" value="закрыть" /></div></div></div></div></div>';

        $("body").append(popupPhotoHtml);
        var popupPhotoBox = $(".popup-box-form");
        var popupPhotoBorder = $(".popup-info-msg",popupPhotoBox);
        var popupPhotoShadow = $(".box-shadow",popupPhotoBox).bind('click', function() {popupPhotoHide()});
        var popupPhotoContent = $(".popup-info-msg_i",popupPhotoBox);
        var popupPhotoForm = $(".msg-form",popupPhotoBox);

        $("#photo-close",popupPhotoBox).bind('click', function() {popupPhotoHide()});
        var popupPhotoAddLink=$('#new-photo-link');

        function popupPhotoShow(){
            //popupMsgBox.addClass("popup-box_loading").show();
            popupPhotoOpened=true;
            popupPhotoBox.show();
            popupPhotoShadow.css({
                "width":$(document).width(),
                "height":$(document).height(),
                "display":"block",
                "opacity":0
            })
            .animate({opacity: 0.5});
        }
        function popupPhotoHide(){
            popupPhotoShadow.animate({opacity: 0});
            popupPhotoBox.hide();
            popupPhotoOpened=false;
        }

        function popupPhotoOpen() {
            if(!Lib.User.checkStatus()){
                return false;
            }
            //$('.msg-title span',popupPhotoContent).html(User.nickname);
            //$('#photo-comment',popupPhotoContent).val('');
            document.getElementById('PhotoForm').reset();
            popupPhotoForm.removeClass('with-error');
            popupPhotoShow();

            return false;
        }

        // форму отправляем в iframe
        // ответ - скрипт с результатом
        // или выдать ошибки
        // или добавить фотку (или перезагрузить страницу)

        function popupPhotoSendMsg() {
            var photoVal=$('#photo-file',popupPhotoForm).val().trim();
            var commentVal=$('#photo-comment',popupPhotoForm).val().trim();

            // проверить наличие текста в форме
            if (photoVal.length<2) {
                // выдать ошибку
                $('#photo-file-error',popupPhotoForm).html('выберите фотографию');
                popupPhotoForm.addClass('with-error');
                return false;
            }
            $('#photo-file-error, #photo-comment-error',popupPhotoForm).html('');
            popupPhotoForm.removeClass('with-error');
            $('#PhotoForm').attr('action','/ajax/user/id'+MyUser.id+'/album/add_photo/');

            document.getElementById('PhotoForm').submit();
        }

        function popupPhotoSendResult(data) {
            eval('var answer='+data);

            if (answer.isOk) {
                // добавить комментарий
                galleryAddNewItem(answer.comments[0]);
                updateUser(data);
                popupPhotoHide();
            }
            else {
                // выдать ошибку
                $('.error-text',popupPhotoForm).html(answer.errorText);
                popupPhotoForm.addClass('with-error');
            }
        }

        popupPhotoAddLink.click(popupPhotoOpen);
        $("#photo-send",popupPhotoBox).click(popupPhotoSendMsg);

        var photoListItemHTML=
        '<li><div>'+
            '<a href="#"><span><img src="#" alt="" /></span><em></em></a>'+
        '</div></li>';

        function photoAddItem(photoInfo) {
            photoItemNew = $(photoListItemHTML);
            $('.photos-album ul').append(photoItemNew);
            $('img',photoItemNew).attr('src',StaticHost+photoInfo.img_p);
            $('a',photoItemNew).attr('href','/user/id'+User.id+'/album/photo'+photoInfo.id+'/');
            if (photoInfo.description) {
                $('em',photoItemNew).html(photoInfo.description);
            }
            else {
                $('em',photoItemNew).remove();
            }
        }

        // будет вызываться из фрейма, поэтому делаем так
        $.fn.photoUploadResult=function(answer) {
            if (answer.isOk) {
                // добавить на страницу
                photoAddItem(answer.photo);

                updateUser(answer);

                // закрыть окно
                popupPhotoHide()
            }
            else {
                $('#photo-file-error, #photo-comment-error',popupPhotoForm).html('');
                // выдать ошибки формы
                if (answer.notices.photo) {
                    $('#photo-file-error',popupPhotoForm).html(answer.notices.photo);
                }
                if (answer.notices.description) {
                    $('#photo-comment-error',popupPhotoForm).html(answer.notices.description);
                }
                popupPhotoForm.addClass('with-error');
            }
            //$('#photo-uploader').attr('src','#');
        }


    }
    if ($('.photos-item').length) {
        var photoSingleBox=$('.photos-item');
        var photoBtnNext=$('.rarr',photoSingleBox);
        var photoBtnPrev=$('.larr',photoSingleBox);

        var photoCurImg=$('#photo-single-item img',photoSingleBox);
        var photoCurDescription=$('#photo-single-item em',photoSingleBox);
        var photoCount=Photos.length;

        function photoPrevClick() {
            SelPhotoId--;
            if (SelPhotoId < 0) {
                SelPhotoId=photoCount-1;
            }
            photoSetItem();
            return false;
        }

        function photoNextClick() {
            SelPhotoId++;
            if (SelPhotoId >= photoCount) {
                SelPhotoId=0;
            }
            photoSetItem();
            return false;
        }

        function photoSetItem() {
            var photoItem=Photos[SelPhotoId];
            SelPhoto=photoItem.id;

            photoCurImg.attr('src',StaticHost+photoItem.img_m);
            photoCurDescription.html(photoItem.description);

            // загрузить блок комментов
            $('.b-articles-comments').empty().html('L o a d i n g . . .');
            var url='/ajax/user/id'+User.id+'/album/photo'+SelPhoto+'/comments/';
            $('.b-articles-comments').load(url,function(){
                $('#comment-form-block').commentsForm();
            });
        }

        function photoDelete() {
            var url='/ajax/user/id'+User.id+'/album/photo'+SelPhoto+'/delete/';
            var post = {
                ajax: 'ajax',
                photo_pos: SelPhotoId
            };
            $.ajax({
                url: url,
                type: 'post',
                data: post,
                success: photoDeleteResult
            });
        }
        function photoDeleteResult(data) {
            eval('var answer='+data);

            popupMsgAddMessages(answer.messages);

            if (answer.isOk) {
                // убрать из списка фотку
                for (var i=answer.photo_pos;i<photoCount-1;i++) {
                    Photos[i]=Photos[i+1];
                }
                Photos[photoCount-1]=null;
                photoCount--;

                // если осталась одна фотка - отключить действия прокрутки
                if (photoCount==1) {
                    photoBtnNext.addClass('r-disable');
                    photoBtnPrev.addClass('l-disable');
                    photoBtnNext.unbind('click');
                    photoBtnPrev.unbind('click');

                    $('#photo-single-item',photoSingleBox).unbind('click');
                }
                // если не осталось - перейти в альбом
                else if (photoCount==0) {
                    window.location='/user/id'+User.id+'/album/';
                    return;
                }

                // перейти на следующую или предыдущую фотку
                if (SelPhotoId >= photoCount) {
                    SelPhotoId=0;
                }
                photoSetItem();
            }
        }

        if (Photos.length>1) {
            photoBtnNext.removeClass('r-disable');
            photoBtnPrev.removeClass('l-disable');
            photoBtnNext.click(photoNextClick);
            photoBtnPrev.click(photoPrevClick);

            $('#photo-single-item',photoSingleBox).click(photoNextClick);
        }
        $('.photo-delete',photoSingleBox).click(function(){photoDelete();});

    }
    /* <<<< Photos*/













    /**
     * Поиск игроков
     */

    // Загрузка и кеширование шаблона формы сообщения
    $.get('/app/tpl/ajax/user-mail.html', {}, function (template) {
        $.template('user-mail', template);
    });

    // Загрузка и кеширование шаблона информации о пользователе
    $.get('/app/tpl/ajax/user-info.html', {}, function (template) {
        $.template('user-info', template);
    });

    var notify = function(message) {
        $.modal({
            name     : 'success',
            skin     : 'm-success',
            type     : 'dialog',
            width    : 400,
            header   : message,
            content  : false,
            closeall : close
        });
    }

    var sendMessage = function(id, nick) {
        $.modal({
            name    : 'modal-user-message',
            skin    : 'm-user-message',
            header  : 'Личное сообщение',
            content : true,
            width   : 400,
            onOpen: function(obj) {
                var content = $('.m-content', obj).empty();

                var checkForm = function() {
                    if ( $('.text', obj).val() != '' && $('.textarea', obj).val() != '' )
                        $('.btn-message-send', obj).prop('disabled', false);
                    else
                        $('.btn-message-send', obj).prop('disabled', true);
                }

                $.tmpl('user-mail').appendTo(content);

                obj.delegate('.text, .textarea', 'keypress', checkForm);

                $('.btn-message-send', obj).prop('disabled', true);
            },
            buttons: [
                {
                    title: 'Отправить',
                    name: 'btn-message-send',
                    action: function() {
                        var btn = $(this);
                        var obj = $(this).parents('.modal');

                        $.ajax({
                            url      : '/ajax/message/send',
                            type     : 'post',
                            data     : {
                                title : $('.text', obj).val(),
                                text  : $('.textarea', obj).val(),
                                to_id : id
                            },
                            dataType : 'html',
                            beforeSend: function() {
                                $('.btn-message-send, .text, .textarea', obj).prop('disabled', true);
                            },
                            success: function(data) {
                                notify('Сообщение успешно доставлено игроку<br>' + nick + '.');
                            },
                            complete: function() {
                                $('.btn-message-send, .text, .textarea', obj).prop('disabled', false);
                            }
                        });
                    }
                }
            ]
        });
    }

    var userSearch = function() {

        $.ajax({
            url      : '/ajax/users',
            type     : 'post',
            data     : $('#search-form').serialize(),
            dataType : 'json',
            beforeSend: function() {
                $('.search-button').prop('disabled', true);
            },
            success: function(data) {
                $('.search-content-right').empty()
                    .append( $('#search-user').tmpl(data.users) );

                $('.search-count').html(data.count);
            },
            complete: function() {
                $('.search-button').prop('disabled', false);
            }
        });

        $('#search-form').submit(function() { return false });
    }

    if ($('.search-box').size())
        userSearch();

    $('.search-button').bind('click', userSearch);
    $('.search-sort').bind('change', userSearch);

    $('.search-item-link').bind('click', function() {
        var obj = $(this);
        var value = obj.attr('rel');

        $('.search-type-hidden').val(value);
        $('.search-item-link').removeClass('search-item-link-active');
        obj.addClass('search-item-link-active');

        $('.search-content-right').empty();
        $('.search-count').empty();
        $('.search-input-text').val('');

        userSearch();

        return false;
    });

    var getUserInfo = function(id) {

        $.ajax({
            url      : '/ajax/user/id' + id,
            type     : 'post',
            dataType : 'json',
            success: function(data) {

                $.modal({
                    name    : 'modal-user-info',
                    skin    : 'm-user',
                    header  : false,
                    content : true,
                    width   : 600,
                    onOpen: function(obj) {
                        var content = $('.m-content', obj).empty();
                        var action = (data.isFriend) ? 'fromfriend' : 'tofriend';

                        // Заполнение шаблона
                        $.tmpl('user-info', data).appendTo(content);



                        content.delegate('.btn-user-mail', 'click', function() {
                            var obj = $(this);

                            sendMessage(data.id, data.nick);

                            return false;
                        });



                        content.delegate('.btn-user-friend', 'click', function() {
                            var obj = $(this);

                            $.ajax({
                                url      : '/ajax/user/id' + data.id + '/' + action,
                                type     : 'post',
                                dataType : 'html',
                                success: function() {
                                    action = (action == 'tofriend') ? 'fromfriend' : 'tofriend';

                                    obj.toggleClass('user-friend-added');
                                }
                            });

                            return false;
                        });



                        content.delegate('.btn-user-island', 'click', function() {
                            var obj = $(this);
                            window.location.replace('/user/id' + data.id);
                            return false;
                        });
                    },
                    buttons: (data.itsme) ? [
                        {
                            title : 'Изменить',
                            name  : 'user-profile-edit',
                            action: function() {
                                window.location.href = '/user/id' + data.id + '/edit/';
                            }
                        }
                    ] : []
                });

            }
        });

    }

    $('.search-content-right').unbind().delegate('.search-user', 'click', function() {
        getUserInfo( $(this).data('id') );
        return false;
    });

    $('.island-body').unbind().delegate('.user-details-link', 'click', function() {
        getUserInfo( $(this).data('id') );
        return false;
    });




    /* >>>> Users list */
    /*
    if ($('.user-friends-item').length>0 && typeof(UList)!='undefined') {
        var uListBox=$('#users-box');
        var uListNextBtn=$('.user-friends-item .rarr');
        var uListPrevBtn=$('.user-friends-item .larr');

        var uListCount=$('#users-count');
        var uListNums=$('#users-nums');

        var uListParams=UList;


        function uListNext() {
            if (uListParams.page<uListParams.pages) {
                uListPage(uListParams.page+1);
            }
        }
        function uListPrev() {
            if (uListParams.page>1) {
                uListPage(uListParams.page-1);
            }
        }

        function uListPage(pageNum) {
            var letter=(uListParams.letter!='')?('ltr'+uListParams.letter):'';
            var url='/ajax/users/'+uListParams.type+((uListParams.letter!='')?('/ltr'+uListParams.letter):'')+'/page'+pageNum+'/';
            uListBox.load(url,function(){
                uListParams=UList;
                uListCheckBtn();
                uListSetInfo();
            });
        }

        function uListCheckBtn() {
            if (uListParams.page<uListParams.pages) {
                uListNextBtn.removeClass('r-disable');
            }
            else {
                uListNextBtn.addClass('r-disable');
            }
            if (uListParams.page>1) {
                uListPrevBtn.removeClass('l-disable');
            }
            else {
                uListPrevBtn.addClass('l-disable');
            }
        }

        function uListSetInfo() {
            uListCount.html(uListParams.total);
            var numsHTML=uListParams.from+'-'+uListParams.to;
            uListNums.html(numsHTML);
        }

        uListNextBtn.click(uListNext);
        uListPrevBtn.click(uListPrev);
        uListCheckBtn();
        uListSetInfo();
    }
    */
    /* <<<< Users list */

    // проверка наличия глобальной ошибки
    if (typeof(GlobalErrorMessage)!='undefined') {
        var msg={
            type: 'error',
            message: GlobalErrorMessage,
            description: '',
            icon: 'e_error',
            noClose: true
        };
        popupMsgAddMessage(msg);
    }
    if (typeof(GlobalError)!='undefined') {
        var msg={
            type: 'error',
            message: GlobalError,
            description: '',
            icon: '',
            noClose: false
        };
        popupMsgAddMessage(msg);
    }
    if (typeof(GlobalMessage)!='undefined') {
        var msg={
            type: 'message',
            message: GlobalMessage,
            description: '',
            icon: GlobalMessageIcon,
            noClose: false
        };
        popupMsgAddMessage(msg);
    }

    // проверка наличия уведомлений
    Lib.User.notificationCheck();


    // проверка доступности сайта

        // отправляем текущее время
        var url='/ajax/time/';
        var d=new Date();
        var post = {
            ajax: 'ajax',
            Y: d.getFullYear(),
            m: d.getMonth(),
            d: d.getDate(),
            H: d.getHours(),
            i: d.getMinutes(),
            s: d.getSeconds()
        };
        $.ajax({
            url: url,
            type: 'post',
            data: post,
            success: function(){}
        });


});


$(document).ready(function() {
    $(".messages-link").click(function(){
        $('.star-page').stopTime("timerAnimal");
        $(".b-messages").animate({"opacity":0},function(){$(this).css({"display":"none"})});
        $(this).find(".b-messages").stop(true,false).css({"display":"block"}).animate({"opacity":1});
        //если облако животного, тогда добавит таймер на скрытие
        if ($(this).hasClass('animal-cloud')) {
            $('.star-page').oneTime("2s", "timerAnimal", function() {
                $(".b-messages").animate({"opacity":0},function(){$(this).css({"display":"none"})});
            });
        }
        //return false;
    });
    $(".message-close").click(function(){
        $('.star-page').stopTime("timerAnimal");
        $(".b-messages").animate({"opacity":0},function(){$(this).css({"display":"none"})});
        return false;
    });
});

