function show_reply_form(comment_id, quoting) {
    var comment = $('#fcomment_' + comment_id);
    var replyLink = $('#link_reply_' + comment_id);
    replyLink.replaceWith('<a class="answer" id="link_reply_' + comment_id + '" href="javascript:hide_reply_form('+comment_id+');" class="column_unit_comm_leave">Отменить</a>');
    // прячем ссылку "цитировать"
    $('#link_quote_' + comment_id).hide();
    
    var url = _FORM_URL + comment_id + '/';
    var url_form = url.replace('/comment', '/form');
    if (quoting) {
        url_form += 'quote/'
    }
    $.get( url_form, {}, function(data) {
        var form = $(data);
        form.css('display', 'none');
        comment.append(form);
        form.slideDown();
        apply_form_hijax(form);
    });
}

function comment_delete(comment_id) {
    if (confirm("Уверены, что хотите удалить?")) {
        var comment = $('#c' + comment_id);
        var url = '/threadedcomments/comment_delete/' + comment_id;
        $.getJSON( url, {}, function(data) {
            if (data.success) {
                comment.html(data.comment_deleted);
                // уменьшаем количество комментов на единицу
                var cnt_com = $('#entry_cnt_comments');
                if (cnt_com) {
                    var new_count = (parseInt($('#entry_cnt_comments').text()) > 0) ? parseInt($('#entry_cnt_comments').text()) - 1 : 0;
                    $('#entry_cnt_comments').text(new_count);
                }
            } else {
                alert(data.error);
            }
        });
    }
}

function hide_reply_form(comment_id) {
    var replyLink = $('#link_reply_' + comment_id);
    replyLink.replaceWith('<a class="answer" id="link_reply_' + comment_id + '"href="javascript:show_reply_form('+comment_id+')" class="column_unit_comm_leave">Ответить</a>');
    // показываем ссылку "цитировать"
    $('#link_quote_' + comment_id).show();
    
    var form = $('#c' + comment_id + ' form');
    var errors = $('#ecomment_'+comment_id)
    errors.slideUp(function() { errors.remove(); });
    form.slideUp(function() { form.remove(); });
}

function hide_show_comment(id) {
    $('#c' + id + ' .show_comment').css('display', 'none');
}
function show_show_comment(id) {
    $('#c' + id + ' .show_comment').css('display', 'inline');
}
function hide_reply(id) {
    $('#c' + id + ' .reply').css('display', 'none');
}
function show_reply(id) {
    $('#c' + id + ' .reply').css('display', 'inline');
}
function hide_comment(comment_id) {
    hide_reply_form(comment_id);
    var comment_body = $('#c' + comment_id + ' .body');
    comment_body.slideUp();
    $('#c' + comment_id + ' .show_comment').replaceWith('<a href="javascript:show_comment('+comment_id+')" class="show_comment">Показать</a>');
    $('#c' + comment_id).fadeTo('fast', 0.50);
    hide_reply(comment_id);
}
function show_comment(comment_id) {
    var comment_body = $('#c' + comment_id + ' .body');
    comment_body.slideDown();
    $('#c' + comment_id + ' .show_comment').replaceWith('<a href="javascript:hide_comment('+comment_id+')" class="show_comment">Скрыть</a>');
    $('#c' + comment_id).fadeTo('fast', 1);
    show_reply(comment_id);
}
function show_login_form() {
    $('#login').replaceWith('<form method="POST" action="'+_LOGIN_URL+'" id="login"><ul><li id="login_messages"></li><li>Username:</li><li><input type="text" name="username"></input></li><li>Password:</li><li><input type="password" name="password"></input></li><li><input type="submit" id="register_now" value="Log In"></input></li></ul></form>');
    var beforeSubmit = function(formData, jqForm, options) {
        var form = jqForm[0];
        if(form.password.value.length < 4) {
            $('#login_messages').removeClass('register_success').addClass('register_failure').text('Password must be at least 4 characters in length.');
            return false;
        }
        if(form.password.value.length > 128) {
            $('#login_messages').removeClass('register_success').addClass('register_failure').text('Password must be at most 128 characters in length.');
            return false;
        }
        if(form.username.value.length < 3) {
            $('#login_messages').removeClass('register_success').addClass('register_failure').text('Username must be at least 3 characters in length.');
            return false;
        }
        if(form.username.value.length > 128) {
            $('#login_messages').removeClass('register_success').addClass('register_failure').text('Username must be at most 128 characters in length.');
            return false;
        }
    }
    var success = function(data) {
        window.location.reload();
    }
    var options = {
        beforeSubmit : beforeSubmit,
        success : success
    };
    $('#login').ajaxForm(options);
}
function show_registration_form() {
    $('#register').replaceWith('<form method="POST" action="'+_REGISTER_URL+'" id="register"><ul><li id="register_messages"></li><li>Username:</li><li><input type="text" name="username"></input></li><li>Password:</li><li><input type="password" name="password"></input></li><li><input type="submit" id="register_now" value="Register"></input></li></ul></form>');
    var beforeSubmit = function(formData, jqForm, options) {
        var form = jqForm[0];
        if(form.password.value.length < 4) {
            $('#register_messages').removeClass('register_success').addClass('register_failure').text('Password must be at least 4 characters in length.');
            return false;
        }
        if(form.password.value.length > 128) {
            $('#register_messages').removeClass('register_success').addClass('register_failure').text('Password must be at most 128 characters in length.');
            return false;
        }
        if(form.username.value.length < 3) {
            $('#register_messages').removeClass('register_success').addClass('register_failure').text('Username must be at least 3 characters in length.');
            return false;
        }
        if(form.username.value.length > 128) {
            $('#register_messages').removeClass('register_success').addClass('register_failure').text('Username must be at most 128 characters in length.');
            return false;
        }
    }
    var success = function(data) {
        window.location.reload();
    }
    var options = {
        beforeSubmit : beforeSubmit,
        success : success
    };
    $('#register').ajaxForm(options);
    var ajax_in_progress = false;
    $('#register').keyup(function(eventObject) {
        var username = $('#register :text').fieldValue()[0];
        if(username.length > 2 && !ajax_in_progress) {
            var s = function(data, textStatus){
                $('#register_messages').removeClass('register_failure');
                $('#register_messages').addClass('register_success');
                $('#register_messages').text('Username ' + username + ' IS available.');
                ajax_in_progress = false;
            }
            var e = function(XMLHttpRequest, textStatus, errorThrown){
                $('#register_messages').removeClass('register_success');
                $('#register_messages').addClass('register_failure');
                $('#register_messages').text('Username ' + username + ' is NOT available.');
                ajax_in_progress = false;
            }
            var options = {
                url: _CHECK_EXISTS_URL,
                data: {username: username},
                beforeSend: function(XMLHttpRequest) { ajax_in_progress = true; },
                success: s,
                error: e
            };
            $.ajax(options);
        }
    });
}

function _apply_form_hijax(comment_form_selector, data) {
    var comment_form = $(comment_form_selector);
    var comment_form_parent = comment_form.parent();
    comment_form.remove();
    comment_form_parent.append(data.form);
    var new_comment_form = $(comment_form_selector);
    apply_form_hijax(new_comment_form);

//    try {
//        $(new_comment_form).find('input[@disabled]').removeAttr('disabled');
//    } catch(e) {}

    return new_comment_form;
}

function apply_form_hijax(selector) {
    
    selector.each(function(){
        if (_COMMENTS_PAGE) {
            this.action += '?page=' + _COMMENTS_PAGE;
        }
    });

    var beforeSubmit = function(formData, jqForm, options) {
        try {
            jqForm.find('input[type=image]').attr('disabled', true).css('opacity', '0.2');
        } catch(e) {}
        
//        try {
//            jqForm.find('input[@type=submit]').attr('disabled', 'disabled').val('Подождите...');
//        } catch(e) {
//            alert('Error');
//        }
    }

    var success = function(data) {
        if (data.success) {
            if (data.need_redirection) {
                window.location = data.redirection_url;
                return;
            }
            if (data.parent_id) {
                if (data.hide_parent_comment_delete_link) {
                    $('#link' + data.parent_id).hide();
                }
                var parent = $('#c' + data.parent_id);
                var depth_re = new RegExp('depth\-(\\d+)');
                var classes = parent.attr('class');
                var depth = parseInt(depth_re.exec(classes)[1]) + 1;
                if (depth > 6) {
                    depth = 6;
                }
                
                var comment_data = data.comment_data.replace('depth-0', 'depth-'+depth);
                
                var sibling = null;
                /*for (var i = parseInt(depth) - 1; i >= 0; --i) {
                    var n = parent.nextAll('.depth-' + i);
                    if(n.length > 0) {
                        sibling = n.filter(':first');
                        i = -1;
                    }
                }*/
                for (var i = parseInt(depth) - 1; i >= 0; --i) {
                    var str = '';
                    for (var j = i; j >= 0; j--) {
                        str += '.depth-' + j + ',';
                    }
                    str = str.substr(0, str.length-1) + ',.pager';
                    // выбираем все комменты, глубина которых такая же или меньше, чем у parent
                    var n = parent.nextAll(str);
                    if(n.length > 0) {
                        sibling = n.filter(':first');
                        i = -1;
                    }
                }
                
                if (sibling == null) {
                    var last_next = parent.nextAll(':last');
                    if (last_next.length > 0) {
                        last_next.after(comment_data);
                    } else {
                        $('#comments').append(comment_data);
                    }
                } else {
                    sibling.before(comment_data);
                }
                hide_reply_form(data.parent_id);
            } else {
                $('#comments').append(data.comment_data);
                //$('#comments div.pager').before(data.comment_data);
                var new_comment = $('#comments div:last')
                var comment_form = _apply_form_hijax('.responseform', data);
                var scroll_top = new_comment.offset().top - (($(document.body).height() - new_comment.height()) / 2);
                $('html,body').animate({scrollTop: scroll_top + 'px'}, 0, 'swing');
            }
            
            var cnt_com = $('#entry_cnt_comments');
            if (cnt_com) {
                $('#entry_cnt_comments').text(data.cnt_comments);
            }
        } else {
            object_id = data.object_id;
            comment_id = data.parent_id;
            if (!comment_id) {
                var comment_form_selector = '.responseform';
            } else {
                var comment_form_selector = '#fcomment_'+comment_id+' > form';
            }
            _apply_form_hijax(comment_form_selector, data);
        }
    }
    var options = {
        beforeSubmit : beforeSubmit,
        success : success,
        dataType : 'json'
    };
    if (selector.ajaxForm != undefined) 
        selector.ajaxForm(options);
}

function blur(comment, id) {
    comment.addClass('blurred');
    hide_comment(id);
    hide_show_comment(id);
    comment.fadeTo('fast', 0.2);
}

function show_message_reply_form(message_id, username) {
    $.ajax({
        type: "GET",
        url: '/accounts/profile/xml_message_reply/' + message_id + '/',
        dataType: "html",
        success: function(data){
            ds = data.split('|||');
            nmessage = ds[1];
            skey = ds[0];

            var message = $('#fmessage_' + message_id);
            var replyLink = $('#link' + message_id);
            replyLink.replaceWith('<a id="link' + message_id + '" href="javascript:hide_message_reply_form(' + message_id + ',\'' + username + '\');" class="comm reply">Отменить</a>');
            var url = '/accounts/' + username + '/' + message_id + '/message_add/';
            var reply_to_html = '';
    
            var _MFORM = '<textarea class="input_area" id="id_message_'+ message_id + '" name="message">' + nmessage + '</textarea>';
            var _SKEY = '<input type="hidden" name="skey" value="' + skey + '">';
            var form = $('<form id="reply_form'+message_id+'" method="post" action="'+url+'" class="responseform">' + _SKEY + _MFORM + '<input class="submitbutton" type="submit" value="Отправить"></form>');
            form.css('display', 'none');
            message.append(form);
            form.slideDown();
        },
        error: function(){
        }
    });
    
}

function hide_message_reply_form(message_id, username) {;
    var replyLink = $('#link' + message_id);
    replyLink.replaceWith('<a id="link' + message_id + '"href="javascript:show_message_reply_form('+message_id+',\''+username+'\')" class="comm reply">Ответить</a>');
    var form = $('#reply_form'+message_id);
    form.slideUp();
    form.remove();
}

function send_form(form) {
    comment = form.comment.value.replace(/(^\s+)|(\s+$ )/g, "")
    if (comment.length > 0) {
        form.submit();
        $('.submitbutton', form).attr('disabled', 'disabled').val('Подождите...');
    }
}

jQuery.fn.toggleCheckboxes = function(ignore) {
    ignore = ignore || [];
    return this.each(
        function() {
            jQuery("input[@type=checkbox]", this).not(ignore).each(
                function() {
                    this.checked = !this.checked;
                }
            )
        }   
    )
}

$(document).ready(function() {
    apply_form_hijax($('.responseform'));
});

