var Keywords = {
    init: function() {
        if ($('#js_add_keyword')) {
            $('body').append(
                '<div id="js_keyword_dialog" title="Add Keyword">' +
                    '<p class="error">'+
                        '<span class="ui-icon ui-icon-alert">&nbsp;</span>'+
                        '<span class="message">&nbsp;</span>'+
                    '</p>'+
                    '<div>'+
                        '<label>Keyword:</label>&nbsp;'+
                        '<select id="js_select_keyword">'+
                            '<option value="">Select keyword</option>'+
                        '</select>'+
                    '</div>'+
                '</div>'
            );

            $('#js_keyword_dialog').dialog({
                autoOpen: false,
                modal: true,

                open: function() {
                    /**
                     * Hide error box and clear message text
                     */
                    $(this).find('.error').hide();

                        $.ajax({
                            url: '/keywords.html',
                            type: 'POST',
                            dataType: 'json',
                            data: {
                                'do': 'get_keywords',
                                'username': $(this).dialog('option', 'username')
                            },
                            /**
                             * Disable select
                             */
                            beforeSend: function() {
                                $('#js_select_keyword').attr('disabled', 'disabled');
                            },
                            /**
                             * Append options
                             */
                            success: function(data) {
                                if ('ok' == data.type) {
                                    var sOptions = '<option value="">Select keyword</option>';
                                    for (i = 0; i < data.keywords.length; ++i) {
                                        sOptions += '<option value="'+(data.keywords[i].id)+'">'+(data.keywords[i].keyword)+'</option>';
                                    }
                                    $('#js_select_keyword').html(sOptions);
                                } else {
                                    Keywords.displayErrors(data.message);
                                }
                            },
                            /**
                             * Redirect browser to login page if 403 status code received
                             */
                            error: function(xhr) {
                                if (403 == xhr.status) {
                                    location.replace('/login');
                                }
                            },
                            /**
                             * Enable select
                             */
                            complete: function() {
                                $('#js_select_keyword').removeAttr('disabled');
                            }
                        });

                    $(this).find('#js_select_keyword').val('');
                },

                buttons: {
                    'Ok': function() {
                        Keywords.addKeyword($(this).dialog('option', 'username'), $(this).find('#js_select_keyword').val());
                    },
                    'Cancel': function() {
                        $(this).dialog('close');
                    }
                }
            });


            $('#js_add_keyword').click(function(){
                $('#js_keyword_dialog').dialog('option', 'username', $(this).attr('rel'));
                $('#js_keyword_dialog').dialog('open');
            });

            $('.js_remove_keyword').live('click', function(){
                var oClicked = $(this);

                if (oClicked.hasClass('busy')) {
                    return false;
                }

                $.ajax({
                    url: '/keywords.html',
                    type: 'POST',
                    dataType: 'json',
                    data: {
                        'do': 'remove_keyword',
                        'keywordId': oClicked.attr('rel'),
                        'username': $('#js_add_keyword').attr('rel')
                    },
                    beforeSend: function() {
                        oClicked.addClass('busy');
                    },
                    success: function(data) {
                        if ('ok' == data.type) {
                            oClicked.parents('.keyword').slideUp(function(){
                                if (!$(this).next().hasClass('keyword')) {
                                    if ($(this).prev().hasClass('keyword')) {
                                        $(this).prev().addClass('last');
                                    } else {
                                        $(this).replaceWith('<i id="js_no_keywords" style="display: none;">No keywords yet</i>');
                                        $('#js_no_keywords').slideDown();
                                    }
                                }
                                $(this).remove();
                            });
                        }
                    },
                    error: function(xhr) {
                        if (403 == xhr.status) {
                            location.replace('/login');
                        }
                    },
                    complete: function() {
                        oClicked.removeClass('busy');
                    }
                });

                return false;
            });
        }
    },

    /**
     * Helps to display errors in dialog box
     */
    displayErrors: function(errors) {
        var sMessage = '';

        if (errors instanceof Array) {
            for(i = 0; i < errors.length-1; ++i) {
                sMessage += errors[i] + '<br/>';
            }
            sMessage += errors.pop();
        } else {
            sMessage = errors;
        }

        $('#js_keyword_dialog .error .message').html(sMessage);
        $('#js_keyword_dialog .error').show('highlight', 1000);
    },

    addKeyword: function(username, keywordId) {
        var aValues = {
            'username': username,
            'keywordId': keywordId
        };

        var aErrors = [];

        for (var key in aValues) {
            switch (key) {
            case 'username':
                if (!aValues[key].length) {
                    aErrors.push('Wrong username.');
                }
                break;

            case 'keywordId':
                if (!aValues[key]) {
                    aErrors.push('Select keyword please.');
                }
                break;
            }
        }

        if (aErrors.length) {
            Keywords.displayErrors(aErrors);
        } else {
            aValues['do'] = 'add_keyword';

            var oDialog = $('#js_keyword_dialog');

            $.ajax({
                url: '/keywords.html',
                type: 'POST',
                dataType: 'json',
                data: aValues,
                /**
                 * Hide dialog buttons
                 */
                beforeSend: function() {
                    this.buttons = oDialog.dialog('option','buttons');
                    oDialog.dialog('option','buttons', {});
                },
                /**
                 * Close dialog
                 */
                success: function(data) {
                    if ('ok' == data.type) {
                        oDialog.dialog('close');

                        var sNewKeyword = '<div class="keyword last" style="display:none;">'+
                            '<a href="/keyword-'+(data.keyword.keyword)+'">'+(data.keyword.keyword)+'</a>'+
                            '&nbsp;('+(data.keyword.profiles)+')'+
                            '<a href="javascript:void(0);" class="img_btn_remove js_remove_keyword" rel="'+(data.keyword.id)+'">&nbsp;</a>'+
                        '</div>';

                        var oKeywords = $('.content.keywords');

                        if (oKeywords.find('div.keyword').length) {
                            oKeywords.find('div.keyword:last').removeClass('last').after(sNewKeyword);
                        } else {
                            oKeywords.find('#js_no_keywords').replaceWith(sNewKeyword)
                        }

                        oKeywords.find('div.keyword:last').slideDown();

                    } else {
                        Keywords.displayErrors(data.message);
                    }
                },
                /**
                 * Redirect browser to login page if 403 status code received
                 */
                error: function(xhr) {
                    if (403 == xhr.status) {
                        location.replace('/login');
                    }
                },
                /**
                 * Show dialog buttons
                 */
                complete: function() {
                    oDialog.dialog('option','buttons', this.buttons);
                }
            });
        }
    }
};

$(document).ready(function(){
    Keywords.init();
});
