/* Reload all authentication depended page elements */
function authReload(doneCallback) {
    var elements = $(".auth_reload");
    var busy = elements.length;
    
    $(".auth_reload").each(function(index) {
        var url = $(this).attr("src")
        var element = $(this);
        $.ajax({
            url: url,
            cache: false,
            success: function(html) {
                element.before(html).remove(); 
                busy = busy - 1;
                if (!busy) {
                    if (doneCallback != null)
                        doneCallback();
                    // Reload FB parser, thereby re-parsing fb elements
                    if (FB.XFBML.Host.parseDomTree)
                        setTimeout( FB.XFBML.Host.parseDomTree, 0 );
                }
            }
        });
    });
}

/* Logout User */
$(function() {
    $("#fb_sign_out").live("click", function() {
        FB.Connect.logout(function() {
            var logout_url = $("#fb_sign_out").attr("href") + "?random=" + Math.random()*1000;
            $.ajax({
                url: logout_url,
                success: function(html){
                    authReload();
              }
            });
        });
        return false;
    });
    $("#sign_out").live("click", function () {
        var logout_url = $(this).attr("href") + "?random=" + Math.random()*1000;
        $.ajax({
            url: logout_url,
            success: function(html){
                authReload();
          }
        });
        return false;
    });
});


/* Social Slide-In */
$(function() {
    $('#frmNewsSubscribe').submit(function() {
        if ($('#frmNewsSubscribe').attr('oldhtml')) {
            $('#frmNewsSubscribe').html($('#frmNewsSubscribe').attr('oldhtml'));
            $('#frmNewsSubscribe').removeAttr('oldhtml');
        } else {
            var submit_url = $(this).attr('action') + '?random=' + Math.random() * 1000;
            $.ajax({
                url: submit_url,
                data: {
                    email : $('#id_news_email').attr('value'),
                    mobile: $('#id_news_mobile').attr('value')
                },
                dataType: 'json',
                type: 'POST',
                success: function(data) {
                    if (data.status == 'error') {
                        $('#frmNewsSubscribe').attr('oldhtml', $('#frmNewsSubscribe').html());
                        $('#frmNewsSubscribe').html('<p>'+data.message+'</p><p><input type="submit" name="submit" id="newsletter_signup" value="Try again" class="submit" /></p>');
                    } else {
                        $('#frmNewsSubscribe').html('<p>'+data.message+'</p>');
                    }
                }
            });
        }
        return false;
    });
});


/* Facebook Login */
function facebookLoginSuccess(data) {
    if (data.new_user) {
        window.location.replace(data.redirect);
    }
    else {
        authReload(tb_remove);
    }
}

function facebookModalLogin() {
    showModalBusy();
    $.ajax({
        url: "/facebook/login-redirect/",
        success: function(data){
            facebookLoginSuccess(data);
        },
        dataType: "json"
    });
    return false;
}

function showModalBusy() {
    $(".modal_buttons").hide();
    $(".modal_busy").show();
}

function showModalButtons() {
    $(".modal_busy").hide();
    $(".modal_buttons").show();
}

// Modal Login
$(function() {
    $("#login_submit").live("click", function () {
        $("#frmLogin").validate({
            onfocusout: false,
            onkeyup: false,
            onclick: false,
            submitHandler: function() {
                authReload(tb_remove);
            },
            invalidHandler: showModalButtons, 
            rules: {
                username: {
                    required: true,
                    remote: {
                        url: "/modals/login/",
                        type: "post",
                        beforeSend: showModalBusy,
                        data: {
                            password: function() {
                                return $("#id_password").val();
                            }
                        }
                    }
                }
            }
        });
	});
});

// Modal Register
function validateRegistration() {
    var validator = $("#frmRegister").validate({
        onkeyup: false,
        onclick: false,
        submitHandler: function(form) {
            showModalBusy();
            $('#frmRegister').ajaxSubmit(function() { 
                authReload(tb_remove);
            }); 
        },
        invalidHandler: showModalButtons, 
        rules: {
            username: {
                required: true,
                minlength: 4,
                remote: {
                    url: "/validate/username/",
                    type: "post",
                    timeout: 20000,
                    error: function (XMLHttpRequest, textStatus, errorThrown) { showDefaultAjaxError("username", validator); },
                    beforeSend: function (XMLHttpRequest) { showBusy("username"); },
                    onSuccess: function () { hideBusy("username"); }
                }
            },
            recaptcha_response_field: {
                required: true,
                remote: {
                    url: "/validate/captcha/",
                    type: "post",
                    timeout: 20000,
                    data: {
                        recaptcha_challenge_field: function() {
                            return $("#recaptcha_challenge_field").val();
                        }
                    },
                    error: function (XMLHttpRequest, textStatus, errorThrown) { showDefaultAjaxError("recaptcha_response_field", validator); },
                    beforeSend: function (XMLHttpRequest) { showBusy("recaptcha_response_field"); },
                    onSuccess: function () { hideBusy("recaptcha_response_field"); },
                    invalid: function () { Recaptcha.reload(); }
                }
            }
        }
    });
}

// Modal Password Reset
$(function() {
    $("#reset_submit").live("click", function () {
        var validator = $("#frmForgottenPassword").validate({
            onfocusout: false,
            onkeyup: false,
            onclick: false,
            submitHandler: function() {
                $('#frmForgottenPassword').ajaxSubmit(function(data) { 
                    $(".modal_busy").hide();
                    $("#frmForgottenPassword").hide();
                    $("#reminder_done").show();
                }); 
            },
            invalidHandler: showModalButtons, 
            rules: {
                email: {
                    required: true,
                    email: true,
                    remote: {
                        url: "/validate/password-reset/",
                        type: "post",
                        beforeSend: showModalBusy,
                        data: {
                            email: function() {
                                return $("#id_email").val();
                            }
                        }
                    }
                }
            }
        });
	});
});

// Poll Vote

$(function() {
    $('#frmPoll').submit(function() {
        
        if (validatePoll()) {
            $.ajax({
                type: 'POST',
                url: $('#frmPoll').attr('action'),
                data: { option_id: $("input[@name='poll']:checked").attr("value")},
                success: function(data){
	                jQuery(".polllink").click();
                }
            });
            return false;
        }
        else
            return false;
    });
});


// User Actions
function userActionSuccess(data)
{
    json = eval(data);
    element = $("#user_" + json.user_pk);
    element.text(json.action_text);
    element.attr("class", json.action_class);
    if (json.action_href)
        element.attr("href", json.action_href);
    else
        element.removeAttr("href");
}

$(function() {
    $(".user_add, .user_delete").live("click", function () {
        if ($(this).attr("href"))
        {
            var data = {};
            jQuery.post($(this).attr("href"), 
                data, 
                userActionSuccess,
                "json"
            );
            $(this).removeAttr("href");
            return false;
        }
    });
});

// Status Update
$(function() {
    $(".status_update > input").blur(function() {
        if (this.value == "")
            this.value = "Update your status here...";
    });
});

$(function() {
    $(".status_update > input").focus(function() {
        if (this.value == 'Update your status here...' | this.value == "Please enter your new status here..." | this.value == "Status updated.") {
            this.value = '';
        }
    });
});

function statusUpdateSuccess(data) {
    json = eval(data);
    if (json.updated) {
        $(".status_update > input").attr("value", "Status updated.");
        $(".latest_status_update").text("Your Latest: " + json.truncated_text);
        submit_facebook_update(json.text);
    }
}

$(function() {
    $(".status_update_btn").live("click", function() {
        var input_element = $(".status_update > input")
        var text = input_element.attr("value");
        if (text == "Update your status here..." | text == "Please enter your new status here..." | text == "Status updated.") {
            input_element.attr("value", "Please enter your new status here...");
            return false;
        }

        input_element.attr("value", "Updating, please wait...");
        var action_url = $("#frmStatusUpdate").attr("action");
        var data = {text: text};
        $.post(action_url, 
                data, 
                statusUpdateSuccess,
                "json"
            );
        return false;
    });
});

// Status Like
$(function() {
    $(".update_btn_like").live("click", function () {
        var score_element = $(this).parent().parent().find(".update_meta_like");
        var data = {};
        jQuery.post(jQuery(this).attr("href"), 
            data, 
            function(data){
                json = eval(data);
                score_element.text(json.score.score);
            }, 
            "json"
        );
        return false;
    });
});
