//Scroll to element plugin
jQuery.fn.extend({
  scrollTo : function(speed, easing) {
    return this.each(function() {
      var targetOffset = $(this).offset().top;
      $('html,body').animate({scrollTop: targetOffset}, speed, easing);
    });
  }
});


$(function() {
    //imports
    var Regex = MT.Utils.Regex,
        IE7 = MT.Utils.Browser.isIE7(),
        Opera = MT.Utils.Browser.isOpera(),
        _evaluate = MT.Utils.Json.evaluate;
    
    var LoginCloud = {
        container: $("#login_cloud"),
        redirect_url: "/$USERNAME/cama",
        init: function() {
            var context = this;
            
            $("#login_cloud form").submit(function(e) {
                e.preventDefault(); e.stopPropagation();
                
                $.ajax({
                    type: 'POST',
                    url: '/login',
                    data: {
                        username: $("#login_username").val(),
                        password: $("#login_password").val()
                    },
                    dataType: 'json',
                    beforeSend: function() {
                        context.showInProcess();
                    },
                    success: function(data, status) {
                        window.location = context.redirect_url.replace("$USERNAME", data.data.username);
                    },
                    error: function(xhr, status, error) {
                        context.showErrorMessage();
                    },
                    complete: function() {
                        context.hideInProcess();
                    }
                });
            });
        },
        
        setRedirectURL: function(url) {
            this.redirect_url = url;
            
            return this;
        },
        
        showInProcess: function() {
            $(".spinner", this.container).removeClass("hidden");
        },
        
        hideInProcess: function() {
            $(".spinner", this.container).addClass("hidden");
        },
        
        showErrorMessage: function() {
            $(".error-message", this.container).removeClass("hidden").animate({height:43});
            this.setHeight(247);
        },
        
        setHeight: function(h) {
            var cloud = this.container,
                content = $(".content", cloud),
                form = $("form", content);
            
            content.animate({height:h}, {keepOverflow:true});
            form.animate({height:h}, {
                complete: function(e) {
                    $("#login_username").focus();
                }
            });
        },
        
        hideMessages: function() {
            $("#login_cloud .error-message").addClass("hidden").css("height", 0);
            this.hideInProcess();
        },
        
        toggleView: function(callback) {
            var context = this;
            var cloud = this.container,
                content = $(".content", cloud),
                form = $("form", content);
            
            if (!this.isVisible()) {
                cloud.removeClass("hidden");
                if (IE7 || Opera) {
                    content.height(205);
                    form.height(208);
                    $("#login_username").focus();
                    return;
                }
                
                content.animate({height:205}, {keepOverflow:true});
                form.animate({height:208}, {
                    complete: function(e) {
                        $("#login_username").focus();
                        context.hideMessages();
                    }
                });
                
                
            } else {
                $("#menu_button_login").removeClass("selected");
                if (IE7 || Opera) {
                    content.height(0);
                    form.height(0);
                    cloud.addClass("hidden");
                    return;
                }
                
                content.animate({height:0}, {
                    complete: function(e) {
                        cloud.addClass("hidden");
                        context.hideMessages();
                        callback && callback();
                    },
                    keepOverflow:true
                });
                form.animate({height:0});
                //$(".edge.left, .edge.right", "#login_cloud").animate({height:0}, {keepOverflow:true});
            }
        },
        
        isVisible: function() {
            return !this.container.hasClass("hidden");
        }
    }
    
    MT.LoginCloud = LoginCloud;
    
    var SignupCloud = {
        container: $("#signup_cloud"),
        redirect_url: "/$USERNAME/welcome",
        
        init: function() {
            var context = this;
            
            $("#signup_cloud form").submit(function(e) {
                e.preventDefault(); e.stopPropagation();
                
                context.hideMessages();
                var username = $("#signup_username").val(),
                    email = $("#signup_email").val(),
                    password1 = $("#signup_password1").val(),
                    password2 = $("#signup_password2").val(),
                    recaptcha_challenge_field = $("#recaptcha_challenge_field").val(),
                    recaptcha_response_field = $("#recaptcha_response_field").val(),
                    tos = $("#signup_tos").attr("checked");
                
                var vals = {
                        username: (username != ""),
                        email: Regex.EMAIL_VALIDATOR().test(email),
                        password: (password1 == password2),
                        password1: (password1 != ""),
                        password2: (password2 != ""),
                        recaptcha: (recaptcha_response_field != ""),
                        tos: tos
                    },
                    incomplete_fields = [];
                
                for (v in vals) {
                    if (!vals[v]) incomplete_fields.push(v);
                }
                
                if (incomplete_fields.length > 0) {
                    context.showErrorMessage(incomplete_fields);
                    return;
                }
                
                $.ajax({
                    type: 'POST',
                    url: '/signup',
                    data: {
                        username: username,
                        email: email,
                        password1: password1,
                        password2: password2,
                        recaptcha_response_field: recaptcha_response_field,
                        recaptcha_challenge_field: recaptcha_challenge_field,
                        tos: tos
                    },
                    dataType: 'json',
                    beforeSend: function() {
                        context.showInProcess()
                    },
                    success: function(data, status) {
                        window.location = context.redirect_url.replace("$USERNAME", data.data.username);
                    },
                    error: function(xhr, status, error) {
                        if (xhr.status == 400) {
                            var error_fields = eval("(" + xhr.responseText + ")").data;
                            context.showErrorMessage(error_fields);
                            Recaptcha.reload();
                        } else {
                            context.showUnknownError();
                        }
                        $("#signup_password1, #signup_password2").val("");
                    },
                    complete: function() {
                        context.hideInProcess()
                    }
                });
            });
        },
        
        
        setRedirectURL: function(url) {
            this.redirect_url = url;
            
            return this;
        },
        
        showInProcess: function() {
            $(".spinner", this.container).removeClass("hidden");
        },
        
        hideInProcess: function() {
            $(".spinner", this.container).addClass("hidden");
        },
        
        showErrorMessage: function(fields) {
            for (i in fields) {
                var arr = fields[i].split("_"), name = arr[0], msg = arr.slice(1).join("_");
                $(".formfield-" + name + " .error-message", this.container).html(" &mdash; " + (msg == "" ? 'invalid' : msg)).removeClass("hidden");
            }
            
            $(".formfield-" + fields[0].split("_")[0] + " input", this.container).focus();
        },
        
        showUnknownError: function() {
            $(".error-message.error-unknwon", this.container).removeClass("hidden")
        },
        
        hideMessages: function() {
            $(".error-message", this.container).addClass("hidden");
            this.hideInProcess();
        },
        
        toggleView: function(callback) {
            var context = this,
                cloud = this.container,
                content = $(".content", cloud),
                form = $("form", content);
            
            if (!this.isVisible()) {
                cloud.removeClass("hidden");
                if (IE7 || Opera) {
                    content.height(470);
                    form.height(475);
                    $("#signup_username").focus();
                    return;
                }
                content.animate({height:475}, {keepOverflow:true});
                form.animate({height:475}, {
                    complete: function(e) {
                        $("#signup_username").focus();
                    }
                });
                
            } else {
                $("#menu_button_signup").removeClass("selected");
                if (IE7 || Opera) {
                    content.height(0);
                    form.height(0);
                    cloud.addClass("hidden");
                    return;
                }
                
                content.animate({height:0}, {
                    complete: function(e) {
                        cloud.addClass("hidden");
                        callback && callback();
                    },
                    keepOverflow:true
                });
                form.animate({height:0});
            }
            
        },
        
        isVisible: function() {
            return !this.container.hasClass("hidden");
        }
    }
    
    MT.SignupCloud = SignupCloud;
    
 $(window).load(function() { 
        $("#main_menu .drop-down").click(function(e) {
            e.preventDefault(); e.stopPropagation()
            t = $(e.target);
            
            var li = t.closest("li");
            
            if (li.hasClass("selected")) {
                li.removeClass("selected");
            } else {
                $("#main_menu > li").removeClass("selected");
                li.addClass("selected");
            }
            
            
        });
        
        if (!MT.Env.user) {
            SignupCloud.init();
            LoginCloud.init();
            
            $("#menu_button_login").click(function(e) {
                e.preventDefault();
                e.stopPropagation();
                
                $(this).addClass("selected");
                if (SignupCloud.isVisible()) {
                    SignupCloud.toggleView(function() {
                        LoginCloud.toggleView();
                    });
                    
                    return;
                }
                
                LoginCloud.toggleView();
            });
            
            $("#menu_button_signup").click(function(e) {
                e.preventDefault();
                e.stopPropagation();
                
                $(this).addClass("selected");
                if (LoginCloud.isVisible()) {
                    LoginCloud.toggleView(function() {
                        SignupCloud.toggleView();
                    });
                    
                    return;
                }
                SignupCloud.toggleView();
            });
            
            if (window.location.hash == "#login") {
                LoginCloud.toggleView();
            } else if (window.location.hash == "#signup") {
                SignupCloud.toggleView();
            }
            
            // hide cloud on esc
            window.onkeypress = function(e) {
                if (e.keyCode == 27) {
                    SignupCloud.isVisible() && SignupCloud.toggleView();
                    LoginCloud.isVisible() && LoginCloud.toggleView();
                }
            }
            
            try {
                showRecaptcha(document.getElementById("recaptcha_wrapper"));
            } catch(e) {}
        }
    });
});