diff --git a/app/routes.js b/app/routes.js
index 3442625..7577a10 100644
--- a/app/routes.js
+++ b/app/routes.js
@@ -182,7 +182,7 @@ module.exports = function(app, rootPath, passport, smtpTransport, sequelize) {
});
});
- app.get('/admin/user-data', isLoggedIn, function(req, res) {
+ app.get('/admin/user/list', isLoggedIn, function(req, res) {
try {
if(req.user.admin) {
sequelize.models.User.findAll().then(function(values) {
@@ -190,15 +190,450 @@ module.exports = function(app, rootPath, passport, smtpTransport, sequelize) {
});
}
else {
-
+ //TODO: Return some kind of error.
+ res.status(400).end();
}
}
catch(e) {console.log(e);}
});
- app.post('/admin/createUser', isLoggedIn, function(req, res) {
+ app.post('/admin/user/create', isLoggedIn, function(req, res) {
try {
- res.json({status: 'success'});
+ if(req.user.admin) {
+ var login = req.body.login;
+ var password = req.body.password;
+
+ sequelize.models.User.create({
+ login: login,
+ password: sequelize.models.User.generateHash(password),
+ admin: true
+ }).then(function(user) {
+ res.json({result: 'success'});
+ }).catch(function(err) {
+ console.log(err);
+ res.json({result: 'duplicate'});
+ });
+ }
+ } catch(e) {console.log(e);}
+ });
+
+ app.post('/admin/user/delete', isLoggedIn, function(req, res) {
+ try {
+ if(req.user.admin) {
+ var userId = req.body.id;
+
+ /* This isn't quite right.. the return of user.destroy() causes problems if the user is not found. Regardless, it is cleaner code to user the class method to destroy the instance rather than load it just to destroy it.
+ sequelize.models.User.findById(userId, {}).then(function(user) {
+ if(user) {
+ return user.destroy();
+ }
+ else {
+ res.json({result: 'failure'});
+ }
+ }).then(function() {
+ res.json({result: 'success'});
+ }).catch(function(err) {
+ console.log(err);
+ res.json({result: 'failure'});
+ });
+ */
+ sequelize.models.User.destroy({where: {id: userId}}).then(function(count) {
+ if(count == 1) {
+ res.json({result: 'success'});
+ }
+ else {
+ res.json({result: 'failure'});
+ }
+ }).catch(function(err) {
+ console.log(err);
+ res.json({result: 'failure'});
+ });
+ }
+ } catch(e) {console.log(e);}
+ });
+
+ app.post('/admin/user/changeLogin', isLoggedIn, function(req, res) {
+ try {
+ if(req.user.admin) {
+ var userId = req.body.id;
+ var login = req.body.login;
+
+ sequelize.models.User.findById(userId, {}).then(function(user) {
+ user.login = login;
+ return user.save();
+ }).then(function() {
+ res.json({result: 'success'});
+ }).catch(function(err) {
+ console.log(err);
+ res.json({result: 'failure'});
+ });
+ }
+ } catch(e) {console.log(e);}
+ });
+
+ app.post('/admin/user/resetPassword', isLoggedIn, function(req, res) {
+ try {
+ if(req.user.admin) {
+ var userId = req.body.id;
+ var password = req.body.password;
+
+ sequelize.models.User.findById(userId, {}).then(function(user) {
+ user.password = sequelize.models.User.generateHash(password);
+ return user.save();
+ }).then(function() {
+ res.json({result: 'success'});
+ }).catch(function(err) {
+ console.log(err);
+ res.json({result: 'failure'});
+ });
+ }
+ } catch(e) {console.log(e);}
+ });
+
+ app.get('/admin/venues/list', isLoggedIn, function(req, res) {
+ try {
+ var showDeleted = req.query.showDeleted == 'true';
+
+ sequelize.models.Venue.findAll({paranoid: !showDeleted}).then(function(values) {
+ res.json(values);
+ });
+ }
+ catch(e) {console.log(e);}
+ });
+
+ app.post('/admin/venues/create', isLoggedIn, function(req, res) {
+ try {
+ if(req.user.admin) {
+ var name = req.body.name;
+
+ sequelize.models.Venue.create({
+ name: name
+ }).then(function(user) {
+ res.json({result: 'success'});
+ }).catch(function(err) {
+ console.log(err);
+ res.json({result: 'duplicate'});
+ });
+ }
+ } catch(e) {console.log(e);}
+ });
+
+ app.post('/admin/venues/delete', isLoggedIn, function(req, res) {
+ try {
+ if(req.user.admin) {
+ var id = req.body.id;
+
+ sequelize.models.Venue.destroy({where: {id: id}}).then(function(count) {
+ if(count == 1) {
+ res.json({result: 'success'});
+ }
+ else {
+ res.json({result: 'failure'});
+ }
+ }).catch(function(err) {
+ console.log(err);
+ res.json({result: 'failure'});
+ });
+ }
+ } catch(e) {console.log(e);}
+ });
+
+ app.post('/admin/venues/edit', isLoggedIn, function(req, res) {
+ try {
+ if(req.user.admin) {
+ var id = req.body.id;
+ var name = req.body.name;
+
+ sequelize.models.Venue.findById(id, {}).then(function(venue) {
+ venue.name = name;
+ return venue.save();
+ }).then(function() {
+ res.json({result: 'success'});
+ }).catch(function(err) {
+ console.log(err);
+ res.json({result: 'failure'});
+ });
+ }
+ } catch(e) {console.log(e);}
+ });
+
+ app.get('/admin/measures/list', isLoggedIn, function(req, res) {
+ try {
+ var showDeleted = req.query.showDeleted == 'true';
+
+ sequelize.models.Measure.findAll({paranoid: !showDeleted}).then(function(values) {
+ res.json(values);
+ });
+ }
+ catch(e) {console.log(e);}
+ });
+
+ app.post('/admin/measures/create', isLoggedIn, function(req, res) {
+ try {
+ if(req.user.admin) {
+ var name = req.body.name;
+ var postfix = req.body.postfix;
+
+ sequelize.models.Measure.create({
+ name: name,
+ postfix: postfix
+ }).then(function(user) {
+ res.json({result: 'success'});
+ }).catch(function(err) {
+ console.log(err);
+ res.json({result: 'duplicate'});
+ });
+ }
+ } catch(e) {console.log(e);}
+ });
+
+ app.post('/admin/measures/delete', isLoggedIn, function(req, res) {
+ try {
+ if(req.user.admin) {
+ var id = req.body.id;
+
+ sequelize.models.Measure.destroy({where: {id: id}}).then(function(count) {
+ if(count == 1) {
+ res.json({result: 'success'});
+ }
+ else {
+ res.json({result: 'failure'});
+ }
+ }).catch(function(err) {
+ console.log(err);
+ res.json({result: 'failure'});
+ });
+ }
+ } catch(e) {console.log(e);}
+ });
+
+ app.post('/admin/measures/edit', isLoggedIn, function(req, res) {
+ try {
+ if(req.user.admin) {
+ var id = req.body.id;
+ var name = req.body.name;
+ var postfix = req.body.postfix;
+
+ sequelize.models.Measure.findById(id, {}).then(function(measure) {
+ measure.name = name;
+ measure.postfix = postfix;
+ return measure.save();
+ }).then(function() {
+ res.json({result: 'success'});
+ }).catch(function(err) {
+ console.log(err);
+ res.json({result: 'failure'});
+ });
+ }
+ } catch(e) {console.log(e);}
+ });
+
+ app.get('/admin/categories/list', isLoggedIn, function(req, res) {
+ try {
+ var showDeleted = req.query.showDeleted == 'true';
+
+ sequelize.models.Category.findAll({paranoid: !showDeleted}).then(function(values) {
+ res.json(values);
+ });
+ }
+ catch(e) {console.log(e);}
+ });
+
+ app.post('/admin/categories/create', isLoggedIn, function(req, res) {
+ try {
+ if(req.user.admin) {
+ var name = req.body.name;
+
+ sequelize.models.Category.create({
+ name: name
+ }).then(function(user) {
+ res.json({result: 'success'});
+ }).catch(function(err) {
+ console.log(err);
+ res.json({result: 'duplicate'});
+ });
+ }
+ } catch(e) {console.log(e);}
+ });
+
+ app.post('/admin/categories/delete', isLoggedIn, function(req, res) {
+ try {
+ if(req.user.admin) {
+ var id = req.body.id;
+
+ sequelize.models.Category.destroy({where: {id: id}}).then(function(count) {
+ if(count == 1) {
+ res.json({result: 'success'});
+ }
+ else {
+ res.json({result: 'failure'});
+ }
+ }).catch(function(err) {
+ console.log(err);
+ res.json({result: 'failure'});
+ });
+ }
+ } catch(e) {console.log(e);}
+ });
+
+ app.post('/admin/categories/edit', isLoggedIn, function(req, res) {
+ try {
+ if(req.user.admin) {
+ var id = req.body.id;
+ var name = req.body.name;
+
+ sequelize.models.Category.findById(id, {}).then(function(category) {
+ category.name = name;
+ return category.save();
+ }).then(function() {
+ res.json({result: 'success'});
+ }).catch(function(err) {
+ console.log(err);
+ res.json({result: 'failure'});
+ });
+ }
+ } catch(e) {console.log(e);}
+ });
+
+ app.get('/admin/subcategories/list', isLoggedIn, function(req, res) {
+ try {
+ var showDeleted = req.query.showDeleted == 'true';
+
+ sequelize.models.Subcategory.findAll({paranoid: !showDeleted}).then(function(values) {
+ res.json(values);
+ });
+ }
+ catch(e) {console.log(e);}
+ });
+
+ app.post('/admin/subcategories/create', isLoggedIn, function(req, res) {
+ try {
+ if(req.user.admin) {
+ var name = req.body.name;
+
+ sequelize.models.Subcategory.create({
+ name: name
+ }).then(function(user) {
+ res.json({result: 'success'});
+ }).catch(function(err) {
+ console.log(err);
+ res.json({result: 'duplicate'});
+ });
+ }
+ } catch(e) {console.log(e);}
+ });
+
+ app.post('/admin/subcategories/delete', isLoggedIn, function(req, res) {
+ try {
+ if(req.user.admin) {
+ var id = req.body.id;
+
+ sequelize.models.Subcategory.destroy({where: {id: id}}).then(function(count) {
+ if(count == 1) {
+ res.json({result: 'success'});
+ }
+ else {
+ res.json({result: 'failure'});
+ }
+ }).catch(function(err) {
+ console.log(err);
+ res.json({result: 'failure'});
+ });
+ }
+ } catch(e) {console.log(e);}
+ });
+
+ app.post('/admin/subcategories/edit', isLoggedIn, function(req, res) {
+ try {
+ if(req.user.admin) {
+ var id = req.body.id;
+ var name = req.body.name;
+
+ sequelize.models.Subcategory.findById(id, {}).then(function(subcategory) {
+ subcategory.name = name;
+ return subcategory.save();
+ }).then(function() {
+ res.json({result: 'success'});
+ }).catch(function(err) {
+ console.log(err);
+ res.json({result: 'failure'});
+ });
+ }
+ } catch(e) {console.log(e);}
+ });
+
+ app.get('/admin/items/list', isLoggedIn, function(req, res) {
+ try {
+ var showDeleted = req.query.showDeleted == 'true';
+
+ sequelize.models.Item.findAll({paranoid: !showDeleted}).then(function(values) {
+ res.json(values);
+ });
+ }
+ catch(e) {console.log(e);}
+ });
+
+ app.post('/admin/items/create', isLoggedIn, function(req, res) {
+ try {
+ if(req.user.admin) {
+ var name = req.body.name;
+ var defaultPrice = req.body.defaultPrice;
+ var measures = req.body.measures;
+
+ sequelize.models.Item.create({
+ name: name,
+ defaultPrice: defaultPrice,
+ measures: measures
+ }).then(function(user) {
+ res.json({result: 'success'});
+ }).catch(function(err) {
+ console.log(err);
+ res.json({result: 'duplicate'});
+ });
+ }
+ } catch(e) {console.log(e);}
+ });
+
+ app.post('/admin/items/delete', isLoggedIn, function(req, res) {
+ try {
+ if(req.user.admin) {
+ var id = req.body.id;
+
+ sequelize.models.Item.destroy({where: {id: id}}).then(function(count) {
+ if(count == 1) {
+ res.json({result: 'success'});
+ }
+ else {
+ res.json({result: 'failure'});
+ }
+ }).catch(function(err) {
+ console.log(err);
+ res.json({result: 'failure'});
+ });
+ }
+ } catch(e) {console.log(e);}
+ });
+
+ app.post('/admin/items/edit', isLoggedIn, function(req, res) {
+ try {
+ if(req.user.admin) {
+ var id = req.body.id;
+ var name = req.body.name;
+ var defaultPrice = req.body.defaultPrice;
+ var measures = req.body.measures;
+
+ sequelize.models.Item.findById(id, {}).then(function(item) {
+ item.name = name;
+ item.defaultPrice = defaultPrice;
+ item.measures = measures;
+ return item.save();
+ }).then(function() {
+ res.json({result: 'success'});
+ }).catch(function(err) {
+ console.log(err);
+ res.json({result: 'failure'});
+ });
+ }
} catch(e) {console.log(e);}
});
diff --git a/migrations/20160602030145-Measure.js b/migrations/20160602030145-Measure.js
index 72cab5b..24bc0e6 100644
--- a/migrations/20160602030145-Measure.js
+++ b/migrations/20160602030145-Measure.js
@@ -23,11 +23,6 @@ module.exports = {
type: DataTypes.STRING,
allowNull: false
},
- visible: {
- type: DataTypes.BOOLEAN,
- allowNull: false,
- defaultValue: true
- },
createdAt: {
type: DataTypes.DATE,
allowNull: false
@@ -35,9 +30,15 @@ module.exports = {
updatedAt: {
type: DataTypes.DATE,
allowNull: false
+ },
+ deletedAt: {
+ type: DataTypes.DATE,
+ allowNull: true
}
}, {
- charset: 'utf8'
+ charset: 'utf8',
+ timestamps: true,
+ paranoid: true
});
},
diff --git a/migrations/20160602030146-Venue.js b/migrations/20160602030146-Venue.js
index b46d8da..efb0af2 100644
--- a/migrations/20160602030146-Venue.js
+++ b/migrations/20160602030146-Venue.js
@@ -15,11 +15,6 @@ module.exports = {
type: DataTypes.STRING,
allowNull: false
},
- visible: {
- type: DataTypes.BOOLEAN,
- allowNull: false,
- defaultValue: true
- },
createdAt: {
type: DataTypes.DATE,
allowNull: false
@@ -27,9 +22,15 @@ module.exports = {
updatedAt: {
type: DataTypes.DATE,
allowNull: false
+ },
+ deletedAt: {
+ type: DataTypes.DATE,
+ allowNull: true
}
}, {
- charset: 'utf8'
+ charset: 'utf8',
+ timestamps: true,
+ paranoid: true
});
},
diff --git a/migrations/20160602030147-Category.js b/migrations/20160602030147-Category.js
index e566464..f33b1e5 100644
--- a/migrations/20160602030147-Category.js
+++ b/migrations/20160602030147-Category.js
@@ -15,11 +15,6 @@ module.exports = {
type: DataTypes.STRING,
allowNull: false
},
- visible: {
- type: DataTypes.BOOLEAN,
- allowNull: false,
- defaultValue: true
- },
createdAt: {
type: DataTypes.DATE,
allowNull: false
@@ -27,9 +22,15 @@ module.exports = {
updatedAt: {
type: DataTypes.DATE,
allowNull: false
+ },
+ deletedAt: {
+ type: DataTypes.DATE,
+ allowNull: true
}
}, {
- charset: 'utf8'
+ charset: 'utf8',
+ timestamps: true,
+ paranoid: true
});
},
diff --git a/migrations/20160602030148-Subcategory.js b/migrations/20160602030148-Subcategory.js
index 0b6e551..65a9ff2 100644
--- a/migrations/20160602030148-Subcategory.js
+++ b/migrations/20160602030148-Subcategory.js
@@ -17,11 +17,6 @@ module.exports = {
field: 'name',
allowNull: false
},
- visible: {
- type: DataTypes.BOOLEAN,
- allowNull: false,
- defaultValue: true
- },
categoryId: {
type: Sequelize.INTEGER,
references: {
@@ -38,9 +33,15 @@ module.exports = {
updatedAt: {
type: DataTypes.DATE,
allowNull: false
+ },
+ deletedAt: {
+ type: DataTypes.DATE,
+ allowNull: true
}
}, {
- charset: 'utf8'
+ charset: 'utf8',
+ timestamps: true,
+ paranoid: true
});
},
diff --git a/migrations/20160602030149-Item.js b/migrations/20160602030149-Item.js
index 270a92f..d5fbd95 100644
--- a/migrations/20160602030149-Item.js
+++ b/migrations/20160602030149-Item.js
@@ -23,11 +23,6 @@ module.exports = {
type: DataTypes.DECIMAL(9,2),
allowNull: false
},
- visible: {
- type: DataTypes.BOOLEAN,
- allowNull: false,
- defaultValue: true
- },
subcategoryId: {
type: Sequelize.INTEGER,
references: {
@@ -44,9 +39,15 @@ module.exports = {
updatedAt: {
type: DataTypes.DATE,
allowNull: false
+ },
+ deletedAt: {
+ type: DataTypes.DATE,
+ allowNull: true
}
}, {
- charset: 'utf8'
+ charset: 'utf8',
+ timestamps: true,
+ paranoid: true
});
},
diff --git a/migrations/20160602030150-Sale.js b/migrations/20160602030150-Sale.js
index d7f459f..944b0c5 100644
--- a/migrations/20160602030150-Sale.js
+++ b/migrations/20160602030150-Sale.js
@@ -58,9 +58,15 @@ module.exports = {
updatedAt: {
type: DataTypes.DATE,
allowNull: false
+ },
+ deletedAt: {
+ type: DataTypes.DATE,
+ allowNull: true
}
}, {
- charset: 'utf8'
+ charset: 'utf8',
+ timestamps: true,
+ paranoid: true
});
},
diff --git a/models/category.js b/models/category.js
index e82fb85..765e0f7 100644
--- a/models/category.js
+++ b/models/category.js
@@ -13,13 +13,21 @@ module.exports = function(sequelize, DataTypes) {
type: DataTypes.STRING,
allowNull: false
},
- visible: {
- type: DataTypes.BOOLEAN,
- allowNull: false,
- defaultValue: true
+ createdAt: {
+ type: DataTypes.DATE,
+ allowNull: false
+ },
+ updatedAt: {
+ type: DataTypes.DATE,
+ allowNull: false
+ },
+ deletedAt: {
+ type: DataTypes.DATE,
+ allowNull: true
}
}, {
freezeTableName: true, // Model tableName will be the same as the model name
+ paranoid: true,
classMethods: {
associate: function(models) {
Category.hasMany(models.Subcategory, {as: 'subcategories', foreignKey: {name: 'categoryId', field: 'categoryId'}});
diff --git a/models/item.js b/models/item.js
index e6847ba..81779d0 100644
--- a/models/item.js
+++ b/models/item.js
@@ -22,13 +22,21 @@ module.exports = function(sequelize, DataTypes) {
type: DataTypes.DECIMAL(9,2),
allowNull: false
},
- visible: {
- type: DataTypes.BOOLEAN,
- allowNull: false,
- defaultValue: true
+ createdAt: {
+ type: DataTypes.DATE,
+ allowNull: false
+ },
+ updatedAt: {
+ type: DataTypes.DATE,
+ allowNull: false
+ },
+ deletedAt: {
+ type: DataTypes.DATE,
+ allowNull: true
}
}, {
freezeTableName: true, // Model tableName will be the same as the model name
+ paranoid: true,
classMethods: {
associate: function(models) {
Item.belongsTo(models.Subcategory, {as: 'subcategory', foreignKey: {name: 'subcategoryId', field: 'subcategoryId'}});
diff --git a/models/measure.js b/models/measure.js
index a3d2270..e4a5783 100644
--- a/models/measure.js
+++ b/models/measure.js
@@ -20,13 +20,9 @@ module.exports = function(sequelize, DataTypes) {
postfix: {
type: DataTypes.STRING,
allowNull: false
- },
- visible: {
- type: DataTypes.BOOLEAN,
- allowNull: false,
- defaultValue: true
}
}, {
- freezeTableName: true // Model tableName will be the same as the model name
+ freezeTableName: true, // Model tableName will be the same as the model
+ paranoid: true
});
};
diff --git a/models/sale.js b/models/sale.js
index 1c7b5dd..cc67bd3 100644
--- a/models/sale.js
+++ b/models/sale.js
@@ -21,9 +21,22 @@ module.exports = function(sequelize, DataTypes) {
//GAAP standard is to use DECIMAL(13,4) for precision when dealing with money. 13 digits before the decimal, and 4 after it.
type: DataTypes.DECIMAL(13,4),
allowNull: false
+ },
+ createdAt: {
+ type: DataTypes.DATE,
+ allowNull: false
+ },
+ updatedAt: {
+ type: DataTypes.DATE,
+ allowNull: false
+ },
+ deletedAt: {
+ type: DataTypes.DATE,
+ allowNull: true
}
}, {
freezeTableName: true, // Model tableName will be the same as the model name
+ paranoid: true,
classMethods: {
associate: function(models) {
Sale.belongsTo(models.Item, {as: 'item', foreignKey: {name: 'itemId', field: 'itemId'}});
diff --git a/models/subcategory.js b/models/subcategory.js
index e2b4636..91d6024 100644
--- a/models/subcategory.js
+++ b/models/subcategory.js
@@ -15,13 +15,21 @@ module.exports = function(sequelize, DataTypes) {
field: 'name',
allowNull: false
},
- visible: {
- type: DataTypes.BOOLEAN,
- allowNull: false,
- defaultValue: true
+ createdAt: {
+ type: DataTypes.DATE,
+ allowNull: false
+ },
+ updatedAt: {
+ type: DataTypes.DATE,
+ allowNull: false
+ },
+ deletedAt: {
+ type: DataTypes.DATE,
+ allowNull: true
}
}, {
freezeTableName: true, // Model tableName will be the same as the model name
+ paranoid: true,
classMethods: {
associate: function(models) {
Subcategory.belongsTo(models.Category, {as: 'category', foreignKey: {name: 'categoryId', field: 'categoryId'}});
diff --git a/models/venue.js b/models/venue.js
index c83e4fb..8e76fd9 100644
--- a/models/venue.js
+++ b/models/venue.js
@@ -13,12 +13,20 @@ module.exports = function(sequelize, DataTypes) {
type: DataTypes.STRING,
allowNull: false
},
- visible: {
- type: DataTypes.BOOLEAN,
- allowNull: false,
- defaultValue: true
+ createdAt: {
+ type: DataTypes.DATE,
+ allowNull: false
+ },
+ updatedAt: {
+ type: DataTypes.DATE,
+ allowNull: false
+ },
+ deletedAt: {
+ type: DataTypes.DATE,
+ allowNull: true
}
}, {
- freezeTableName: true // Model tableName will be the same as the model name
+ freezeTableName: true, // Model tableName will be the same as the model name,
+ paranoid: true
});
};
diff --git a/public/admin/Venues.html b/public/admin/Venues.html
new file mode 100644
index 0000000..20e90d4
--- /dev/null
+++ b/public/admin/Venues.html
@@ -0,0 +1,184 @@
+
+
+
Manage Venues
+
+
+
+
+
+ Include Deleted
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Are you certain you wish to delete the venue ?
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/admin/categories.css b/public/admin/categories.css
new file mode 100644
index 0000000..e69de29
diff --git a/public/admin/categories.html b/public/admin/categories.html
new file mode 100644
index 0000000..c57b552
--- /dev/null
+++ b/public/admin/categories.html
@@ -0,0 +1,183 @@
+
+
+
Manage Categories
+
+
+
+
+
+ Include Deleted
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Are you certain you wish to delete the category ?
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/admin/categories.styl b/public/admin/categories.styl
new file mode 100644
index 0000000..984ea84
--- /dev/null
+++ b/public/admin/categories.styl
@@ -0,0 +1,2 @@
+#categories {
+}
\ No newline at end of file
diff --git a/public/admin/css/bootstrap-switch.css b/public/admin/css/bootstrap-switch.css
new file mode 100644
index 0000000..6c0cc1d
--- /dev/null
+++ b/public/admin/css/bootstrap-switch.css
@@ -0,0 +1,195 @@
+/* ========================================================================
+ * bootstrap-switch - v3.3.2
+ * http://www.bootstrap-switch.org
+ * ========================================================================
+ * Copyright 2012-2013 Mattia Larentis
+ *
+ * ========================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================================
+ */
+
+.bootstrap-switch {
+ display: inline-block;
+ direction: ltr;
+ cursor: pointer;
+ border-radius: 4px;
+ border: 1px solid;
+ border-color: #cccccc;
+ position: relative;
+ text-align: left;
+ overflow: hidden;
+ line-height: 8px;
+ z-index: 0;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ vertical-align: middle;
+ -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+ -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+ transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+}
+.bootstrap-switch .bootstrap-switch-container {
+ display: inline-block;
+ top: 0;
+ border-radius: 4px;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+}
+.bootstrap-switch .bootstrap-switch-handle-on,
+.bootstrap-switch .bootstrap-switch-handle-off,
+.bootstrap-switch .bootstrap-switch-label {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ cursor: pointer;
+ display: inline-block !important;
+ height: 100%;
+ padding: 6px 12px;
+ font-size: 14px;
+ line-height: 20px;
+}
+.bootstrap-switch .bootstrap-switch-handle-on,
+.bootstrap-switch .bootstrap-switch-handle-off {
+ text-align: center;
+ z-index: 1;
+}
+.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary,
+.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary {
+ color: #fff;
+ background: #337ab7;
+}
+.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info,
+.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info {
+ color: #fff;
+ background: #5bc0de;
+}
+.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success,
+.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success {
+ color: #fff;
+ background: #5cb85c;
+}
+.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning,
+.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning {
+ background: #f0ad4e;
+ color: #fff;
+}
+.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger,
+.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger {
+ color: #fff;
+ background: #d9534f;
+}
+.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default,
+.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default {
+ color: #000;
+ background: #eeeeee;
+}
+.bootstrap-switch .bootstrap-switch-label {
+ text-align: center;
+ margin-top: -1px;
+ margin-bottom: -1px;
+ z-index: 100;
+ color: #333333;
+ background: #ffffff;
+}
+.bootstrap-switch .bootstrap-switch-handle-on {
+ border-bottom-left-radius: 3px;
+ border-top-left-radius: 3px;
+}
+.bootstrap-switch .bootstrap-switch-handle-off {
+ border-bottom-right-radius: 3px;
+ border-top-right-radius: 3px;
+}
+.bootstrap-switch input[type='radio'],
+.bootstrap-switch input[type='checkbox'] {
+ position: absolute !important;
+ top: 0;
+ left: 0;
+ margin: 0;
+ z-index: -1;
+ opacity: 0;
+ filter: alpha(opacity=0);
+}
+.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-on,
+.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-off,
+.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-label {
+ padding: 1px 5px;
+ font-size: 12px;
+ line-height: 1.5;
+}
+.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-on,
+.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-off,
+.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-label {
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+}
+.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-on,
+.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-off,
+.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-label {
+ padding: 6px 16px;
+ font-size: 18px;
+ line-height: 1.3333333;
+}
+.bootstrap-switch.bootstrap-switch-disabled,
+.bootstrap-switch.bootstrap-switch-readonly,
+.bootstrap-switch.bootstrap-switch-indeterminate {
+ cursor: default !important;
+}
+.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-on,
+.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-on,
+.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-on,
+.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-off,
+.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-off,
+.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-off,
+.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-label,
+.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-label,
+.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-label {
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+ cursor: default !important;
+}
+.bootstrap-switch.bootstrap-switch-animate .bootstrap-switch-container {
+ -webkit-transition: margin-left 0.5s;
+ -o-transition: margin-left 0.5s;
+ transition: margin-left 0.5s;
+}
+.bootstrap-switch.bootstrap-switch-inverse .bootstrap-switch-handle-on {
+ border-bottom-left-radius: 0;
+ border-top-left-radius: 0;
+ border-bottom-right-radius: 3px;
+ border-top-right-radius: 3px;
+}
+.bootstrap-switch.bootstrap-switch-inverse .bootstrap-switch-handle-off {
+ border-bottom-right-radius: 0;
+ border-top-right-radius: 0;
+ border-bottom-left-radius: 3px;
+ border-top-left-radius: 3px;
+}
+.bootstrap-switch.bootstrap-switch-focused {
+ border-color: #66afe9;
+ outline: 0;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
+ box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
+}
+.bootstrap-switch.bootstrap-switch-on .bootstrap-switch-label,
+.bootstrap-switch.bootstrap-switch-inverse.bootstrap-switch-off .bootstrap-switch-label {
+ border-bottom-right-radius: 3px;
+ border-top-right-radius: 3px;
+}
+.bootstrap-switch.bootstrap-switch-off .bootstrap-switch-label,
+.bootstrap-switch.bootstrap-switch-inverse.bootstrap-switch-on .bootstrap-switch-label {
+ border-bottom-left-radius: 3px;
+ border-top-left-radius: 3px;
+}
diff --git a/public/admin/css/bootstrap-switch.min.css b/public/admin/css/bootstrap-switch.min.css
new file mode 100644
index 0000000..c63cfe2
--- /dev/null
+++ b/public/admin/css/bootstrap-switch.min.css
@@ -0,0 +1,22 @@
+/* ========================================================================
+ * bootstrap-switch - v3.3.2
+ * http://www.bootstrap-switch.org
+ * ========================================================================
+ * Copyright 2012-2013 Mattia Larentis
+ *
+ * ========================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================================
+ */
+
+.bootstrap-switch{display:inline-block;direction:ltr;cursor:pointer;border-radius:4px;border:1px solid #ccc;position:relative;text-align:left;overflow:hidden;line-height:8px;z-index:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.bootstrap-switch .bootstrap-switch-container{display:inline-block;top:0;border-radius:4px;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.bootstrap-switch .bootstrap-switch-handle-off,.bootstrap-switch .bootstrap-switch-handle-on,.bootstrap-switch .bootstrap-switch-label{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;cursor:pointer;display:inline-block!important;height:100%;padding:6px 12px;font-size:14px;line-height:20px}.bootstrap-switch .bootstrap-switch-handle-off,.bootstrap-switch .bootstrap-switch-handle-on{text-align:center;z-index:1}.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary,.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary{color:#fff;background:#337ab7}.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info,.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info{color:#fff;background:#5bc0de}.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success,.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success{color:#fff;background:#5cb85c}.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning,.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning{background:#f0ad4e;color:#fff}.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger,.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger{color:#fff;background:#d9534f}.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default,.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default{color:#000;background:#eee}.bootstrap-switch .bootstrap-switch-label{text-align:center;margin-top:-1px;margin-bottom:-1px;z-index:100;color:#333;background:#fff}.bootstrap-switch .bootstrap-switch-handle-on{border-bottom-left-radius:3px;border-top-left-radius:3px}.bootstrap-switch .bootstrap-switch-handle-off{border-bottom-right-radius:3px;border-top-right-radius:3px}.bootstrap-switch input[type=radio],.bootstrap-switch input[type=checkbox]{position:absolute!important;top:0;left:0;margin:0;z-index:-1;opacity:0;filter:alpha(opacity=0)}.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-label{padding:1px 5px;font-size:12px;line-height:1.5}.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-label{padding:5px 10px;font-size:12px;line-height:1.5}.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-label{padding:6px 16px;font-size:18px;line-height:1.3333333}.bootstrap-switch.bootstrap-switch-disabled,.bootstrap-switch.bootstrap-switch-indeterminate,.bootstrap-switch.bootstrap-switch-readonly{cursor:default!important}.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-label,.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-label,.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-label{opacity:.5;filter:alpha(opacity=50);cursor:default!important}.bootstrap-switch.bootstrap-switch-animate .bootstrap-switch-container{-webkit-transition:margin-left .5s;-o-transition:margin-left .5s;transition:margin-left .5s}.bootstrap-switch.bootstrap-switch-inverse .bootstrap-switch-handle-on{border-radius:0 3px 3px 0}.bootstrap-switch.bootstrap-switch-inverse .bootstrap-switch-handle-off{border-radius:3px 0 0 3px}.bootstrap-switch.bootstrap-switch-focused{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.bootstrap-switch.bootstrap-switch-inverse.bootstrap-switch-off .bootstrap-switch-label,.bootstrap-switch.bootstrap-switch-on .bootstrap-switch-label{border-bottom-right-radius:3px;border-top-right-radius:3px}.bootstrap-switch.bootstrap-switch-inverse.bootstrap-switch-on .bootstrap-switch-label,.bootstrap-switch.bootstrap-switch-off .bootstrap-switch-label{border-bottom-left-radius:3px;border-top-left-radius:3px}
\ No newline at end of file
diff --git a/public/admin/css/bootstrap/fonts/glyphicons-halflings-regular.eot b/public/admin/css/fonts/glyphicons-halflings-regular.eot
similarity index 100%
rename from public/admin/css/bootstrap/fonts/glyphicons-halflings-regular.eot
rename to public/admin/css/fonts/glyphicons-halflings-regular.eot
diff --git a/public/admin/css/bootstrap/fonts/glyphicons-halflings-regular.svg b/public/admin/css/fonts/glyphicons-halflings-regular.svg
similarity index 100%
rename from public/admin/css/bootstrap/fonts/glyphicons-halflings-regular.svg
rename to public/admin/css/fonts/glyphicons-halflings-regular.svg
diff --git a/public/admin/css/bootstrap/fonts/glyphicons-halflings-regular.ttf b/public/admin/css/fonts/glyphicons-halflings-regular.ttf
similarity index 100%
rename from public/admin/css/bootstrap/fonts/glyphicons-halflings-regular.ttf
rename to public/admin/css/fonts/glyphicons-halflings-regular.ttf
diff --git a/public/admin/css/bootstrap/fonts/glyphicons-halflings-regular.woff b/public/admin/css/fonts/glyphicons-halflings-regular.woff
similarity index 100%
rename from public/admin/css/bootstrap/fonts/glyphicons-halflings-regular.woff
rename to public/admin/css/fonts/glyphicons-halflings-regular.woff
diff --git a/public/admin/css/bootstrap/fonts/glyphicons-halflings-regular.woff2 b/public/admin/css/fonts/glyphicons-halflings-regular.woff2
similarity index 100%
rename from public/admin/css/bootstrap/fonts/glyphicons-halflings-regular.woff2
rename to public/admin/css/fonts/glyphicons-halflings-regular.woff2
diff --git a/public/admin/css/titatoggle-dist-min.css b/public/admin/css/titatoggle-dist-min.css
new file mode 100644
index 0000000..b0acce6
--- /dev/null
+++ b/public/admin/css/titatoggle-dist-min.css
@@ -0,0 +1 @@
+@keyframes popIn{0%{transform:scale(1,1)}25%{transform:scale(1.2,1)}50%{transform:scale(1.4,1)}100%{transform:scale(1,1)}}@keyframes popOut{0%{transform:scale(1,1)}25%{transform:scale(1.2,1)}50%{transform:scale(1.4,1)}100%{transform:scale(1,1)}}@keyframes splashIn{0%{transform:scale(1);opacity:1}25%{transform:scale(1.1);opacity:.8}50%{transform:scale(1.1);opacity:.9}100%{transform:scale(1);opacity:1}}@keyframes splashOut{0%{transform:scale(1);opacity:1}25%{transform:scale(1);opacity:.8}50%{transform:scale(1);opacity:.9}100%{transform:scale(0.5);opacity:1}}.checkbox-toggle{position:relative}.checkbox-toggle input{display:block;position:absolute;top:0;right:0;bottom:0;left:0;width:0;height:0;margin:0 0;cursor:pointer;zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;filter:alpha(opacity=0)}.checkbox-toggle input+span{cursor:pointer;user-select:none}.checkbox-toggle input+span:before{position:absolute;left:0;display:inline-block}.checkbox-toggle input+span>h4{display:inline}.checkbox-slider{position:relative}.checkbox-slider input{display:block;position:absolute;top:0;right:0;bottom:0;left:0;width:0;height:0;margin:0 0;cursor:pointer;zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;filter:alpha(opacity=0)}.checkbox-slider input+span{cursor:pointer;user-select:none}.checkbox-slider input+span:before{position:absolute;left:0;display:inline-block}.checkbox-slider input+span>h4{display:inline}.checkbox-slider input+span{padding-left:40px}.checkbox-slider input+span:before{content:"";height:20px;width:40px;background:rgba(100,100,100,.2);box-shadow:inset 0 0 5px rgba(0,0,0,.8);transition:background .2s ease-out}.checkbox-slider input+span:after{width:20px;height:20px;position:absolute;left:0;top:0;display:block;background:#fff;transition:margin-left .1s ease-in-out;text-align:center;font-weight:700;content:""}.checkbox-slider input:checked+span:after{margin-left:20px;content:""}.checkbox-slider input:checked+span:before{transition:background .2s ease-in}.checkbox-slider--default{position:relative}.checkbox-slider--default input{display:block;position:absolute;top:0;right:0;bottom:0;left:0;width:0;height:0;margin:0 0;cursor:pointer;zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;filter:alpha(opacity=0)}.checkbox-slider--default input+span{cursor:pointer;user-select:none}.checkbox-slider--default input+span:before{position:absolute;left:0;display:inline-block}.checkbox-slider--default input+span>h4{display:inline}.checkbox-slider--default input+span{padding-left:40px}.checkbox-slider--default input+span:before{content:"";height:20px;width:40px;background:rgba(100,100,100,.2);box-shadow:inset 0 0 5px rgba(0,0,0,.8);transition:background .2s ease-out}.checkbox-slider--default input+span:after{width:20px;height:20px;position:absolute;left:0;top:0;display:block;background:#fff;transition:margin-left .1s ease-in-out;text-align:center;font-weight:700;content:""}.checkbox-slider--default input:checked+span:after{margin-left:20px;content:""}.checkbox-slider--default input:checked+span:before{transition:background .2s ease-in}.checkbox-slider--default input+span:after{background:#fff;border:solid transparent 1px;background-clip:content-box}.checkbox-slider--default input:checked+span:after{background:#5cb85c;border:solid transparent 1px;background-clip:content-box}.checkbox-slider--a-rounded{position:relative}.checkbox-slider--a-rounded input{display:block;position:absolute;top:0;right:0;bottom:0;left:0;width:0;height:0;margin:0 0;cursor:pointer;zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;filter:alpha(opacity=0)}.checkbox-slider--a-rounded input+span{cursor:pointer;user-select:none}.checkbox-slider--a-rounded input+span:before{position:absolute;left:0;display:inline-block}.checkbox-slider--a-rounded input+span>h4{display:inline}.checkbox-slider--a-rounded input+span{padding-left:40px}.checkbox-slider--a-rounded input+span:before{content:"";height:20px;width:40px;background:rgba(100,100,100,.2);box-shadow:inset 0 0 5px rgba(0,0,0,.8);transition:background .2s ease-out}.checkbox-slider--a-rounded input+span:after{width:20px;height:20px;position:absolute;left:0;top:0;display:block;background:#fff;transition:margin-left .1s ease-in-out;text-align:center;font-weight:700;content:""}.checkbox-slider--a-rounded input:checked+span:after{margin-left:20px;content:""}.checkbox-slider--a-rounded input:checked+span:before{transition:background .2s ease-in}.checkbox-slider--a-rounded input+span:after{background:#fff;border:solid transparent 1px;background-clip:content-box}.checkbox-slider--a-rounded input:checked+span:after{background:#5cb85c;border:solid transparent 1px;background-clip:content-box}.checkbox-slider--a-rounded input+span:after,.checkbox-slider--a-rounded input+span:before{border-radius:4px}.checkbox-slider--a-rounded input+span:after,.checkbox-slider--a-rounded input:checked+span:after{border:solid transparent 2px;background-clip:content-box}.checkbox-slider--a-rounded.checkbox-slider-sm input+span:before,.checkbox-slider--a-rounded.checkbox-slider-sm input+span:after{border-radius:3px}.checkbox-slider--a-rounded.checkbox-slider-md input+span:before,.checkbox-slider--a-rounded.checkbox-slider-md input+span:after{border-radius:4px}.checkbox-slider--a-rounded.checkbox-slider-lg input+span:before,.checkbox-slider--a-rounded.checkbox-slider-lg input+span:after{border-radius:6px}.checkbox-slider--a{position:relative}.checkbox-slider--a input{display:block;position:absolute;top:0;right:0;bottom:0;left:0;width:0;height:0;margin:0 0;cursor:pointer;zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;filter:alpha(opacity=0)}.checkbox-slider--a input+span{cursor:pointer;user-select:none}.checkbox-slider--a input+span:before{position:absolute;left:0;display:inline-block}.checkbox-slider--a input+span>h4{display:inline}.checkbox-slider--a input+span{padding-left:40px}.checkbox-slider--a input+span:before{content:"";height:20px;width:40px;background:rgba(100,100,100,.2);box-shadow:inset 0 0 5px rgba(0,0,0,.8);transition:background .2s ease-out}.checkbox-slider--a input+span:after{width:20px;height:20px;position:absolute;left:0;top:0;display:block;background:#fff;transition:margin-left .1s ease-in-out;text-align:center;font-weight:700;content:""}.checkbox-slider--a input:checked+span:after{margin-left:20px;content:""}.checkbox-slider--a input:checked+span:before{transition:background .2s ease-in}.checkbox-slider--a input+span{padding-left:60px}.checkbox-slider--a input+span:before{content:"";width:60px}.checkbox-slider--a input+span:after{width:40px;font-size:10px;color:#000;content:"Off";border:solid transparent 1px;background-clip:content-box}.checkbox-slider--a input:checked+span:after{content:"On";color:#fff;background:#5cb85c;border:solid transparent 1px;background-clip:content-box}.checkbox-slider--a.checkbox-slider-sm input+span{padding-left:30px}.checkbox-slider--a.checkbox-slider-sm input+span:before{width:30px}.checkbox-slider--a.checkbox-slider-sm input+span:after{width:20px;font-size:5px}.checkbox-slider--a.checkbox-slider-sm input:checked+span:after{margin-left:10px}.checkbox-slider--a.checkbox-slider-md input+span{padding-left:90px}.checkbox-slider--a.checkbox-slider-md input+span:before{width:90px}.checkbox-slider--a.checkbox-slider-md input+span:after{width:60px;font-size:15px}.checkbox-slider--a.checkbox-slider-md input:checked+span:after{margin-left:30px}.checkbox-slider--a.checkbox-slider-lg input+span{padding-left:120px}.checkbox-slider--a.checkbox-slider-lg input+span:before{width:120px}.checkbox-slider--a.checkbox-slider-lg input+span:after{width:80px;font-size:20px}.checkbox-slider--a.checkbox-slider-lg input:checked+span:after{margin-left:40px}.checkbox-slider--b{position:relative}.checkbox-slider--b input{display:block;position:absolute;top:0;right:0;bottom:0;left:0;width:0;height:0;margin:0 0;cursor:pointer;zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;filter:alpha(opacity=0)}.checkbox-slider--b input+span{cursor:pointer;user-select:none}.checkbox-slider--b input+span:before{position:absolute;left:0;display:inline-block}.checkbox-slider--b input+span>h4{display:inline}.checkbox-slider--b input+span{padding-left:40px}.checkbox-slider--b input+span:before{content:"";height:20px;width:40px;background:rgba(100,100,100,.2);box-shadow:inset 0 0 5px rgba(0,0,0,.8);transition:background .2s ease-out}.checkbox-slider--b input+span:after{width:20px;height:20px;position:absolute;left:0;top:0;display:block;background:#fff;transition:margin-left .1s ease-in-out;text-align:center;font-weight:700;content:""}.checkbox-slider--b input:checked+span:after{margin-left:20px;content:""}.checkbox-slider--b input:checked+span:before{transition:background .2s ease-in}.checkbox-slider--b input+span{padding-left:40px}.checkbox-slider--b input+span:before{border-radius:20px;width:40px}.checkbox-slider--b input+span:after{background:#fff;content:"";width:20px;border:solid transparent 2px;background-clip:padding-box;border-radius:20px}.checkbox-slider--b input:not(:checked)+span:after{animation:popOut ease-in .3s normal}.checkbox-slider--b input:checked+span:after{content:"";margin-left:20px;border:solid transparent 2px;background-clip:padding-box;animation:popIn ease-in .3s normal}.checkbox-slider--b input:checked+span:before{background:#5cb85c}.checkbox-slider--b.checkbox-slider-md input+span:before{border-radius:30px}.checkbox-slider--b.checkbox-slider-md input+span:after{border-radius:30px}.checkbox-slider--b.checkbox-slider-lg input+span:before{border-radius:40px}.checkbox-slider--b.checkbox-slider-lg input+span:after{border-radius:40px}.checkbox-slider--b-flat{position:relative}.checkbox-slider--b-flat input{display:block;position:absolute;top:0;right:0;bottom:0;left:0;width:0;height:0;margin:0 0;cursor:pointer;zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;filter:alpha(opacity=0)}.checkbox-slider--b-flat input+span{cursor:pointer;user-select:none}.checkbox-slider--b-flat input+span:before{position:absolute;left:0;display:inline-block}.checkbox-slider--b-flat input+span>h4{display:inline}.checkbox-slider--b-flat input+span{padding-left:40px}.checkbox-slider--b-flat input+span:before{content:"";height:20px;width:40px;background:rgba(100,100,100,.2);box-shadow:inset 0 0 5px rgba(0,0,0,.8);transition:background .2s ease-out}.checkbox-slider--b-flat input+span:after{width:20px;height:20px;position:absolute;left:0;top:0;display:block;background:#fff;transition:margin-left .1s ease-in-out;text-align:center;font-weight:700;content:""}.checkbox-slider--b-flat input:checked+span:after{margin-left:20px;content:""}.checkbox-slider--b-flat input:checked+span:before{transition:background .2s ease-in}.checkbox-slider--b-flat input+span{padding-left:40px}.checkbox-slider--b-flat input+span:before{border-radius:20px;width:40px}.checkbox-slider--b-flat input+span:after{background:#fff;content:"";width:20px;border:solid transparent 2px;background-clip:padding-box;border-radius:20px}.checkbox-slider--b-flat input:not(:checked)+span:after{animation:popOut ease-in .3s normal}.checkbox-slider--b-flat input:checked+span:after{content:"";margin-left:20px;border:solid transparent 2px;background-clip:padding-box;animation:popIn ease-in .3s normal}.checkbox-slider--b-flat input:checked+span:before{background:#5cb85c}.checkbox-slider--b-flat.checkbox-slider-md input+span:before{border-radius:30px}.checkbox-slider--b-flat.checkbox-slider-md input+span:after{border-radius:30px}.checkbox-slider--b-flat.checkbox-slider-lg input+span:before{border-radius:40px}.checkbox-slider--b-flat.checkbox-slider-lg input+span:after{border-radius:40px}.checkbox-slider--b-flat input+span:before{box-shadow:none}.checkbox-slider--c{position:relative}.checkbox-slider--c input{display:block;position:absolute;top:0;right:0;bottom:0;left:0;width:0;height:0;margin:0 0;cursor:pointer;zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;filter:alpha(opacity=0)}.checkbox-slider--c input+span{cursor:pointer;user-select:none}.checkbox-slider--c input+span:before{position:absolute;left:0;display:inline-block}.checkbox-slider--c input+span>h4{display:inline}.checkbox-slider--c input+span{padding-left:40px}.checkbox-slider--c input+span:before{content:"";height:20px;width:40px;background:rgba(100,100,100,.2);box-shadow:inset 0 0 5px rgba(0,0,0,.8);transition:background .2s ease-out}.checkbox-slider--c input+span:after{width:20px;height:20px;position:absolute;left:0;top:0;display:block;background:#fff;transition:margin-left .1s ease-in-out;text-align:center;font-weight:700;content:""}.checkbox-slider--c input:checked+span:after{margin-left:20px;content:""}.checkbox-slider--c input:checked+span:before{transition:background .2s ease-in}.checkbox-slider--c input+span{padding-left:40px}.checkbox-slider--c input+span:before{height:2px!important;top:10px;box-shadow:none;width:40px;background:#555}.checkbox-slider--c input+span:after{box-shadow:none;width:20px;border:solid #555 2px;border-radius:20px}.checkbox-slider--c input:checked+span:after{background:#5cb85c;margin-left:20px;border:solid #5cb85c 2px;animation:splashIn ease-in .3s normal}.checkbox-slider--c input:checked+span:before{background:#5cb85c}.checkbox-slider--c.checkbox-slider-sm input+span:before{top:4px}.checkbox-slider--c.checkbox-slider-md input+span:before{top:14px}.checkbox-slider--c.checkbox-slider-md input+span:after{width:30px;border-radius:30px}.checkbox-slider--c.checkbox-slider-lg input+span:before{top:19px}.checkbox-slider--c.checkbox-slider-lg input+span:after{width:40px;border-radius:40px}.checkbox-slider--c-weight{position:relative}.checkbox-slider--c-weight input{display:block;position:absolute;top:0;right:0;bottom:0;left:0;width:0;height:0;margin:0 0;cursor:pointer;zoom:1;-webkit-opacity:0;-moz-opacity:0;opacity:0;filter:alpha(opacity=0)}.checkbox-slider--c-weight input+span{cursor:pointer;user-select:none}.checkbox-slider--c-weight input+span:before{position:absolute;left:0;display:inline-block}.checkbox-slider--c-weight input+span>h4{display:inline}.checkbox-slider--c-weight input+span{padding-left:40px}.checkbox-slider--c-weight input+span:before{content:"";height:20px;width:40px;background:rgba(100,100,100,.2);box-shadow:inset 0 0 5px rgba(0,0,0,.8);transition:background .2s ease-out}.checkbox-slider--c-weight input+span:after{width:20px;height:20px;position:absolute;left:0;top:0;display:block;background:#fff;transition:margin-left .1s ease-in-out;text-align:center;font-weight:700;content:""}.checkbox-slider--c-weight input:checked+span:after{margin-left:20px;content:""}.checkbox-slider--c-weight input:checked+span:before{transition:background .2s ease-in}.checkbox-slider--c-weight input+span{padding-left:40px}.checkbox-slider--c-weight input+span:before{height:2px!important;top:10px;box-shadow:none;width:40px;background:#555}.checkbox-slider--c-weight input+span:after{box-shadow:none;width:20px;border:solid #555 2px;border-radius:20px}.checkbox-slider--c-weight input:checked+span:after{background:#5cb85c;margin-left:20px;border:solid #5cb85c 2px;animation:splashIn ease-in .3s normal}.checkbox-slider--c-weight input:checked+span:before{background:#5cb85c}.checkbox-slider--c-weight.checkbox-slider-sm input+span:before{top:4px}.checkbox-slider--c-weight.checkbox-slider-md input+span:before{top:14px}.checkbox-slider--c-weight.checkbox-slider-md input+span:after{width:30px;border-radius:30px}.checkbox-slider--c-weight.checkbox-slider-lg input+span:before{top:19px}.checkbox-slider--c-weight.checkbox-slider-lg input+span:after{width:40px;border-radius:40px}.checkbox-slider--c-weight input+span:before{height:1px!important}.checkbox-slider--c-weight input:checked+span:before{height:2px!important}.checkbox-slider--c-weight input:not(:checked)+span:after{transform:scale(0.7);left:-6px}.checkbox-slider--default input:disabled+span:after{background:#777}.checkbox-slider--default input:disabled+span:before{box-shadow:0 0 0 #000}.checkbox-slider--default input:disabled+span{color:#777}.checkbox-slider--a input:disabled+span:after{background:#777;color:#fff}.checkbox-slider--a input:disabled+span:before{box-shadow:0 0 0 #000}.checkbox-slider--a input:disabled+span{color:#777}.checkbox-slider--b input:disabled+span:after{border:solid transparent 2px;border-radius:40px}.checkbox-slider--b input:disabled+span:before{box-shadow:0 0 0 #000}.checkbox-slider--b input:disabled+span{color:#777}.checkbox-slider--c input:disabled:checked+span:after{background:#777}.checkbox-slider--c input:disabled+span:after{border-color:#777}.checkbox-slider--c input:disabled+span:before{background:#777}.checkbox-slider--c input:disabled+span{color:#777}input:checked+.indicator-success{color:#5cb85c}input:checked+.indicator-info{color:#5bc0de}input:checked+.indicator-warning{color:#f0ad4e}input:checked+.indicator-danger{color:#d9534f}.checkbox-slider-sm{line-height:10px}.checkbox-slider-sm input+span{padding-left:20px}.checkbox-slider-sm input+span:before{width:20px}.checkbox-slider-sm input+span:after,.checkbox-slider-sm input+span:before{height:10px;line-height:10px}.checkbox-slider-sm input+span:after{width:10px;vertical-align:middle}.checkbox-slider-sm input:checked+span:after{margin-left:10px}.checkbox-slider-md{line-height:30px}.checkbox-slider-md input+span{padding-left:60px}.checkbox-slider-md input+span:before{width:60px}.checkbox-slider-md input+span:after,.checkbox-slider-md input+span:before{height:30px;line-height:30px}.checkbox-slider-md input+span:after{width:30px;vertical-align:middle}.checkbox-slider-md input:checked+span:after{margin-left:30px}.checkbox-slider-lg{line-height:40px}.checkbox-slider-lg input+span{padding-left:80px}.checkbox-slider-lg input+span:before{width:80px}.checkbox-slider-lg input+span:after,.checkbox-slider-lg input+span:before{height:40px;line-height:40px}.checkbox-slider-lg input+span:after{width:40px;vertical-align:middle}.checkbox-slider-lg input:checked+span:after{margin-left:40px}.checkbox-slider-info.checkbox-slider--default input:checked+span:after,.checkbox-slider-info.checkbox-slider--a input:checked+span:after,.checkbox-slider-info.checkbox-slider--c input:checked+span:after,.checkbox-slider-info.checkbox-slider--c-weight input:checked+span:after{background:#5bc0de;background-clip:content-box}.checkbox-slider-info.checkbox-slider--c input:checked+span:after,.checkbox-slider-info.checkbox-slider--c-weight input:checked+span:after{border-color:#5bc0de}.checkbox-slider-info.checkbox-slider--b input:checked+span:before,.checkbox-slider-info.checkbox-slider--b-flat input:checked+span:before,.checkbox-slider-info.checkbox-slider--c input:checked+span:before,.checkbox-slider-info.checkbox-slider--c-weight input:checked+span:before{background:#5bc0de}.checkbox-slider-warning.checkbox-slider--default input:checked+span:after,.checkbox-slider-warning.checkbox-slider--a input:checked+span:after,.checkbox-slider-warning.checkbox-slider--c input:checked+span:after,.checkbox-slider-warning.checkbox-slider--c-weight input:checked+span:after{background:#f0ad4e;background-clip:content-box}.checkbox-slider-warning.checkbox-slider--c input:checked+span:after,.checkbox-slider-warning.checkbox-slider--c-weight input:checked+span:after{border-color:#f0ad4e}.checkbox-slider-warning.checkbox-slider--b input:checked+span:before,.checkbox-slider-warning.checkbox-slider--b-flat input:checked+span:before,.checkbox-slider-warning.checkbox-slider--c input:checked+span:before,.checkbox-slider-warning.checkbox-slider--c-weight input:checked+span:before{background:#f0ad4e}.checkbox-slider-danger.checkbox-slider--default input:checked+span:after,.checkbox-slider-danger.checkbox-slider--a input:checked+span:after,.checkbox-slider-danger.checkbox-slider--c input:checked+span:after,.checkbox-slider-danger.checkbox-slider--c-weight input:checked+span:after{background:#d9534f;background-clip:content-box}.checkbox-slider-danger.checkbox-slider--c input:checked+span:after,.checkbox-slider-danger.checkbox-slider--c-weight input:checked+span:after{border-color:#d9534f}.checkbox-slider-danger.checkbox-slider--b input:checked+span:before,.checkbox-slider-danger.checkbox-slider--b-flat input:checked+span:before,.checkbox-slider-danger.checkbox-slider--c input:checked+span:before,.checkbox-slider-danger.checkbox-slider--c-weight input:checked+span:before{background:#d9534f}
\ No newline at end of file
diff --git a/public/admin/css/titatoggle-dist.css b/public/admin/css/titatoggle-dist.css
new file mode 100644
index 0000000..800944c
--- /dev/null
+++ b/public/admin/css/titatoggle-dist.css
@@ -0,0 +1,1233 @@
+/*******************************************************
+Variables
+*******************************************************/
+/*******************************************************
+Animation
+*******************************************************/
+@-webkit-keyframes popIn {
+ 0% {
+ -webkit-transform: scale(1, 1);
+ transform: scale(1, 1);
+ }
+ 25% {
+ -webkit-transform: scale(1.2, 1);
+ transform: scale(1.2, 1);
+ }
+ 50% {
+ -webkit-transform: scale(1.4, 1);
+ transform: scale(1.4, 1);
+ }
+ 100% {
+ -webkit-transform: scale(1, 1);
+ transform: scale(1, 1);
+ }
+}
+@keyframes popIn {
+ 0% {
+ -webkit-transform: scale(1, 1);
+ transform: scale(1, 1);
+ }
+ 25% {
+ -webkit-transform: scale(1.2, 1);
+ transform: scale(1.2, 1);
+ }
+ 50% {
+ -webkit-transform: scale(1.4, 1);
+ transform: scale(1.4, 1);
+ }
+ 100% {
+ -webkit-transform: scale(1, 1);
+ transform: scale(1, 1);
+ }
+}
+@-webkit-keyframes popOut {
+ 0% {
+ -webkit-transform: scale(1, 1);
+ transform: scale(1, 1);
+ }
+ 25% {
+ -webkit-transform: scale(1.2, 1);
+ transform: scale(1.2, 1);
+ }
+ 50% {
+ -webkit-transform: scale(1.4, 1);
+ transform: scale(1.4, 1);
+ }
+ 100% {
+ -webkit-transform: scale(1, 1);
+ transform: scale(1, 1);
+ }
+}
+@keyframes popOut {
+ 0% {
+ -webkit-transform: scale(1, 1);
+ transform: scale(1, 1);
+ }
+ 25% {
+ -webkit-transform: scale(1.2, 1);
+ transform: scale(1.2, 1);
+ }
+ 50% {
+ -webkit-transform: scale(1.4, 1);
+ transform: scale(1.4, 1);
+ }
+ 100% {
+ -webkit-transform: scale(1, 1);
+ transform: scale(1, 1);
+ }
+}
+@-webkit-keyframes splashIn {
+ 0% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ opacity: 1;
+ }
+ 25% {
+ -webkit-transform: scale(1.1);
+ transform: scale(1.1);
+ opacity: 0.8;
+ }
+ 50% {
+ -webkit-transform: scale(1.1);
+ transform: scale(1.1);
+ opacity: .9;
+ }
+ 100% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ opacity: 1;
+ }
+}
+@keyframes splashIn {
+ 0% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ opacity: 1;
+ }
+ 25% {
+ -webkit-transform: scale(1.1);
+ transform: scale(1.1);
+ opacity: 0.8;
+ }
+ 50% {
+ -webkit-transform: scale(1.1);
+ transform: scale(1.1);
+ opacity: .9;
+ }
+ 100% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ opacity: 1;
+ }
+}
+@-webkit-keyframes splashOut {
+ 0% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ opacity: 1;
+ }
+ 25% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ opacity: 0.8;
+ }
+ 50% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ opacity: .9;
+ }
+ 100% {
+ -webkit-transform: scale(0.5);
+ transform: scale(0.5);
+ opacity: 1;
+ }
+}
+@keyframes splashOut {
+ 0% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ opacity: 1;
+ }
+ 25% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ opacity: 0.8;
+ }
+ 50% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ opacity: .9;
+ }
+ 100% {
+ -webkit-transform: scale(0.5);
+ transform: scale(0.5);
+ opacity: 1;
+ }
+}
+/*******************************************************
+Main Slider basics
+*******************************************************/
+.checkbox-toggle {
+ position: relative;
+}
+.checkbox-toggle input {
+ display: block;
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ width: 0%;
+ height: 0%;
+ margin: 0 0;
+ cursor: pointer;
+ zoom: 1;
+ -webkit-opacity: 0;
+ -moz-opacity: 0;
+ opacity: 0;
+ filter: alpha(opacity=0);
+}
+.checkbox-toggle input + span {
+ cursor: pointer;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.checkbox-toggle input + span:before {
+ position: absolute;
+ left: 0px;
+ display: inline-block;
+}
+.checkbox-toggle input + span > h4 {
+ display: inline;
+}
+/*******************************************************
+Main Slider
+*******************************************************/
+.checkbox-slider {
+ position: relative;
+}
+.checkbox-slider input {
+ display: block;
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ width: 0%;
+ height: 0%;
+ margin: 0 0;
+ cursor: pointer;
+ zoom: 1;
+ -webkit-opacity: 0;
+ -moz-opacity: 0;
+ opacity: 0;
+ filter: alpha(opacity=0);
+}
+.checkbox-slider input + span {
+ cursor: pointer;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.checkbox-slider input + span:before {
+ position: absolute;
+ left: 0px;
+ display: inline-block;
+}
+.checkbox-slider input + span > h4 {
+ display: inline;
+}
+.checkbox-slider input + span {
+ padding-left: 40px;
+}
+.checkbox-slider input + span:before {
+ content: "";
+ height: 20px;
+ width: 40px;
+ background: rgba(100, 100, 100, 0.2);
+ box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.8);
+ transition: background 0.2s ease-out;
+}
+.checkbox-slider input + span:after {
+ width: 20px;
+ height: 20px;
+ position: absolute;
+ left: 0px;
+ top: 0;
+ display: block;
+ background: #ffffff;
+ transition: margin-left 0.1s ease-in-out;
+ text-align: center;
+ font-weight: bold;
+ content: "";
+}
+.checkbox-slider input:checked + span:after {
+ margin-left: 20px;
+ content: "";
+}
+.checkbox-slider input:checked + span:before {
+ transition: background 0.2s ease-in;
+}
+/*******************************************************
+Slider default
+*******************************************************/
+.checkbox-slider--default {
+ position: relative;
+}
+.checkbox-slider--default input {
+ display: block;
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ width: 0%;
+ height: 0%;
+ margin: 0 0;
+ cursor: pointer;
+ zoom: 1;
+ -webkit-opacity: 0;
+ -moz-opacity: 0;
+ opacity: 0;
+ filter: alpha(opacity=0);
+}
+.checkbox-slider--default input + span {
+ cursor: pointer;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.checkbox-slider--default input + span:before {
+ position: absolute;
+ left: 0px;
+ display: inline-block;
+}
+.checkbox-slider--default input + span > h4 {
+ display: inline;
+}
+.checkbox-slider--default input + span {
+ padding-left: 40px;
+}
+.checkbox-slider--default input + span:before {
+ content: "";
+ height: 20px;
+ width: 40px;
+ background: rgba(100, 100, 100, 0.2);
+ box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.8);
+ transition: background 0.2s ease-out;
+}
+.checkbox-slider--default input + span:after {
+ width: 20px;
+ height: 20px;
+ position: absolute;
+ left: 0px;
+ top: 0;
+ display: block;
+ background: #ffffff;
+ transition: margin-left 0.1s ease-in-out;
+ text-align: center;
+ font-weight: bold;
+ content: "";
+}
+.checkbox-slider--default input:checked + span:after {
+ margin-left: 20px;
+ content: "";
+}
+.checkbox-slider--default input:checked + span:before {
+ transition: background 0.2s ease-in;
+}
+.checkbox-slider--default input + span:after {
+ background: #ffffff;
+ border: solid transparent 1px;
+ background-clip: content-box;
+}
+.checkbox-slider--default input:checked + span:after {
+ background: #5cb85c;
+ border: solid transparent 1px;
+ background-clip: content-box;
+}
+/*******************************************************
+Slider default rounded
+*******************************************************/
+.checkbox-slider--a-rounded {
+ position: relative;
+}
+.checkbox-slider--a-rounded input {
+ display: block;
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ width: 0%;
+ height: 0%;
+ margin: 0 0;
+ cursor: pointer;
+ zoom: 1;
+ -webkit-opacity: 0;
+ -moz-opacity: 0;
+ opacity: 0;
+ filter: alpha(opacity=0);
+}
+.checkbox-slider--a-rounded input + span {
+ cursor: pointer;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.checkbox-slider--a-rounded input + span:before {
+ position: absolute;
+ left: 0px;
+ display: inline-block;
+}
+.checkbox-slider--a-rounded input + span > h4 {
+ display: inline;
+}
+.checkbox-slider--a-rounded input + span {
+ padding-left: 40px;
+}
+.checkbox-slider--a-rounded input + span:before {
+ content: "";
+ height: 20px;
+ width: 40px;
+ background: rgba(100, 100, 100, 0.2);
+ box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.8);
+ transition: background 0.2s ease-out;
+}
+.checkbox-slider--a-rounded input + span:after {
+ width: 20px;
+ height: 20px;
+ position: absolute;
+ left: 0px;
+ top: 0;
+ display: block;
+ background: #ffffff;
+ transition: margin-left 0.1s ease-in-out;
+ text-align: center;
+ font-weight: bold;
+ content: "";
+}
+.checkbox-slider--a-rounded input:checked + span:after {
+ margin-left: 20px;
+ content: "";
+}
+.checkbox-slider--a-rounded input:checked + span:before {
+ transition: background 0.2s ease-in;
+}
+.checkbox-slider--a-rounded input + span:after {
+ background: #ffffff;
+ border: solid transparent 1px;
+ background-clip: content-box;
+}
+.checkbox-slider--a-rounded input:checked + span:after {
+ background: #5cb85c;
+ border: solid transparent 1px;
+ background-clip: content-box;
+}
+.checkbox-slider--a-rounded input + span:after,
+.checkbox-slider--a-rounded input + span:before {
+ border-radius: 4px;
+}
+.checkbox-slider--a-rounded input + span:after,
+.checkbox-slider--a-rounded input:checked + span:after {
+ border: solid transparent 2px;
+ background-clip: content-box;
+}
+/*******************************************************
+Slider default rounded Sizes
+*******************************************************/
+.checkbox-slider--a-rounded.checkbox-slider-sm input + span:before,
+.checkbox-slider--a-rounded.checkbox-slider-sm input + span:after {
+ border-radius: 3px;
+}
+.checkbox-slider--a-rounded.checkbox-slider-md input + span:before,
+.checkbox-slider--a-rounded.checkbox-slider-md input + span:after {
+ border-radius: 4px;
+}
+.checkbox-slider--a-rounded.checkbox-slider-lg input + span:before,
+.checkbox-slider--a-rounded.checkbox-slider-lg input + span:after {
+ border-radius: 6px;
+}
+/*******************************************************
+Slider A
+*******************************************************/
+.checkbox-slider--a {
+ position: relative;
+}
+.checkbox-slider--a input {
+ display: block;
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ width: 0%;
+ height: 0%;
+ margin: 0 0;
+ cursor: pointer;
+ zoom: 1;
+ -webkit-opacity: 0;
+ -moz-opacity: 0;
+ opacity: 0;
+ filter: alpha(opacity=0);
+}
+.checkbox-slider--a input + span {
+ cursor: pointer;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.checkbox-slider--a input + span:before {
+ position: absolute;
+ left: 0px;
+ display: inline-block;
+}
+.checkbox-slider--a input + span > h4 {
+ display: inline;
+}
+.checkbox-slider--a input + span {
+ padding-left: 40px;
+}
+.checkbox-slider--a input + span:before {
+ content: "";
+ height: 20px;
+ width: 40px;
+ background: rgba(100, 100, 100, 0.2);
+ box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.8);
+ transition: background 0.2s ease-out;
+}
+.checkbox-slider--a input + span:after {
+ width: 20px;
+ height: 20px;
+ position: absolute;
+ left: 0px;
+ top: 0;
+ display: block;
+ background: #ffffff;
+ transition: margin-left 0.1s ease-in-out;
+ text-align: center;
+ font-weight: bold;
+ content: "";
+}
+.checkbox-slider--a input:checked + span:after {
+ margin-left: 20px;
+ content: "";
+}
+.checkbox-slider--a input:checked + span:before {
+ transition: background 0.2s ease-in;
+}
+.checkbox-slider--a input + span {
+ padding-left: 60px;
+}
+.checkbox-slider--a input + span:before {
+ content: "";
+ width: 60px;
+}
+.checkbox-slider--a input + span:after {
+ width: 40px;
+ font-size: 10px;
+ color: #000000;
+ content: "Off";
+ border: solid transparent 1px;
+ background-clip: content-box;
+}
+.checkbox-slider--a input:checked + span:after {
+ content: "On";
+ color: #ffffff;
+ background: #5cb85c;
+ border: solid transparent 1px;
+ background-clip: content-box;
+}
+/*******************************************************
+Slider A SIZES
+*******************************************************/
+.checkbox-slider--a.checkbox-slider-sm input + span {
+ padding-left: 30px;
+}
+.checkbox-slider--a.checkbox-slider-sm input + span:before {
+ width: 30px;
+}
+.checkbox-slider--a.checkbox-slider-sm input + span:after {
+ width: 20px;
+ font-size: 5px;
+}
+.checkbox-slider--a.checkbox-slider-sm input:checked + span:after {
+ margin-left: 10px;
+}
+.checkbox-slider--a.checkbox-slider-md input + span {
+ padding-left: 90px;
+}
+.checkbox-slider--a.checkbox-slider-md input + span:before {
+ width: 90px;
+}
+.checkbox-slider--a.checkbox-slider-md input + span:after {
+ width: 60px;
+ font-size: 15px;
+}
+.checkbox-slider--a.checkbox-slider-md input:checked + span:after {
+ margin-left: 30px;
+}
+.checkbox-slider--a.checkbox-slider-lg input + span {
+ padding-left: 120px;
+}
+.checkbox-slider--a.checkbox-slider-lg input + span:before {
+ width: 120px;
+}
+.checkbox-slider--a.checkbox-slider-lg input + span:after {
+ width: 80px;
+ font-size: 20px;
+}
+.checkbox-slider--a.checkbox-slider-lg input:checked + span:after {
+ margin-left: 40px;
+}
+/*******************************************************
+Slider B
+*******************************************************/
+.checkbox-slider--b {
+ position: relative;
+}
+.checkbox-slider--b input {
+ display: block;
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ width: 0%;
+ height: 0%;
+ margin: 0 0;
+ cursor: pointer;
+ zoom: 1;
+ -webkit-opacity: 0;
+ -moz-opacity: 0;
+ opacity: 0;
+ filter: alpha(opacity=0);
+}
+.checkbox-slider--b input + span {
+ cursor: pointer;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.checkbox-slider--b input + span:before {
+ position: absolute;
+ left: 0px;
+ display: inline-block;
+}
+.checkbox-slider--b input + span > h4 {
+ display: inline;
+}
+.checkbox-slider--b input + span {
+ padding-left: 40px;
+}
+.checkbox-slider--b input + span:before {
+ content: "";
+ height: 20px;
+ width: 40px;
+ background: rgba(100, 100, 100, 0.2);
+ box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.8);
+ transition: background 0.2s ease-out;
+}
+.checkbox-slider--b input + span:after {
+ width: 20px;
+ height: 20px;
+ position: absolute;
+ left: 0px;
+ top: 0;
+ display: block;
+ background: #ffffff;
+ transition: margin-left 0.1s ease-in-out;
+ text-align: center;
+ font-weight: bold;
+ content: "";
+}
+.checkbox-slider--b input:checked + span:after {
+ margin-left: 20px;
+ content: "";
+}
+.checkbox-slider--b input:checked + span:before {
+ transition: background 0.2s ease-in;
+}
+.checkbox-slider--b input + span {
+ padding-left: 40px;
+}
+.checkbox-slider--b input + span:before {
+ border-radius: 20px;
+ width: 40px;
+}
+.checkbox-slider--b input + span:after {
+ background: #ffffff;
+ content: "";
+ width: 20px;
+ border: solid transparent 2px;
+ background-clip: padding-box;
+ border-radius: 20px;
+}
+.checkbox-slider--b input:not(:checked) + span:after {
+ -webkit-animation: popOut ease-in 0.3s normal;
+ animation: popOut ease-in 0.3s normal;
+}
+.checkbox-slider--b input:checked + span:after {
+ content: "";
+ margin-left: 20px;
+ border: solid transparent 2px;
+ background-clip: padding-box;
+ -webkit-animation: popIn ease-in 0.3s normal;
+ animation: popIn ease-in 0.3s normal;
+}
+.checkbox-slider--b input:checked + span:before {
+ background: #5cb85c;
+}
+/*******************************************************
+Slider B Sizes
+*******************************************************/
+.checkbox-slider--b.checkbox-slider-md input + span:before {
+ border-radius: 30px;
+}
+.checkbox-slider--b.checkbox-slider-md input + span:after {
+ border-radius: 30px;
+}
+.checkbox-slider--b.checkbox-slider-lg input + span:before {
+ border-radius: 40px;
+}
+.checkbox-slider--b.checkbox-slider-lg input + span:after {
+ border-radius: 40px;
+}
+/*******************************************************
+Slider B-flat
+*******************************************************/
+.checkbox-slider--b-flat {
+ position: relative;
+}
+.checkbox-slider--b-flat input {
+ display: block;
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ width: 0%;
+ height: 0%;
+ margin: 0 0;
+ cursor: pointer;
+ zoom: 1;
+ -webkit-opacity: 0;
+ -moz-opacity: 0;
+ opacity: 0;
+ filter: alpha(opacity=0);
+}
+.checkbox-slider--b-flat input + span {
+ cursor: pointer;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.checkbox-slider--b-flat input + span:before {
+ position: absolute;
+ left: 0px;
+ display: inline-block;
+}
+.checkbox-slider--b-flat input + span > h4 {
+ display: inline;
+}
+.checkbox-slider--b-flat input + span {
+ padding-left: 40px;
+}
+.checkbox-slider--b-flat input + span:before {
+ content: "";
+ height: 20px;
+ width: 40px;
+ background: rgba(100, 100, 100, 0.2);
+ box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.8);
+ transition: background 0.2s ease-out;
+}
+.checkbox-slider--b-flat input + span:after {
+ width: 20px;
+ height: 20px;
+ position: absolute;
+ left: 0px;
+ top: 0;
+ display: block;
+ background: #ffffff;
+ transition: margin-left 0.1s ease-in-out;
+ text-align: center;
+ font-weight: bold;
+ content: "";
+}
+.checkbox-slider--b-flat input:checked + span:after {
+ margin-left: 20px;
+ content: "";
+}
+.checkbox-slider--b-flat input:checked + span:before {
+ transition: background 0.2s ease-in;
+}
+.checkbox-slider--b-flat input + span {
+ padding-left: 40px;
+}
+.checkbox-slider--b-flat input + span:before {
+ border-radius: 20px;
+ width: 40px;
+}
+.checkbox-slider--b-flat input + span:after {
+ background: #ffffff;
+ content: "";
+ width: 20px;
+ border: solid transparent 2px;
+ background-clip: padding-box;
+ border-radius: 20px;
+}
+.checkbox-slider--b-flat input:not(:checked) + span:after {
+ -webkit-animation: popOut ease-in 0.3s normal;
+ animation: popOut ease-in 0.3s normal;
+}
+.checkbox-slider--b-flat input:checked + span:after {
+ content: "";
+ margin-left: 20px;
+ border: solid transparent 2px;
+ background-clip: padding-box;
+ -webkit-animation: popIn ease-in 0.3s normal;
+ animation: popIn ease-in 0.3s normal;
+}
+.checkbox-slider--b-flat input:checked + span:before {
+ background: #5cb85c;
+}
+.checkbox-slider--b-flat.checkbox-slider-md input + span:before {
+ border-radius: 30px;
+}
+.checkbox-slider--b-flat.checkbox-slider-md input + span:after {
+ border-radius: 30px;
+}
+.checkbox-slider--b-flat.checkbox-slider-lg input + span:before {
+ border-radius: 40px;
+}
+.checkbox-slider--b-flat.checkbox-slider-lg input + span:after {
+ border-radius: 40px;
+}
+.checkbox-slider--b-flat input + span:before {
+ box-shadow: none;
+}
+/*******************************************************
+Slider C
+*******************************************************/
+.checkbox-slider--c {
+ position: relative;
+}
+.checkbox-slider--c input {
+ display: block;
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ width: 0%;
+ height: 0%;
+ margin: 0 0;
+ cursor: pointer;
+ zoom: 1;
+ -webkit-opacity: 0;
+ -moz-opacity: 0;
+ opacity: 0;
+ filter: alpha(opacity=0);
+}
+.checkbox-slider--c input + span {
+ cursor: pointer;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.checkbox-slider--c input + span:before {
+ position: absolute;
+ left: 0px;
+ display: inline-block;
+}
+.checkbox-slider--c input + span > h4 {
+ display: inline;
+}
+.checkbox-slider--c input + span {
+ padding-left: 40px;
+}
+.checkbox-slider--c input + span:before {
+ content: "";
+ height: 20px;
+ width: 40px;
+ background: rgba(100, 100, 100, 0.2);
+ box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.8);
+ transition: background 0.2s ease-out;
+}
+.checkbox-slider--c input + span:after {
+ width: 20px;
+ height: 20px;
+ position: absolute;
+ left: 0px;
+ top: 0;
+ display: block;
+ background: #ffffff;
+ transition: margin-left 0.1s ease-in-out;
+ text-align: center;
+ font-weight: bold;
+ content: "";
+}
+.checkbox-slider--c input:checked + span:after {
+ margin-left: 20px;
+ content: "";
+}
+.checkbox-slider--c input:checked + span:before {
+ transition: background 0.2s ease-in;
+}
+.checkbox-slider--c input + span {
+ padding-left: 40px;
+}
+.checkbox-slider--c input + span:before {
+ height: 2px !important;
+ top: 10px;
+ box-shadow: none;
+ width: 40px;
+ background: #555555;
+}
+.checkbox-slider--c input + span:after {
+ box-shadow: none;
+ width: 20px;
+ border: solid #555555 2px;
+ border-radius: 20px;
+}
+.checkbox-slider--c input:checked + span:after {
+ background: #5cb85c;
+ margin-left: 20px;
+ border: solid #5cb85c 2px;
+ -webkit-animation: splashIn ease-in 0.3s normal;
+ animation: splashIn ease-in 0.3s normal;
+}
+.checkbox-slider--c input:checked + span:before {
+ background: #5cb85c;
+}
+/*******************************************************
+Slider C Sizes
+*******************************************************/
+.checkbox-slider--c.checkbox-slider-sm input + span:before {
+ top: 4px;
+}
+.checkbox-slider--c.checkbox-slider-md input + span:before {
+ top: 14px;
+}
+.checkbox-slider--c.checkbox-slider-md input + span:after {
+ width: 30px;
+ border-radius: 30px;
+}
+.checkbox-slider--c.checkbox-slider-lg input + span:before {
+ top: 19px;
+}
+.checkbox-slider--c.checkbox-slider-lg input + span:after {
+ width: 40px;
+ border-radius: 40px;
+}
+/*******************************************************
+Slider C-weight
+*******************************************************/
+.checkbox-slider--c-weight {
+ position: relative;
+}
+.checkbox-slider--c-weight input {
+ display: block;
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ width: 0%;
+ height: 0%;
+ margin: 0 0;
+ cursor: pointer;
+ zoom: 1;
+ -webkit-opacity: 0;
+ -moz-opacity: 0;
+ opacity: 0;
+ filter: alpha(opacity=0);
+}
+.checkbox-slider--c-weight input + span {
+ cursor: pointer;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.checkbox-slider--c-weight input + span:before {
+ position: absolute;
+ left: 0px;
+ display: inline-block;
+}
+.checkbox-slider--c-weight input + span > h4 {
+ display: inline;
+}
+.checkbox-slider--c-weight input + span {
+ padding-left: 40px;
+}
+.checkbox-slider--c-weight input + span:before {
+ content: "";
+ height: 20px;
+ width: 40px;
+ background: rgba(100, 100, 100, 0.2);
+ box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.8);
+ transition: background 0.2s ease-out;
+}
+.checkbox-slider--c-weight input + span:after {
+ width: 20px;
+ height: 20px;
+ position: absolute;
+ left: 0px;
+ top: 0;
+ display: block;
+ background: #ffffff;
+ transition: margin-left 0.1s ease-in-out;
+ text-align: center;
+ font-weight: bold;
+ content: "";
+}
+.checkbox-slider--c-weight input:checked + span:after {
+ margin-left: 20px;
+ content: "";
+}
+.checkbox-slider--c-weight input:checked + span:before {
+ transition: background 0.2s ease-in;
+}
+.checkbox-slider--c-weight input + span {
+ padding-left: 40px;
+}
+.checkbox-slider--c-weight input + span:before {
+ height: 2px !important;
+ top: 10px;
+ box-shadow: none;
+ width: 40px;
+ background: #555555;
+}
+.checkbox-slider--c-weight input + span:after {
+ box-shadow: none;
+ width: 20px;
+ border: solid #555555 2px;
+ border-radius: 20px;
+}
+.checkbox-slider--c-weight input:checked + span:after {
+ background: #5cb85c;
+ margin-left: 20px;
+ border: solid #5cb85c 2px;
+ -webkit-animation: splashIn ease-in 0.3s normal;
+ animation: splashIn ease-in 0.3s normal;
+}
+.checkbox-slider--c-weight input:checked + span:before {
+ background: #5cb85c;
+}
+.checkbox-slider--c-weight.checkbox-slider-sm input + span:before {
+ top: 4px;
+}
+.checkbox-slider--c-weight.checkbox-slider-md input + span:before {
+ top: 14px;
+}
+.checkbox-slider--c-weight.checkbox-slider-md input + span:after {
+ width: 30px;
+ border-radius: 30px;
+}
+.checkbox-slider--c-weight.checkbox-slider-lg input + span:before {
+ top: 19px;
+}
+.checkbox-slider--c-weight.checkbox-slider-lg input + span:after {
+ width: 40px;
+ border-radius: 40px;
+}
+.checkbox-slider--c-weight input + span:before {
+ height: 1px !important;
+}
+.checkbox-slider--c-weight input:checked + span:before {
+ height: 2px !important;
+}
+.checkbox-slider--c-weight input:not(:checked) + span:after {
+ -webkit-transform: scale(0.7);
+ transform: scale(0.7);
+ left: -6px;
+}
+/******************************************************
+State Disabled
+*******************************************************/
+.checkbox-slider--default input:disabled + span:after {
+ background: #777777;
+}
+.checkbox-slider--default input:disabled + span:before {
+ box-shadow: 0 0 0 black;
+}
+.checkbox-slider--default input:disabled + span {
+ color: #777777;
+}
+.checkbox-slider--a input:disabled + span:after {
+ background: #777777;
+ color: #ffffff;
+}
+.checkbox-slider--a input:disabled + span:before {
+ box-shadow: 0 0 0 black;
+}
+.checkbox-slider--a input:disabled + span {
+ color: #777777;
+}
+.checkbox-slider--b input:disabled + span:after {
+ border: solid transparent 2px;
+ border-radius: 40px;
+}
+.checkbox-slider--b input:disabled + span:before {
+ box-shadow: 0 0 0 black;
+}
+.checkbox-slider--b input:disabled + span {
+ color: #777777;
+}
+.checkbox-slider--c input:disabled:checked + span:after {
+ background: #777777;
+}
+.checkbox-slider--c input:disabled + span:after {
+ border-color: #777777;
+}
+.checkbox-slider--c input:disabled + span:before {
+ background: #777777;
+}
+.checkbox-slider--c input:disabled + span {
+ color: #777777;
+}
+/*******************************************************
+Indicators
+*******************************************************/
+input:checked + .indicator-success {
+ color: #5cb85c;
+}
+input:checked + .indicator-info {
+ color: #5bc0de;
+}
+input:checked + .indicator-warning {
+ color: #f0ad4e;
+}
+input:checked + .indicator-danger {
+ color: #d9534f;
+}
+/*******************************************************
+Sizes
+*******************************************************/
+.checkbox-slider-sm {
+ line-height: 10px;
+}
+.checkbox-slider-sm input + span {
+ padding-left: 20px;
+}
+.checkbox-slider-sm input + span:before {
+ width: 20px;
+}
+.checkbox-slider-sm input + span:after,
+.checkbox-slider-sm input + span:before {
+ height: 10px;
+ line-height: 10px;
+}
+.checkbox-slider-sm input + span:after {
+ width: 10px;
+ vertical-align: middle;
+}
+.checkbox-slider-sm input:checked + span:after {
+ margin-left: 10px;
+}
+.checkbox-slider-md {
+ line-height: 30px;
+}
+.checkbox-slider-md input + span {
+ padding-left: 60px;
+}
+.checkbox-slider-md input + span:before {
+ width: 60px;
+}
+.checkbox-slider-md input + span:after,
+.checkbox-slider-md input + span:before {
+ height: 30px;
+ line-height: 30px;
+}
+.checkbox-slider-md input + span:after {
+ width: 30px;
+ vertical-align: middle;
+}
+.checkbox-slider-md input:checked + span:after {
+ margin-left: 30px;
+}
+.checkbox-slider-lg {
+ line-height: 40px;
+}
+.checkbox-slider-lg input + span {
+ padding-left: 80px;
+}
+.checkbox-slider-lg input + span:before {
+ width: 80px;
+}
+.checkbox-slider-lg input + span:after,
+.checkbox-slider-lg input + span:before {
+ height: 40px;
+ line-height: 40px;
+}
+.checkbox-slider-lg input + span:after {
+ width: 40px;
+ vertical-align: middle;
+}
+.checkbox-slider-lg input:checked + span:after {
+ margin-left: 40px;
+}
+/*******************************************************
+Variations
+*******************************************************/
+.checkbox-slider-info.checkbox-slider--default input:checked + span:after,
+.checkbox-slider-info.checkbox-slider--a input:checked + span:after,
+.checkbox-slider-info.checkbox-slider--c input:checked + span:after,
+.checkbox-slider-info.checkbox-slider--c-weight input:checked + span:after {
+ background: #5bc0de;
+ background-clip: content-box;
+}
+.checkbox-slider-info.checkbox-slider--c input:checked + span:after,
+.checkbox-slider-info.checkbox-slider--c-weight input:checked + span:after {
+ border-color: #5bc0de;
+}
+.checkbox-slider-info.checkbox-slider--b input:checked + span:before,
+.checkbox-slider-info.checkbox-slider--b-flat input:checked + span:before,
+.checkbox-slider-info.checkbox-slider--c input:checked + span:before,
+.checkbox-slider-info.checkbox-slider--c-weight input:checked + span:before {
+ background: #5bc0de;
+}
+.checkbox-slider-warning.checkbox-slider--default input:checked + span:after,
+.checkbox-slider-warning.checkbox-slider--a input:checked + span:after,
+.checkbox-slider-warning.checkbox-slider--c input:checked + span:after,
+.checkbox-slider-warning.checkbox-slider--c-weight input:checked + span:after {
+ background: #f0ad4e;
+ background-clip: content-box;
+}
+.checkbox-slider-warning.checkbox-slider--c input:checked + span:after,
+.checkbox-slider-warning.checkbox-slider--c-weight input:checked + span:after {
+ border-color: #f0ad4e;
+}
+.checkbox-slider-warning.checkbox-slider--b input:checked + span:before,
+.checkbox-slider-warning.checkbox-slider--b-flat input:checked + span:before,
+.checkbox-slider-warning.checkbox-slider--c input:checked + span:before,
+.checkbox-slider-warning.checkbox-slider--c-weight input:checked + span:before {
+ background: #f0ad4e;
+}
+.checkbox-slider-danger.checkbox-slider--default input:checked + span:after,
+.checkbox-slider-danger.checkbox-slider--a input:checked + span:after,
+.checkbox-slider-danger.checkbox-slider--c input:checked + span:after,
+.checkbox-slider-danger.checkbox-slider--c-weight input:checked + span:after {
+ background: #d9534f;
+ background-clip: content-box;
+}
+.checkbox-slider-danger.checkbox-slider--c input:checked + span:after,
+.checkbox-slider-danger.checkbox-slider--c-weight input:checked + span:after {
+ border-color: #d9534f;
+}
+.checkbox-slider-danger.checkbox-slider--b input:checked + span:before,
+.checkbox-slider-danger.checkbox-slider--b-flat input:checked + span:before,
+.checkbox-slider-danger.checkbox-slider--c input:checked + span:before,
+.checkbox-slider-danger.checkbox-slider--c-weight input:checked + span:before {
+ background: #d9534f;
+}
diff --git a/public/admin/index.ejs b/public/admin/index.ejs
index 3347d3a..642a3d1 100644
--- a/public/admin/index.ejs
+++ b/public/admin/index.ejs
@@ -21,10 +21,12 @@
+
+
@@ -32,27 +34,28 @@
-
-
-
-
-
+
diff --git a/public/admin/items.css b/public/admin/items.css
new file mode 100644
index 0000000..e69de29
diff --git a/public/admin/items.html b/public/admin/items.html
new file mode 100644
index 0000000..3089c96
--- /dev/null
+++ b/public/admin/items.html
@@ -0,0 +1,207 @@
+
+
+
Manage Items
+
+
+
+
+
+ Include Deleted
+
+
+
+
+
+
+ Name
+ Default Price
+ Measures
+
+
+
+
+
+
+
+
+
+
+
+
+ Are you certain you wish to delete the item ?
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/admin/items.styl b/public/admin/items.styl
new file mode 100644
index 0000000..b6e190d
--- /dev/null
+++ b/public/admin/items.styl
@@ -0,0 +1,2 @@
+#items {
+}
\ No newline at end of file
diff --git a/public/admin/js/LinkedTreeTable.js b/public/admin/js/LinkedTreeTable.js
new file mode 100644
index 0000000..d702c30
--- /dev/null
+++ b/public/admin/js/LinkedTreeTable.js
@@ -0,0 +1,149 @@
+"use strict";
+
+var LinkedTreeTable;
+
++function($) {
+ //Pass an element (jquery or html reference), an options object (see DEFAULTS), and an array of node metadata objects (see NODE_DEFAULTS).
+ LinkedTreeTable = function(element, options, nodeMetadata) {
+ var _this = this;
+ this.$element = $(element);
+ this.options = $.extend({}, LinkedTreeTable.DEFAULTS, options);
+ this.nodes = [];
+ this.$selectedRow = null;
+ this.selectionHandler = function(event) {
+ $(this).addClass(_this.options.selectionCSS).siblings().removeClass(_this.options.selectionCSS);
+ _this.$selectedRow = $(this);
+ };
+
+ this.addNodeMetadata = function(nodeMetadata) {
+ nodeMetadata = $.extend({}, LinkedTreeTable.NODE_DEFAULTS, nodeMetadata);
+ var nodes = this.nodes[nodeMetadata.type];
+
+ nodeMetadata.cls = "NODE";
+
+ if(typeof nodes == 'object') {
+ if(nodes.cls == 'NODE') {
+ this.nodes[nodeMetadata.type] = [nodes, nodeMetadata];
+ }
+ else {
+ nodes.push(nodeMetadata);
+ }
+ }
+ else {
+ this.nodes[nodeMetadata.type] = nodeMetadata
+ }
+ };
+
+ //Add the node metadata to the mapping.
+ for(var index = 0; index < nodeMetadata.length; index++) {
+ this.addNodeMetadata(nodeMetadata[index]);
+ }
+ };
+
+ LinkedTreeTable.DEFAULTS = {
+ dataAttr: 'data-key-name', //The property name to use to attach the model sent by the server to the table row created for the data.
+ typeAttr: 'data-type-name', //The attribute name used to attach the type to the table row.
+ selectionCSS: 'selected',
+ selection: 'row', //Currently only row is supported.
+ getIdHandler: null //Optional global function that gets the id for an object. No ID will be used if not provided, in which case the row will not be re-opened or re-selected after refreshing the data from the server.
+ };
+
+ LinkedTreeTable.NODE_DEFAULTS = {
+ type: '', //The type name this node metadata applies to. Must be provided. The empty type is used to identify the metadata for collecting root nodes.
+ url: '', //The absolute or relative path to use to query the initial data. Server is expected to respond with a JSON array of objects.
+ typeHandler: null, //The optional handler called to determine the type for the model sent by the server. Must return a type name that is then matched to the node metadata to get children.
+ defaultType: null, //The default type to assign to the node if the type handler does not provide one. This normally should be set, particularly if a handler won't always provide a type.
+ postAddRowHandler: null, //Optional function that is passed the jquery table row and the data object sent by the server for that row. Allows post processing of the row prior to display.
+ parameters: null, //Optional function that returns an object, or an object whose attributes are passed to the URL as parameters.
+ getIdHandler: null //Optional function that gets the id for an object. The global version will be used if this one is not provided.
+ };
+
+ LinkedTreeTable.prototype.getSelectedRow = function() {
+ return this.$selectedRow;
+ };
+
+ //A function that will clean and rebuild the table displaying all the users.
+ //Note that each row of the table will have a data element attached to the table row. The key will be "model" and the value will be the object sent by the server.
+ //Pass an optional table row or data object to reference a node in the tree whose children will be refreshed. If not provided then the root nodes will be refreshed.
+ LinkedTreeTable.prototype.refresh = function(node) {
+ var _this = this;
+ var table = this.$element;
+ var thead = table.find("thead tr");
+ var tbody = table.find("tbody");
+ var selection = this.options.selection;
+ var dataAttr = this.options.dataAttr;
+ var selectionHandler = this.selectionHandler;
+ var params;
+
+ //TODO: Need to identify the top most visible row?
+ //TODO: Otherwise identify the scroll position so we can reset it if necessary?
+ //TODO: Find the ID's of all rows at this tree level or lower that are open so we can re-open them after refreshing?
+ //TODO: Otherwise map the new data by ID to the rows at this tree level so we can update the rows instead of replacing them?
+
+ if(thead.length == 0) {
+ return;
+ }
+
+ //Empty or Create the table body.
+ if(tbody.length != 0) {
+ //Remove the row selection handler.
+ if(selection == 'row') this.$element.off('click', 'tbody tr', selectionHandler);
+ //Empty the table of data.
+ tbody.empty();
+ }
+ else {
+ tbody = $("
");
+ tbody.appendTo(table);
+ }
+
+ if(typeof this.options.parameters == 'function') {
+ params = this.options.parameters();
+
+ //Must be an object.
+ if(typeof params != 'object') {
+ params = {};
+ }
+ }
+ else if(typeof this.options.parameters == 'object') {
+ params = this.options.parameters;
+ }
+ else {params = {};}
+
+ $.getJSON(this.options.url, params, function(data) {
+ var headers = thead.children();
+ var attributes = [];
+
+ //Read the table headers to get the data object keys.
+ for(var headerIndex = 0; headerIndex < headers.length; headerIndex++) {
+ var nextHeader = headers[headerIndex];
+
+ attributes[headerIndex] = $(nextHeader).attr(dataAttr);
+ }
+
+ //Add the table data.
+ for(var dataIndex = 0; dataIndex < data.length; dataIndex++) {
+ var rowData = data[dataIndex];
+ var row = $("
");
+
+ row.appendTo(tbody);
+ //Save the model attached to the table row. Can be retrieved later to get the model sent by the server.
+ row.data("model", rowData);
+
+ for(var attributeIndex = 0; attributeIndex < attributes.length; attributeIndex++) {
+ var attribute = attributes[attributeIndex];
+ var cellData = rowData[attribute];
+
+ row.append("
" + cellData + " ");
+ }
+
+ if(_this.options.postAddRowHandler) {
+ //Call the optional handler after adding the row, passing the jquery row object, and the row data object sent by the server. Allows post processing on the row (adding classes to the row for example).
+ _this.options.postAddRowHandler(row, rowData);
+ }
+ }
+
+ //Setup the row selection handler.
+ if(selection == 'row') table.on('click', 'tbody tr', selectionHandler);
+ });
+ }
+}(jQuery);
\ No newline at end of file
diff --git a/public/admin/js/bootstrap-switch.js b/public/admin/js/bootstrap-switch.js
new file mode 100644
index 0000000..826263a
--- /dev/null
+++ b/public/admin/js/bootstrap-switch.js
@@ -0,0 +1,744 @@
+/* ========================================================================
+ * bootstrap-switch - v3.3.2
+ * http://www.bootstrap-switch.org
+ * ========================================================================
+ * Copyright 2012-2013 Mattia Larentis
+ *
+ * ========================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================================
+ */
+
+(function() {
+ var slice = [].slice;
+
+ (function($, window) {
+ "use strict";
+ var BootstrapSwitch;
+ BootstrapSwitch = (function() {
+ function BootstrapSwitch(element, options) {
+ if (options == null) {
+ options = {};
+ }
+ this.$element = $(element);
+ this.options = $.extend({}, $.fn.bootstrapSwitch.defaults, {
+ state: this.$element.is(":checked"),
+ size: this.$element.data("size"),
+ animate: this.$element.data("animate"),
+ disabled: this.$element.is(":disabled"),
+ readonly: this.$element.is("[readonly]"),
+ indeterminate: this.$element.data("indeterminate"),
+ inverse: this.$element.data("inverse"),
+ radioAllOff: this.$element.data("radio-all-off"),
+ onColor: this.$element.data("on-color"),
+ offColor: this.$element.data("off-color"),
+ onText: this.$element.data("on-text"),
+ offText: this.$element.data("off-text"),
+ labelText: this.$element.data("label-text"),
+ handleWidth: this.$element.data("handle-width"),
+ labelWidth: this.$element.data("label-width"),
+ baseClass: this.$element.data("base-class"),
+ wrapperClass: this.$element.data("wrapper-class")
+ }, options);
+ this.prevOptions = {};
+ this.$wrapper = $("
", {
+ "class": (function(_this) {
+ return function() {
+ var classes;
+ classes = ["" + _this.options.baseClass].concat(_this._getClasses(_this.options.wrapperClass));
+ classes.push(_this.options.state ? _this.options.baseClass + "-on" : _this.options.baseClass + "-off");
+ if (_this.options.size != null) {
+ classes.push(_this.options.baseClass + "-" + _this.options.size);
+ }
+ if (_this.options.disabled) {
+ classes.push(_this.options.baseClass + "-disabled");
+ }
+ if (_this.options.readonly) {
+ classes.push(_this.options.baseClass + "-readonly");
+ }
+ if (_this.options.indeterminate) {
+ classes.push(_this.options.baseClass + "-indeterminate");
+ }
+ if (_this.options.inverse) {
+ classes.push(_this.options.baseClass + "-inverse");
+ }
+ if (_this.$element.attr("id")) {
+ classes.push(_this.options.baseClass + "-id-" + (_this.$element.attr("id")));
+ }
+ return classes.join(" ");
+ };
+ })(this)()
+ });
+ this.$container = $("
", {
+ "class": this.options.baseClass + "-container"
+ });
+ this.$on = $("
", {
+ html: this.options.onText,
+ "class": this.options.baseClass + "-handle-on " + this.options.baseClass + "-" + this.options.onColor
+ });
+ this.$off = $("", {
+ html: this.options.offText,
+ "class": this.options.baseClass + "-handle-off " + this.options.baseClass + "-" + this.options.offColor
+ });
+ this.$label = $("", {
+ html: this.options.labelText,
+ "class": this.options.baseClass + "-label"
+ });
+ this.$element.on("init.bootstrapSwitch", (function(_this) {
+ return function() {
+ return _this.options.onInit.apply(element, arguments);
+ };
+ })(this));
+ this.$element.on("switchChange.bootstrapSwitch", (function(_this) {
+ return function(e) {
+ if (false === _this.options.onSwitchChange.apply(element, arguments)) {
+ if (_this.$element.is(":radio")) {
+ return $("[name='" + (_this.$element.attr('name')) + "']").trigger("previousState.bootstrapSwitch", true);
+ } else {
+ return _this.$element.trigger("previousState.bootstrapSwitch", true);
+ }
+ }
+ };
+ })(this));
+ this.$container = this.$element.wrap(this.$container).parent();
+ this.$wrapper = this.$container.wrap(this.$wrapper).parent();
+ this.$element.before(this.options.inverse ? this.$off : this.$on).before(this.$label).before(this.options.inverse ? this.$on : this.$off);
+ if (this.options.indeterminate) {
+ this.$element.prop("indeterminate", true);
+ }
+ this._init();
+ this._elementHandlers();
+ this._handleHandlers();
+ this._labelHandlers();
+ this._formHandler();
+ this._externalLabelHandler();
+ this.$element.trigger("init.bootstrapSwitch", this.options.state);
+ }
+
+ BootstrapSwitch.prototype._constructor = BootstrapSwitch;
+
+ BootstrapSwitch.prototype.setPrevOptions = function() {
+ return this.prevOptions = $.extend(true, {}, this.options);
+ };
+
+ BootstrapSwitch.prototype.state = function(value, skip) {
+ if (typeof value === "undefined") {
+ return this.options.state;
+ }
+ if (this.options.disabled || this.options.readonly) {
+ return this.$element;
+ }
+ if (this.options.state && !this.options.radioAllOff && this.$element.is(":radio")) {
+ return this.$element;
+ }
+ if (this.$element.is(":radio")) {
+ $("[name='" + (this.$element.attr('name')) + "']").trigger("setPreviousOptions.bootstrapSwitch");
+ } else {
+ this.$element.trigger("setPreviousOptions.bootstrapSwitch");
+ }
+ if (this.options.indeterminate) {
+ this.indeterminate(false);
+ }
+ value = !!value;
+ this.$element.prop("checked", value).trigger("change.bootstrapSwitch", skip);
+ return this.$element;
+ };
+
+ BootstrapSwitch.prototype.toggleState = function(skip) {
+ if (this.options.disabled || this.options.readonly) {
+ return this.$element;
+ }
+ if (this.options.indeterminate) {
+ this.indeterminate(false);
+ return this.state(true);
+ } else {
+ return this.$element.prop("checked", !this.options.state).trigger("change.bootstrapSwitch", skip);
+ }
+ };
+
+ BootstrapSwitch.prototype.size = function(value) {
+ if (typeof value === "undefined") {
+ return this.options.size;
+ }
+ if (this.options.size != null) {
+ this.$wrapper.removeClass(this.options.baseClass + "-" + this.options.size);
+ }
+ if (value) {
+ this.$wrapper.addClass(this.options.baseClass + "-" + value);
+ }
+ this._width();
+ this._containerPosition();
+ this.options.size = value;
+ return this.$element;
+ };
+
+ BootstrapSwitch.prototype.animate = function(value) {
+ if (typeof value === "undefined") {
+ return this.options.animate;
+ }
+ value = !!value;
+ if (value === this.options.animate) {
+ return this.$element;
+ }
+ return this.toggleAnimate();
+ };
+
+ BootstrapSwitch.prototype.toggleAnimate = function() {
+ this.options.animate = !this.options.animate;
+ this.$wrapper.toggleClass(this.options.baseClass + "-animate");
+ return this.$element;
+ };
+
+ BootstrapSwitch.prototype.disabled = function(value) {
+ if (typeof value === "undefined") {
+ return this.options.disabled;
+ }
+ value = !!value;
+ if (value === this.options.disabled) {
+ return this.$element;
+ }
+ return this.toggleDisabled();
+ };
+
+ BootstrapSwitch.prototype.toggleDisabled = function() {
+ this.options.disabled = !this.options.disabled;
+ this.$element.prop("disabled", this.options.disabled);
+ this.$wrapper.toggleClass(this.options.baseClass + "-disabled");
+ return this.$element;
+ };
+
+ BootstrapSwitch.prototype.readonly = function(value) {
+ if (typeof value === "undefined") {
+ return this.options.readonly;
+ }
+ value = !!value;
+ if (value === this.options.readonly) {
+ return this.$element;
+ }
+ return this.toggleReadonly();
+ };
+
+ BootstrapSwitch.prototype.toggleReadonly = function() {
+ this.options.readonly = !this.options.readonly;
+ this.$element.prop("readonly", this.options.readonly);
+ this.$wrapper.toggleClass(this.options.baseClass + "-readonly");
+ return this.$element;
+ };
+
+ BootstrapSwitch.prototype.indeterminate = function(value) {
+ if (typeof value === "undefined") {
+ return this.options.indeterminate;
+ }
+ value = !!value;
+ if (value === this.options.indeterminate) {
+ return this.$element;
+ }
+ return this.toggleIndeterminate();
+ };
+
+ BootstrapSwitch.prototype.toggleIndeterminate = function() {
+ this.options.indeterminate = !this.options.indeterminate;
+ this.$element.prop("indeterminate", this.options.indeterminate);
+ this.$wrapper.toggleClass(this.options.baseClass + "-indeterminate");
+ this._containerPosition();
+ return this.$element;
+ };
+
+ BootstrapSwitch.prototype.inverse = function(value) {
+ if (typeof value === "undefined") {
+ return this.options.inverse;
+ }
+ value = !!value;
+ if (value === this.options.inverse) {
+ return this.$element;
+ }
+ return this.toggleInverse();
+ };
+
+ BootstrapSwitch.prototype.toggleInverse = function() {
+ var $off, $on;
+ this.$wrapper.toggleClass(this.options.baseClass + "-inverse");
+ $on = this.$on.clone(true);
+ $off = this.$off.clone(true);
+ this.$on.replaceWith($off);
+ this.$off.replaceWith($on);
+ this.$on = $off;
+ this.$off = $on;
+ this.options.inverse = !this.options.inverse;
+ return this.$element;
+ };
+
+ BootstrapSwitch.prototype.onColor = function(value) {
+ var color;
+ color = this.options.onColor;
+ if (typeof value === "undefined") {
+ return color;
+ }
+ if (color != null) {
+ this.$on.removeClass(this.options.baseClass + "-" + color);
+ }
+ this.$on.addClass(this.options.baseClass + "-" + value);
+ this.options.onColor = value;
+ return this.$element;
+ };
+
+ BootstrapSwitch.prototype.offColor = function(value) {
+ var color;
+ color = this.options.offColor;
+ if (typeof value === "undefined") {
+ return color;
+ }
+ if (color != null) {
+ this.$off.removeClass(this.options.baseClass + "-" + color);
+ }
+ this.$off.addClass(this.options.baseClass + "-" + value);
+ this.options.offColor = value;
+ return this.$element;
+ };
+
+ BootstrapSwitch.prototype.onText = function(value) {
+ if (typeof value === "undefined") {
+ return this.options.onText;
+ }
+ this.$on.html(value);
+ this._width();
+ this._containerPosition();
+ this.options.onText = value;
+ return this.$element;
+ };
+
+ BootstrapSwitch.prototype.offText = function(value) {
+ if (typeof value === "undefined") {
+ return this.options.offText;
+ }
+ this.$off.html(value);
+ this._width();
+ this._containerPosition();
+ this.options.offText = value;
+ return this.$element;
+ };
+
+ BootstrapSwitch.prototype.labelText = function(value) {
+ if (typeof value === "undefined") {
+ return this.options.labelText;
+ }
+ this.$label.html(value);
+ this._width();
+ this.options.labelText = value;
+ return this.$element;
+ };
+
+ BootstrapSwitch.prototype.handleWidth = function(value) {
+ if (typeof value === "undefined") {
+ return this.options.handleWidth;
+ }
+ this.options.handleWidth = value;
+ this._width();
+ this._containerPosition();
+ return this.$element;
+ };
+
+ BootstrapSwitch.prototype.labelWidth = function(value) {
+ if (typeof value === "undefined") {
+ return this.options.labelWidth;
+ }
+ this.options.labelWidth = value;
+ this._width();
+ this._containerPosition();
+ return this.$element;
+ };
+
+ BootstrapSwitch.prototype.baseClass = function(value) {
+ return this.options.baseClass;
+ };
+
+ BootstrapSwitch.prototype.wrapperClass = function(value) {
+ if (typeof value === "undefined") {
+ return this.options.wrapperClass;
+ }
+ if (!value) {
+ value = $.fn.bootstrapSwitch.defaults.wrapperClass;
+ }
+ this.$wrapper.removeClass(this._getClasses(this.options.wrapperClass).join(" "));
+ this.$wrapper.addClass(this._getClasses(value).join(" "));
+ this.options.wrapperClass = value;
+ return this.$element;
+ };
+
+ BootstrapSwitch.prototype.radioAllOff = function(value) {
+ if (typeof value === "undefined") {
+ return this.options.radioAllOff;
+ }
+ value = !!value;
+ if (value === this.options.radioAllOff) {
+ return this.$element;
+ }
+ this.options.radioAllOff = value;
+ return this.$element;
+ };
+
+ BootstrapSwitch.prototype.onInit = function(value) {
+ if (typeof value === "undefined") {
+ return this.options.onInit;
+ }
+ if (!value) {
+ value = $.fn.bootstrapSwitch.defaults.onInit;
+ }
+ this.options.onInit = value;
+ return this.$element;
+ };
+
+ BootstrapSwitch.prototype.onSwitchChange = function(value) {
+ if (typeof value === "undefined") {
+ return this.options.onSwitchChange;
+ }
+ if (!value) {
+ value = $.fn.bootstrapSwitch.defaults.onSwitchChange;
+ }
+ this.options.onSwitchChange = value;
+ return this.$element;
+ };
+
+ BootstrapSwitch.prototype.destroy = function() {
+ var $form;
+ $form = this.$element.closest("form");
+ if ($form.length) {
+ $form.off("reset.bootstrapSwitch").removeData("bootstrap-switch");
+ }
+ this.$container.children().not(this.$element).remove();
+ this.$element.unwrap().unwrap().off(".bootstrapSwitch").removeData("bootstrap-switch");
+ return this.$element;
+ };
+
+ BootstrapSwitch.prototype._width = function() {
+ var $handles, handleWidth;
+ $handles = this.$on.add(this.$off);
+ $handles.add(this.$label).css("width", "");
+ handleWidth = this.options.handleWidth === "auto" ? Math.max(this.$on.width(), this.$off.width()) : this.options.handleWidth;
+ $handles.width(handleWidth);
+ this.$label.width((function(_this) {
+ return function(index, width) {
+ if (_this.options.labelWidth !== "auto") {
+ return _this.options.labelWidth;
+ }
+ if (width < handleWidth) {
+ return handleWidth;
+ } else {
+ return width;
+ }
+ };
+ })(this));
+ this._handleWidth = this.$on.outerWidth();
+ this._labelWidth = this.$label.outerWidth();
+ this.$container.width((this._handleWidth * 2) + this._labelWidth);
+ return this.$wrapper.width(this._handleWidth + this._labelWidth);
+ };
+
+ BootstrapSwitch.prototype._containerPosition = function(state, callback) {
+ if (state == null) {
+ state = this.options.state;
+ }
+ this.$container.css("margin-left", (function(_this) {
+ return function() {
+ var values;
+ values = [0, "-" + _this._handleWidth + "px"];
+ if (_this.options.indeterminate) {
+ return "-" + (_this._handleWidth / 2) + "px";
+ }
+ if (state) {
+ if (_this.options.inverse) {
+ return values[1];
+ } else {
+ return values[0];
+ }
+ } else {
+ if (_this.options.inverse) {
+ return values[0];
+ } else {
+ return values[1];
+ }
+ }
+ };
+ })(this));
+ if (!callback) {
+ return;
+ }
+ return setTimeout(function() {
+ return callback();
+ }, 50);
+ };
+
+ BootstrapSwitch.prototype._init = function() {
+ var init, initInterval;
+ init = (function(_this) {
+ return function() {
+ _this.setPrevOptions();
+ _this._width();
+ return _this._containerPosition(null, function() {
+ if (_this.options.animate) {
+ return _this.$wrapper.addClass(_this.options.baseClass + "-animate");
+ }
+ });
+ };
+ })(this);
+ if (this.$wrapper.is(":visible")) {
+ return init();
+ }
+ return initInterval = window.setInterval((function(_this) {
+ return function() {
+ if (_this.$wrapper.is(":visible")) {
+ init();
+ return window.clearInterval(initInterval);
+ }
+ };
+ })(this), 50);
+ };
+
+ BootstrapSwitch.prototype._elementHandlers = function() {
+ return this.$element.on({
+ "setPreviousOptions.bootstrapSwitch": (function(_this) {
+ return function(e) {
+ return _this.setPrevOptions();
+ };
+ })(this),
+ "previousState.bootstrapSwitch": (function(_this) {
+ return function(e) {
+ _this.options = _this.prevOptions;
+ if (_this.options.indeterminate) {
+ _this.$wrapper.addClass(_this.options.baseClass + "-indeterminate");
+ }
+ return _this.$element.prop("checked", _this.options.state).trigger("change.bootstrapSwitch", true);
+ };
+ })(this),
+ "change.bootstrapSwitch": (function(_this) {
+ return function(e, skip) {
+ var state;
+ e.preventDefault();
+ e.stopImmediatePropagation();
+ state = _this.$element.is(":checked");
+ _this._containerPosition(state);
+ if (state === _this.options.state) {
+ return;
+ }
+ _this.options.state = state;
+ _this.$wrapper.toggleClass(_this.options.baseClass + "-off").toggleClass(_this.options.baseClass + "-on");
+ if (!skip) {
+ if (_this.$element.is(":radio")) {
+ $("[name='" + (_this.$element.attr('name')) + "']").not(_this.$element).prop("checked", false).trigger("change.bootstrapSwitch", true);
+ }
+ return _this.$element.trigger("switchChange.bootstrapSwitch", [state]);
+ }
+ };
+ })(this),
+ "focus.bootstrapSwitch": (function(_this) {
+ return function(e) {
+ e.preventDefault();
+ return _this.$wrapper.addClass(_this.options.baseClass + "-focused");
+ };
+ })(this),
+ "blur.bootstrapSwitch": (function(_this) {
+ return function(e) {
+ e.preventDefault();
+ return _this.$wrapper.removeClass(_this.options.baseClass + "-focused");
+ };
+ })(this),
+ "keydown.bootstrapSwitch": (function(_this) {
+ return function(e) {
+ if (!e.which || _this.options.disabled || _this.options.readonly) {
+ return;
+ }
+ switch (e.which) {
+ case 37:
+ e.preventDefault();
+ e.stopImmediatePropagation();
+ return _this.state(false);
+ case 39:
+ e.preventDefault();
+ e.stopImmediatePropagation();
+ return _this.state(true);
+ }
+ };
+ })(this)
+ });
+ };
+
+ BootstrapSwitch.prototype._handleHandlers = function() {
+ this.$on.on("click.bootstrapSwitch", (function(_this) {
+ return function(event) {
+ event.preventDefault();
+ event.stopPropagation();
+ _this.state(false);
+ return _this.$element.trigger("focus.bootstrapSwitch");
+ };
+ })(this));
+ return this.$off.on("click.bootstrapSwitch", (function(_this) {
+ return function(event) {
+ event.preventDefault();
+ event.stopPropagation();
+ _this.state(true);
+ return _this.$element.trigger("focus.bootstrapSwitch");
+ };
+ })(this));
+ };
+
+ BootstrapSwitch.prototype._labelHandlers = function() {
+ return this.$label.on({
+ "click": function(e) {
+ return e.stopPropagation();
+ },
+ "mousedown.bootstrapSwitch touchstart.bootstrapSwitch": (function(_this) {
+ return function(e) {
+ if (_this._dragStart || _this.options.disabled || _this.options.readonly) {
+ return;
+ }
+ e.preventDefault();
+ e.stopPropagation();
+ _this._dragStart = (e.pageX || e.originalEvent.touches[0].pageX) - parseInt(_this.$container.css("margin-left"), 10);
+ if (_this.options.animate) {
+ _this.$wrapper.removeClass(_this.options.baseClass + "-animate");
+ }
+ return _this.$element.trigger("focus.bootstrapSwitch");
+ };
+ })(this),
+ "mousemove.bootstrapSwitch touchmove.bootstrapSwitch": (function(_this) {
+ return function(e) {
+ var difference;
+ if (_this._dragStart == null) {
+ return;
+ }
+ e.preventDefault();
+ difference = (e.pageX || e.originalEvent.touches[0].pageX) - _this._dragStart;
+ if (difference < -_this._handleWidth || difference > 0) {
+ return;
+ }
+ _this._dragEnd = difference;
+ return _this.$container.css("margin-left", _this._dragEnd + "px");
+ };
+ })(this),
+ "mouseup.bootstrapSwitch touchend.bootstrapSwitch": (function(_this) {
+ return function(e) {
+ var state;
+ if (!_this._dragStart) {
+ return;
+ }
+ e.preventDefault();
+ if (_this.options.animate) {
+ _this.$wrapper.addClass(_this.options.baseClass + "-animate");
+ }
+ if (_this._dragEnd) {
+ state = _this._dragEnd > -(_this._handleWidth / 2);
+ _this._dragEnd = false;
+ _this.state(_this.options.inverse ? !state : state);
+ } else {
+ _this.state(!_this.options.state);
+ }
+ return _this._dragStart = false;
+ };
+ })(this),
+ "mouseleave.bootstrapSwitch": (function(_this) {
+ return function(e) {
+ return _this.$label.trigger("mouseup.bootstrapSwitch");
+ };
+ })(this)
+ });
+ };
+
+ BootstrapSwitch.prototype._externalLabelHandler = function() {
+ var $externalLabel;
+ $externalLabel = this.$element.closest("label");
+ return $externalLabel.on("click", (function(_this) {
+ return function(event) {
+ event.preventDefault();
+ event.stopImmediatePropagation();
+ if (event.target === $externalLabel[0]) {
+ return _this.toggleState();
+ }
+ };
+ })(this));
+ };
+
+ BootstrapSwitch.prototype._formHandler = function() {
+ var $form;
+ $form = this.$element.closest("form");
+ if ($form.data("bootstrap-switch")) {
+ return;
+ }
+ return $form.on("reset.bootstrapSwitch", function() {
+ return window.setTimeout(function() {
+ return $form.find("input").filter(function() {
+ return $(this).data("bootstrap-switch");
+ }).each(function() {
+ return $(this).bootstrapSwitch("state", this.checked);
+ });
+ }, 1);
+ }).data("bootstrap-switch", true);
+ };
+
+ BootstrapSwitch.prototype._getClasses = function(classes) {
+ var c, cls, i, len;
+ if (!$.isArray(classes)) {
+ return [this.options.baseClass + "-" + classes];
+ }
+ cls = [];
+ for (i = 0, len = classes.length; i < len; i++) {
+ c = classes[i];
+ cls.push(this.options.baseClass + "-" + c);
+ }
+ return cls;
+ };
+
+ return BootstrapSwitch;
+
+ })();
+ $.fn.bootstrapSwitch = function() {
+ var args, option, ret;
+ option = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
+ ret = this;
+ this.each(function() {
+ var $this, data;
+ $this = $(this);
+ data = $this.data("bootstrap-switch");
+ if (!data) {
+ $this.data("bootstrap-switch", data = new BootstrapSwitch(this, option));
+ }
+ if (typeof option === "string") {
+ return ret = data[option].apply(data, args);
+ }
+ });
+ return ret;
+ };
+ $.fn.bootstrapSwitch.Constructor = BootstrapSwitch;
+ return $.fn.bootstrapSwitch.defaults = {
+ state: true,
+ size: null,
+ animate: true,
+ disabled: false,
+ readonly: false,
+ indeterminate: false,
+ inverse: false,
+ radioAllOff: false,
+ onColor: "primary",
+ offColor: "default",
+ onText: "ON",
+ offText: "OFF",
+ labelText: " ",
+ handleWidth: "auto",
+ labelWidth: "auto",
+ baseClass: "bootstrap-switch",
+ wrapperClass: "wrapper",
+ onInit: function() {},
+ onSwitchChange: function() {}
+ };
+ })(window.jQuery, window);
+
+}).call(this);
diff --git a/public/admin/js/bootstrap-switch.min.js b/public/admin/js/bootstrap-switch.min.js
new file mode 100644
index 0000000..9849658
--- /dev/null
+++ b/public/admin/js/bootstrap-switch.min.js
@@ -0,0 +1,22 @@
+/* ========================================================================
+ * bootstrap-switch - v3.3.2
+ * http://www.bootstrap-switch.org
+ * ========================================================================
+ * Copyright 2012-2013 Mattia Larentis
+ *
+ * ========================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================================
+ */
+
+(function(){var t=[].slice;!function(e,i){"use strict";var n;return n=function(){function t(t,i){null==i&&(i={}),this.$element=e(t),this.options=e.extend({},e.fn.bootstrapSwitch.defaults,{state:this.$element.is(":checked"),size:this.$element.data("size"),animate:this.$element.data("animate"),disabled:this.$element.is(":disabled"),readonly:this.$element.is("[readonly]"),indeterminate:this.$element.data("indeterminate"),inverse:this.$element.data("inverse"),radioAllOff:this.$element.data("radio-all-off"),onColor:this.$element.data("on-color"),offColor:this.$element.data("off-color"),onText:this.$element.data("on-text"),offText:this.$element.data("off-text"),labelText:this.$element.data("label-text"),handleWidth:this.$element.data("handle-width"),labelWidth:this.$element.data("label-width"),baseClass:this.$element.data("base-class"),wrapperClass:this.$element.data("wrapper-class")},i),this.prevOptions={},this.$wrapper=e("",{"class":function(t){return function(){var e;return e=[""+t.options.baseClass].concat(t._getClasses(t.options.wrapperClass)),e.push(t.options.state?t.options.baseClass+"-on":t.options.baseClass+"-off"),null!=t.options.size&&e.push(t.options.baseClass+"-"+t.options.size),t.options.disabled&&e.push(t.options.baseClass+"-disabled"),t.options.readonly&&e.push(t.options.baseClass+"-readonly"),t.options.indeterminate&&e.push(t.options.baseClass+"-indeterminate"),t.options.inverse&&e.push(t.options.baseClass+"-inverse"),t.$element.attr("id")&&e.push(t.options.baseClass+"-id-"+t.$element.attr("id")),e.join(" ")}}(this)()}),this.$container=e("
",{"class":this.options.baseClass+"-container"}),this.$on=e("
",{html:this.options.onText,"class":this.options.baseClass+"-handle-on "+this.options.baseClass+"-"+this.options.onColor}),this.$off=e("",{html:this.options.offText,"class":this.options.baseClass+"-handle-off "+this.options.baseClass+"-"+this.options.offColor}),this.$label=e("",{html:this.options.labelText,"class":this.options.baseClass+"-label"}),this.$element.on("init.bootstrapSwitch",function(e){return function(){return e.options.onInit.apply(t,arguments)}}(this)),this.$element.on("switchChange.bootstrapSwitch",function(i){return function(n){return!1===i.options.onSwitchChange.apply(t,arguments)?i.$element.is(":radio")?e("[name='"+i.$element.attr("name")+"']").trigger("previousState.bootstrapSwitch",!0):i.$element.trigger("previousState.bootstrapSwitch",!0):void 0}}(this)),this.$container=this.$element.wrap(this.$container).parent(),this.$wrapper=this.$container.wrap(this.$wrapper).parent(),this.$element.before(this.options.inverse?this.$off:this.$on).before(this.$label).before(this.options.inverse?this.$on:this.$off),this.options.indeterminate&&this.$element.prop("indeterminate",!0),this._init(),this._elementHandlers(),this._handleHandlers(),this._labelHandlers(),this._formHandler(),this._externalLabelHandler(),this.$element.trigger("init.bootstrapSwitch",this.options.state)}return t.prototype._constructor=t,t.prototype.setPrevOptions=function(){return this.prevOptions=e.extend(!0,{},this.options)},t.prototype.state=function(t,i){return"undefined"==typeof t?this.options.state:this.options.disabled||this.options.readonly?this.$element:this.options.state&&!this.options.radioAllOff&&this.$element.is(":radio")?this.$element:(this.$element.is(":radio")?e("[name='"+this.$element.attr("name")+"']").trigger("setPreviousOptions.bootstrapSwitch"):this.$element.trigger("setPreviousOptions.bootstrapSwitch"),this.options.indeterminate&&this.indeterminate(!1),t=!!t,this.$element.prop("checked",t).trigger("change.bootstrapSwitch",i),this.$element)},t.prototype.toggleState=function(t){return this.options.disabled||this.options.readonly?this.$element:this.options.indeterminate?(this.indeterminate(!1),this.state(!0)):this.$element.prop("checked",!this.options.state).trigger("change.bootstrapSwitch",t)},t.prototype.size=function(t){return"undefined"==typeof t?this.options.size:(null!=this.options.size&&this.$wrapper.removeClass(this.options.baseClass+"-"+this.options.size),t&&this.$wrapper.addClass(this.options.baseClass+"-"+t),this._width(),this._containerPosition(),this.options.size=t,this.$element)},t.prototype.animate=function(t){return"undefined"==typeof t?this.options.animate:(t=!!t,t===this.options.animate?this.$element:this.toggleAnimate())},t.prototype.toggleAnimate=function(){return this.options.animate=!this.options.animate,this.$wrapper.toggleClass(this.options.baseClass+"-animate"),this.$element},t.prototype.disabled=function(t){return"undefined"==typeof t?this.options.disabled:(t=!!t,t===this.options.disabled?this.$element:this.toggleDisabled())},t.prototype.toggleDisabled=function(){return this.options.disabled=!this.options.disabled,this.$element.prop("disabled",this.options.disabled),this.$wrapper.toggleClass(this.options.baseClass+"-disabled"),this.$element},t.prototype.readonly=function(t){return"undefined"==typeof t?this.options.readonly:(t=!!t,t===this.options.readonly?this.$element:this.toggleReadonly())},t.prototype.toggleReadonly=function(){return this.options.readonly=!this.options.readonly,this.$element.prop("readonly",this.options.readonly),this.$wrapper.toggleClass(this.options.baseClass+"-readonly"),this.$element},t.prototype.indeterminate=function(t){return"undefined"==typeof t?this.options.indeterminate:(t=!!t,t===this.options.indeterminate?this.$element:this.toggleIndeterminate())},t.prototype.toggleIndeterminate=function(){return this.options.indeterminate=!this.options.indeterminate,this.$element.prop("indeterminate",this.options.indeterminate),this.$wrapper.toggleClass(this.options.baseClass+"-indeterminate"),this._containerPosition(),this.$element},t.prototype.inverse=function(t){return"undefined"==typeof t?this.options.inverse:(t=!!t,t===this.options.inverse?this.$element:this.toggleInverse())},t.prototype.toggleInverse=function(){var t,e;return this.$wrapper.toggleClass(this.options.baseClass+"-inverse"),e=this.$on.clone(!0),t=this.$off.clone(!0),this.$on.replaceWith(t),this.$off.replaceWith(e),this.$on=t,this.$off=e,this.options.inverse=!this.options.inverse,this.$element},t.prototype.onColor=function(t){var e;return e=this.options.onColor,"undefined"==typeof t?e:(null!=e&&this.$on.removeClass(this.options.baseClass+"-"+e),this.$on.addClass(this.options.baseClass+"-"+t),this.options.onColor=t,this.$element)},t.prototype.offColor=function(t){var e;return e=this.options.offColor,"undefined"==typeof t?e:(null!=e&&this.$off.removeClass(this.options.baseClass+"-"+e),this.$off.addClass(this.options.baseClass+"-"+t),this.options.offColor=t,this.$element)},t.prototype.onText=function(t){return"undefined"==typeof t?this.options.onText:(this.$on.html(t),this._width(),this._containerPosition(),this.options.onText=t,this.$element)},t.prototype.offText=function(t){return"undefined"==typeof t?this.options.offText:(this.$off.html(t),this._width(),this._containerPosition(),this.options.offText=t,this.$element)},t.prototype.labelText=function(t){return"undefined"==typeof t?this.options.labelText:(this.$label.html(t),this._width(),this.options.labelText=t,this.$element)},t.prototype.handleWidth=function(t){return"undefined"==typeof t?this.options.handleWidth:(this.options.handleWidth=t,this._width(),this._containerPosition(),this.$element)},t.prototype.labelWidth=function(t){return"undefined"==typeof t?this.options.labelWidth:(this.options.labelWidth=t,this._width(),this._containerPosition(),this.$element)},t.prototype.baseClass=function(t){return this.options.baseClass},t.prototype.wrapperClass=function(t){return"undefined"==typeof t?this.options.wrapperClass:(t||(t=e.fn.bootstrapSwitch.defaults.wrapperClass),this.$wrapper.removeClass(this._getClasses(this.options.wrapperClass).join(" ")),this.$wrapper.addClass(this._getClasses(t).join(" ")),this.options.wrapperClass=t,this.$element)},t.prototype.radioAllOff=function(t){return"undefined"==typeof t?this.options.radioAllOff:(t=!!t,t===this.options.radioAllOff?this.$element:(this.options.radioAllOff=t,this.$element))},t.prototype.onInit=function(t){return"undefined"==typeof t?this.options.onInit:(t||(t=e.fn.bootstrapSwitch.defaults.onInit),this.options.onInit=t,this.$element)},t.prototype.onSwitchChange=function(t){return"undefined"==typeof t?this.options.onSwitchChange:(t||(t=e.fn.bootstrapSwitch.defaults.onSwitchChange),this.options.onSwitchChange=t,this.$element)},t.prototype.destroy=function(){var t;return t=this.$element.closest("form"),t.length&&t.off("reset.bootstrapSwitch").removeData("bootstrap-switch"),this.$container.children().not(this.$element).remove(),this.$element.unwrap().unwrap().off(".bootstrapSwitch").removeData("bootstrap-switch"),this.$element},t.prototype._width=function(){var t,e;return t=this.$on.add(this.$off),t.add(this.$label).css("width",""),e="auto"===this.options.handleWidth?Math.max(this.$on.width(),this.$off.width()):this.options.handleWidth,t.width(e),this.$label.width(function(t){return function(i,n){return"auto"!==t.options.labelWidth?t.options.labelWidth:e>n?e:n}}(this)),this._handleWidth=this.$on.outerWidth(),this._labelWidth=this.$label.outerWidth(),this.$container.width(2*this._handleWidth+this._labelWidth),this.$wrapper.width(this._handleWidth+this._labelWidth)},t.prototype._containerPosition=function(t,e){return null==t&&(t=this.options.state),this.$container.css("margin-left",function(e){return function(){var i;return i=[0,"-"+e._handleWidth+"px"],e.options.indeterminate?"-"+e._handleWidth/2+"px":t?e.options.inverse?i[1]:i[0]:e.options.inverse?i[0]:i[1]}}(this)),e?setTimeout(function(){return e()},50):void 0},t.prototype._init=function(){var t,e;return t=function(t){return function(){return t.setPrevOptions(),t._width(),t._containerPosition(null,function(){return t.options.animate?t.$wrapper.addClass(t.options.baseClass+"-animate"):void 0})}}(this),this.$wrapper.is(":visible")?t():e=i.setInterval(function(n){return function(){return n.$wrapper.is(":visible")?(t(),i.clearInterval(e)):void 0}}(this),50)},t.prototype._elementHandlers=function(){return this.$element.on({"setPreviousOptions.bootstrapSwitch":function(t){return function(e){return t.setPrevOptions()}}(this),"previousState.bootstrapSwitch":function(t){return function(e){return t.options=t.prevOptions,t.options.indeterminate&&t.$wrapper.addClass(t.options.baseClass+"-indeterminate"),t.$element.prop("checked",t.options.state).trigger("change.bootstrapSwitch",!0)}}(this),"change.bootstrapSwitch":function(t){return function(i,n){var o;return i.preventDefault(),i.stopImmediatePropagation(),o=t.$element.is(":checked"),t._containerPosition(o),o!==t.options.state?(t.options.state=o,t.$wrapper.toggleClass(t.options.baseClass+"-off").toggleClass(t.options.baseClass+"-on"),n?void 0:(t.$element.is(":radio")&&e("[name='"+t.$element.attr("name")+"']").not(t.$element).prop("checked",!1).trigger("change.bootstrapSwitch",!0),t.$element.trigger("switchChange.bootstrapSwitch",[o]))):void 0}}(this),"focus.bootstrapSwitch":function(t){return function(e){return e.preventDefault(),t.$wrapper.addClass(t.options.baseClass+"-focused")}}(this),"blur.bootstrapSwitch":function(t){return function(e){return e.preventDefault(),t.$wrapper.removeClass(t.options.baseClass+"-focused")}}(this),"keydown.bootstrapSwitch":function(t){return function(e){if(e.which&&!t.options.disabled&&!t.options.readonly)switch(e.which){case 37:return e.preventDefault(),e.stopImmediatePropagation(),t.state(!1);case 39:return e.preventDefault(),e.stopImmediatePropagation(),t.state(!0)}}}(this)})},t.prototype._handleHandlers=function(){return this.$on.on("click.bootstrapSwitch",function(t){return function(e){return e.preventDefault(),e.stopPropagation(),t.state(!1),t.$element.trigger("focus.bootstrapSwitch")}}(this)),this.$off.on("click.bootstrapSwitch",function(t){return function(e){return e.preventDefault(),e.stopPropagation(),t.state(!0),t.$element.trigger("focus.bootstrapSwitch")}}(this))},t.prototype._labelHandlers=function(){return this.$label.on({click:function(t){return t.stopPropagation()},"mousedown.bootstrapSwitch touchstart.bootstrapSwitch":function(t){return function(e){return t._dragStart||t.options.disabled||t.options.readonly?void 0:(e.preventDefault(),e.stopPropagation(),t._dragStart=(e.pageX||e.originalEvent.touches[0].pageX)-parseInt(t.$container.css("margin-left"),10),t.options.animate&&t.$wrapper.removeClass(t.options.baseClass+"-animate"),t.$element.trigger("focus.bootstrapSwitch"))}}(this),"mousemove.bootstrapSwitch touchmove.bootstrapSwitch":function(t){return function(e){var i;if(null!=t._dragStart&&(e.preventDefault(),i=(e.pageX||e.originalEvent.touches[0].pageX)-t._dragStart,!(i<-t._handleWidth||i>0)))return t._dragEnd=i,t.$container.css("margin-left",t._dragEnd+"px")}}(this),"mouseup.bootstrapSwitch touchend.bootstrapSwitch":function(t){return function(e){var i;if(t._dragStart)return e.preventDefault(),t.options.animate&&t.$wrapper.addClass(t.options.baseClass+"-animate"),t._dragEnd?(i=t._dragEnd>-(t._handleWidth/2),t._dragEnd=!1,t.state(t.options.inverse?!i:i)):t.state(!t.options.state),t._dragStart=!1}}(this),"mouseleave.bootstrapSwitch":function(t){return function(e){return t.$label.trigger("mouseup.bootstrapSwitch")}}(this)})},t.prototype._externalLabelHandler=function(){var t;return t=this.$element.closest("label"),t.on("click",function(e){return function(i){return i.preventDefault(),i.stopImmediatePropagation(),i.target===t[0]?e.toggleState():void 0}}(this))},t.prototype._formHandler=function(){var t;return t=this.$element.closest("form"),t.data("bootstrap-switch")?void 0:t.on("reset.bootstrapSwitch",function(){return i.setTimeout(function(){return t.find("input").filter(function(){return e(this).data("bootstrap-switch")}).each(function(){return e(this).bootstrapSwitch("state",this.checked)})},1)}).data("bootstrap-switch",!0)},t.prototype._getClasses=function(t){var i,n,o,s;if(!e.isArray(t))return[this.options.baseClass+"-"+t];for(n=[],o=0,s=t.length;s>o;o++)i=t[o],n.push(this.options.baseClass+"-"+i);return n},t}(),e.fn.bootstrapSwitch=function(){var i,o,s;return o=arguments[0],i=2<=arguments.length?t.call(arguments,1):[],s=this,this.each(function(){var t,a;return t=e(this),a=t.data("bootstrap-switch"),a||t.data("bootstrap-switch",a=new n(this,o)),"string"==typeof o?s=a[o].apply(a,i):void 0}),s},e.fn.bootstrapSwitch.Constructor=n,e.fn.bootstrapSwitch.defaults={state:!0,size:null,animate:!0,disabled:!1,readonly:!1,indeterminate:!1,inverse:!1,radioAllOff:!1,onColor:"primary",offColor:"default",onText:"ON",offText:"OFF",labelText:" ",handleWidth:"auto",labelWidth:"auto",baseClass:"bootstrap-switch",wrapperClass:"wrapper",onInit:function(){},onSwitchChange:function(){}}}(window.jQuery,window)}).call(this);
\ No newline at end of file
diff --git a/public/admin/js/framework_lite.js b/public/admin/js/framework_lite.js
index a9cae6a..991b5a8 100644
--- a/public/admin/js/framework_lite.js
+++ b/public/admin/js/framework_lite.js
@@ -75,52 +75,54 @@ function BrainstormFramework() {
}
this.extractViewData = function(viewData) {
- var data = {script: "", metadata: undefined, view: ""};
- var start;
-
- //Remove the escaping that allowed it to be sent as part of a JSON response.//
- viewData = this.unescape(viewData);
-
- //Strip out any run-once scripts to be run after loading the html.//
- while(viewData.indexOf("") != -1) {
- //extract the script.//
- data.script += viewData.substring(viewData.indexOf("") + 9, viewData.indexOf(" ")).replace("", "");
- //Remove the script from the view data.//
- viewData = viewData.substring(0, viewData.indexOf("")) + viewData.substring(viewData.indexOf(" ") + 10);
+ if(viewData != undefined) {
+ var data = {script: "", metadata: undefined, view: ""};
+ var start;
+
+ //Remove the escaping that allowed it to be sent as part of a JSON response.//
+ viewData = this.unescape(viewData);
+
+ //Strip out any run-once scripts to be run after loading the html.//
+ while(viewData.indexOf("") != -1) {
+ //extract the script.//
+ data.script += viewData.substring(viewData.indexOf("") + 9, viewData.indexOf(" ")).replace("", "");
+ //Remove the script from the view data.//
+ viewData = viewData.substring(0, viewData.indexOf("")) + viewData.substring(viewData.indexOf(" ") + 10);
+ }
+
+ //Detect and remove any metadata.//
+ if((start = viewData.indexOf('')) != -1) {
+ var end = viewData.indexOf(' ', start + 10);
+ var metadata = viewData.substring(start, end + 11);
+
+ //Remove the metadata from the document.//
+ viewData = viewData.substring(0, start) + viewData.substring(end + 11);
+ //Parse the metadata XML.//
+ data.metadata = $.parseXML(metadata);
+ }
+ else if((start = viewData.indexOf('', start + 10);
+ var metadata = viewData.substring(start, end + 2);
+
+ //Remove the metadata from the document.//
+ viewData = viewData.substring(0, start) + viewData.substring(end + 2);
+ //Parse the metadata XML.//
+ data.metadata = $.parseXML(metadata);
+ }
+ else if((start = viewData.indexOf(' ')) != -1) {
+ viewData = viewData.substring(0, start) + viewData.substring(start + 11);
+ }
+
+ //Strip out any comments.//
+ while(viewData.indexOf("") + 3);
+ }
+
+ data.view = viewData;
+
+ return data;
}
-
- //Detect and remove any metadata.//
- if((start = viewData.indexOf('')) != -1) {
- var end = viewData.indexOf(' ', start + 10);
- var metadata = viewData.substring(start, end + 11);
-
- //Remove the metadata from the document.//
- viewData = viewData.substring(0, start) + viewData.substring(end + 11);
- //Parse the metadata XML.//
- data.metadata = $.parseXML(metadata);
- }
- else if((start = viewData.indexOf('', start + 10);
- var metadata = viewData.substring(start, end + 2);
-
- //Remove the metadata from the document.//
- viewData = viewData.substring(0, start) + viewData.substring(end + 2);
- //Parse the metadata XML.//
- data.metadata = $.parseXML(metadata);
- }
- else if((start = viewData.indexOf(' ')) != -1) {
- viewData = viewData.substring(0, start) + viewData.substring(start + 11);
- }
-
- //Strip out any comments.//
- while(viewData.indexOf("") + 3);
- }
-
- data.view = viewData;
-
- return data;
}
//
diff --git a/public/admin/js/linkedTable.js b/public/admin/js/linkedTable.js
index 770afaa..1f73c27 100644
--- a/public/admin/js/linkedTable.js
+++ b/public/admin/js/linkedTable.js
@@ -4,32 +4,40 @@ var LinkedTable;
+function($) {
LinkedTable = function(element, options) {
+ var _this = this;
this.$element = $(element);
this.options = $.extend({}, LinkedTable.DEFAULTS, options);
- this.clickHandler = function(event) {
- $(this).addClass('highlight').siblings().removeClass('highlight');
+ this.$selectedRow = null;
+ this.selectionHandler = function(event) {
+ $(this).addClass(_this.options.selectionCSS).siblings().removeClass(_this.options.selectionCSS);
+ _this.$selectedRow = $(this);
};
};
LinkedTable.DEFAULTS = {
url: '', //The absolute or relative path to use to query the data. Server is expected to respond with a JSON array of objects.
attr: 'data-key-name',
- selection: 'row' //Currently only row is supported.
+ selectionCSS: 'selected',
+ selection: 'row', //Currently only row is supported.
+ postAddRowHandler: null, //Optional function that is passed the jquery table row and the data object sent by the server for that row. Allows post processing of the row prior to display.
+ parameters: null //Optional function that returns an object, or an object whose attributes are passed to the URL as parameters.
};
- //TODO
- LinkedTable.prototype.myMethod = function() {
-
+ LinkedTable.prototype.getSelectedRow = function() {
+ return this.$selectedRow;
};
//A function that will clean and rebuild the table displaying all the users.
+ //Note that each row of the table will have a data element attached to the table row. The key will be "model" and the value will be the object sent by the server.
LinkedTable.prototype.refresh = function() {
+ var _this = this;
var table = this.$element;
var thead = table.find("thead tr");
var tbody = table.find("tbody");
var selection = this.options.selection;
var attr = this.options.attr;
- var clickHandler = this.clickHandler;
+ var selectionHandler = this.selectionHandler;
+ var params;
if(thead.length == 0) {
return;
@@ -38,7 +46,7 @@ var LinkedTable;
//Empty or Create the table body.
if(tbody.length != 0) {
//Remove the row selection handler.
- if(selection == 'row') this.$element.off('click', 'tbody tr', clickHandler);
+ if(selection == 'row') this.$element.off('click', 'tbody tr', selectionHandler);
//Empty the table of data.
tbody.empty();
}
@@ -47,7 +55,20 @@ var LinkedTable;
tbody.appendTo(table);
}
- $.getJSON("user-data", function(data) {
+ if(typeof this.options.parameters == 'function') {
+ params = this.options.parameters();
+
+ //Must be an object.
+ if(typeof params != 'object') {
+ params = {};
+ }
+ }
+ else if(typeof this.options.parameters == 'object') {
+ params = this.options.parameters;
+ }
+ else {params = {};}
+
+ $.getJSON(this.options.url, params, function(data) {
var headers = thead.children();
var attributes = [];
@@ -64,6 +85,8 @@ var LinkedTable;
var row = $(" ");
row.appendTo(tbody);
+ //Save the model attached to the table row. Can be retrieved later to get the model sent by the server.
+ row.data("model", rowData);
for(var attributeIndex = 0; attributeIndex < attributes.length; attributeIndex++) {
var attribute = attributes[attributeIndex];
@@ -71,10 +94,15 @@ var LinkedTable;
row.append("" + cellData + " ");
}
+
+ if(_this.options.postAddRowHandler) {
+ //Call the optional handler after adding the row, passing the jquery row object, and the row data object sent by the server. Allows post processing on the row (adding classes to the row for example).
+ _this.options.postAddRowHandler(row, rowData);
+ }
}
//Setup the row selection handler.
- if(selection == 'row') table.on('click', 'tbody tr', clickHandler);
+ if(selection == 'row') table.on('click', 'tbody tr', selectionHandler);
});
}
}(jQuery);
\ No newline at end of file
diff --git a/public/admin/js/main.js b/public/admin/js/main.js
index 6dfc761..3035bec 100644
--- a/public/admin/js/main.js
+++ b/public/admin/js/main.js
@@ -50,16 +50,21 @@ $(document).ready(function($) {
(function(){
var htmlOriginal = jQuery.fn.html;
jQuery.fn.html = function(html) {
- var data = brainstormFramework.extractViewData(html);
-
- htmlOriginal.apply(this, [data.view]);
-
- if(data.script && data.script.length > 0) {
- try {
- eval(data.script);
- } catch(err) {
- alert(err);
+ if(html != undefined) {
+ var data = brainstormFramework.extractViewData(html);
+
+ htmlOriginal.apply(this, [data.view]);
+
+ if(data.script && data.script.length > 0) {
+ try {
+ eval(data.script);
+ } catch(err) {
+ alert(err);
+ }
}
}
+ else {
+ htmlOriginal.apply(this, html);
+ }
}
})();
\ No newline at end of file
diff --git a/public/admin/main.css b/public/admin/main.css
index 53ad0d4..49bda24 100644
--- a/public/admin/main.css
+++ b/public/admin/main.css
@@ -398,6 +398,12 @@ sub {
.inlineBlock {
display: inline-block;
}
+.modal-dialog {
+ background: #fff;
+}
+.selected {
+ background-color: #ffe184 !important;
+}
/* Footer Lines */
#footer {
margin-top: 6px;
@@ -497,6 +503,6 @@ sub {
.headerIcon {
width: 30px;
}
-#users .highlight {
+#users .selected {
background-color: #ffe184 !important;
}
diff --git a/public/admin/main.styl b/public/admin/main.styl
index 4db3f73..cb7c249 100644
--- a/public/admin/main.styl
+++ b/public/admin/main.styl
@@ -420,6 +420,14 @@ sup, sub {
display: inline-block;
}
+.modal-dialog {
+ background: white;
+}
+
+.selected {
+ background-color: #ffe184 !important;
+}
+
/* Footer Lines */
#footer {
@@ -467,4 +475,9 @@ sup, sub {
@require "home"
@require "editor"
-@require "users"
\ No newline at end of file
+@require "users"
+@require "venues"
+@require "measures"
+@require "categories"
+@require "subcategories"
+@require "items"
\ No newline at end of file
diff --git a/public/admin/measures.css b/public/admin/measures.css
new file mode 100644
index 0000000..e1f8e72
--- /dev/null
+++ b/public/admin/measures.css
@@ -0,0 +1,3 @@
+#measures .selected {
+ background-color: #ffe184 !important;
+}
diff --git a/public/admin/measures.html b/public/admin/measures.html
new file mode 100644
index 0000000..778a953
--- /dev/null
+++ b/public/admin/measures.html
@@ -0,0 +1,195 @@
+
+
+
Manage Measures
+
+
+
+
+
+ Include Deleted
+
+
+
+
+
+
+ Name
+ Postfix
+
+
+
+
+
+
+
+
+
+
+
+
+ Are you certain you wish to delete the venue ?
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/admin/measures.styl b/public/admin/measures.styl
new file mode 100644
index 0000000..3f9ccba
--- /dev/null
+++ b/public/admin/measures.styl
@@ -0,0 +1,2 @@
+#measures {
+}
\ No newline at end of file
diff --git a/public/admin/subcategories.css b/public/admin/subcategories.css
new file mode 100644
index 0000000..e69de29
diff --git a/public/admin/subcategories.html b/public/admin/subcategories.html
new file mode 100644
index 0000000..a64d658
--- /dev/null
+++ b/public/admin/subcategories.html
@@ -0,0 +1,183 @@
+
+
+
Manage Subcategories
+
+
+
+
+
+ Include Deleted
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Are you certain you wish to delete the subcategory ?
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/admin/subcategories.styl b/public/admin/subcategories.styl
new file mode 100644
index 0000000..9fb9869
--- /dev/null
+++ b/public/admin/subcategories.styl
@@ -0,0 +1,2 @@
+#subcategories {
+}
\ No newline at end of file
diff --git a/public/admin/users.html b/public/admin/users.html
index 2406b89..daf1f01 100644
--- a/public/admin/users.html
+++ b/public/admin/users.html
@@ -5,8 +5,9 @@
@@ -20,7 +21,6 @@
-
+
+
+
+
+
+
+
+
+
+
+ Are you certain you wish to delete the user ?
+
+
\ No newline at end of file
diff --git a/public/admin/users.styl b/public/admin/users.styl
index 80bebff..320bce0 100644
--- a/public/admin/users.styl
+++ b/public/admin/users.styl
@@ -1,5 +1,5 @@
#users {
- .highlight {
+ .selected {
background-color: #ffe184 !important;
}
}
\ No newline at end of file
diff --git a/public/admin/venues.styl b/public/admin/venues.styl
new file mode 100644
index 0000000..7a4f660
--- /dev/null
+++ b/public/admin/venues.styl
@@ -0,0 +1,2 @@
+#venues {
+}
\ No newline at end of file