Seating

Seating algorithm question for SO

HTML

<form id="form">
    <div>
        <span>Prio 1</span>
        <select></select>
        <label><input type="checkbox"> Separate?</label>
    </div>
    <br>
    <input type="submit" value="Seat">
</form>
<pre id="result"></pre>

CSS

#result{
    overflow: auto;
    width: 100%;
}

JavaScript

// The data model
var data = {
    guests: [], // id, name, tags
    tables: [], // id, seats
    seats: [], // id, guest
    tags: [] // id, name
};

// Create some tags
data.tags.push({ id: 0, name: 'Gender' });
data.tags.push({ id: 1, name: 'Language' });
data.tags.push({ id: 2, name: 'Region' });

// Create some guests
for(var i = 0; i < 10; i++)
    data.guests.push({
        id: i,
        name: 'Samuel ' +i,
        tags: [
            (i % 2 == 0 ? 'M' : 'F'),
            (i % 3 == 0 ? 'English' : 'Swedish'),
            (i % 2 == 0 ? 'US' : 'Sweden')
        ]
    });

// Create some tables
for(var i = 0; i < 10; i++){
    var seats = [],
        numSeats = Math.floor(Math.random() * 10);
    
    for(var j = 0; j < numSeats; j++)
        seats.push(j);
    
    data.tables.push({
        id: i,
        seats: seats
    });
}

// Create some seats
for(var i = 0; i < 10; i++){
    data.seats.push({
        id: i,
        guest: 1 + Math.floor(Math.random() * 10)
    });
}

//console.log(data);

// Init the form
var $tags = $('#form select:nth(0)');
for(var i = 0; i < data.tags.length; i++)
    $tags.append('<option value="'
              + data.tags[i].id + '">'
              + data.tags[i].name
              + '</option>');

$tags.parent().clone().insertAfter($tags.parent()).find('span').html('Prio 5');
$tags.parent().clone().insertAfter($tags.parent()).find('span').html('Prio 4');
$tags.parent().clone().insertAfter($tags.parent()).find('span').html('Prio 3');
$tags.parent().clone().insertAfter($tags.parent()).find('span').html('Prio 2');

var printData = function(){
    var html = '',
        props = ['guests', 'tables', 'seats', 'tags'];
    for(var j = 0; j < props.length; j++){
        html += '\n--- ' + props[j] + ' ---';
        for(var i = 0; i < data[props[j]].length; i++){
            html += '\nid:\t' + data[props[j]][i].id;
            var secondProp = '';
            if(data[props[j]][i].name)
                secondProp = 'name';
           ...