var serials = new Serials();

function Serials() {

    var hiddenSerials;
    var lastSelectedSerial;
    var toggleSubscriptionDialog;
    
    this.selectedSerials = [];
    this.recommendations = [];
    this.episodesName = {};
    this.episodesDescription = {};
    this.serialDialogs = [];

    this.send = function()
    {
        var hasErrors = false;
        var emailField = $('#email-subscription');
        if (!basic.isEmail(emailField.val())) {
            $('#incorrectEmail').show();
            $('#alreadySubscribedInfo').hide();
            var submitButton = $('#submit-subscription');
            submitButton.attr('disabled', 'disabled');
            emailField.keypress(function(){
                $('#incorrectEmail').hide();
                submitButton.removeAttr('disabled');
            });
            hasErrors = true;
        }
        if (!hasErrors) {
            $('#submit-subscription').attr('disabled', 'disabled');
            var serialTypes = [];
            for (i in this.selectedSerials) {
                var types = [];
                $('.serialType-' + this.selectedSerials[i] + ':checked').each(function(){
                    types.push($(this).val());
                });
                serialTypes[this.selectedSerials[i]] = types.join('|');
            }
            var params = {
                'serials[]': this.selectedSerials,
                email: emailField.val()
            };
            for(i in serialTypes) {
                params['serialTypes[' + i + ']'] = serialTypes[i];
            }
            $.post(
                '/subscription/index',
                params,
                function(response) {
                    if (!response.noSerials) {
                        if (response.alreadySubscribed) {
                            $('#alreadySubscribedInfo').show();
                            $('#submit-subscription').removeAttr('disabled');
                        } else {
                            $('#subscriptionForm').hide();
                            $('#alreadySubscribedInfo').hide();
                            $('#wizardInfo-step3-email').text(emailField.val());
                            $('#wizardInfo-step2').hide();
                            $('#wizardInfo-step3').show();
                            $('#welcomeToFriendfeed').show();
                        }
                    }
                },
                'json'
            );
        }
    }

    this.save = function()
    {
        var params = {
            sendToEmail: $('input[name=sendToEmail]:checked').length,
            period: $('input[name=period]:checked').val()
        };
        $.post(
            '/subscription/settings',
            params,
            function(response) {
                var successBlock = $('#saveSuccess');
                successBlock.show();
                setTimeout(function(){successBlock.hide()}, 5000);
            },
            'json'
        );
        return false;
    }

    this.serialSelectHandler = function(serialId)
    {
        var block = $('#serialSelect_' + serialId);
        var serialIndex = $.inArray(serialId, this.selectedSerials);
        if (serialIndex == -1) {
            this.selectedSerials.push(serialId);
            block.addClass('selected-new');
            this.lastSelectedSerial = serialId;
            this.showTypes(serialId);
        } else {
            this.selectedSerials[serialIndex] = null;
            block.removeClass('selected-new');
            block.removeClass('selected');
        }

        var serialsTemp = [];
        for(i in this.selectedSerials) {
            if (this.selectedSerials[i] != null) {
                serialsTemp.push(this.selectedSerials[i]);
            }
        }
        this.selectedSerials = serialsTemp;

        if (this.selectedSerials.length) {
            $('#toStep2Button').removeAttr('disabled');
        } else {
            $('#toStep2Button').attr('disabled', 'disabled');
        }
    }

    this.unsubscribe = function()
    {
        $.post(
            '/subscription/settings',
            { 'delete': 1 },
            function(response) {
                document.location = '/';
            }
        );
    }

    this.hideOtherSerials = function()
    {
        $('.other').hide();
    }

    this.showOtherSerials = function()
    {
        if(!$('#allSerials .other').get(0)){
            var serialsBlock = $('#moreorless').before(this.hiddenSerials);
        } else {
            $('.other').show();
        }
    }

    this.endSelect = function()
    {
        var serialsTemp = [];
        for(i in this.selectedSerials) {
            if (this.selectedSerials[i] != null) {
                serialsTemp.push(this.selectedSerials[i]);
            }
        }

        this.selectedSerials = serialsTemp;

        var hasErrors = false;
        if (this.selectedSerials.length == 0) {
            $('#serialsNotSelected').show();
            $('.serial').click(function(){
                $('#serialsNotSelected').hide();
            });
            hasErrors = true;
        }

        if (!hasErrors) {
            $('#serialsSelected').hide();
            var allSerialsBlock = $('#allSerials');
            var allSerials = $('.serial', allSerialsBlock);
            var selectedSerialsBlock = $('#selectedSerials');
            allSerials.filter('.selected-new').each(function(){
                $(this).clone().appendTo(selectedSerialsBlock);
            });
            $('#subscriptionForm').show();
            $('.serial', selectedSerialsBlock).each(function(){
                $(this).removeClass('selected-new');
                $('img, .title span', this).each(function(){
                    $(this).removeAttr('onclick');
                });
            });
            $('#wizardInfo-step1').hide();
            $('#wizardInfo-step2').show();
            allSerialsBlock.hide();
            selectedSerialsBlock.show();
        }
    }

    this.backToStep1 = function()
    {
        $('#serialsSelected').show();
        var allSerialsBlock = $('#allSerials');
        var allSerials = $('.serial', allSerialsBlock);
        $('#wizardInfo-step1').show();
        $('#wizardInfo-step2').hide();
        $('#subscriptionForm').hide();
        $('#alreadySubscribedInfo').hide();
        $('#selectedSerials').empty()
            .hide();
        allSerialsBlock.show();
    }

    this.showRecommendations = function()
    {
        $('.recommendation-hidden').removeClass('recommendation-hidden')
            .addClass('recommendation');
        $('#recommendationsShowLink').hide();
        $('#recommendationsHideLink').show();
    }

    this.hideRecommendations = function()
    {
        $('.recommendation').removeClass('recommendation')
            .addClass('recommendation-hidden');
        $('#recommendationsHideLink').hide();
        $('#recommendationsShowLink').show();
    }

    this.sendFriendlink = function()
    {
        var emailField = $('#email-friendlink');
        if (!basic.isEmail(emailField.val())) {
            var incorrectEmailBlock = $('#incorrectEmail');
            incorrectEmailBlock.show();
            emailField.keypress(function(){
                incorrectEmailBlock.hide();
            });
            return false;
        }
        return true;
    }

    this.getEpisodes = function(serialId, episodeId)
    {
        if (serialId > 0) {
            $.post(
                '/adminpanel/get-episodes',
                { serialId: serialId },
                function(response){
                    $('#links-addlink').empty();
                    $('.addlink-addlink').hide();
                    serials.episodesName = {};
                    var block = $('#episodes-addlink');
                    block.empty();
                    block.append(
                        '<option value="0">Выберите серию</option>'
                    );
                    for(i in response.episodes) {
                        serials.episodesName[response.episodes[i].episodeId] = response.episodes[i].name;
                        serials.episodesDescription[response.episodes[i].episodeId] = response.episodes[i].description;
                        block.append(
                            '<option value="' + response.episodes[i].episodeId + '">#' + response.episodes[i].season + '.' + response.episodes[i].index + ' ' + response.episodes[i].name + ' / ' + response.episodes[i].nameEng + '</option>'
                        );
                    }
                    
                    var serialTypes = '';
                    for (i in response.serialTypes) {
                        serialTypes += '<option value="' + response.serialTypes[i].serialTypeId.toString() + '">'
                            + response.resources[response.serialTypes[i].resourceId].toString()
                            + ' / ' + response.translaters[response.serialTypes[i].translaterId].toString()
                            + '</option>';
                    }
                    $('#serialTypeId-linkadd').html(serialTypes);
                    
                    if (episodeId > 0) {
                        block.val(episodeId);
                        serials.getLinks(episodeId);
                    }
                },
                'json'
            );
        }
    }

    this.getLinks = function(episodeId)
    {
        if (episodeId > 0) {
            $.post(
                '/adminpanel/get-links',
                { episodeId: episodeId },
                function(response){
                    var block = $('#links-addlink');
                    block.empty();
                    $('.addlink-addlink').show();
                    for(i in response.links) {
                        block.append(
                            '<li>'
                                + '#' + response.links[i].linkId
                                + '<a href="' + response.links[i].url + '">'
                                    + response.links[i].resourceName + ' (' + response.links[i].translaterName + ')'
                                + '</a>'
                                + '<img src="/img/pencil.png" style="cursor: pointer;" onclick="serials.editLink(' + response.links[i].linkId + ')" alt="Редактировать" title="Редактировать ссылку" />'
                                + '<img src="/img/delete.png" style="cursor: pointer;" onclick="serials.deleteLink(' + response.links[i].linkId + ')" alt="Удалить" title="Удалить ссылку" />'
                            + '</li>'
                        );
                    }
                },
                'json'
            );
        }
    }

    this.editEpisode = function()
    {
        var episodeId = $('#episodes-addlink').val();
        if (episodeId > 0) {
            $('#episodes-addlink').hide();
            $('#button-editEpisode-addlink').hide();
            $('#editEpisode-addlink').show();
            $('#name-editEpisode-addlink').val(this.episodesName[episodeId]);
            $('#description-editEpisode-addlink').val(this.episodesDescription[episodeId]);
        }
    }

    this.saveEpisode = function()
    {
        var episodeId = $('#episodes-addlink').val();
        var name = $('#name-editEpisode-addlink').val();
        var description = $('#description-editEpisode-addlink').val();
        if (episodeId > 0 && name != '') {
            $.post(
                '/adminpanel/save-episode',
                { episodeId: episodeId, name: name, description: description },
                function(response) {
                    if (response.success) {
                        $('#editEpisode-addlink').hide();
                        $('#button-editEpisode-addlink').show();
                        $('#episodes-addlink').show();
                        $('#description-editEpisode-addlink').val('')
                        serials.getEpisodes($('#serial-addlink').val(), episodeId);
                    } else {
                        alert('error');
                    }
                },
                'json'
            );
        }
    }

    this.editEpisodeCancel = function()
    {
        $('#editEpisode-addlink').hide();
        $('#button-editEpisode-addlink').show();
        $('#episodes-addlink').show();
    }

    this.editLink = function(linkId)
    {
        $.post(
            '/adminpanel/edit-link/format/ajah',
            { linkId: linkId },
            function(response) {
                $('#link-edit').html(response);
            }
        );
    }

    this.saveLink = function()
    {
        var parameters = {
            linkId: $('#linkId-linkedit').val(),
            url: $('#url-linkedit').val(),
            serialTypeId: $('#serialTypeId-linkedit').val(),
            sendToUpdates: $('#sendToUpdates-linkedit:checked').length
        }
        $.post(
            '/adminpanel/save-link',
            parameters,
            function(response) {
                if (response.success) {
                    $('#link-edit').empty();
                    serials.getLinks($('#episodes-addlink').val());
                } else {
                    alert('error');
                }
            },
            'json'
        );
    }

    this.deleteLink = function(linkId)
    {
        if (confirm('Вы уверены?')) {
            $.post(
                '/adminpanel/delete-link',
                { linkId: linkId },
                function(response) {
                    if (response.success) {
                        serials.getLinks($('#episodes-addlink').val());
                    } else {
                        alert('error');
                    }
                },
                'json'
            );
        }
    }

    this.addLink = function()
    {
        var parameters = {
            episodeId: $('#episodes-addlink').val(),
            url: $('#url-linkadd').val(),
            serialTypeId: $('#serialTypeId-linkadd').val(),
            sendToUpdates: $('#sendToUpdates:checked').length
        }
        $.post(
            '/adminpanel/add-link',
            parameters,
            function(response) {
                if (response.success) {
                    $('#link-edit').empty();
                    serials.getLinks($('#episodes-addlink').val());
                } else {
                    alert('error');
                }
            },
            'json'
        );
    }

    this.showTypes = function(serialId)
    {
        if (this.serialDialogs[serialId]) {
            this.serialDialogs[serialId].dialog('open');
        } else {
            $('#dialogs').append('<div id="dialog-' + serialId + '"><img src="/img/loadimage.gif" /></div>');
            var dialog = $('#dialog-' + serialId);
            dialog.dialog({
                title: 'Переводы и источники',
                modal: true,
                buttons: {
                    'Отмена': function(){
                        if ($('.serialType-' + serialId + ':checked').length) {
                            serials.serialSelectHandler(serials.lastSelectedSerial);
                        }
                        $(this).dialog('close');
                    },
                    'Выбрать': function(){
                        if ($('.serialType-' + serialId + ':checked').length) {
                            $(this).dialog('close');
                        } else {
                            $("#serialTypesNotSelected").dialog('open');
                        }
                    }
                },
                closeOnEscape: false,
                width: 500,
                beforeclose: function(event, ui) {
                    if (!$('.serialType-' + serialId + ':checked').length) {
                        serials.serialSelectHandler(serials.lastSelectedSerial);
                    }
                }
            });
            $.post(
                '/index/get-serial-types',
                { 'serialId': serialId, 'format': 'ajah' },
                function(response) {
                    dialog.html(response);
                },
                'html'
            );
            this.serialDialogs[serialId] = dialog;
        }
    }

    this.hideSpoilers = function(selector)
    {
        $(selector).each(function(){
            var content = '<button style="clear: both;" onclick="$(\'.episode-spoiler\', $(this).parent()).show(); $(this).hide(); return false;">Показать описание серии</button>\
            <span class="episode-spoiler" style="display: none;">' + $(this).html() + '</span>';
            $(this).html(content);
        });
    }
    
    this.filterSerials = function(filterName)
    {
        var filterName = filterName.replace(/(^\s+)|(\s+$)/g, "");
        if (filterName.length > 0) {
            this.showOtherSerials();
            $('#moreSerials').hide();
            $('.serial').each(function(){
                var name = $('.serialName', this).html();
                var nameEng = $('.serialNameEng', this).html();
                if (name.toLowerCase().search(new RegExp(filterName, 'i')) != -1 || nameEng.toLowerCase().search(new RegExp(filterName, 'i')) != -1) {
                    $(this).show();
                } else {
                    $(this).hide();
                }
            });
        } else {
            $('.serial').hide();
            $('.serial:not(.other)').show();
            $('#moreSerials').show();
        }
    }
    
    this.searchSerials = function(filterName)
    {
        var filterName = filterName.replace(/(^\s+)|(\s+$)/g, "");
        if (filterName.length > 0) {
            $('.serial.default').hide();
            $('.serial:not(.default)').remove();
            $('#bestTitle').hide();
            $('#foundTitle').show();
            $('#notFoundTitle').hide();
            $('#myTitle').hide();
            $('#loader').show();
            $.post(
                '/serial/search',
                { term: filterName },
                function (response) {
                    $('#loader').hide();
                    if (response) {
                        $('#allSerials').append(response);
                    } else {
                        $('#foundTitle').hide();
                        $('#notFoundTitle').show();
                    }
                }
            );
        } else {
            $('.serial:not(.default)').remove();
            $('.serial.default').show();
            $('#foundTitle').hide();
            $('#bestTitle').show();
            $('#notFoundTitle').hide();
            $('#myTitle').show();
        }
    }
    
    this.toggleWatched = function(episodeId, isWatched, allSeason, callback)
    {
        $.post(
            '/subscription/toggle-watched',
            {
                episodeId: episodeId,
                watched: (isWatched ? 1 : 0),
                allSeason: (allSeason ? 1 : 0)
            },
            function(response){
                if (callback) {
                    callback();
                }
                if (!allSeason) {
                    if (isWatched) {
                        $('#alreadyWatched_' + episodeId).show();
                        $('#notWatched_' + episodeId).hide();
                        $('.episode-index-link-' + episodeId).addClass('before');
                    } else {
                        $('#alreadyWatched_' + episodeId).hide();
                        $('#notWatched_' + episodeId).show();
                        $('.episode-index-link-' + episodeId).removeClass('before');
                    }
                }
                if (response.marked) {
                    for (i in response.marked) {
                        if (isWatched) {
                            $('#alreadyWatched_' + response.marked[i]).show();
                            $('#notWatched_' + response.marked[i]).hide();
                            $('.episode-index-link-' + response.marked[i]).addClass('before');
                        } else {
                            $('#alreadyWatched_' + response.marked[i]).hide();
                            $('#notWatched_' + response.marked[i]).show();
                            $('.episode-index-link-' + response.marked[i]).removeClass('before');
                        }
                    }
                }
            },
            'json'
        );
    }
    
    this.toggleSubscription = function(serialId, createSubscribe)
    {
        if (createSubscribe) {
        	var checkedSerialTypes = $('.serialType:checked');
            if (checkedSerialTypes.length) {
                var types = [];
                checkedSerialTypes.each(function(){
                    types.push($(this).val());
                });
                serialTypes = types.join('|');
                $.post(
                    '/subscription/toggle-subscription',
                    {
                        serialId: serialId,
                        serialTypes: serialTypes,
                        create: (createSubscribe ? 1 : 0)
                    },
                    function() {
                        $('#notSubscribedButton').val('Сохранено');
                        $('#notSubscribedButton').removeAttr('disabled');
                        $('#alreadySubscribed').show();
                        $('#subscribedText').show();
                        $('#notSubscribedText').hide();
                        setTimeout(function(){
                            $('#notSubscribedButton').val('Сохранить');
                        }, 3000);
                    }
                );
                $('#notSubscribedButton').attr('disabled', 'disabled');
                $(this).dialog('close');
            } else {
                $("#serialTypesNotSelected").dialog('open');
            }
        } else {
            $.post(
                '/subscription/toggle-subscription',
                { serialId: serialId },
                function() {
                    $('.serialType').removeAttr('checked');
                    $('.serialTypeGood').attr('checked', 'checked');
                    $('#alreadySubscribed').hide();
                    $('#subscribedText').hide();
                    $('#notSubscribedText').show();
                    $('#alreadySubscribedButton').removeAttr('disabled');
                    $('#notSubscribed').show();
                    $('#notSubscribedButton').val('Подписаться');
                }
            );
            $('#alreadySubscribedButton').attr('disabled', 'disabled');
        }
    }
    
    this.addTempLink = function(episodeId, url)
    {
        var parameters = {
            episodeId: episodeId,
            url: url
        }
        $.post(
            '/wiki/add-link',
            parameters
        );
    }

}
