(function($) {
    $(function() {

        // create containers for all ajaxable form links
        $('.ajaxable').each(function() {
            var $window = $("#ajaxable-window").clone();
            $window.attr("id", this.id + "-window");
            $('body').append($window);

            var $trigger = $(this)
            var trigger = '#' + this.id;

            $window.jqm({
                ajax: '@href',
                ajaxText: '<p><img src="' + STATIC_URL + 'img/indicator.gif" alt="*"/> ' + gettext("Loading") + '</p>',
                target: $('.target', $window)[0],
                overlay: 60,
                trigger: trigger,
                onShow: function(hash) {
                    var offset = $(hash.t).offset();
                    var oleft = offset.left - hash.w.width() + $(hash.t).width();
                    if (oleft < 0) oleft = 0;
                    hash.w.css({position: 'absolute', left: oleft, top: offset.top});
                    var width = $(hash.t).width();
                    width = width > 50 ? width : 50;
                    $('.header', hash.w).css({width: width});
                    hash.w.show();
                },
                onLoad: function(hash) {
                    $('form', hash.w).ajaxForm({
                        dataType: 'json',
                        target: $('.target', $window),
                        success: function(response) {
                            if (response.success) {
                                $('.target', $window).text(response.message);
                                setTimeout(function() { $window.jqmHide() }, 1000);
                                callback = ajaxable_callbacks[$trigger.attr('data-callback')];
                                callback && callback($trigger, response);
                                if (response.redirect)
                                    window.location = response.redirect;
                            }
                            else {
                                $('.error', $window).remove();
                                $.each(response.errors, function(id, errors) {
                                    $('#id_' + id, $window).before('<span class="error">' + errors[0] + '</span>');
                                });
                                $('input[type=submit]', $window).removeAttr('disabled');
                                return false;
                            }
                        }
                    });
                }
            });
        });


        var login_and_retry = function($form) {
            var $window = $("#ajaxable-window").clone();
            $window.attr("id", "context-login-window");
            $('body').append($window);

            $window.jqm({
                ajax: '/uzytkownik/zaloguj-utworz/?next=' + escape(window.location),
                ajaxText: '<p><img src="' + STATIC_URL + 'img/indicator.gif" alt="*"/> ' + gettext("Loading") + '</p>',
                target: $('.target', $window)[0],
                overlay: 60,
                onShow: function(hash) {
                    var offset = $form.offset();
                    hash.w.css({position: 'absolute', left: offset.left - hash.w.width() + $form.width(), top: offset.top});
                    var width = $form.width();
                    width = width > 50 ? width : 50;
                    $('.header', hash.w).css({width: width});
                    hash.w.show();
                },
                onLoad: function(hash) {
                    $('form', hash.w).ajaxForm({
                        dataType: 'json',
                        target: $('.target', $window),
                        success: function(response) {
                            if (response.success) {
                                $('.target', $window).text(response.message);
                                setTimeout(function() { $window.jqmHide() }, 1000);
                                $form.submit();
                                location.reload();
                            }
                            else {
                                $('.error', $window).remove();
                                $.each(response.errors, function(id, errors) {
                                    $('#id_' + id, $window).before('<span class="error">' + errors[0] + '</span>');
                                });
                                $('input[type=submit]', $window).removeAttr('disabled');
                                return false;
                            }
                        }
                    });
                }
            }).jqmShow();
            
        };


        $('.ajax-form').each(function() {
            var $form = $(this);
            $form.ajaxForm({
                dataType: 'json',
                beforeSubmit: function() {
                    $('input[type=submit]', $form)
                        .attr('disabled', 'disabled')
                        .after('<img src="/static/img/indicator.gif" style="margin-left: 0.5em"/>');
                },
                error: function(response) {
                        if (response.status == 403)
                            login_and_retry($form);
                    },
                success: function(response) {
                    if (response.success) {
                        callback = ajax_form_callbacks[$form.attr('data-callback')];
                        callback && callback($form, response);

                    } else {
                        $('span.error', $form).remove();
                        $.each(response.errors, function(id, errors) {
                            $('#id_' + id, $form).before('<span class="error">' + errors[0] + '</span>');
                        });
                        $('input[type=submit]', $form).removeAttr('disabled');
                        $('img', $form).remove();
                    }
                }
            });
        });


        var update_star = function($elem, response) {
            /* updates the star after successful ajax */
            var $star = $elem.closest('.star');
            if (response.like) {
                $star.addClass('like');
                $star.removeClass('unlike');
            }
            else {
                $star.addClass('unlike');
                $star.removeClass('like');
            }
        };

        var ajax_form_callbacks = {
            'social-like-book': update_star
        };

        var ajaxable_callbacks = {
            'social-book-sets': function() {location.reload();}
        };



    // check placeholder browser support
    if (!Modernizr.input.placeholder)
    {
        // set placeholder values
        $(this).find('[placeholder]').each(function()
        {
            $(this).val( $(this).attr('placeholder') ).addClass('placeholder');
        });
 
        // focus and blur of placeholders
        $('[placeholder]').focus(function()
        {
            if ($(this).val() == $(this).attr('placeholder'))
            {
                $(this).val('');
                $(this).removeClass('placeholder');
            }
        }).blur(function()
        {
            if ($(this).val() == '' || $(this).val() == $(this).attr('placeholder'))
            {
                $(this).val($(this).attr('placeholder'));
                $(this).addClass('placeholder');
            }
        });

        // remove placeholders on submit
        $('[placeholder]').closest('form').submit(function()
        {
            $(this).find('[placeholder]').each(function()
            {
                if ($(this).val() == $(this).attr('placeholder'))
                {
                    $(this).val('');
                }
            })
        });
    }



    });
})(jQuery);

