var bossMail = function()
{
    var options = {
        overlayId   : 'overlay_boss',
        contentId   : 'boss_mail',
        contentSize : {width  : 423,
                       height : 440},
        msgDefValue : 'Сообщение',
        url         : '/mailfordirector/block/',
        captchaUrl  : '/kcaptcha.php'
    }
    
    var overlay = null;
    var content = null;
    var topOffset = 0;
    var contentHtml = null;
    var baseHeight = options.contentSize.height;
    var formVisible = true;
    
    function show()
    {
        initOverlayDiv();
        
        overlay.show();
        content.show();
        
        if (!formVisible) {
            hideMessages();
            showForm();
        }
    }
    
    function hide()
    {
        content.hide();
        overlay.hide();                    
    }
    
    function initOverlayDiv()
    {
        if (null === overlay) {
            addOverlayDiv();
            overlay.height($(document).height());
            bindScrollEvent();
            bindResizeEvent();
            bindClickEvent();
        }
        
        initContentPosition();        
    }
    
    function initContentPosition()
    {
        var left = ($(window).width() > options.contentSize.width) ? Math.round(($(window).width() - options.contentSize.width) / 2) : 0;

        calculateTopOffset();
        var top = topOffset + $(window).scrollTop();                
        
        content.css({top:top + 'px', left:left + 'px'});
    }
    
    function calculateTopOffset()
    {
        topOffset = ($(window).height() > options.contentSize.height) ? Math.round(($(window).height() - options.contentSize.height) / 2) : 0;
    }
    
    function addOverlayDiv()
    {
        $('body').append('<div id="' + options.overlayId + '"></div>');
        overlay = $('#' + options.overlayId);
        
        $('body').append(contentHtml);
        content = $('#' + options.contentId);
    }
    
    function bindScrollEvent()
    {
        $(window).scroll(function () {
            if (topOffset > 0) {
                var top = topOffset + $(window).scrollTop();
                
                content.css({top:top});
            }
        });
    }
    
    function bindResizeEvent()
    {
        $(window).resize(function () {
            initContentPosition();
        });
    }
    
    function bindClickEvent()
    {
        overlay.click(function() {bossMail.close();});
    }
    
    function showLoading()
    {
        $('#' + options.contentId + ' div.right input').hide();
        $('#' + options.contentId + ' div.right span').show();
    }
    
    function hideLoading()
    {
        $('#' + options.contentId + ' div.right span').hide();
        $('#' + options.contentId + ' div.right input').show();        
    }
    
    function send()
    {
        hideErrors();
        hideMessages();
        showLoading();
        
        var params = $('#' + options.contentId + ' form').serializeArray();
        
        $.post(options.url, params, sendResponse, 'json');
    }
    
    function sendResponse(data)
    {
        hideLoading();
        
        if (data.result) {
            showMessages(['Спасибо! Ваше сообщение было успешно отправлено!']);
            refreshCaptcha();
            clearForm();
            hideForm();
            
            setTimeout(function() {hide();}, 1200);
        } else {
            refreshCaptcha();
            showErrors(data.errors);   
        }
    }
    
    function hideForm()
    {
        formVisible = false;
        $('#' + options.contentId + ' form').hide();
        $('#' + options.contentId + ' p').hide();
    }
    
    function showForm()
    {
        formVisible = true;
        $('#' + options.contentId + ' form').show();
        $('#' + options.contentId + ' p').show();
    }
    
    function clearForm()
    {
        $('#' + options.contentId + ' form').get(0).reset();
    }
    
    function showMessages(messages)
    {
        var messagesUl = $('#' + options.contentId + ' ul.messages');
        
        for (var i=0;i<messages.length;i++) {
            messagesUl.append('<li>' + messages[i] + '</li>');
        }

        messagesUl.show();
        
        topOffset = 0;
    }
    
    function hideMessages()
    {
        $('#' + options.contentId + ' ul.messages').empty().hide();
        calculateTopOffset();
    }
    
    function showErrors(errors)
    {
        var errorsUl = $('#' + options.contentId + ' ul.errors');
        
        for (var i=0;i<errors.length;i++) {
            errorsUl.append('<li>' + errors[i] + '</li>');
        }
                
        errorsUl.show();

//        options.contentSize.height = baseHeight + 30 * errors.length;
        topOffset = 0;
//        calculateTopOffset();
    }
    
    function hideErrors()
    {
        $('#' + options.contentId + ' ul.errors').empty().hide();
//        options.contentSize.height = baseHeight;
        calculateTopOffset();
    }
    
    function refreshCaptcha()
    {
        $('#' + options.contentId + ' td.captcha img').attr('src', options.captchaUrl + '?r=' + Math.random());
    }
    
    return {
        onLinkClick : function()
        {
            if (null === contentHtml) {
                alert('Пожалуйста, подождите. Страница ещё не загрузилась полностью...');
                return false;
            }
            
            show();
        },
        
        setup : function(html)
        {
            contentHtml = html;
        },
        close : function()
        {
            hide();
        },
        
        onMsgFocus : function(element)
        {
            if (element.value == options.msgDefValue) {
                element.value = '';
            }
        },
        
        onMsgBlur : function(element)
        {
            if (element.value == '') {
                element.value = options.msgDefValue;
            }
        },
        
        send : function()
        {
            send();
        }
    }
} ();
