GoozzySite = {}

function init_profile_invite()
{
    var $container = $('#js_invite');
    var $log = $container.find("#js_invite_log");
    var $invites_count_el = $container.find("#invites_count");
    var $invites_count_el_loginbox = $('#right_sidebar #loginbox_invite_count');
    var $form = $('#js_invite form');
    var $form_submit_button = $('#js_invite form button');
    var inv_enable = $invites_count_el.is(":visible");
    var inv_count = parseInt($invites_count_el.text());
    var request_num = 0;

    function add_message(is_error, msg, num) {
        $li = $log.find('#invite_message_' + num);
        $li.find('img').remove().end() // remove throbber
            .append(msg)
        if (is_error) {
            $li.addClass("error");
            if (inv_enable) {
                inv_count++;
                $invites_count_el.text(inv_count);
                $invites_count_el_loginbox.text(inv_count);
                if (inv_count > 0) {
                    $form.slideDown('fast');
                }
            }
        } else {
            $form.find("#id_email").val("");
        }
    }


    function on_response(num) {
        return function(data) {
            try {
                response = eval("(" + data + ")");
            } catch(err) {
                msg = "error: response parse exception"
            }
            if (response.error) {
                add_message(true, response.error, num);
            } else {
                add_message(false, response.message, num);
            }
        }
    }

    $form.submit( function() {
        var email = $(this).find('#id_email').val();
        if (inv_enable && (!inv_count || !email)) {
            return false;
        }
        $form_submit_button.attr("disabled", "disabled");
        setTimeout(function(){
            $form_submit_button.attr("disabled", false);
        }, 500);
        $.post(
            '/invite/',
            {'email': email},
            on_response(request_num)
        );
        if (inv_enable) {
            inv_count--;

            $invites_count_el.text(inv_count);
            $invites_count_el_loginbox.text(inv_count);
            if (inv_count <= 0) {
                $form.slideUp('fast');
            }
        }
        $log.prepend('<li id="invite_message_' + request_num + '"><b>' + email + '</b>: <img src="/imgs/throbber-light.gif" alt="" /></li>');
        var $removeLi = $log.find('li:eq(6)');
        if ($removeLi.length) {
            $removeLi.hide('fast', function() {$(this).remove();});
        }

        $log.removeClass("empty");

        request_num++;
        return false;
    })
}

$(document).ready(function(){
	init_profile_invite();
})

GoozzySite.changeLanguage = function(lang)
{
    $('#language_form')
        .find('input').val(lang).end()
        .submit();
}

GoozzySite.SimpleSearch = function(input, res)
{
    function Search()
    {
        var term = this.value;
        if (term == Search.term) {
            return;
        }
        if (Search.timeout) {
            clearTimeout(Search.timeout);
        }
        Search.term = term;
        Search.timeout = setTimeout(function() {
            $.get(url, {'search_term':term}, function(data){
                Search.timeout = null;
                $(res).html(data);
            })
        }, 500);
    }

    Search.onfocus = function() {
        if (this.value == gettext('Search')) {
            this.className = '';
            this.value = '';
        }
    }

    Search.onblur = function() {
        if (this.value == '' || this.value == gettext('Search')) {
            this.className = 'empty';
            this.value = gettext('Search');
        }
    }

    var $input = $(input),
        url = $input.parents('form:first').attr('action');
    
    if (url) {
        url.replace(/(&|\?)search_term=[^&]*/gi, '$1');
        Search.term = $input.val();
        $input.bind('focus',Search.onfocus)
            .bind('blur',Search.onblur)
            .bind('keyup',Search)
            .trigger('blur');
    }
}

GoozzySite.installFxAddon =
{
    tryInitial: function(aEvent)
    {
        this.showInstallEnable();
        return this.attemptInstall(aEvent);
    },
    showInstallEnable: function()
    {
        if ((document == null) || (document.getElementById == null)) {
            return;
        }
        var content = document.getElementById('click_here_content')
        if (content != null) {
            return;
        }
        var placeholder = document.getElementById('click_here_placeholder');
    },
    attemptInstall: function(aEvent)
    {
        var params = {
            'Goozzy': {
                URL: aEvent.target.href,
                IconURL: aEvent.target.getAttribute('iconURL'),
                toString: function () { return this.URL; }
            }
        };
        InstallTrigger.install(params);
        return false;
    }
};

/**
 * Class to control dynamic flash messages.
 * @param selector Node selector, where the messages container will be placed.
 *                 If it is a ``.flashmessages`` class containing node, no additional container will be created.
 *                 If options.inplace is true, it is the node, near which the message will be shown.
 * @param message Optional. Prefilled message.
 * @param options Optional. Additional options:
 *      level    - className to be added to the container;
 *      prepend  - whether to prepend or append a container;
 *      autoShow - whether to show container on message add;
 *      maxMessages - maximum amount of messages to keep on screen (-1 means unlimited);
 *      inplace  - place container sibling to ``selector`` element with position absolute;
 *      cssProps - objects, containing additional css properties for container;
 *      autoHide - timeout before the container disappears; -1 disables feature;
 */
GoozzySite.FlashMessages = function(selector, message, options)
{
    var _setOffset = function()
    {
        var offset = $sibling.offset();
        if (options.bottomright) {
            offset.top += $sibling.height();
            offset.right = offset.left + $sibling.width();
            offset.left = offset.right - $container.width();
            $container.css("text-align", "right");
        } else {
            var delta = options.prepend ? -5 : +5;
            offset.top += delta;
            if (options.prepend) {
                offset.top -= $container.height();
            }
        }
        $container.css(offset);
    };

    this.show = function(speed)
    {
        $container.show(speed);
        if (options.autoHide !== -1) {
            timerId = setTimeout(function() { $container.fadeOut('slow'); timerId = null; },
                    options.autoHide);
        }
        return this;
    };
    this.hide = function(speed)
    {
        $container.hide(speed);
        if (timerId) {
            clearTimeout(timerId);
            timerId = null;
        }
        return this;
    };
    this.addMessage = function(text)
    {
        if (options.maxMessages != -1 && ++messagesCount > options.maxMessages) {
            messagesCount = options.maxMessages;
            $('li:first', $container).fadeOut('fast', function() { $(this).remove() });
        }
        $container.append('<li><span>' + text + '</span></li>');
        if (options.autoShow) {
            this.show();
        }
        if (options.inplace) {
            _setOffset();
        }
        return this;
    };
    this.changeLevel = function(level)
    {
        $container.removeClass('error success').addClass(level);
        return this;
    };
    this.clear = function()
    {
        $container.empty();
        messagesCount = 0;

        if (timerId) {
            clearTimeout(timerId);
            timerId = null;
        }

        return this.hide();
    };
    this.remove = function()
    {
        this.clear();
        $container.remove();
    };
    this.relocate = function(newContainer, prepend)
    {
        if (prepend === undefined) {
            prepend = true;
        }
        var $tmpContainer = $container.clone();
        if (prepend === false) {
            $tmpContainer.appendTo(newContainer);
        } else if (prepend === true) {
            $tmpContainer.prependTo(newContainer);
        } else if (prepend === null) {
            $(newContainer).replaceWith($tmpContainer);
        }
        $container.remove();
        $container = $tmpContainer;
        return this;
    };

    if (typeof(message) == 'object') {
        var options = message;
    } else {
        var options = options || {};
    }
    options.level = options.level || '';
    options.prepend = options.prepend || true;
    options.autoShow = options.autoShow || true;
    options.maxMessages = options.maxMessages || 5;
    options.inplace = options.inplace || true;
    options.cssProps = options.cssProps || {};
    options.autoHide = options.autoHide || 7e3;

    var timerId = null;

    if (selector === undefined) {
        var selector = 'body';
        options.prepend = true;
        options.inplace = false;
    }

    if (options.inplace) {
        var $sibling = $(selector);
        var $container = $('<ul class="inplace_flashmessages" style="display: none;" />');
        $container.insertAfter($sibling);
        _setOffset();
    } else {
        var $container = $(selector);

        if (!$container.is('.flashmessages')) {
            html = '<ul class="flashmessages" style="display: none;"></ul>';
            options.prepend ? 
                $container.prepend(html) :
                $container.append(html);
            $container = $('ul.flashmessages', $container);
        }
    }

    $container.css(options.cssProps).addClass(options.level);

    var messagesCount = 0;
    if (typeof(message) == 'string') {
        this.addMessage(message);
    }
}

GoozzySite.SlugHelper = function(srcSelector, dstSelector)
{
    var manuallyEdited = false;
    var $slugInput = $(dstSelector).bind('change', function()
        {
            manuallyEdited = true;
            if ($slugInput.val() == '') {
                manuallyEdited = false;
            }
        });
    var $nameInput = $(srcSelector).bind('keyup', function()
        {
            if (! manuallyEdited) {
                $slugInput.val(URLify($nameInput.val(), 20));
            }
        });
}

GoozzySite.chooseDownloadButton = function(klass) {
    $('.' + klass).hide();
    $.browser.chrome = /chrome/.test(navigator.userAgent.toLowerCase());
    if ($.browser.opera) {
        if (gPlatform == PLATFORM_WINDOWS) {
            $('#opera_win').show();
        } else {
            $('#opera_other').show();
        }
    } else if ($.browser.msie) {
        $('#download_ie').show();
    } else if ($.browser.chrome) {
        $('#download_chrome').show();
    } else {
        $('#download_firefox').show();
    }
}

GoozzySite.chooseDownloadButtonPopup = function(bar) {
    if (!$('#goozzy').length) {
        var bar = $(bar),
            useragent = navigator.userAgent.toLowerCase();
        $.browser.chrome = /chrome/.test(useragent);
        if ($.browser.msie && parseFloat($.browser.version) > 7) {
            bar.find('.version.msie').css('display', 'inline-block');
            bar.find('.text.msie').css('display', 'inline');
        } else if ($.browser.chrome) {
            bar.find('.version.chrome').css('display', 'inline-block');
        } else if ($.browser.mozilla && useragent.substring(useragent.indexOf('firefox/') + 8).substring(0,3) >= 3.6) {
            bar.find('.version.firefox').css('display', 'inline-block');
        } else {
            bar.find('.text').hide();
            bar.find('.text.warning').css('display', 'inline');
        }
        bar.show();
    }
}

function showPopUpForm(positionElement, formId) {
    var form = $(formId);
    var posit = $(positionElement);
    var top = left = 0;
    var pos = posit.position();
    var left = pos.left - 10 + "px";
    var top = pos.top - 10 + "px";  
    form.css( { 
            left: left, 
            top: top
    } );
    $(formId).slideToggle('fast');
    return false;
}

GoozzySite.TabsSwitcher = function(selector)
{
    var container = $(selector);
    var pagesContainer = container.siblings('.object_list');
    var tabs = $('li', container);    
    var links = $('a', tabs);    
    links.each(function() {
        var link = $(this);
        var page = link.attr('href');
        var redirect = link.attr('redirect');
        if (redirect) {return;}
        if (page) {
            if (page.indexOf('=') != -1) {
                page = page.substring(1, page.indexOf('='));
            } else {
                page = page.substring(page.indexOf('/')+1);
            }
            
            link.bind('click', function() {
                tabs.removeClass('active');
                link.blur().parent().addClass('active');
                $('.subpage', pagesContainer).hide().filter('.subpage_' + page).show();
                return false;
            });
        }
    });
};

GoozzySite.getGetParams = function(source)
{
    if (source == undefined) {
        var s = window.location.search;
    } else {
        s = source;
    }
    a = s.match(/[^&?=]*=[^&?=]*/g);
    r = {};
    if (a) {
        for (i=0; i<a.length; i++) {
            r[a[i].match(/[^&?=]*/)[0]] = a[i].match(/=([^&?]*)/)[0].replace('=', '');
        }
    }
    return(r);
}
GoozzySite.pureLocation = function(source)
{
    if (source == undefined) {
        var source = window.location.href;
    }
    return source.substring(0, source.indexOf('?'));
}

GoozzySite.triggeredProvider = function(form_name) {
    var $form = $("form#" + form_name);
    var $provider =  $form.find("#id_provider");
    var $openid = $form.find('#openid');
    var $simple_form = $form.find('#simple_form');
    $provider.change(function() {
        if ($provider.val() == 'openid') {
            $openid.show();
        } else {
            $openid.hide();
        }
        if ($provider.val() == 'other') {
            $simple_form.show();
        } else {
            $simple_form.hide();
        }
    });
    $provider.trigger('change');
}

GoozzySite.toggleCommentReplyForm = function(comment_id, url) {
    var comment_reply = $('#' + comment_id),
        $form = comment_reply.parents('.comments_container:first').next('.comments_new');
    if ($form.length) {
        $form.slideToggle();
        return;
    }
    var to_add = $('#commentReplyFormTemplate').clone().removeAttr('id')
        .find('form').attr('action', url).end();
    comment_reply.parents('.comments_container:first').after(to_add);
    to_add.slideDown();
}

GoozzySite.toggleCommentReplies = function(comment_id)
{
    var $commentsContainer = $('#comment_' + comment_id).siblings('ul');
    $('#comment_' + comment_id).find('.hide_replies')[$commentsContainer.is(':visible') ? 'hide' : 'show']()
    $('#comment_' + comment_id).find('.show_replies')[$commentsContainer.is(':visible') ? 'show' : 'hide']()
    $commentsContainer.slideToggle('fast');
    return false;
};

GoozzySite.checkCommentForm = function(f) {
    var $ta = $(f).find('textarea');
    if (!$ta.val()) {
        $ta.focus();
        return false;
    }
}

GoozzySite.checkCompleteRegistrationForm = function(f) {
    var $email = $(f).find('#id_email'),
        $fields = $(f).find('div.f_row'),
        $inputs = $fields.find('input'),
        $errors = false;

    for (var i=0; i<$inputs.length; i++) {
        var $input = $($inputs.get(i)),
            $field = $($fields.get(i));
        if (!$input.val()) {
            $field.addClass('error');
            $field.find('span.error_list').text(gettext('This field is required'));
            $field.find('span.checkmark').hide();
            $errors = true;
        } else if ($input.val() && $field.hasClass('error')) {
            $field.removeClass('error');
            $field.find('span.error_list').text('');
        }
    }
    if ($email.val()) { GoozzySite.checkRegistrationFormEmailFeild($email); }

    $errors = ($(f).find('.error').length) ? true : false;

    if ($errors) {
        $(f).find('.error input:first').focus();
        return false;
    }
}

GoozzySite.checkRegistrationFormEmailFeild = function(input) {
    var reg = /.+@.+\..+/,
    email = input.val(),
    box = input.parent().parent().parent().parent(),
    span_error = box.find('span.error_list'),
    span_checkmark = box.find('span.checkmark');

    if (email.match(reg)) {
        box.removeClass('error')
        span_error.text('');
        span_checkmark.show();
    } else {
        box.addClass('error');
        span_error.text(gettext('Not valid address'));
        span_checkmark.hide();
    }
}

GoozzySite.checkRegistrationFormPass = function(input) {
    var pass = input.parent().parent().parent().parent().siblings('div').find('input#id_register-password').val(),
        confirm_pass = input.val(),
        pass_box = input.parent().parent().parent().parent().siblings('div:has(input#id_register-password)'),
        confirm_box = input.parent().parent().parent().parent();

    if (pass != confirm_pass) {
        pass_box.addClass('error');
        confirm_box.addClass('error');
        pass_box.find('span.error_list').text(gettext('Passwords do not match'))
        confirm_box.find('span.error_list').text('');
    }
}

GoozzySite.checkRegistrationForm = function(f) {
        var $email = $(f).find('#id_register-email'),
        $conf_pass = $(f).find('#id_register-confirmpassword'),
        $fields = $(f).find('div.f_row'),
        $inputs = $fields.find('input'),
        $errors = false;

    for (var i=0; i<$inputs.length; i++) {
        var $input = $($inputs.get(i)),
            $field = $($fields.get(i));
        if (!$input.val()) {
            $field.addClass('error');
            $field.find('span.error_list').text(gettext('This field is required'));
            $field.find('span.checkmark').hide();
            $errors = true;
        } else if ($input.val() && $field.hasClass('error')) {
            $field.removeClass('error');
            $field.find('span.error_list').text('');
        }
    }
    if ($email.val()) { GoozzySite.checkRegistrationFormEmailFeild($email); }
    if ($conf_pass.val()) { GoozzySite.checkRegistrationFormPass($conf_pass); }

    $errors = ($(f).find('.error').length) ? true : false;

    if ($errors) {
        $(f).find('.error input:first').focus();
        return false;
    }
}

GoozzySite.checkRegistrationProviderForm = function(f) {
    if ($(f).find('#provider').val() != 'openid') {
        return true;
    } else {
        if (!$(f).find('#id_oid').val()) {
            $(f).find('#id_oid').focus();
            return false;
        } else {
            return true;
        }
    }
}

GoozzySite.registrationProviderFormController = function(provider) {
    var $form = $('#oid_form'),
        $provider_field = $form.find('#provider');
    
    $provider_field.val(provider);
    if (provider == 'openid') {
        $form[$form.is(':visible') ? 'hide' : 'show']();
        $('span#oid')[$form.is(':visible') ? 'hide' : 'show']();
        $('span#email')[$form.is(':visible') ? 'show' : 'hide']();
        $('#registration_form')[$form.is(':visible') ? 'hide' : 'show']();
    } else {
        $form.submit();
    }
}

