// http://www.lanoo.c Copyright(c). All rights reserved.
 
var last_len = 0;
var message_timer = null;

var message_type;
var loading_message = false;
var show_new_message;
var author_only;

var favor_in_progress     = false;
var publish_in_progress   = false;
var remove_in_progress    = false;
var shorten_in_progress   = false;
var subscribe_in_progress = false;

$.fn.setCursorPosition = function(pos) {
    if ($(this).get(0).setSelectionRange) {
        $(this).get(0).setSelectionRange(pos, pos);

    } else if ($(this).get(0).createTextRange) {
        var range = $(this).get(0).createTextRange();

        range.collapse(true);
        range.moveEnd('character', pos);
        range.moveStart('character', pos);
        range.select();
    }
};

$.fn.insertAtCaret = function (tagName) {
	return this.each(function(){
		if (document.selection) {
			//IE support
			this.focus();
			sel = document.selection.createRange();
			sel.text = tagName;
			this.focus();
		}else if (this.selectionStart || this.selectionStart == '0') {
			//MOZILLA/NETSCAPE support
			startPos = this.selectionStart;
			endPos = this.selectionEnd;
			scrollTop = this.scrollTop;
			this.value = this.value.substring(0, startPos) + tagName + this.value.substring(endPos,this.value.length);
			this.focus();
			this.selectionStart = startPos + tagName.length;
			this.selectionEnd = startPos + tagName.length;
			this.scrollTop = scrollTop;
		} else {
			this.value += tagName;
			this.focus();
		}
	});
};

function setStatus(s) {
    var status = $('#message_form input[name=status]');
    status.val(s);
}

function getStatus() {
    var status = $('#message_form input[name=status]');
    return status.val();
}

function disableSubmit() {
    var message_submit = $('#message_submit');
    var status = getStatus();

    message_submit.attr('disabled', 'disabled');

    if (status == 'normal')
        message_submit.css('background-position','left -40px')

    else if (status == 'direct')
        message_submit.css('background-position','left -280px')

    else if (status == 'reply')
        message_submit.css('background-position','left -120px')

    else if (status == 'edit')
        message_submit.css('background-position','left -200px')
}

function enableSubmit() {
    var message_submit = $('#message_submit');
    var status = getStatus();

    message_submit.removeAttr('disabled');

    if (status == 'normal')
        message_submit.css('background-position','left top')

    else if (status == 'direct')
        message_submit.css('background-position','left -240px')

    else if (status == 'reply')
        message_submit.css('background-position','left -80px')

    else if (status == 'edit')
        message_submit.css('background-position','left -160px')
}

function messageChange() {
    var message_len = $('#message_text').val().length;

    if (message_len > 140 && last_len <= 140) {
        disableSubmit();
    }
    else if (message_len <= 140 && last_len > 140) {
        enableSubmit();
    }
    else if (message_len > 0 && last_len == 0) {
        enableSubmit();
    }
    else if (message_len == 0 && last_len > 0) {
        setStatus('normal');
        disableSubmit();
    }
    else if (message_len != last_len && message_len > 0 && message_len <= 140) {
        enableSubmit();
    }

    if (message_len != last_len) {
        last_len = message_len;
        $('#char_count b').html(140-message_len);
    }

    return true;
}

function messageFocus() {
    message_timer = setInterval(messageChange, 400);
}

function messageBlur() {
    clearInterval(message_timer);
    message_timer = null;
}

function messageCutPaste() {
    setTimeout(messageChange, 10);
    return true;
}

function sendNotify() {
    var notice = $('#send_notify');
    var status = getStatus();
    var msg;

    if (status == 'reply')
        msg = '回复成功';
    
    else if (status == 'edit')
        msg = '修改成功';

    else if (status == 'direct')
        msg = '信已发出';

    else
        msg = '发布成功';

    notice.html(msg);
    notice.show().fadeOut(4000);
}

function publishMessage() {
    if (publish_in_progress)
        return false;

    publish_in_progress = true;

    $('#message_form').ajaxSubmit({
        url: '/message/publish.json',

        success:
            function(data) {
                if(data.success) {
                    var status = getStatus();

                    if (status == 'normal' || status == 'direct' || status == 'reply') {
                        if(show_new_message) {
                            if (message_type != 'review' || data.show_review) {
                                $('#timeline').prepend(data.message);
                                bindMessageEvents();

                                $('#message_' + data.hid).hide().fadeIn(1400);
                                $('#empty_intro').hide();
                            }
                        }

                        if (message_type == 'discussion') {
                            var reply_to = $('#message_form input[name=reply_to]');

                            $('#message_' + reply_to.val()).next('ul').append('<li>' + data.message + '</li>');
                            bindMessageEvents();

                            $('#message_' + data.hid).hide().fadeIn(1400);
                        }
                    }
                    else if (status == 'edit') {
                        $('#message_' + data.hid).replaceWith(data.message);
                        bindMessageEvents();
                    }

                    sendNotify();
                    setStatus('normal');

                    $('#message_text').val('');
                    messageChange();
                }
                else
                    alert(data.err_msg);

                publish_in_progress = false;
            },

        dataType: 'json'
    });

    return false;
}

function shortenUrl() {
    if (shorten_in_progress)
        return false;

    shorten_in_progress = true;

    $('#shorten_form').ajaxSubmit({
        url: '/shorten_url.json',

        success:
            function(data) {
                $('#shorten_box').dialog('close');

                if(data.success) {
                    $('#message_text').insertAtCaret(' ' + data.short_url + ' ');

                    pageTracker._trackPageview('/shorten_url.json');
                }
                else
                    alert(data.err_msg);

                shorten_in_progress = false;
            },

        dataType: 'json'
    });

    return false;
}

function subscribe() {
    if (subscribe_in_progress)
        return false;

    subscribe_in_progress = true;

    var user_name = $('#subscribe_link').attr('user_name');

    $.post('/user/subscribe.json',
        { op: 1, user_name: user_name },

        function(data) {
            if (data.success) {
                $('#subscribed').show();
                $('#subscribe').hide();

                pageTracker._trackPageview('/user/subscribe.json');
            }
            else
                alert(data.err_msg);

            subscribe_in_progress = false;
        },

        'json'
    );

    return false;
}

function favor() {
    if (favor_in_progress)
        return false;

    favor_in_progress = true;

    var self = $(this);
    var message_id = self.parents('.message').attr('id');

    $.post('/message/favor.json',
        { op: 1, message_id: message_id.substr(8) },

        function(data) {
            if (data.success) {
                $('#' + message_id + ' .disfavor').show();
                self.hide();
            }
            else
                alert(data.err_msg);

            favor_in_progress = false;
        },

        'json'
    );

    return false;
}


function disfavor() {
    if (favor_in_progress)
        return false;

    favor_in_progress = true;

    var self = $(this);
    var message_id = self.parents('.message').attr('id');

    $.post('/message/favor.json',
        { op: 0, message_id: message_id.substr(8) },

        function(data) {
            if (data.success) {
                $('#' + message_id + ' .favor').show();
                self.hide();
            }
            else
                alert(data.err_msg);

            favor_in_progress = false;
        },

        'json'
    );

    return false;
}

function reply() {
    var self = $(this);
    var message_id = self.parents('.message').attr('id');
    var user_name = $('#' + message_id + ' .message_content .user_name').html();

    setStatus('reply');

    $('#message_form input[name=reply_to]').val(message_id.substr(8));
    $('#message_text').val('').insertAtCaret('@' + user_name + ' ');

    $(window).scrollTop(0);

    return false;
}

function forward() {
    if (publish_in_progress)
        return false;

    publish_in_progress = true;

    var self = $(this);
    var message_id = self.parents('.message').attr('id');
    var user_name = $('#' + message_id + ' .message_content .user_name').html();

    $.post('/message/load_text.json',
        { message_id: message_id.substr(8) },

        function(data) {
            if (data.success) {
                $('#message_text').val('').insertAtCaret(' 转 @' + user_name + ' ' + data.message_text);
                $('#message_text').setCursorPosition(0);
                setStatus('normal');

                $(window).scrollTop(0);
            }
            else
                alert(data.err_msg);

            publish_in_progress = false;
        },

        'json'
    );

    return false;
}

function edit() {
    if (publish_in_progress)
        return false;

    publish_in_progress = true;

    var self = $(this);
    var message_id = self.parents('.message').attr('id').substr(8);

    $.post('/message/load_text.json',
        { message_id: message_id },

        function(data) {
            if (data.success) {
                $('#message_text').val('').insertAtCaret(data.message_text);

                $('#message_form input[name=message_id]').val(message_id);
                setStatus('edit');

                $(window).scrollTop(0);
            }
            else
                alert(data.err_msg);

            publish_in_progress = false;
        },

        'json'
    );

    return false;
}

function remove() {
    if (remove_in_progress)
        return false;

    remove_in_progress = true;

    var self = $(this);
    var message_id = self.parents('.message').attr('id');

    $.post('/message/remove.json',
        { message_id: message_id.substr(8) },

        function(data) {
            if (data.success) {
                $('#' + message_id).hide();
            }
            else
                alert(data.err_msg);

            remove_in_progress = false;
        },

        'json'
    );

    return false;
}

function review() {
    if (publish_in_progress)
        return false;

    publish_in_progress = true;

    var self = $(this);
    var book_id = self.parents('.book').attr('id');
    var book_name = $('#' + book_id + ' .book_title').text();
    var book_url = $('.page_header').attr('site_url') + '/book/' + book_id.substr(5);

    $('#message_form input[name=book_id]').val(book_id.substr(5));

    $.post('/shorten_url.json',
        { url: book_url },

        function(data) {
            if (data.success) {
                $('#message_text').val('《' + book_name + '》 ' + data.short_url + ' ' + '#点评 ').focus();
                setStatus('normal');

                $(window).scrollTop(0);
            }
            else
                alert(data.err_msg);

            publish_in_progress = false;
        },

        'json'
    );

    return false;
}

function directMessage() {
    var user_name = $(this).attr('user_name');

    setStatus('direct');

    $('#message_form input[name=user_name]').val(user_name);
    $('#message_text').val('').insertAtCaret('@' + user_name + ' ');

    $(window).scrollTop(0);

    return false;
}

function bindMessageEvents() {
    $('.message').mouseover(showPanel);
    $('.message').mouseout(hidePanel);

    $('.favor').click(favor);
    $('.disfavor').click(disfavor);

    $('.forward').click(forward);
    $('.reply').click(reply);
    $('.edit').click(edit);
    $('.remove').click(remove);
}

function loadTest() {
    if ($(window).scrollTop() > $(document).height() - $(window).height() - 10) {
        loadMessages();
    }
}
 
function loadMessages() {
    if (loading_message)
        return false;

    var more_message = $('#more_message');
    if (more_message.size()==0) {
        $(window).unbind('scroll');
        return false;
    }

    loading_message = true;
    var ajax_loader = $('#ajax_loader');
    ajax_loader.show();


    var params = {
        message_type: message_type,
        author_only: author_only,
        timestamp: more_message.attr('timestamp')
    };

    if (message_type == 'user' || message_type == 'favorite' || message_type == 'mentioned')
        params['user_name'] = more_message.attr('user_name');

    else if (message_type == 'review')
        params['book_id'] = $('.book_detailed').attr('id').substr(5);

    else if (message_type == 'tagged') {
        params['tag_name'] = $('.page_header').attr('tag_name');

        user_name = $('.page_header').attr('user_name');
        if (user_name != '')
            params['user_name'] = user_name;
    }

    $.getJSON('/message/load.json',
        params,

        function(data) {
            if (data.success) {
                $('#timeline').append(data.messages);
                bindMessageEvents();
                more_message.attr('timestamp', data.timestamp);

                if (!data.has_more) {
                    $(window).unbind('scroll');
                }

                pageTracker._trackPageview('/message/load.json');
            }
            else
                alert(data.err_msg);
         
            ajax_loader.hide();
            loading_message = false;
        }
    );

    return false;
}

function user_subscribe() {
    if (subscribe_in_progress)
        return false;

    subscribe_in_progress = true;

    var self = $(this).parent();
    var user_name = self.attr('user_name');

    $.post('/user/subscribe.json',
        { op: 1, user_name: user_name },

        function(data) {
            if (data.success) {
                self.hide();
                self.siblings('.user_unsubscribe').show();
            }
            else
                alert(data.err_msg);

            subscribe_in_progress = false;
        },

        'json'
    );

    return false;
}

function user_unsubscribe() {
    if (subscribe_in_progress)
        return false;

    subscribe_in_progress = true;

    var self = $(this).parent();
    var user_name = self.attr('user_name');

    $.post('/user/subscribe.json',
        { op: 0, user_name: user_name },

        function(data) {
            if (data.success) {
                self.hide();
                self.siblings('.user_subscribe').show();
            }
            else
                alert(data.err_msg);

            subscribe_in_progress = false;
        },

        'json'
    );

    return false;
}

function rememberMe() {
    var checkbox = $("input[name='remember_me']");

    if (checkbox.is(":checked"))
        checkbox.parent().prepend('<input type="hidden" name="max_age" value="' + 60 * 60 * 24 * 60 + '"/>');
    else
        $("input[name='max_age']").remove();
}

function initReading(view, can_publish, show_new, msg_type, can_subscribe, only_author) {
    show_new_message = show_new;
    author_only = only_author

    if (can_publish) {
        $('#shorten_box').dialog({
            autoOpen: false,
            modal: true,
            width: 450,
            height: 95,
            minHeight: false
        });

        $('#shorten_link').click(function() {
            $('#shorten_box').dialog('open');
            $('#shorten_form input[name=url]').val('');

            return false;
        });

        var message_text =  $('#message_text')
        message_text.val('');

        message_text.focus(messageFocus);
        message_text.blur(messageBlur);

        $('#message_form input[name=message_type]').val(msg_type);
        $('#message_form input[name=reply_to]').val('');
        $('#message_submit').attr('disabled', 'disabled');

        $('#message_form').submit(publishMessage);
        $('#shorten_form').submit(shortenUrl);

        $('#subscribe').click(subscribe);

        $('.review').click(review);

        $('#book_tabs')
    }

    if (msg_type) {
        message_type = msg_type;
        bindMessageEvents();

        if ($(window).scrollTop() == $(document).height() - $(window).height())
            $(window).scrollTop(0);

        if (view == 'scroll' && msg_type != 'discussion' && msg_type != 'single')
            $(window).scroll(loadTest);

        if (msg_type == 'user')
            $('#direct_message').click(directMessage);
    }

    if (can_subscribe) {
        $('.user_subscribe a').click(user_subscribe);
        $('.user_unsubscribe a').click(user_unsubscribe);
    }

    $('.user_subscription').mouseover(highlightRelationPanel);
    $('.user_subscription').mouseout(greyRelationPanel);

    $('#user_profile').mouseover(showBackupLink);
    $('#user_profile').mouseout(hideBackupLink);

    $('#toolbox_header').click(toggleToolbox);

    $('#backup_link').click(function () { $('#backup_link').hide(); });

    $('#about_invite_link').click(function() {
        $('#about_invite').toggle();
    });
}

function showPanel() {
    $(this).attr('class', 'message clearfix show_panel'); 
}

function hidePanel() {
    $(this).attr('class', 'message clearfix hide_panel'); 
}

function highlightRelationPanel(user) {
    $(this).attr('class', 'user_subscription clearfix highlight_relation_panel');
}

function greyRelationPanel(user) {
    $(this).attr('class', 'user_subscription clearfix grey_relation_panel');
}

function showBackupLink() {
    $(this).attr('class', 'show_backup_link clearfix');
}

function hideBackupLink() {
    $(this).attr('class', 'hide_backup_link clearfix');
}

function toggleToolbox() {
    if ($('#toolbox').attr('class') == 'hide_toolbox_body') {
        $('#toolbox').attr('class','show_toolbox_body');
    }
    else {
        $('#toolbox').attr('class','hide_toolbox_body');
    }
}

function defaultInitHook() {
}
