Keyword wrapper/splitter

by joplomacedo

HTML

<form>
    <textarea></textarea>
    <button>Split in groups</button>
</form>

CSS

textarea {
    display: block;
    width: 100%;
    box-shadow: 0;
    border: 1px solid;
    resize: vertical;
    outline: none;
    min-height: 200px;
}

JavaScript

function splitLoop( arr, max, func, callback, current_index ) {
    var date = +new Date(),
        current_index = current_index || -1;

    for (; ++current_index < max;) {
        if ( +new Date() - date < 99 ) {
            func( arr[current_index], current_index );
        } else {
            setTimeout(function () {
                splitLoop(arr, max, func, callback, current_index);
            }, 25);

            return;
        }
    }
    callback();
}


var $textarea = $('textarea'),
    wrapAndGroup = function ( kws, max_kws_in_group ) {
        var kw,
            kws_len,
            kw_str = '',
            max_trios_in_group = Math.floor(max_kws_in_group / 3),
            trios_in_group = 0,
            $textarea,
            $textareas = $('');

        kws = kws.filter(function ( kw ) {
            return kw.length;
        });
        
        kws_len = kws.length;

        splitLoop(kws, kws_len, function ( kw, i ) {
            kw_str += kw + '\n"' + kw + '"\n[' + kw + ']\n';

            if ( ++trios_in_group == max_trios_in_group ) {
                $textarea = $('<textarea>').html(kw_str);
                $textareas = $textareas.add($textarea);
                kw_str = '';
                trios_in_group = 0;
            }
            
        }, function () {
            if ( kw_str.length ) {
                $textarea = $('<textarea>').html(kw_str);
                $textareas = $textareas.add($textarea);
            }
            $textareas.appendTo('body');
        });
        
    };


$('form').on('submit', function (e) {
    var kws = $textarea.val().split('\n');
    wrapAndGroup( kws, 2500 );
    e.preventDefault();
    
});