packages feed

notmuch-web-0.1.2: templates/compose.julius

$(document).ready(function() {
    //resize body field: copied from jquery-mobile
    var input = $("textarea#body"),
        extraLineHeight = 15,
        keyupTimeoutBuffer = 100,
        keyupTimeout;

    input._keyup = function() {
        var scrollHeight = input[ 0 ].scrollHeight,
        clientHeight = input[ 0 ].clientHeight;

        if ( clientHeight < scrollHeight ) {
            input.height( scrollHeight + extraLineHeight );
        }
    };

    $(".addr-help").popover();

    input.on( "keyup change input paste", function() {
        clearTimeout( keyupTimeout );
        keyupTimeout = setTimeout( input._keyup, keyupTimeoutBuffer );
    });

    //restore format setting
    var oldformat = window.localStorage.getItem("Compose Body Format");
    if (oldformat) {
        $("#bdyfmt").val(oldformat);
        if (oldformat == 3) { //markdown
            $("#previewbtn").removeClass("hidden");
        }
    }
    $("#bdyfmt").change(function() {
        var f = $("#bdyfmt").val();
        window.localStorage.setItem("Compose Body Format", f);
        if (f == 3) { //markdown
            $("#previewbtn").removeClass("hidden");
        } else {
            $("#previewbtn").addClass("hidden");
        }
    });

    //The preview button
    $("#previewbtn").on("click", function() {
        var frm = $("#preview-form");
        var data = frm.serializeArray();
        $(data).each(function() {
            if (this.name == "f2")
                this.value = $("#Body").val();
        });
        $.ajax({
            type: "POST",
            data: $.param(data),
            dataType: 'html',
            url: frm.attr('action')
        })
        .done(function(data) {
            $("#preview-body").html(data);
            $("#preview-modal").modal();
        })
        .fail(function(xhr, err, e) {
            alert("Error " + err + " " + e);
        });
        return false;
    });

    //parse a comma seperated list of addresses, supporting commas inside quotes in the name
    var parseAddrs = function(str) {
        var pttrn = /( *"[^"]*"[^,"]*|[^",]+)(,)?/g;
        var data = [];

        while (m = pttrn.exec(str)) {
            if (m[1]) {
                data.push({txt: m[1], comma: m[2] !== undefined});
            }
        }

        return data;
    };

    // Now the address fields
    $(".address-field").each(function() {
        $(this).select2({
            data: [],
            multiple: true,
            selectOnBlur: true,
            width: 'element',
            minimumInputLength: 3,
            createSearchChoice: function(term) {
                return {id: term, text: term};
            },
            initSelection: function(element, callback) {
                var data = []
                $(parseAddrs(element.val())).each(function() {
                    data.push({id: this.txt, text: this.txt});
                });
                callback(data);
            },
            query: function(options) {
                if (window.searchContacts)
                    window.searchContacts(options.term, options.page, options.callback);
                else
                    options.callback({results:[], more: false});
            },
            tokenizer: function(input, selection, selectCallback, opts) {
                var data = parseAddrs(input);
                var ret = '';
                $(data).each(function() {
                    if (this.comma) {
                        selectCallback({id: this.txt, text: this.txt});
                    } else {
                        ret += this.txt;
                    }
                });
                return ret;
            },
            formatSelection: function(addr, node) {
                if (addr.id != "") {
                    var esc = this.escapeMarkup;
                    var m = addr.id.match(/([^<]*)(<([^>]*)>)?/);
                    if (m === undefined || m[1] === undefined) {
                        return addr.text;
                    } else {
                        node.replaceWith("<div title='"+esc(addr.text)+"'>"+esc(m[1])+"</div>");
                        return undefined;
                    }
                }
            },
        });

        var addrbox = $(this);
        //var s2container = addrbox.prev("div.select2-container");
        var s2container = addrbox.select2("container");
        s2container.on("dblclick", "li.select2-search-choice", function() {
            var data = addrbox.select2("data");

            //Clear the clicked element
            var item = $(this).children("div").attr("title");
            var ndata = $.grep(data, function(i) {
                return i.id != item;
            });
            addrbox.select2("data", ndata);

            //Set it as the input
            s2container.find("li.select2-search-field input").val(item);
            addrbox.data("select2").resizeSearch();
            addrbox.data("select2").focusSearch();
            addrbox.select2("open");
        });
    });
});