/**
 * Citeline Client-side Logic for index.html
 */

var show_info = false;

var init = {

    anonymous : function() {
        var ifExisting = function(url) {
            redirect(url);
        }
            
        var ifNot = function() {
            removeActiveExhibit();
            if ($.browser.mozilla) {
                $('img.reflect').reflect( {
                    height: 0.3,
                    opacity: 0.4
                });
            } else {
                showDialog($("#browser"));
            }
            prepareUpload("upload", "upload_submit");
            $(".signin").click(signIn);
            reveal("anonymous");
        }
        
        focusOnActiveExhibit(ifExisting,ifNot);
    },

    authenticated : function() {
        var ifExisting = function(url) {
            redirect(url);
        }
            
        var ifNot = function() {
            removeActiveExhibit();                
            $(".signout").click(signOut);
            $.getJSON("playgrounds",
                function(pgs) {
                    var pane = $(".authenticated");
                    var list = pane.find("ul").empty();
                    var found = false;
                    for (var pg in pgs) {
                        var data = pgs[pg];
                        var title = (!data.title) ? '[untitled]' : data.title;
                        var created = new Date(data.created);
                        list.append("<li><a href='" + pg +  "/' title='" + title + "'>" + title + "</a> <span class='date'>[" + created.toLocaleString() + "]</span></li>");
                        found = true;
                    }
                    if (!found) {
                        pane.find(".message").fadeIn(200);
                    }
                }
            );
            prepareUpload("new", "new_submit");
            reveal("authenticated");
        }
         
        if (getStatus() == "pending") {
            $.getJSON("playgrounds",
                function(pgs) {
                    var pane = $(".selector");
                    var list = pane.find("ul").empty();
                    for (var pg in pgs) {
                        var data = pgs[pg];
                        var title = (!data.title) ? '[untitled]' : data.title;
                        var created = new Date(data.created);
                        list.append("<div><input type='radio' name='id' value='" + pg + "'> " + title + " <span class='date'>[" + created.toLocaleString() + "]</span></div>");
                    }
                    reveal("selector");
                }
            );
        } else {
            focusOnActiveExhibit(ifExisting,ifNot);
        }
    },
    
    sign_up: function() {
        passwordHandler("signup");
    },

    password_reset: function() {
        passwordHandler("password_reset");
    },
    
    sign_in: signIn,
    
    browser: function() {
        var dialog = $("#browser");
        dialog.find("button[@name='close']").click( function() {
            hideDialog(dialog);
        });
        revealDialog(dialog);
    },
        
    openid_unavailable: function() {
        var dialog = $("#openid_unavailable");
        dialog.find("button[@name='close']").click( function() {
            redirect("./");
        });
        revealDialog(dialog);
    },
      
    openid_failure: function() {
        var dialog = $("#openid_failure");
        var p = getParameters();
        dialog.find(".error_msg").text(decodeURI(p.msg));
        dialog.find("button[@name='close']").click( function() {
            redirect("./");
        });
        revealDialog(dialog);
    },

    syntax_error: function() {
        var dialog = $("#syntax_error");
        dialog.find(".error_msg").show();
        dialog.find("button[@name='close']").click( function() {
            redirect("./");
        });
        revealDialog(dialog);
    },

    size_error: function() {
        var dialog = $("#size_error");
        dialog.find(".error_msg").show();
        dialog.find("button[@name='close']").click( function() {
            redirect("./");
        });
        revealDialog(dialog);
    },
    
    error: function() {
        var dialog = $("#error");
        dialog.find("a[@name='toggle']").click( function() {
            $(this).hide();
            dialog.find(".error_msg").show();
        }).show();
        dialog.find(".error_msg").hide();
        dialog.find("button[@name='close']").click( function() {
            redirect("./");
        });
        revealDialog(dialog);
    }
    
}

// --------------------------------------------------

function getStatus() {
    return $.cookie('apg_status');
}

function focusOnActiveExhibit(ifExisting, ifNot) {
    if ($.info.active_playground) {
        var url = $.info.active_playground + "/";
        $.ajax({
            type: "HEAD",
            url: url,
            success: function() {
                ifExisting(url);
            },
            error: ifNot
        });
    } else {
        ifNot();
    }
}

function prepareUpload(form, action) {

    var formElement = $("form[@name='" + form + "']");
    
    if (!formElement.attr("instrumented")) {
        formElement.ajaxForm( {
            type: "post",
            beforeSubmit: function(formData, jqForm, options) {
                var ready = false;
                for (var i = 0; i < formData.length; i++) {
                    if (formData[i].name == "file" && formData[i].value != "") {
                        ready = true;
                        break;
                    }
                }
                if (!ready) {
                    var dialog = formElement.find(".output").show();
                    setTimeout( function() {
                        dialog.fadeOut(1000);
                    }, 2000);
                }
                return ready;
            },
            success: function(d) {
                
                // NOTE(SM): for some f*cked up reason the json data 
                // is sometimes returned encapsulated in <pre></pre> tags. 
                // Don't ask me why or how to avoid that because it's beyond me.
                if (d.indexOf("<pre>") == 0) {
                    d = d.substring(5);
                    d = d.substring(0, d.length - 6);
                }
                
                try {
                    var data = eval("(" + d + ")");
                } catch (e) {
                    var data = {};
                    data.error = d;
                }
                
                if (data.status && data.status == "done") {
                    redirect(data.id + "/");
                } else {
                    if (!data.type) data.type = "error";
                    var dialog = $("#" + data.type);
                    dialog.find(".error_msg").text(data.error);
                    showDialog(dialog);
                }
            },
            error: error
        });
        
        formElement.find('.upload').click( function() {
            formElement.submit();
        });
        
        formElement.attr("instrumented","true");
    }
        
    formElement.find('.output').hide();
}

function setActiveExhibit(id) {
    $.info.active_playground = id;
    $.cookie('apg', id, { path :'/' });
}

function removeActiveExhibit() {
    delete $.info.active_playground;
    $.cookie('apg', null, { path :'/' });
}

// --------------------------------------------------

function signIn() {

    var getMessage = function(thing) {
        return "Please, type your " + thing + " in the above text box to sign in."
    };

    var signInHandler = function(type, thing) {
        var form = $("form[@name='sign_in_" + type + "']");
        var value = form.find("input").val();
        if (!value) {
            var output = form.find(".output").text(getMessage(thing)).fadeIn(300);
            setTimeout( function() {
                output.fadeOut(1000);
            }, 3000);
            return false;
        } else {
            waitDialog("Authenticating");
            return true;
        }
    }

    var types = {
        "email": null,
        "openid": function() {
            return signInHandler("openid", "OpenID URL");
        }
    };

    var instrument = function(type, handler) {
        var form = $("form[@name='sign_in_" + type + "']");
        var action = form.find("a.action");
        action.click( function() {
            showDrawer(form.find(".content"));
        });
        if (handler) {
            form.submit(handler);
        }
    };

    var pane = $("#sign_in");
    if (!pane.attr("augmented")) {
        for ( var type in types) {
            instrument(type, types[type]);
        }
        pane.attr("augmented", "true");
    }

    var success = function(data) {
        if (data == "unknown") {
            var email = $("#email").val();
            var dialog = $("#signup_choice");
            dialog.find("span[@name='email']").html(email);
            dialog.find("button[@name='yes']").click( function() {
                waitDialog("Processing");
                $.post("signup_email", {
                    "email": email
                }, function(data) {
                    if (data == "sent") {
                        var dialog = $("#signup_message");
                        dialog.find("span[@name='email']").html(email);
                        showDialog(dialog);
                    } else {
                        showDialog($("#error"));
                    }
                });
            });
            dialog.find("button[@name='no']").click( function() {
                hideDialog();
                load("anonymous");
            });

            showDialog(dialog);
        } else {
            data = $.secureEvalJSON(data);

            showDialog($("#signin_email"));

            var instrument2 = function() {
                var counter = 0;

                var form = $("form[@name='sign_in_email2']").ajaxForm({
                    beforeSubmit : function(formArray, jqForm) {
                        var password = formArray.pop();
                        formArray.push( {
                            name :"continuation",
                            value :data.continuation
                        });
                        var password_hash = hex_sha1(password.value);
                        var hash = hex_sha1(data.challenge + password_hash);
                        formArray.push( {
                            name: "hash",
                            value: hash
                        });
                        waitDialog("Authenticating");
                    },
                    error: error,
                    success: function(data) {
                        if (data == "valid") {
                            form.find(".output").hide();
                            hideDialog();
                            redirect('');
                        } else {
                            showDialog($("#signin_email"));
                            counter++;
                            if (counter == 1) {
                                form.find(".output:eq(0)")
                                    .fadeOut(50)
                                    .html("Sorry, your password doesn't match. Try typing it again.")
                                    .fadeIn(100);
                            } else {
                                form.find(".output:eq(0)")
                                    .fadeOut(50)
                                    .html("Sorry, your password still doesn't match.")
                                    .fadeIn(100);
                                form.find(".output:eq(1)")
                                    .fadeIn(1000);
                            }
                            $("form[@name='sign_in_email']").ajaxForm({
                                success :success,
                                error :error
                            });
                        }
                    }
                });
            };

            if (typeof hex_sha1 != "function") {
                $.getScript("scripts/sha1.js", instrument2);
            } else {
                instrument2();
            }
        }
    };

    $("form[@name='sign_in_email']").ajaxForm( {
        beforeSubmit : function(formArray, form) {
            if (formArray[0].value == "") {
                var msg = form.find(".output")
                              .text(getMessage("email address"))
                              .fadeIn(300);
                setTimeout( function() {
                    msg.fadeOut(1000);
                }, 3000);
                return false;
            } else {
                waitDialog("Looking up");
            }
        },
        success :success,
        error :error
    });

    if ($.info) {
        if ($.info.email) $("#email").val($.info.email);
        if ($.info.openid_claimed) $("#openid_url").val($.info.openid_claimed);
    }

    revealDialog($("#sign_in"));
}

function signOut() {
    $("#signout").fadeOut(200);
    $("#info").fadeOut(100);
    $.post("signout", function() {
        $.cookie('JSESSIONID', null);
        $.info = null;
        redirect('');
    });
}

function passwordHandler(type) {
    if (type == "signup") {
        var title = "Sign Up"
    } else {
        var title = "Password Reset"
    }

    var parameters = getParameters();
    var continuation = parameters.resume;

    var dialog = $("#password_selection");

    dialog.find("span[@name='title']").html(title);
    dialog.find("span[@name='email']").html($.info.email);

    var instrument = function() {
        var form = $("form[@name='password_selection']").ajaxForm( {
            beforeSubmit: function(formArray, jqForm) {
                var password1 = formArray.pop();
                var password2 = formArray.pop();
                if (password1.value == password2.value) {
                    var password = hex_sha1(password1.value);
                    formArray.push( {
                        name: "password",
                        value: password
                    });
                    formArray.push( {
                        name: "continuation",
                        value: continuation
                    });
                    form.find(".output").hide();
                    waitDialog("Processing");
                } else {
                    form.find(".output").html("Passwords don't match. Please type them again.").fadeIn(100);
                    return false;
                }
            },
            error: error,
            success: function(data) {
                if (data != "ok") {
                    var errorDialog = $("#error");
                    errorDialog.html("Sorry, an error was encountered signing up: " + data);
                    showDialog(errorDialog);
                    reportError("Error signing up", data);
                } else {
                    hideDialog();
                    redirect('');
                }
            }
        });
    };

    if (typeof hex_sha1 != "function") {
        $.getScript("scripts/sha1.js", instrument);
    } else {
        instrument();
    }

    showDialog(dialog);
}

function passwordReset() {
    var email = $("#email").val();
    var dialog = $("#password_reset_message");
    dialog.find("span[@name='email']").html(email);
    $.post("password_reset", {
        "email" :email
    });
    showDialog(dialog);
}
