So, here’s the web-a-list-a-sortifier.. Ok, I’m gonna need some work on that name. Anyhow, I needed a way to simply drag and drop some arbitrary textual list, say from an excel spreadsheet and to import and export this list in a nice and simple way. Here is a jQuery driven solution, ready to use here and now:

<html>

<head>
    <title>Greycastle jQuery based list sorter</title>

    <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" />
    <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
    <script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>
    <link rel="stylesheet" href="/resources/demos/style.css" />

    <style>
        #sortable-list {
            list-style-type: none;
            margin: 0;
            padding: 0;
            width: 100%;
        }

        #sortable-list li {
            margin: 0 3px 3px 3px;
            padding: 0.4em;
            padding-left: 2.6em;
            font-size: 1.4em;
            height: 18px;
            line-height: 0.7em;
        }

        #sortable-list li span {
            position: absolute;
            margin-left: -1.3em;
        }

        #sortable-list li span.remove-button {
            position: absolute;
            margin-left: -2.3em;
        }

        #buttons-container input {
            float: right;
            margin-left: 15px;
            width: 100px;
        }
    </style>

    <script>

        if (!String.prototype.trim) {
            String.prototype.trim = function () {
                return this.replace(/^\s+|\s+$/g, '');
            }
        }

        setList = function () {
            var html = "";
            var lines = $("#new-line-separated-text").val().trim().split("\n");
            for (var i = 0; i < lines.length; ++i) {
                html += '<li class="ui-state-default"><span class="remove-button ui-icon ui-icon-trash"></span><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>' + lines[i] + '</li>';
            }

            $("#sortable-list").html(html);

            // Add remove hooks on all trash-buttons
            $(".remove-button").click(function () {
                $(this).parent().remove();
            });
        };

        getList = function () {
            var text = "";
            $("#sortable-list li").each(function (index, value) {
                text += $(value).text() + "\r\n";
            });

            $("#new-line-separated-text").val(text.trim());
            $("#new-line-separated-text").select();
        }

        $(function () {

            $("#sortable-list").sortable();
            $("#sortable-list").disableSelection();

            // Prepare list
            $('#new-line-separated-text').val("Just select these rows\r\nand paste your own\r\nthen press {Set list}\r\nto generate your own reorderable list\r\nwhen you're done\r\npress {Get list}.\r\nClick the trashcan\r\nto remove any rows");
            setList();

        });

    </script>

</head>

<body>

    <ul id="sortable-list">
    </ul>
    <br />
    <textarea id="new-line-separated-text" style="width: 100%; height: 120px;"></textarea>
    <br />
    <div id="buttons-container">
        <input type="submit" value="Set list" onclick="setList(); return false;" />
        <input type="submit" value="Get list" onclick="getList(); return false;" />
        <div style="clear: both;">
            <!-- break float -->
        </div>
    </div>

</body>

</html>