From eea59a31979b58f699b31ea596c80c0cc38d0da4 Mon Sep 17 00:00:00 2001
From: Moritz Scheider <moritzschneider@bluewin.ch>
Date: Sat, 3 Jun 2017 15:51:57 +0200
Subject: [PATCH] changed file encoding to unix

---
 tools/groups.tool | 710 +++++++++++++++++++++++-----------------------
 tools/users.tool  | 630 ++++++++++++++++++++--------------------
 2 files changed, 670 insertions(+), 670 deletions(-)

diff --git a/tools/groups.tool b/tools/groups.tool
index 1be122e..a8c4109 100644
--- a/tools/groups.tool
+++ b/tools/groups.tool
@@ -1,355 +1,355 @@
-<div>
-    <table class="table table-hover groups-table">
-        <thead>
-            <tr>
-            </tr>
-        </thead>
-        <tbody>
-        </tbody>
-    </table>
-</div>
-
-<script type="text/javascript">
-    var groups = {
-        showInTable: ['name'],
-        curUserData: null,
-
-        // Page
-        page: {
-            max: Number.MAX_VALUE,
-            cur: function() {
-                return parseInt(tools.mem.session.get('curPage'));
-            },
-            set: function(num) {
-                num = parseInt(num);
-                if (num > 0 && num < groups.page.max + 1)
-                    tools.mem.session.set('curPage', num);
-                $('.groups-cur-page-cont').html(groups.page.cur());
-                groups.get();
-            },
-            inc: function() {
-                groups.page.set(groups.page.cur() + 1);
-            },
-            dec: function() {
-                groups.page.set(groups.page.cur() - 1);
-            }
-        },
-
-        //Sorting
-        sort: {
-            cur: function() {
-                return tools.mem.session.get('curSort');
-            },
-            set: function(sort) {
-                tools.mem.session.set('curSort', sort);
-                groups.get();
-            },
-            inv: function() {
-                var tmp = groups.sort.cur();
-                if (tmp.charAt(0) == '-')
-                    groups.sort.set(tmp.slice(1));
-                else
-                    groups.sort.set('-' + tmp);
-            }
-        },
-
-        //Searching
-        search: {
-            cur: function() {
-                return tools.mem.session.get('search');
-            },
-            set: function(dom, val) {
-                tools.mem.session.set('search', dom + '==' + val);
-                groups.page.set(1);
-            },
-            clr: function() {
-                tools.mem.session.set('search', '');
-                groups.page.set(1);
-            },
-        },
-
-        // Get groups
-        get: function() {
-            amivcore.groups.GET({
-                data: {
-                    'max_results': '50',
-                    page: groups.page.cur(),
-                    sort: groups.sort.cur(),
-                    where: groups.search.cur(),
-                }
-            }, function(ret) {
-                console.log(ret);
-                if (ret === undefined || ret['_items'].length == 0) {
-                    tools.log('No Data', 'w');
-                    return;
-                }
-
-                groups.meta = ret['_meta'];
-                groups.page.max = Math.ceil(groups.meta.total / groups.meta.max_results);
-                $('.groups-page-max-cont').html(groups.page.max);
-
-                // Clear table from previous contentent
-                $('.groups-table thead tr, .groups-table tbody').html('');
-
-                groups.showInTable.forEach(function(i) {
-                    $('.groups-table thead tr').append('<th>' + i + '</th>');
-                });
-
-                for (var n in ret['_items']) {
-                    var tmp = '';
-                    groups.showInTable.forEach(function(i) {
-                        tmp += '<td>' + ret['_items'][n][i] + '</td>';
-                    });
-                    $('.groups-table tbody').append('<tr data-id="' + ret['_items'][n]['_id'] + '">' + tmp + '</tr>');
-                }
-                $('.groups-table tbody tr').click(groups.showDetails);
-            });
-        },
-
-        // Make Modal with editable table data
-        showDetails: function() {
-            amivcore.groups.GET({
-                id: $(this).attr('data-id')
-            }, function(ret) {
-                console.log(ret);
-                curUserData = ret;
-
-                var tmp = '<div class="groups-edit-cont" data-etag="' + ret['_etag'] + '" data-id="' + ret['_id'] + '">';
-                for (var cur in ret)
-                    if (cur.charAt(0) != '_')
-                        if (cur == 'user_subscribers') {
-                            tmp += '<p><strong>Subscribed: <kbd>' + ret[cur].length + '</kbd> <kbd class="groups-show-users"><span class="glyphicon glyphicon-edit" aria-hidden="true"></span></kbd></strong></p>';
-                        } else {
-                            switch (amivcore.getParamType('groups', cur)) {
-                                case 'boolean':
-                                    tmp += '<div class="checkbox"><label><input type="checkbox" value="' + ret[cur] + '" name="' + cur + '">' + cur + '</label></div>';
-                                    break;
-
-                                case 'integer':
-                                    tmp += '<div class="form-group"><label>' + cur + ':</label><input type="number" value="' + ret[cur] + '" class="form-control" name="' + cur + '" min="0" step="1"></div>';
-                                    break;
-
-                                default:
-                                    tmp += '<div class="form-group"><label>' + cur + ':</label><input type="text" value="' + ret[cur] + '" class="form-control" name="' + cur + '"></div>';
-                                    break;
-                            }
-                        }
-                tmp += '</div>';
-
-                tools.modal({
-                    head: ret.firstname + ' ' + ret.lastname,
-                    body: tmp,
-                    button: {
-                        'Delete': {
-                            type: 'danger',
-                            callback: function() {
-                                if (confirm('Fo\' shizzle my nizzle? U fo\' real?'))
-                                    amivcore.groups.DELETE({
-                                        id: $('.groups-edit-cont').first().attr('data-id'),
-                                        header: {
-                                            'If-Match': $('.groups-edit-cont').attr('data-etag')
-                                        },
-                                    }, function(ret) {
-                                        if (ret === undefined) {
-                                            tools.log('Group successfully deleted', 's');
-                                            groups.get();
-                                            tools.modalClose();
-                                        } else {
-                                            tools.log('Error', 'e');
-                                        }
-                                    });
-                            }
-                        },
-                        'Update': {
-                            type: 'success',
-                            close: true,
-                            callback: groups.inspect,
-                        },
-                    }
-                });
-
-            });
-
-            $('.groups-show-users').off('click').on('click', function() {
-                console.log($('groups-edit-cont').first().attr('data-id'));
-            });
-        },
-
-        // Check wether changes were maid and saves it in that case
-        inspect: function() {
-            var newUserData = {};
-            $('.groups-edit-cont tr').each(function() {
-                newUserData[$(this).children('td:nth-child(1)').html()] = $(this).children('td:nth-child(2)').html();
-            });
-            var changed = false,
-                curUserDataChanged = {};
-            for (var i in newUserData) {
-                if (newUserData[i] != String(curUserData[i])) {
-                    changed = true;
-                    curUserDataChanged[i] = newUserData[i];
-                }
-            }
-            if (changed) {
-                amivcore.groups.PATCH({
-                    id: curUserData._   id,
-                    header: {
-                        'If-Match': $('.groups-edit-cont').attr('data-etag')
-                    },
-                    data: curUserDataChanged
-                }, function() {
-                    tools.log('User Updated', 's');
-                    groups.get();
-                });
-            }
-        },
-
-        //Make new user
-        add: function() {
-            var tmp = '<div class="row groups-user-add-form">' +
-                '<div class="form-group"><label for="groups-name">Name:</label><input type="text" class="form-control" name="name" id="groups-name"></div>' +
-                '<div class="form-group"><label for="groups-moderator">Group Admin:</label><input type="text" class="form-control" id="groups-moderator" name="moderator_id"></div>' +
-                '<label class="checkbox-inline"><input type="checkbox" name="has_zoidberg_share">Has Zoidberg share</label>' +
-                '<label class="checkbox-inline pull-right"><input type="checkbox" name="allow_self_enrollment">Self-Enrollment</label>' +
-                '</div>';
-            tools.modal({
-                head: 'Create Group',
-                body: tmp,
-                button: {
-                    'Add': {
-                        type: 'success',
-                        callback: function() {
-                            var modName = $('#groups-moderator').val().trim().split(' ');
-                            if (modName.length != 2) {
-                                tools.log('Wrong input for Moderator', 'w');
-                                return;
-                            }
-                            amivcore.users.GET({
-                                data: {
-                                    where: 'firstname==' + modName[0] + ';lastname==' + modName[1]
-                                }
-                            }, function(ret) {
-                                if (ret['_items'].length !== 1) {
-                                    tools.log('Moderator not found', 'w');
-                                    return;
-                                }
-                                var newUserData = {};
-                                $('.groups-user-add-form input').each(function() {
-                                    newUserData[$(this).attr('name')] = $(this).val();
-                                });
-                                newUserData['moderator_id'] = ret['_items'][0]['_id'];
-                                console.log(newUserData);
-                                amivcore.groups.POST({
-                                    data: newUserData
-                                }, function(ret) {
-                                    if (!ret.hasOwnProperty('_status') || ret['_status'] != 'OK')
-                                        tools.log(JSON.stringify(ret.responseJSON['_issues']), 'e');
-                                    else {
-                                        tools.modalClose();
-                                        tools.log('Group Created', 's');
-                                        groups.get();
-                                    }
-                                });
-                            });
-                        }
-                    }
-                }
-            });
-        }
-    };
-
-    // Setup Menu
-    tools.ui.menu({
-        '<span class="glyphicon glyphicon-plus" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="New Group"></span>': {
-            callback: groups.add
-        },
-        '<span class="glyphicon glyphicon-arrow-left" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="Previous Page"></span>': {
-            callback: groups.page.dec
-        },
-        '<span data-toggle="tooltip" data-placement="bottom" title="Set Page"><span class="groups-cur-page-cont" aria-hidden="true"></span> / <span class="groups-page-max-cont" aria-hidden="true"></span></span>': {
-            callback: function() {
-                tools.modal({
-                    head: 'Go To Page:',
-                    body: '<div class="form-group"><input type="number" value="' + groups.page.cur() + '" class="form-control groups-go-page"></div>',
-                    button: {
-                        'Go': {
-                            type: 'success',
-                            close: true,
-                            callback: function() {
-                                groups.page.set($('.groups-go-page').val());
-                            },
-                        }
-                    }
-                });
-            }
-        },
-        '<span class="glyphicon glyphicon-arrow-right" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="Next Page"></span>': {
-            callback: groups.page.inc
-        },
-        '<span class="glyphicon glyphicon-sort" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="Sort"></span>': {
-            callback: function() {
-                var tmp = '<div class="form-group"><select class="form-control groups-sort-select">';
-                var cur = groups.sort.cur();
-                ['name'].forEach(function(i) {
-                    tmp += '<option value="' + i + '"' + ((i == cur) ? ' selected' : '') + '>&#8673; ' + i + '</option>';
-                    tmp += '<option value="-' + i + '"' + (('-' + i == cur) ? ' selected' : '') + '>&#8675; ' + i + '</option>';
-                });
-                tmp += '</select></div>';
-                tools.modal({
-                    head: 'Sort',
-                    body: tmp,
-                    button: {
-                        'Sort': {
-                            type: 'success',
-                            close: true,
-                            callback: function() {
-                                groups.sort.set($('.groups-sort-select').val());
-                            }
-                        }
-                    }
-
-                });
-            }
-        },
-        '<span class="glyphicon glyphicon-search" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="Search"></span>': {
-            callback: function() {
-                var tmp = '<div class="form-group"><select class="form-control groups-search-select">';
-                var cur = groups.search.cur();
-                if (cur === null || cur == '')
-                    cur = '';
-                else
-                    cur = cur.split('==')[1];
-                ['name'].forEach(function(i) {
-                    tmp += '<option value="' + i + '"' + ((i == cur) ? ' selected' : '') + '>' + i + '</option>';
-                });
-                tmp += '</select><br><input type="text" value="' + cur + '" class="form-control groups-search-val"></div>';
-                tools.modal({
-                    head: 'Search',
-                    body: tmp,
-                    button: {
-                        'Clear': {
-                            type: 'warning',
-                            close: true,
-                            callback: groups.search.clr,
-                        },
-                        'Search': {
-                            type: 'success',
-                            close: true,
-                            callback: function() {
-                                groups.search.set($('.groups-search-select').val(), $('.groups-search-val').val());
-                            }
-                        },
-                    }
-                })
-            }
-        }
-    });
-
-    //Set Toolpit
-    $('[data-toggle="tooltip"]').tooltip()
-
-    // Set Initail Page and get first groups
-    if (groups.page.cur() === null || isNaN(groups.page.cur()))
-        groups.page.set(1);
-    else
-        groups.page.set(groups.page.cur());
-</script>
+<div>
+    <table class="table table-hover groups-table">
+        <thead>
+            <tr>
+            </tr>
+        </thead>
+        <tbody>
+        </tbody>
+    </table>
+</div>
+
+<script type="text/javascript">
+    var groups = {
+        showInTable: ['name'],
+        curUserData: null,
+
+        // Page
+        page: {
+            max: Number.MAX_VALUE,
+            cur: function() {
+                return parseInt(tools.mem.session.get('curPage'));
+            },
+            set: function(num) {
+                num = parseInt(num);
+                if (num > 0 && num < groups.page.max + 1)
+                    tools.mem.session.set('curPage', num);
+                $('.groups-cur-page-cont').html(groups.page.cur());
+                groups.get();
+            },
+            inc: function() {
+                groups.page.set(groups.page.cur() + 1);
+            },
+            dec: function() {
+                groups.page.set(groups.page.cur() - 1);
+            }
+        },
+
+        //Sorting
+        sort: {
+            cur: function() {
+                return tools.mem.session.get('curSort');
+            },
+            set: function(sort) {
+                tools.mem.session.set('curSort', sort);
+                groups.get();
+            },
+            inv: function() {
+                var tmp = groups.sort.cur();
+                if (tmp.charAt(0) == '-')
+                    groups.sort.set(tmp.slice(1));
+                else
+                    groups.sort.set('-' + tmp);
+            }
+        },
+
+        //Searching
+        search: {
+            cur: function() {
+                return tools.mem.session.get('search');
+            },
+            set: function(dom, val) {
+                tools.mem.session.set('search', dom + '==' + val);
+                groups.page.set(1);
+            },
+            clr: function() {
+                tools.mem.session.set('search', '');
+                groups.page.set(1);
+            },
+        },
+
+        // Get groups
+        get: function() {
+            amivcore.groups.GET({
+                data: {
+                    'max_results': '50',
+                    page: groups.page.cur(),
+                    sort: groups.sort.cur(),
+                    where: groups.search.cur(),
+                }
+            }, function(ret) {
+                console.log(ret);
+                if (ret === undefined || ret['_items'].length == 0) {
+                    tools.log('No Data', 'w');
+                    return;
+                }
+
+                groups.meta = ret['_meta'];
+                groups.page.max = Math.ceil(groups.meta.total / groups.meta.max_results);
+                $('.groups-page-max-cont').html(groups.page.max);
+
+                // Clear table from previous contentent
+                $('.groups-table thead tr, .groups-table tbody').html('');
+
+                groups.showInTable.forEach(function(i) {
+                    $('.groups-table thead tr').append('<th>' + i + '</th>');
+                });
+
+                for (var n in ret['_items']) {
+                    var tmp = '';
+                    groups.showInTable.forEach(function(i) {
+                        tmp += '<td>' + ret['_items'][n][i] + '</td>';
+                    });
+                    $('.groups-table tbody').append('<tr data-id="' + ret['_items'][n]['_id'] + '">' + tmp + '</tr>');
+                }
+                $('.groups-table tbody tr').click(groups.showDetails);
+            });
+        },
+
+        // Make Modal with editable table data
+        showDetails: function() {
+            amivcore.groups.GET({
+                id: $(this).attr('data-id')
+            }, function(ret) {
+                console.log(ret);
+                curUserData = ret;
+
+                var tmp = '<div class="groups-edit-cont" data-etag="' + ret['_etag'] + '" data-id="' + ret['_id'] + '">';
+                for (var cur in ret)
+                    if (cur.charAt(0) != '_')
+                        if (cur == 'user_subscribers') {
+                            tmp += '<p><strong>Subscribed: <kbd>' + ret[cur].length + '</kbd> <kbd class="groups-show-users"><span class="glyphicon glyphicon-edit" aria-hidden="true"></span></kbd></strong></p>';
+                        } else {
+                            switch (amivcore.getParamType('groups', cur)) {
+                                case 'boolean':
+                                    tmp += '<div class="checkbox"><label><input type="checkbox" value="' + ret[cur] + '" name="' + cur + '">' + cur + '</label></div>';
+                                    break;
+
+                                case 'integer':
+                                    tmp += '<div class="form-group"><label>' + cur + ':</label><input type="number" value="' + ret[cur] + '" class="form-control" name="' + cur + '" min="0" step="1"></div>';
+                                    break;
+
+                                default:
+                                    tmp += '<div class="form-group"><label>' + cur + ':</label><input type="text" value="' + ret[cur] + '" class="form-control" name="' + cur + '"></div>';
+                                    break;
+                            }
+                        }
+                tmp += '</div>';
+
+                tools.modal({
+                    head: ret.firstname + ' ' + ret.lastname,
+                    body: tmp,
+                    button: {
+                        'Delete': {
+                            type: 'danger',
+                            callback: function() {
+                                if (confirm('Fo\' shizzle my nizzle? U fo\' real?'))
+                                    amivcore.groups.DELETE({
+                                        id: $('.groups-edit-cont').first().attr('data-id'),
+                                        header: {
+                                            'If-Match': $('.groups-edit-cont').attr('data-etag')
+                                        },
+                                    }, function(ret) {
+                                        if (ret === undefined) {
+                                            tools.log('Group successfully deleted', 's');
+                                            groups.get();
+                                            tools.modalClose();
+                                        } else {
+                                            tools.log('Error', 'e');
+                                        }
+                                    });
+                            }
+                        },
+                        'Update': {
+                            type: 'success',
+                            close: true,
+                            callback: groups.inspect,
+                        },
+                    }
+                });
+
+            });
+
+            $('.groups-show-users').off('click').on('click', function() {
+                console.log($('groups-edit-cont').first().attr('data-id'));
+            });
+        },
+
+        // Check wether changes were maid and saves it in that case
+        inspect: function() {
+            var newUserData = {};
+            $('.groups-edit-cont tr').each(function() {
+                newUserData[$(this).children('td:nth-child(1)').html()] = $(this).children('td:nth-child(2)').html();
+            });
+            var changed = false,
+                curUserDataChanged = {};
+            for (var i in newUserData) {
+                if (newUserData[i] != String(curUserData[i])) {
+                    changed = true;
+                    curUserDataChanged[i] = newUserData[i];
+                }
+            }
+            if (changed) {
+                amivcore.groups.PATCH({
+                    id: curUserData._   id,
+                    header: {
+                        'If-Match': $('.groups-edit-cont').attr('data-etag')
+                    },
+                    data: curUserDataChanged
+                }, function() {
+                    tools.log('User Updated', 's');
+                    groups.get();
+                });
+            }
+        },
+
+        //Make new user
+        add: function() {
+            var tmp = '<div class="row groups-user-add-form">' +
+                '<div class="form-group"><label for="groups-name">Name:</label><input type="text" class="form-control" name="name" id="groups-name"></div>' +
+                '<div class="form-group"><label for="groups-moderator">Group Admin:</label><input type="text" class="form-control" id="groups-moderator" name="moderator_id"></div>' +
+                '<label class="checkbox-inline"><input type="checkbox" name="has_zoidberg_share">Has Zoidberg share</label>' +
+                '<label class="checkbox-inline pull-right"><input type="checkbox" name="allow_self_enrollment">Self-Enrollment</label>' +
+                '</div>';
+            tools.modal({
+                head: 'Create Group',
+                body: tmp,
+                button: {
+                    'Add': {
+                        type: 'success',
+                        callback: function() {
+                            var modName = $('#groups-moderator').val().trim().split(' ');
+                            if (modName.length != 2) {
+                                tools.log('Wrong input for Moderator', 'w');
+                                return;
+                            }
+                            amivcore.users.GET({
+                                data: {
+                                    where: 'firstname==' + modName[0] + ';lastname==' + modName[1]
+                                }
+                            }, function(ret) {
+                                if (ret['_items'].length !== 1) {
+                                    tools.log('Moderator not found', 'w');
+                                    return;
+                                }
+                                var newUserData = {};
+                                $('.groups-user-add-form input').each(function() {
+                                    newUserData[$(this).attr('name')] = $(this).val();
+                                });
+                                newUserData['moderator_id'] = ret['_items'][0]['_id'];
+                                console.log(newUserData);
+                                amivcore.groups.POST({
+                                    data: newUserData
+                                }, function(ret) {
+                                    if (!ret.hasOwnProperty('_status') || ret['_status'] != 'OK')
+                                        tools.log(JSON.stringify(ret.responseJSON['_issues']), 'e');
+                                    else {
+                                        tools.modalClose();
+                                        tools.log('Group Created', 's');
+                                        groups.get();
+                                    }
+                                });
+                            });
+                        }
+                    }
+                }
+            });
+        }
+    };
+
+    // Setup Menu
+    tools.ui.menu({
+        '<span class="glyphicon glyphicon-plus" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="New Group"></span>': {
+            callback: groups.add
+        },
+        '<span class="glyphicon glyphicon-arrow-left" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="Previous Page"></span>': {
+            callback: groups.page.dec
+        },
+        '<span data-toggle="tooltip" data-placement="bottom" title="Set Page"><span class="groups-cur-page-cont" aria-hidden="true"></span> / <span class="groups-page-max-cont" aria-hidden="true"></span></span>': {
+            callback: function() {
+                tools.modal({
+                    head: 'Go To Page:',
+                    body: '<div class="form-group"><input type="number" value="' + groups.page.cur() + '" class="form-control groups-go-page"></div>',
+                    button: {
+                        'Go': {
+                            type: 'success',
+                            close: true,
+                            callback: function() {
+                                groups.page.set($('.groups-go-page').val());
+                            },
+                        }
+                    }
+                });
+            }
+        },
+        '<span class="glyphicon glyphicon-arrow-right" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="Next Page"></span>': {
+            callback: groups.page.inc
+        },
+        '<span class="glyphicon glyphicon-sort" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="Sort"></span>': {
+            callback: function() {
+                var tmp = '<div class="form-group"><select class="form-control groups-sort-select">';
+                var cur = groups.sort.cur();
+                ['name'].forEach(function(i) {
+                    tmp += '<option value="' + i + '"' + ((i == cur) ? ' selected' : '') + '>&#8673; ' + i + '</option>';
+                    tmp += '<option value="-' + i + '"' + (('-' + i == cur) ? ' selected' : '') + '>&#8675; ' + i + '</option>';
+                });
+                tmp += '</select></div>';
+                tools.modal({
+                    head: 'Sort',
+                    body: tmp,
+                    button: {
+                        'Sort': {
+                            type: 'success',
+                            close: true,
+                            callback: function() {
+                                groups.sort.set($('.groups-sort-select').val());
+                            }
+                        }
+                    }
+
+                });
+            }
+        },
+        '<span class="glyphicon glyphicon-search" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="Search"></span>': {
+            callback: function() {
+                var tmp = '<div class="form-group"><select class="form-control groups-search-select">';
+                var cur = groups.search.cur();
+                if (cur === null || cur == '')
+                    cur = '';
+                else
+                    cur = cur.split('==')[1];
+                ['name'].forEach(function(i) {
+                    tmp += '<option value="' + i + '"' + ((i == cur) ? ' selected' : '') + '>' + i + '</option>';
+                });
+                tmp += '</select><br><input type="text" value="' + cur + '" class="form-control groups-search-val"></div>';
+                tools.modal({
+                    head: 'Search',
+                    body: tmp,
+                    button: {
+                        'Clear': {
+                            type: 'warning',
+                            close: true,
+                            callback: groups.search.clr,
+                        },
+                        'Search': {
+                            type: 'success',
+                            close: true,
+                            callback: function() {
+                                groups.search.set($('.groups-search-select').val(), $('.groups-search-val').val());
+                            }
+                        },
+                    }
+                })
+            }
+        }
+    });
+
+    //Set Toolpit
+    $('[data-toggle="tooltip"]').tooltip()
+
+    // Set Initail Page and get first groups
+    if (groups.page.cur() === null || isNaN(groups.page.cur()))
+        groups.page.set(1);
+    else
+        groups.page.set(groups.page.cur());
+</script>
diff --git a/tools/users.tool b/tools/users.tool
index 12d5113..322d721 100644
--- a/tools/users.tool
+++ b/tools/users.tool
@@ -1,315 +1,315 @@
-<div class="users-table-wrapper">
-	<table class="table table-hover users-table">
-		<thead>
-			<tr>
-			</tr>
-		</thead>
-		<tbody>
-		</tbody>
-	</table>
-</div>
-<script type="text/javascript">
-	var users = {
-		showInTable: ['firstname', 'lastname', 'nethz', 'legi', 'membership'],
-		curUserData: null,
-
-		// Page
-		page: {
-			max: Number.MAX_VALUE,
-			cur: function() {
-				return parseInt(tools.mem.session.get('curPage'));
-			},
-			set: function(num) {
-				num = parseInt(num);
-				if (num > 0 && num < users.page.max + 1)
-					tools.mem.session.set('curPage', num);
-				$('.users-cur-page-cont').html(users.page.cur());
-				users.get();
-			},
-			inc: function() {
-				users.page.set(users.page.cur() + 1);
-			},
-			dec: function() {
-				users.page.set(users.page.cur() - 1);
-			}
-		},
-
-		//Sorting
-		sort: {
-			cur: function() {
-				return tools.mem.session.get('curSort');
-			},
-			set: function(sort) {
-				tools.mem.session.set('curSort', sort);
-				users.get();
-			},
-			inv: function() {
-				var tmp = users.sort.cur();
-				if (tmp.charAt(0) == '-')
-					users.sort.set(tmp.slice(1));
-				else
-					users.sort.set('-' + tmp);
-			}
-		},
-
-		//Searching
-		search: {
-			cur: function() {
-				return tools.mem.session.get('search');
-			},
-			set: function(dom, val) {
-				tools.mem.session.set('search', dom + '==' + val);
-				users.page.set(1);
-			},
-			clr: function() {
-				tools.mem.session.set('search', '');
-				users.page.set(1);
-			},
-		},
-
-		// Get users
-		get: function() {
-			amivcore.users.GET({
-				data: {
-					'max_results': '50',
-					page: users.page.cur(),
-					sort: users.sort.cur(),
-					where: users.search.cur(),
-				}
-			}, function(ret) {
-
-				if (ret === undefined || ret['_items'].length == 0) {
-					tools.log('No Data', 'w');
-					return;
-				}
-
-				users.meta = ret['_meta'];
-				users.page.max = Math.ceil(users.meta.total / users.meta.max_results);
-				$('.users-page-max-cont').html(users.page.max);
-
-				// Clear table from previous contentent
-				$('.users-table thead tr, .users-table tbody').html('');
-
-				users.showInTable.forEach(function(i) {
-					$('.users-table thead tr').append('<th>' + i + '</th>');
-				});
-
-				for (var n in ret['_items']) {
-					var tmp = '';
-					users.showInTable.forEach(function(i) {
-						tmp += '<td>' + ret['_items'][n][i] + '</td>';
-					});
-					$('.users-table tbody').append('<tr data-id="' + ret['_items'][n]['_id'] + '">' + tmp + '</tr>');
-				}
-				$('.users-table tbody tr').click(users.showDetails);
-			});
-		},
-
-		// Make Modal with editable table data
-		showDetails: function() {
-			amivcore.users.GET({
-				id: $(this).attr('data-id')
-			}, function(ret) {
-				curUserData = ret;
-				var tmp = '<table class="table table-hover users-user-edit-table" data-etag="' + ret['_etag'] + '" data-id="' + ret._id + '"><tbody>';
-				for (var cur in ret)
-					if (cur.charAt(0) != '_')
-						tmp += '<tr><td>' + cur + '</td><td contenteditable>' + ret[cur] + '</td></tr>'
-				tmp += '</tbody></table>';
-
-				tools.modal({
-					head: ret.firstname + ' ' + ret.lastname,
-					body: tmp,
-					button: {
-						'Delete': {
-							type: 'danger',
-							callback: function() {
-								if (confirm('Fo\' shizzle my nizzle? U fo\' real?'))
-									amivcore.users.DELETE({
-										id: $('.users-user-edit-table').first().attr('data-id'),
-										header: {
-											'If-Match': $('.users-user-edit-table').attr('data-etag')
-										},
-									}, function(ret) {
-										if (ret === undefined) {
-											tools.log('User successfully deleted', 's');
-											users.get();
-											tools.modalClose();
-										} else {
-											tools.log('Error', 'e');
-										}
-									});
-							}
-						},
-						'Update': {
-							type: 'success',
-							close: true,
-							callback: users.inspectUser,
-						}
-					}
-				});
-
-			});
-		},
-
-		// Check wether changes were maid and saves it in that case
-		inspectUser: function() {
-			var newUserData = {};
-			$('.users-user-edit-table tr').each(function() {
-				newUserData[$(this).children('td:nth-child(1)').html()] = $(this).children('td:nth-child(2)').html();
-			});
-			var changed = false,
-				curUserDataChanged = {};
-			for (var i in newUserData) {
-				if (newUserData[i] != String(curUserData[i])) {
-					changed = true;
-					curUserDataChanged[i] = newUserData[i];
-				}
-			}
-			if (changed) {
-				amivcore.users.PATCH({
-					id: curUserData._id,
-					header: {
-						'If-Match': $('.users-user-edit-table').attr('data-etag')
-					},
-					data: curUserDataChanged
-				}, function() {
-					tools.log('User Updated', 's');
-					users.get();
-				});
-			}
-		},
-
-		//Make new user
-		add: function() {
-			var tmp = '<div class="row users-user-add-form"><div class="form-group col-xs-6"><label for="users-fn">Firstname:</label><input type="text" class="form-control" name="firstname" id="users-fn"></div>' +
-				'<div class="form-group col-xs-6"><label for="users-ln">Lastname:</label><input type="text" class="form-control" id="users-ln" name="lastname"></div>' +
-				'<div class="form-group"><label for="users-email">E-Mail:</label><input type="email" class="form-control" id="users-email" name="email"></div>' +
-				'<div class="form-group col-xs-6"><label for="users-membership">Membership:</label><select class="form-control" id="users-membership" name="membership"><option>regular</option><option>honorary</option><option>extraordinary</option></select></div>' +
-				'<div class="form-group col-xs-6"><label for="users-gender">Gender:</label><select class="form-control" id="users-gender" name="gender"><option>male</option><option>female</option></select></div>' +
-				'</div>';
-			tools.modal({
-				head: 'Spawn new AMIV slave',
-				body: tmp,
-				button: {
-					'Add': {
-						type: 'success',
-						callback: function() {
-							var newUserData = {};
-							$('.users-user-add-form input, .users-user-add-form select').each(function() {
-								newUserData[$(this).attr('name')] = $(this).val();
-							});
-							amivcore.users.POST({
-								data: newUserData
-							}, function(ret) {
-								if (!ret.hasOwnProperty('_status') || ret['_status'] != 'OK')
-									tools.log(JSON.stringify(ret.responseJSON['_issues']), 'e');
-								else {
-									tools.modalClose();
-									tools.log('User Added', 's');
-									users.get();
-								}
-							});
-						}
-					}
-				}
-			});
-		}
-	};
-
-	// Setup Menu
-	tools.ui.menu({
-		'<span class="glyphicon glyphicon-plus" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="Create User"></span>': {
-			callback: users.add
-		},
-		'<span class="glyphicon glyphicon-arrow-left" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="Previous Page"></span>': {
-			callback: users.page.dec
-		},
-		'<span data-toggle="tooltip" data-placement="bottom" title="Set Page"><span class="users-cur-page-cont" aria-hidden="true"></span> / <span class="users-page-max-cont" aria-hidden="true"></span></span>': {
-			callback: function() {
-				tools.modal({
-					head: 'Go To Page:',
-					body: '<div class="form-group"><input type="number" value="' + users.page.cur() + '" class="form-control users-go-page"></div>',
-					button: {
-						'Go': {
-							type: 'success',
-							close: true,
-							callback: function() {
-								users.page.set($('.users-go-page').val());
-							},
-						}
-					}
-				});
-			}
-		},
-		'<span class="glyphicon glyphicon-arrow-right" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="Next Page"></span>': {
-			callback: users.page.inc
-		},
-		'<span class="glyphicon glyphicon-sort" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="Sort"></span>': {
-			callback: function() {
-				var tmp = '<div class="form-group"><select class="form-control users-sort-select">';
-				var cur = users.sort.cur();
-				['_id', 'firstname', 'lastname', 'membership', 'nethz'].forEach(function(i) {
-					tmp += '<option value="' + i + '"' + ((i == cur) ? ' selected' : '') + '>&#8673; ' + i + '</option>';
-					tmp += '<option value="-' + i + '"' + (('-' + i == cur) ? ' selected' : '') + '>&#8675; ' + i + '</option>';
-				});
-				tmp += '</select></div>';
-				tools.modal({
-					head: 'Sort',
-					body: tmp,
-					button: {
-						'Sort': {
-							type: 'success',
-							close: true,
-							callback: function() {
-								users.sort.set($('.users-sort-select').val());
-							}
-						}
-					}
-
-				});
-			}
-		},
-		'<span class="glyphicon glyphicon-search" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="Search"></span>': {
-			callback: function() {
-				var tmp = '<div class="form-group"><select class="form-control users-search-select">';
-				var cur = users.search.cur();
-				if (cur === null || cur == '')
-					cur = '';
-				else
-					cur = cur.split('==')[1];
-				['_id', 'firstname', 'lastname'].forEach(function(i) {
-					tmp += '<option value="' + i + '"' + ((i == cur) ? ' selected' : '') + '>' + i + '</option>';
-				});
-				tmp += '</select><br><input type="text" value="' + cur + '" class="form-control users-search-val"></div>';
-				tools.modal({
-					head: 'Search',
-					body: tmp,
-					button: {
-						'Clear': {
-							type: 'warning',
-							close: true,
-							callback: users.search.clr,
-						},
-						'Search': {
-							type: 'success',
-							close: true,
-							callback: function() {
-								users.search.set($('.users-search-select').val(), $('.users-search-val').val());
-							}
-						},
-					}
-				})
-			}
-		}
-	});
-
-	//Set Toolpit
-	$('[data-toggle="tooltip"]').tooltip()
-
-	// Set Initail Page and get first users
-	if (users.page.cur() === null || isNaN(users.page.cur()))
-		users.page.set(1);
-	else
-		users.page.set(users.page.cur());
-</script>
+<div class="users-table-wrapper">
+	<table class="table table-hover users-table">
+		<thead>
+			<tr>
+			</tr>
+		</thead>
+		<tbody>
+		</tbody>
+	</table>
+</div>
+<script type="text/javascript">
+	var users = {
+		showInTable: ['firstname', 'lastname', 'nethz', 'legi', 'membership'],
+		curUserData: null,
+
+		// Page
+		page: {
+			max: Number.MAX_VALUE,
+			cur: function() {
+				return parseInt(tools.mem.session.get('curPage'));
+			},
+			set: function(num) {
+				num = parseInt(num);
+				if (num > 0 && num < users.page.max + 1)
+					tools.mem.session.set('curPage', num);
+				$('.users-cur-page-cont').html(users.page.cur());
+				users.get();
+			},
+			inc: function() {
+				users.page.set(users.page.cur() + 1);
+			},
+			dec: function() {
+				users.page.set(users.page.cur() - 1);
+			}
+		},
+
+		//Sorting
+		sort: {
+			cur: function() {
+				return tools.mem.session.get('curSort');
+			},
+			set: function(sort) {
+				tools.mem.session.set('curSort', sort);
+				users.get();
+			},
+			inv: function() {
+				var tmp = users.sort.cur();
+				if (tmp.charAt(0) == '-')
+					users.sort.set(tmp.slice(1));
+				else
+					users.sort.set('-' + tmp);
+			}
+		},
+
+		//Searching
+		search: {
+			cur: function() {
+				return tools.mem.session.get('search');
+			},
+			set: function(dom, val) {
+				tools.mem.session.set('search', dom + '==' + val);
+				users.page.set(1);
+			},
+			clr: function() {
+				tools.mem.session.set('search', '');
+				users.page.set(1);
+			},
+		},
+
+		// Get users
+		get: function() {
+			amivcore.users.GET({
+				data: {
+					'max_results': '50',
+					page: users.page.cur(),
+					sort: users.sort.cur(),
+					where: users.search.cur(),
+				}
+			}, function(ret) {
+
+				if (ret === undefined || ret['_items'].length == 0) {
+					tools.log('No Data', 'w');
+					return;
+				}
+
+				users.meta = ret['_meta'];
+				users.page.max = Math.ceil(users.meta.total / users.meta.max_results);
+				$('.users-page-max-cont').html(users.page.max);
+
+				// Clear table from previous contentent
+				$('.users-table thead tr, .users-table tbody').html('');
+
+				users.showInTable.forEach(function(i) {
+					$('.users-table thead tr').append('<th>' + i + '</th>');
+				});
+
+				for (var n in ret['_items']) {
+					var tmp = '';
+					users.showInTable.forEach(function(i) {
+						tmp += '<td>' + ret['_items'][n][i] + '</td>';
+					});
+					$('.users-table tbody').append('<tr data-id="' + ret['_items'][n]['_id'] + '">' + tmp + '</tr>');
+				}
+				$('.users-table tbody tr').click(users.showDetails);
+			});
+		},
+
+		// Make Modal with editable table data
+		showDetails: function() {
+			amivcore.users.GET({
+				id: $(this).attr('data-id')
+			}, function(ret) {
+				curUserData = ret;
+				var tmp = '<table class="table table-hover users-user-edit-table" data-etag="' + ret['_etag'] + '" data-id="' + ret._id + '"><tbody>';
+				for (var cur in ret)
+					if (cur.charAt(0) != '_')
+						tmp += '<tr><td>' + cur + '</td><td contenteditable>' + ret[cur] + '</td></tr>'
+				tmp += '</tbody></table>';
+
+				tools.modal({
+					head: ret.firstname + ' ' + ret.lastname,
+					body: tmp,
+					button: {
+						'Delete': {
+							type: 'danger',
+							callback: function() {
+								if (confirm('Fo\' shizzle my nizzle? U fo\' real?'))
+									amivcore.users.DELETE({
+										id: $('.users-user-edit-table').first().attr('data-id'),
+										header: {
+											'If-Match': $('.users-user-edit-table').attr('data-etag')
+										},
+									}, function(ret) {
+										if (ret === undefined) {
+											tools.log('User successfully deleted', 's');
+											users.get();
+											tools.modalClose();
+										} else {
+											tools.log('Error', 'e');
+										}
+									});
+							}
+						},
+						'Update': {
+							type: 'success',
+							close: true,
+							callback: users.inspectUser,
+						}
+					}
+				});
+
+			});
+		},
+
+		// Check wether changes were maid and saves it in that case
+		inspectUser: function() {
+			var newUserData = {};
+			$('.users-user-edit-table tr').each(function() {
+				newUserData[$(this).children('td:nth-child(1)').html()] = $(this).children('td:nth-child(2)').html();
+			});
+			var changed = false,
+				curUserDataChanged = {};
+			for (var i in newUserData) {
+				if (newUserData[i] != String(curUserData[i])) {
+					changed = true;
+					curUserDataChanged[i] = newUserData[i];
+				}
+			}
+			if (changed) {
+				amivcore.users.PATCH({
+					id: curUserData._id,
+					header: {
+						'If-Match': $('.users-user-edit-table').attr('data-etag')
+					},
+					data: curUserDataChanged
+				}, function() {
+					tools.log('User Updated', 's');
+					users.get();
+				});
+			}
+		},
+
+		//Make new user
+		add: function() {
+			var tmp = '<div class="row users-user-add-form"><div class="form-group col-xs-6"><label for="users-fn">Firstname:</label><input type="text" class="form-control" name="firstname" id="users-fn"></div>' +
+				'<div class="form-group col-xs-6"><label for="users-ln">Lastname:</label><input type="text" class="form-control" id="users-ln" name="lastname"></div>' +
+				'<div class="form-group"><label for="users-email">E-Mail:</label><input type="email" class="form-control" id="users-email" name="email"></div>' +
+				'<div class="form-group col-xs-6"><label for="users-membership">Membership:</label><select class="form-control" id="users-membership" name="membership"><option>regular</option><option>honorary</option><option>extraordinary</option></select></div>' +
+				'<div class="form-group col-xs-6"><label for="users-gender">Gender:</label><select class="form-control" id="users-gender" name="gender"><option>male</option><option>female</option></select></div>' +
+				'</div>';
+			tools.modal({
+				head: 'Spawn new AMIV slave',
+				body: tmp,
+				button: {
+					'Add': {
+						type: 'success',
+						callback: function() {
+							var newUserData = {};
+							$('.users-user-add-form input, .users-user-add-form select').each(function() {
+								newUserData[$(this).attr('name')] = $(this).val();
+							});
+							amivcore.users.POST({
+								data: newUserData
+							}, function(ret) {
+								if (!ret.hasOwnProperty('_status') || ret['_status'] != 'OK')
+									tools.log(JSON.stringify(ret.responseJSON['_issues']), 'e');
+								else {
+									tools.modalClose();
+									tools.log('User Added', 's');
+									users.get();
+								}
+							});
+						}
+					}
+				}
+			});
+		}
+	};
+
+	// Setup Menu
+	tools.ui.menu({
+		'<span class="glyphicon glyphicon-plus" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="Create User"></span>': {
+			callback: users.add
+		},
+		'<span class="glyphicon glyphicon-arrow-left" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="Previous Page"></span>': {
+			callback: users.page.dec
+		},
+		'<span data-toggle="tooltip" data-placement="bottom" title="Set Page"><span class="users-cur-page-cont" aria-hidden="true"></span> / <span class="users-page-max-cont" aria-hidden="true"></span></span>': {
+			callback: function() {
+				tools.modal({
+					head: 'Go To Page:',
+					body: '<div class="form-group"><input type="number" value="' + users.page.cur() + '" class="form-control users-go-page"></div>',
+					button: {
+						'Go': {
+							type: 'success',
+							close: true,
+							callback: function() {
+								users.page.set($('.users-go-page').val());
+							},
+						}
+					}
+				});
+			}
+		},
+		'<span class="glyphicon glyphicon-arrow-right" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="Next Page"></span>': {
+			callback: users.page.inc
+		},
+		'<span class="glyphicon glyphicon-sort" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="Sort"></span>': {
+			callback: function() {
+				var tmp = '<div class="form-group"><select class="form-control users-sort-select">';
+				var cur = users.sort.cur();
+				['_id', 'firstname', 'lastname', 'membership', 'nethz'].forEach(function(i) {
+					tmp += '<option value="' + i + '"' + ((i == cur) ? ' selected' : '') + '>&#8673; ' + i + '</option>';
+					tmp += '<option value="-' + i + '"' + (('-' + i == cur) ? ' selected' : '') + '>&#8675; ' + i + '</option>';
+				});
+				tmp += '</select></div>';
+				tools.modal({
+					head: 'Sort',
+					body: tmp,
+					button: {
+						'Sort': {
+							type: 'success',
+							close: true,
+							callback: function() {
+								users.sort.set($('.users-sort-select').val());
+							}
+						}
+					}
+
+				});
+			}
+		},
+		'<span class="glyphicon glyphicon-search" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="Search"></span>': {
+			callback: function() {
+				var tmp = '<div class="form-group"><select class="form-control users-search-select">';
+				var cur = users.search.cur();
+				if (cur === null || cur == '')
+					cur = '';
+				else
+					cur = cur.split('==')[1];
+				['_id', 'firstname', 'lastname'].forEach(function(i) {
+					tmp += '<option value="' + i + '"' + ((i == cur) ? ' selected' : '') + '>' + i + '</option>';
+				});
+				tmp += '</select><br><input type="text" value="' + cur + '" class="form-control users-search-val"></div>';
+				tools.modal({
+					head: 'Search',
+					body: tmp,
+					button: {
+						'Clear': {
+							type: 'warning',
+							close: true,
+							callback: users.search.clr,
+						},
+						'Search': {
+							type: 'success',
+							close: true,
+							callback: function() {
+								users.search.set($('.users-search-select').val(), $('.users-search-val').val());
+							}
+						},
+					}
+				})
+			}
+		}
+	});
+
+	//Set Toolpit
+	$('[data-toggle="tooltip"]').tooltip()
+
+	// Set Initail Page and get first users
+	if (users.page.cur() === null || isNaN(users.page.cur()))
+		users.page.set(1);
+	else
+		users.page.set(users.page.cur());
+</script>
-- 
GitLab