$(function(){
    // find all editboxes with default values and initialize them:
    $("input.defval").focus(function(){
        var me = $(this);
        if (!me.hasClass('initialized')){
            me.css('color', '#000').addClass('initialized').val('');
        }            
    }).css('color', '#999');
});

(function(){
    if(typeof(window.Mailgun) != 'undefined'){
        throw Exception("Name collision, somehow Mailgun is already defined, resolve this issue");
    }

    window.Mailgun = {};
    var M = window.Mailgun;

    Mailgun.toUrl = function(url, params){
        if(params.length % 2 != 0) {
            throw new Error(
                "params length should be even, since you are passing [key, val, key, val] array");
        }
        var args = [];
        for(var i = 0; i + 1 < params.length; i += 2 ) {
            args.push( [ params[i], encodeURIComponent(params[i+1]) ].join("=") );
        }
        return [ url, (url.indexOf("?") == -1 ? "?": "&"), args.join("&") ].join("");
    };

    Mailgun.repeat = function(value, times){
        var arr = new Array(times);
        for( var i = 0; i < times; ++i ) {
            arr[i] = value;
        }
        return arr;
    };

    Mailgun.zip = function(a, b){
        if (! (a instanceof Array) || ! (b instanceof Array)) {
           throw new Error("a & b should be arrays!");
        }

        var c = new Array(a.length * 2);
        for( var i = 0 ; i < a.length ; ++i ) {
            c[i*2] = a[i];
            c[i*2+1] = b[i];
        }
        return c;
    };


    Mailgun.navigation = function(prefix){
        $.each(['first','prev','next','last'],function(index, value){
                   var button = $("#"+prefix+"-"+value);
                   if( !button.hasClass('ui-state-disabled') ) {
                       button.click(function(){
                                        $("#"+prefix+"-skip").val(0);
                                        $("#"+prefix+"-skip").val($("#"+prefix+"-value-"+value).val());
                                        $("#"+prefix).submit();
                                    });
                   }
               });
    };

    Mailgun.List = function(name) {
        var self = this;
        self.name = name;
        var checkbox =  $("#"+self.name+"-select-all");
        checkbox.change(function(){
                            self.checkAll(checkbox.attr('checked'));
                        });
    };

    Mailgun.List.prototype.checkAll = function(value){
        $("#" +this.name + " tbody :checkbox").attr('checked', value);
    };

    Mailgun.List.prototype.getChecked = function(){
        var elements = [];
        var self = this;
        $("#"+self.name+" tbody :checkbox").each(function(index, element){
                                                     if(element.checked && (element.id.indexOf("select-all") == -1)){
                                                         elements.push(element.id.split(self.name+"-select-")[1]);
                                                     }
                                                 });
        return elements;
    };

    Mailgun.List.prototype.massDelete = function(params){
        var self = this;
        var checked = self.getChecked();
        if(checked.length == 0){
            alert('Please select at least one ' + params.recordSingular);
        }
        else if(confirm('Are you sure you want to delete these ' + params.recordPlural + '?')){
            var url = M.toUrl(params.url,
                              M.zip(
                                  M.repeat(params.recordId, checked.length), checked));
            $.ajax({
                       url: url,
                       async: false,
                       success: function(){
                           window.location.replace(window.location);
                           self.checkAll(false);
                           M.flash_success(params.recordPlural + " have been successfully removed");
                       }
                   });
        }
    };

    Mailgun.Log = {
        create: function(){

            $("#log-form-search").click(function(){
                                            $("#log-form-skip").val(0);
                                            $("#log-form").submit();
                                        });

            $("#log-form-severity").change(function(){
                                                   $("#log-form-skip").val(0);
                                                   $("#log-form").submit();
                                               });

            $("#log-form-limit").change(function(){
                                                $("#log-form-skip").val(0);
                                                $("#log-form").submit();
                                            });

            $("#log-form-domain").change(function(){
                                                $("#log-form-skip").val(0);
                                                $("#log-form").submit();
                                            });


            M.navigation("log-form");

        }
    };


    Mailgun.Hint = {
        create: function(params){
            $("#hide-hint-"+params.id).click(function(){
                                                 $("#"+params.id).hide();
                                                 $.ajax({url:params.hideUrl});
                                             });
        }
    };

    Mailgun.Routes = {
        create: function(params){
            var table = $("#routes");
            var delete_selected = $("#routes-delete-selected");
            var test = $("#routes-test-submit");
            var test_value =$("#routes-test-value");
            var system_message = $("#routes-system-message");

            var hide_message = function(){
                system_message.hide();
            };

            var show_message = function(value){
                system_message.text(value);
                system_message.show();
                system_message.effect('highlight', {}, 1000);
            };

            var highlight_routes = function(data){
                if ('!! error' in data ){
                    show_message(data['!! error']);
                }
                else {
                    var count = 0;
                    for( var route_id in data ) {
                        var row = $("#route-row-"+route_id);
                        if( data[route_id] != null ) {
                            row.effect('highlight', {}, 3000);
                            count += 1;
                        }
                    }
                    if ( count == 0 ) {
                        show_message('No routes matched');
                    }
                }
            };

            M.navigation("routes-form");
            var list = new M.List("routes");

            $("#routes-form-limit").change(function(){
                                                     $("#routes-form-skip").val(0);
                                                     $("#routes-form").submit();
                                                 });



            delete_selected.click(function(){
                                      list.massDelete({
                                                          url: params.massDelete,
                                                          recordSingular: "route",
                                                          recordPlural: "routes",
                                                          recordId: "route_id"
                                                      });
                                  });

            var execute_test = function(){
                hide_message();
                var value = test_value.val();
                if( value.length != 0 ) {
                    var url = M.toUrl(params.massTest, ["value", value]);
                    $.getJSON(url, highlight_routes);
                }
                else {
                    show_message('Please enter an email address to match');
                }
            };

            test.click(execute_test);
            test_value.keypress(function(event){
                                    if(event.keyCode == '13'){
                                        execute_test();
                                    }
                                });
        }
    };

    Mailgun.Bounces = {
        create: function(params){
            $("#bounces-form-search").click(function(){
                                            $("#bounces-form-skip").val(0);
                                            $("#bounces-form").submit();
                                        });

            $("#bounces-form-domain").change(function(){
                                                $("#bounces-form-skip").val(0);
                                                $("#bounces-form-email").val("");
                                                $("#bounces-form").submit();
                                            });

            $("#bounces-form-limit").change(function(){
                                                $("#bounces-form-skip").val(0);
                                                $("#bounces-form").submit();
                                            });

            M.navigation("bounces-form");
            var list = new M.List("bounces");

            $("#bounces-delete-selected").click(function(){
                                                    list.massDelete({
                                                                        url: params.massDelete,
                                                                        recordSingular: "bounce record",
                                                                        recordPlural: "bounce records",
                                                                        recordId: "bounce_id"
                                                                    });
                                                });
        }
    };

    Mailgun.Unsubscribes = {
        create: function(params){
            $("#unsubscribes-form-search").click(function(){
                                                     $("#unsubscribes-form-skip").val(0);
                                                     $("#unsubscribes-form").submit();
                                                 });

            $("#unsubscribes-form-domain").change(function(){
                                                      $("#unsubscribes-form-skip").val(0);
                                                      $("#unsubscribes-form-recipient").val("");
                                                      $("#unsubscribes-form").submit();
                                                  });

            $("#unsubscribes-form-limit").change(function(){
                                                     $("#unsubscribes-form-skip").val(0);
                                                     $("#unsubscribes-form").submit();
                                                 });

            M.navigation("unsubscribes-form");
            var list = new M.List("unsubscribes");

            var activate_checkbox = $("#unsubscribes-activate");
            activate_checkbox.change(
                function(){
                    $.ajax({
                               url: M.toUrl(params.setStatus, ["unsubscribes-activate", activate_checkbox.attr("checked") ? "1" : "0"]),
                               async: false,
                               success: function(){
                                   var message = activate_checkbox.attr("checked") ? "enabled" : "disabled";
                                   M.flash_success("Unsubscribes have been successfully " + message + " for " + $("#unsubscribes-domain").val());
                               }
                           });
                });

            $("#unsubscribes-delete-selected").click(
                function(){
                    list.massDelete({
                                        url: params.massDelete,
                                        recordSingular: "unsubscribe record",
                                        recordPlural: "unsubscribe records",
                                        recordId: "unsubscribe_id"
                                    });
                });
        }
    };

    Mailgun.EditProfile = {
        create: function(params) {
            $("#show-all-timezones").change(function () {
                    var tz_select = $("#tz");
                    $.getJSON(M.toUrl(params.showAllTimezones, ["all", $(this).attr("checked") ? "1" : "0"]),
                              function (timezones) {
                                  // Build a list of new options, preserving user's timezone selected
                                  var opts = '', selected = tz_select.val();
                                  $.each(timezones, function (i, v) {
                                          opts += "<option value = '" + v + "' " + (v == selected ? "selected = 'selected'" : "") + ">" + v + "</option>";
                                  });
                                  tz_select.html(opts);
                              });
            });
        }
    };

    Mailgun.flash_success = function(message){
        $("#ajax-flash").remove();
        $('h2').after('<div class = "flash_success" id = "ajax-flash" style = "display:none;">' + message + '</div>');
        $("#ajax-flash").fadeIn("slow");
    };

    Mailgun.Campaigns = {
        create: function(params){
            $("#campaigns-form-search").click(function(){
                                                     $("#campaigns-form-skip").val(0);
                                                     $("#campaigns-form").submit();
                                                 });

            $("#campaigns-form-domain").change(function(){
                                                   $("#campaigns-form-skip").val(0);
                                                   $("#campaigns-form-campaign_id").val("");
                                                   $("#campaigns-form").submit();
                                               });

            $("#campaigns-form-limit").change(function(){
                                                     $("#campaigns-form-skip").val(0);
                                                     $("#campaigns-form").submit();
                                                 });

            $("#do-tracking").change(
                function(){
                    $.ajax({
                               url: M.toUrl(params.doTracking, ["do-tracking", $("#do-tracking").attr("checked") ? "1" : "0"]),
                               async: false,
                               success: function(){
                                   var message = $("#do-tracking").attr("checked") ? "enabled" : "disabled";
                                   M.flash_success("Campaigns have been successfully " + message + " for " + $("#campaigns-current-domain").val());
                               }
                           });
                });

            M.navigation("campaigns-form");
            var list = new M.List("campaigns");

            $("#campaigns-delete-selected").click(
                function(){
                    list.massDelete({
                                        url: params.massDelete,
                                        recordSingular: "campaign record",
                                        recordPlural: "campaign records",
                                        recordId: "campaign_id"
                                    });
                });
        }
    };

    Mailgun.SpamReports = {
        create: function(params){
            $("#spamreports-form-search").click(function(){
                        $("#spamreports-form-skip").val(0);
                        $("#spamreports-form").submit();
                   });

            $("#spamreports-form-domain").change(function(){
                        $("#spamreports-form-skip").val(0);
                        $("#spamreports-form-email").val("");
                        $("#spamreports-form").submit();
                   });

            $("#spamreports-form-limit").change(function () {
                        $("#spamreports-form-skip").val(0);
                        $("#spamreports-form").submit();
                   });

            M.navigation("spamreports-form");
            var list = new M.List("spamreports");

            $("#spamreports-delete-selected").click(function(){
                       list.massDelete({
                           url: params.massDelete,
                           recordSingular: "spamreport record",
                           recordPlural: "spamreport records",
                           recordId: "spamreport_id"
                           });
                       });
        }
    };

    Mailgun.Invoices = {
        create: function(params){
            M.navigation("invoices-form");
            var list = new M.List("invoices");
        }
    };


    Mailgun.Signup = {
        create: function(domains_only){
            var show_subdomain = function(show){
                $("#subdomain").toggle(show);
            };

            var update_dname = function(){
                var me = $("#domain_name");
                var val = me.val();
                var subdomain = $("#subdomain:visible");
                if (subdomain)
                    val += subdomain.text();
                $(".dname").text(val);
            };

            var render = function(){
                var subdomain = $('input:radio[name=subdomain]:checked');
                var is_s = (subdomain.val() == "yes");
                if(subdomain.length){
                    show_subdomain(is_s);
                }
                update_dname();
            };


            $("input:#domain_name")
                .keyup(update_dname)
                .change(update_dname);

            $("input:radio[name=subdomain]").click(render);
            render();

            if (!domains_only){
                var image = $("#captcha-image");
                image.click(function(){ $.ajax({
                                 url: "/accounts/new_captcha",
                                 context: document.body,
                                 success: function(data){
                                    image.attr("src", "/captchas?id="+data);
                                 }
                            });
                });
            }
        }
    };

    Mailgun.Domain = {
        create: function(){
            var render = function(){
                var server_type = $('input:radio[name=server_type]:checked').val();
                if(server_type == "free" || server_type == "shared"){
                    $("#subdomain").show();
                    $("input[name=name]").removeClass("long").addClass("short");
                }
                else{
                    $("input[name=name]").removeClass("short").addClass("long");
                    $("#subdomain").hide();
                }
            };

            $("input:radio[name=server_type]").click(render);
            render();
        },
        show: function(validateUrl){
            var btn = $("#dns-validate");
            btn.click(function(){
                   $("tr.error").removeClass('error');

                   var original_caption = btn.attr('value');
                   btn.attr('value', 'Checking...').attr('disabled', 'disabled').css("color", "#999");

                   $.getJSON(validateUrl+"?v="+new Date().getTime(), function(response){
                        btn.removeAttr('disabled').attr('value', original_caption).css("color", "#000");
                        if (response['error']){
                            alert(response['error']);
                            return;
                        }

                        // collect failures:
                        $(response).each(function(i, pair){
                            var rtype = pair[0];
                            var hostname = pair[1];
                            rid = rtype.toLowerCase() + hostname.replace(/\./g, '');
                            $("tr#" + rid).addClass('error');
                        });
                        if (response.length > 0)
                            alert("There are issues. Missing DNS records are highlighted.\n\nKeep in mind that DNS changes take time to propagate.");
                        else
                            alert("DNS records for this mailserver is OK");
                   });
            });
        },
        spam_action: function(url) {
            var spamBtn = $("#apply-spam-action");
            spamBtn.click(function () {
                    spamBtn.attr('disabled', 'disabled').css("color", "#999");

                    // Chosen spam action
                    var option = $("input[name=spam_action]:radio:checked")[0].value;

                    $.getJSON(M.toUrl(url, ["option", option]), function(response) {
                            spamBtn.removeAttr('disabled').css('color', '#000');

                            var cls = response['status'] != 'error' ? 'flash_success' : 'flash_error';
                            var msg = response['msg'];

                            // Blink with success or error message
                            $("#feedback").remove();
                            $('#spam-header').after('<div class="' + cls + '" id="feedback" style="display:none;">' + msg + '</div>');
                            $("#feedback").fadeIn("fast").delay(3000).fadeOut("fast");
                    });
            });
        },
        wildcard: function(url) {
            var wildcard_button = $("#apply-wildcard");
            wildcard_button.click(function () {
                    wildcard_button.attr('disabled', 'disabled').css("color", "#999");

                    // Chosen spam action
                    var option = $("input[name=wildcard]:radio:checked")[0].value;

                    $.getJSON(M.toUrl(url, ["wildcard", option]), function(response) {
                            wildcard_button.removeAttr('disabled').css('color', '#000');

                            var cls = response['status'] != 'error' ? 'flash_success' : 'flash_error';
                            var msg = response['msg'];

                            // Blink with success or error message
                            $("#feedback").remove();
                            $('#wildcard-header').after('<div class="' + cls + '" id="feedback" style="display:none;">' + msg + '</div>');
                            $("#feedback").fadeIn("fast").delay(3000).fadeOut("fast");
                    });
            });
        }
    };

    Mailgun.Mailboxes = {
        create: function(params){
            var table = $("#mailboxes");
            var delete_selected = $(".mailboxes-delete-selected");

            var list = new M.List("mailboxes");

            delete_selected.click(function(){
                                      list.massDelete({
                                                          url: params.massDelete,
                                                          recordSingular: "mailbox",
                                                          recordPlural: "mailboxes",
                                                          recordId: "user"
                                                      });
                                  });

            $("#mailboxes-form-search").click(function(){
                                                  $("#mailboxes-form-skip").val(0);
                                                  $("#mailboxes-form").submit();
                                              });

            $("#mailboxes-form-limit").change(function(){
                                                $("#mailboxes-form").submit();
                                            });

            $("#mailboxes-form-domain").change(function(){
                                                $("#mailboxes-form").submit();
                                            });

            $("#mailboxes-upload-form-upload").click(
                function(){
                    if($("#mailboxes-upload-form-file").val().length == 0){
                        alert("Please choose the file to upload");
                    }
                    else{
                        $("#mailboxes-upload-form").submit();
                    }
                });

            M.navigation("mailboxes-form");
        }
    };

    Mailgun.Domains = {
        create: function (params) {
            $("#domains-form-limit").change(function () {
                $("#domains-form").submit();
            });
            M.navigation("domains-form");
        }
    };

    Mailgun.Stripe = {
        create: function (params) {
            var response_handler = function(status, response){
                var button$ = $("#"+params.form+"-submit");

                var form$ = $("#"+params.form);
                if (response.error) {
                    button$.removeAttr("disabled");
                    $(":submit").removeAttr("disabled", "disabled");
                    button$.val("Submit");

                    $('.flash_error').remove();
                    form$.prepend('<div class="flash_error" style="display:none;">' + response.error.message + '</div>');
                    $(".flash_error").fadeIn("fast").delay(3000);
                } else {
                    // token contains id, last4, and card type
                    var token = response['id'];
                    // insert the token into the form so it gets submitted to the server
                    form$.prepend("<input type='hidden' name='stripe_token' value='" + token + "'/>");
                    // and submit
                    form$.submit();
                }
            };

            $(document).ready(
                function() {
                    var button$ = $("#"+params.form+"-submit");
                    button$.click(
                        function(event) {
                            $('.flash_error').remove();
                            button$.attr("disabled", "disabled");
                            button$.val("Processing...");
                            $(":submit").attr("disabled", "disabled");

                            Stripe.createToken({
                                                   number: $('#card_number').val(),
                                                   cvc: $('#card_cvv').val(),
                                                   exp_month: $('#card_expiration_month').val(),
                                                   exp_year: $('#card_expiration_year').val(),
                                                   address_line1: $('#billing_address_line_1').val(),
                                                   address_zip: $('#zip_code').val()
                                               }, null, response_handler);
                        });
                });
        },
        create_free: function(params){
            $(document).ready(
                function() {
                    $("#"+params.form+"-submit").click(
                        function(event) {
                            $("#"+params.form).submit();
                        });
                });
        }
    };
})();

