Initial commit

This commit is contained in:
zhongjin 2018-07-22 11:16:48 +08:00
commit f5ecf0622b
417 changed files with 50664 additions and 0 deletions

8
.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
node_modules
.idea
tmp
package-lock.json
admin/i18n/*/flat.txt
admin/i18n/flat.txt
admin/i18n/*/translations.json
iob_npm.done

10
.npmignore Normal file
View File

@ -0,0 +1,10 @@
gulpfile.js
tasks
test
tmp
.idea
.travis.yml
appveyor.yml
package-lock.json
admin/i18n
iob_npm.done

23
.travis.yml Normal file
View File

@ -0,0 +1,23 @@
os:
- linux
- osx
language: node_js
node_js:
- '4'
- '6'
- '8'
- '10'
before_script:
- export NPMVERSION=$(echo "$($(which npm) -v)"|cut -c1)
- 'if [[ $NPMVERSION == 5 ]]; then npm install -g npm@5; fi'
- npm -v
- npm install winston@2.3.1
- 'npm install https://git.spacen.net/yunkong2/yunkong2.js-controller/tarball/master --production'
env:
- CXX=g++-4.8
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- g++-4.8

21
LICENSE Normal file
View File

@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2014-2018 bluefox <dogafox@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

308
README.md Normal file
View File

@ -0,0 +1,308 @@
![Logo](admin/web.png)
# yunkong2.web
===========================
[![NPM version](http://img.shields.io/npm/v/yunkong2.web.svg)](https://www.npmjs.com/package/yunkong2.web)
[![Downloads](https://img.shields.io/npm/dm/yunkong2.web.svg)](https://www.npmjs.com/package/yunkong2.web)
[![Tests](https://travis-ci.org/yunkong2/yunkong2.web.svg?branch=master)](https://travis-ci.org/yunkong2/yunkong2.web)
[![NPM](https://nodei.co/npm/yunkong2.web.png?downloads=true)](https://nodei.co/npm/yunkong2.web/)
Web server on the base of Node.js and express to read the files from yunkong2 DB
## Tuning Web-Sockets
On some web-sockets clients there is performance problem with communication. Sometimes this problem is due to fallback of socket.io communication on long polling mechanism.
You can set option *Force Web-Sockets* to force using only web-sockets transport.
## Let's Encrypt Certificates
Read [here](https://git.spacen.net/yunkong2/yunkong2.admin#lets-encrypt-certificates)
## Extensions
Web driver supports extensions. The extension is URL handler, that will be called if such URL request appears.
The extensions look like normal adapter, but they have no running process and will be called by web server.
E.g. the user can activate special proxy adapter and reach other devices (like web cams) in the same web server.
It is required to let all services be available under one web server.
## Brute-force protection
If authentication is enabled and the user enters 5 times invalid password during one minute, he must wait at least one minute till next attempt.
After 15th wrong attempt the user must wait 1 hour.
## Changelog
### 2.4.1 (2018-07-21)
* (bluefox) The support of the versioned links to adapter was added
* (bluefox) WhiteList was corrected
* (bluefox) Custom login background is supported
### 2.4.0 (2018-07-15)
* (bluefox) Pre-settings for instances now supported
### 2.3.6 (2018-06-27)
* (bluefox) URLs were sanitized
### 2.3.5 (2018-06-09)
* (bluefox) Used yunkong2.socket.io version 2.1.1
* (bluefox) Authentication problem was fixed
### 2.3.4 (2018-04-27)
* (bluefox) Used socket.io version 2.1.0
### 2.3.3 (2018-04-27)
* (bluefox) Fixing the new version of socket.io
### 2.3.2 (2018-04-14)
* (bluefox) fixed select ID dialog for old style (vis)
### 2.3.1 (2018-04-14)
* (bluefox) Updated socket.io version to 2.1.0
### 2.3.0 (2018-01-24)
* (bluefox) The required for Admin3 libraries are added
### 2.2.0 (2018-01-14)
* (bluefox) Ready for Admin3
### 2.1.9 (2017-11-19)
* (bluefox) Fix link to local admin on welcome screen
### 2.1.7 (2017-10-06)
* (bluefox) Fix link to local admin on welcome screen
### 2.1.4 (2017-10-02)
* (bluefox) Support of yunkong2.pro
### 2.0.6 (2017-08-05)
* (bluefox) Fix welcome screen
### 2.0.5 (2017-05-24)
* (bluefox) Update socketio lib
### 2.0.4 (2017-04-25)
* (bluefox) show logout button if connected over cloud
### 2.0.3 (2017-04-01)
* (bluefox) catch errors for invalid objects
### 2.0.2 (2017-02-08)
* (bluefox) fix selectID dialog
### 2.0.1 (2017-01-28)
* (bluefox) implement new welcome screen
### 2.0.0 (2017-01-05)
* (bluefox) support of web extensions
* (bluefox) protect against brute force attacks
### 1.7.7 (2017-01-04)
* (bluefox) fix error with authentication
### 1.7.6 (2016-12-07)
* (bluefox) Downgrade the socket.io to support older devices
### 1.7.5 (2016-11-14)
* (bluefox) Fix selectID Dialog
### 1.7.4 (2016-11-06)
* (bluefox) Fix unsubscribe of states
### 1.7.3 (2016-10-11)
* (bluefox) use new socketio
* (bluefox) fix config dialog
### 1.7.2 (2016-09-25)
* (bluefox) Fix redirect for login
### 1.7.1 (2016-09-15)
* (bluefox) update selectID dialog
### 1.7.0 (2016-08-30)
* (bluefox) сompatible only with new admin
### 1.6.2 (2016-08-30)
* (bluefox) updated SelectID Dialog
### 1.6.1 (2016-08-27)
* (bluefox) support of letsencrypt
### 1.5.4 (2016-08-14)
* (bluefox) support of web-sockets force
### 1.5.3 (2016-07-27)
* (bluefox) show links if root directory called
### 1.5.2 (2016-07-18)
* (bluefox) fix error with early logout
* (bluefox) update passport.socketio
### 1.5.1 (2016-07-06)
* (bluefox) support of chained certificates
### 1.5.0 (2016-06-29)
* (bluefox) update version of socket.io
### 1.4.8 (2016-06-19)
* (bluefox) bind socket to specifed IP
### 1.4.7 (2016-05-24)
* (bluefox) add version dependency
### 1.4.6 (2016-05-23)
* (bluefox) update selectID dialog
### 1.4.5 (2016-05-17)
* (bluefox) make possible to change language without restart
### 1.4.4 (2016-05-13)
* (bluefox) update socket-io version
### 1.4.3 (2016-04-24)
* (bluefox) use new socket.io version
### 1.4.1 (2016-04-09)
* (bluefox) add grey jquery theme
### 1.4.0 (2016-03-17)
* (bluefox) rename files
### 1.3.5 (2016-03-11)
* (bluefox) update selectId dialog
* (bluefox) enable get files from disk and not from cache, just request http://ip:8082/vis/file.png?something
* (bluefox) update packages
### 1.3.4 (2015-12-25)
* (bluefox) update socketio
### 1.3.3 (2015-12-14)
* (bluefox) add themes
### 1.3.3 (2015-12-14)
* (bluefox) add themes
### 1.3.2 (2015-12-14)
* (bluefox) fix selectID.js
* (bluefox) update socketio
### 1.3.0 (2015-11-15)
* (bluefox) add version compatibility check
### 1.2.2 (2015-11-14)
* (bluefox) support of multi-history
### 1.2.1 (2015-11-10)
* (bluefox) fix default user
### 1.2.0 (2015-11-06)
* (bluefox) support of npm 3.x
### 1.1.1 (2015-11-01)
* (bluefox) some files were missed on npm
*
### 1.1.0 (2015-11-01)
* (bluefox) update jquery UI libs
### 1.0.2 (2015-10-09)
* (bluefox) update selectID dialog
### 1.0.1 (2015-10-06)
* (bluefox) update selectID dialog
* (bluefox) enable resizing of columns in select ID dialog
### 1.0.0 (2015-09-30)
* (bluefox) stop adapter before update
### 0.4.4 (2015-08-14)
* (bluefox) update select ID dialog
### 0.4.3 (2015-08-11)
* (bluefox) fix filter in selectId dialog
* (bluefox) update packages
### 0.4.2 (2015-07-01)
* (bluefox) fix small package.json errors
### 0.4.1 (2015-06-28)
* (bluefox) change login form
* (bluefox) update version of simple-api
* (bluefox) add default user
* (bluefox) temporary enable install over npm
* (bluefox) use xtend 4.0.0
### 0.4.0 (2015-06-13)
* (bluefox) add permissions support
### 0.3.2 (2015-05-20)
* (bluefox) support of subscribeObjects in socketio
### 0.3.1 (2015-04-24)
* (bluefox) make "_socket/info.js" available from every directory
### 0.3.0 (2015-04-23)
* (bluefox) enable https connection and improve login dialog
### 0.2.6 (2015-03-07)
* (bluefox) update socketio
### 0.2.5 (2015-03-04)
* (bluefox) add sysLang variable to info.js (e.g. for Rickshaw)
### 0.2.4 (2015-02-14)
* (bluefox) fix error with update states if used internal socket.io
### 0.2.3 (2015-02-12)
* (bluefox) add simple api
* (bluefox) update select ID dialog
### 0.2.2 (2015-01-20)
* (bluefox) update select ID dialog
### 0.2.1 (2015-01-18)
* (bluefox) update select ID dialog
### 0.2.0 (2015-01-16)
* (bluefox) support of integrated socket (from yunkong2.socketio)
### 0.1.12 (2015-01-08)
* (bluefox) update selectId dialog
### 0.1.11 (2015-01-07)
* (bluefox) monitor state of socket.io to give correct connection data
### 0.1.10 (2015-01-06)
* (bluefox) cache web files in memory
### 0.1.9 (2015-01-03)
* (bluefox) update selectId dialog
### 0.1.8 (2015-01-02)
* (bluefox) enable socketio.0 by default
### 0.1.7 (2015-01-02)
* (bluefox) enable npm install
### 0.1.6 (2014-12-28)
* (bluefox) support empty files
### 0.1.5 (2014-12-26)
* (bluefox) extend select ID dialog with jquery Theme-roller
### 0.1.4 (2014-12-25)
* (bluefox) update select ID dialog
### 0.1.3 (2014-12-14)
* (bluefox) include "lib" directory with common files like jquery and jqGrid
### 0.1.2 (2014-12-05)
* (bluefox) read certificates from DB
### 0.1.1 (2014-12-05)
* (bluefox) use readFile instead of request
### 0.1.0 (2014-11-24)
* (bluefox) support of socket.io information
### 0.0.2 (2014-11-02)
* (bluefox) support of read binary states under http://ip:port/state/stateName
#### 0.0.1
* (bluefox) initial commit

647
admin/index.html Normal file
View File

@ -0,0 +1,647 @@
<html>
<head>
<link rel="stylesheet" type="text/css" href="../../lib/css/themes/jquery-ui/redmond/jquery-ui.min.css"/>
<script type="text/javascript" src="../../lib/js/jquery-1.11.1.min.js"></script>
<script type="text/javascript" src="../../socket.io/socket.io.js"></script>
<script type="text/javascript" src="../../lib/js/jquery-ui-1.10.3.full.min.js"></script>
<link rel="stylesheet" type="text/css" href="../../css/adapter.css"/>
<script type="text/javascript" src="../../js/translate.js"></script>
<script type="text/javascript" src="../../js/adapter-settings.js"></script>
<script type="text/javascript" src="words.js"></script>
<style>
.number {
width: 70px
}
</style>
<script type="text/javascript">
var supportedSockets = ['socketio'];
function showHideSettings() {
if ($('#secure').prop('checked')) {
$('#_certPublic').show();
$('#_certPrivate').show();
$('#_certChained').show();
$('.le-settings').show();
if ($('#leEnabled').prop('checked')) {
$('.le-sub-settings').show();
if ($('#leUpdate').prop('checked')) {
$('.le-sub-settings-update').show();
} else {
$('.le-sub-settings-update').hide();
}
} else {
$('.le-sub-settings').hide();
}
} else {
$('#_certPublic').hide();
$('#_certPrivate').hide();
$('#_certChained').hide();
$('#auth').prop('checked', false);
$('.le-settings').hide();
}
if ($('#auth').prop('checked')) {
$('#secure').prop('checked', true);
$('#defaultUser').val('admin');
$('.defaultUser').hide();
$('#_ttl').show();
} else {
$('.defaultUser').show();
$('#_ttl').hide();
}
if ($('#whiteListEnabled').prop('checked')) {
$('.white-list-settings').show();
} else {
$('.white-list-settings').hide();
}
}
// the function loadSettings has to exist ...
function load(settings, onChange) {
$('#tabs').tabs();
if (!settings) return;
if (!settings.lePort) settings.lePort = 80;
if (settings.whiteListEnabled === undefined) settings.whiteListEnabled = false;
getIPs(function(ips) {
for (var i = 0; i < ips.length; i++) {
$('#bind').append('<option value="' + ips[i].address + '">' + ips[i].name + '</option>');
}
$('#bind.value').val(settings.bind);
});
$('#socketio')
.append('<option value="none">' + _('none') + '</option>')
.append('<option value="">' + _('integrated') + '</option>');
var count = 0;
for (var i = 0; i < supportedSockets.length; i++) {
count++;
getAdapterInstances(supportedSockets[i], function (res) {
if (!res) return;
for (var t = 0; t < res.length; t++) {
$('#socketio').append('<option value="' + res[t]._id + '">' + res[t].common.name + ' [' + res[t]._id.replace('system.adapter.', '') + ']</option>');
}
if (!--count) {
var $socketio = $('#socketio');
$socketio.val(settings.socketio);
if (settings.socketio !== '') {
$('.socketio').hide();
}
$socketio.change(function () {
if ($(this).val() === '') {
$('.socketio').show();
} else {
$('.socketio').hide();
}
});
}
});
}
$('.value').each(function () {
var key = $(this).attr('id');
var $value = $('#' + key + '.value');
if ($value.attr('type') === 'checkbox') {
$value.prop('checked', settings[key]).change(function() {
showHideSettings();
onChange();
});
} else {
$value.val(settings[key]).change(function() {
onChange();
}).keyup(function() {
$(this).trigger('change');
});
}
});
onChange(false);
fillSelectCertificates('#certPublic', 'public', settings.certPublic);
fillSelectCertificates('#certPrivate', 'private', settings.certPrivate);
fillSelectCertificates('#certChained', 'chained', settings.certChained);
fillUsers('#defaultUser', settings.defaultUser);
showHideSettings();
$('#auth').change(function () {
if ($(this).prop('checked')) {
$('#secure').prop('checked', true);
showHideSettings();
}
updateNameSelects();
setDefaultIpUserToDefaultUser();
});
$('#defaultUser').change(function () {
setDefaultIpUserToDefaultUser();
});
applyWhiteListSettings(settings, onChange);
}
function save(callback) {
var obj = {};
$('.value').each(function () {
var $this = $(this);
if ($this.attr('type') === 'checkbox') {
obj[$this.attr('id')] = $this.prop('checked');
} else {
obj[$this.attr('id')] = $this.val();
}
});
if ($('#secure').prop('checked') && (!$('#certPrivate').val() || !$('#certPublic').val())) {
showMessage(_('Set certificates or load it first in the system settings (right top).'));
return;
}
obj['whiteListSettings'] = getWhiteListSettings();
callback(obj);
}
var ips = {};
var inputIndex = 0;
function addWhiteListTableRow(change) {
var table = document.getElementById('whiteListTable');
var row = table.insertRow(2);
var rowCount = table.rows.length;
var defaultRowIndex = rowCount - 1;
var colCount = table.rows[defaultRowIndex].cells.length;
for (var i = 0; i < colCount; i++) {
var newCell = row.insertCell(i);
var cellClass = $(table.rows[defaultRowIndex].cells[i]).attr('class');
if (cellClass.indexOf('defaultUserName') !== -1) {
newCell.innerHTML = '<select class="select-username" />';
} else {
$(newCell).addClass(cellClass);
newCell.innerHTML = table.rows[defaultRowIndex].cells[i].innerHTML;
}
if (newCell.innerHTML === 'default') {
var id = 'input_' + inputIndex++;
var ip = '192.168.0.1';
ips[id] = ip;
newCell.innerHTML = '<input name="ip" size="15" maxlength="255" id="' + id + '" value="' + ip + '"/>';
}
if (newCell.childNodes[0].type === 'checkbox') {
newCell.childNodes[0].checked = false;
}
}
$('.select-username:not(:has(option))').each(function () {
fillNameSelect($(this));
});
if (change && changedCallback) changedCallback();
defaultHandling();
return row;
}
function deleteWhiteListTableRow(index) {
try {
changedCallback && changedCallback();
var table = document.getElementById('whiteListTable');
var rowCount = table.rows.length;
if (index === rowCount - 1) return;
table.deleteRow(index);
} catch (e) {
alert(e);
}
}
function getWhiteListSettings() {
var settings = {};
try {
var table = document.getElementById('whiteListTable');
var rowCount = table.rows.length;
for (var i = 2; i < rowCount; i++) {
var row = table.rows[i];
var ip = (i === (rowCount - 1)) ? 'default' : row.cells[1].childNodes[0].value;
var userSelected = (i === (rowCount - 1)) ? $(row.cells[2]).html().toLowerCase() : $(row.cells[2].childNodes[0]).val();
settings[ip] = {
user: userSelected,
object: {},
state: {},
file: {}
};
for (var c = 2; c < row.cells.length; c++) {
var $cell = $(row.cells[c].childNodes[0]);
var permobject = $cell.attr('permobject');
var perm = $cell.attr('perm');
if (permobject && perm && settings[ip].hasOwnProperty(permobject)) {
settings[ip][permobject][perm] = $cell.prop('checked');
}
}
}
} catch (e) {
alert(e);
}
return settings;
}
function validateIp(ip) {
if (ip.indexOf('*') !== -1 && ip.lastIndexOf('.') > ip.indexOf('*')) {
return false;
}
var expression = /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$|^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$|^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/;
return expression.test(ip.replace('*', '111'));
}
function createWhiteListTable(whiteListSettings) {
var table = document.getElementById("whiteListTable");
var rowCount = table.rows.length;
for (var i = rowCount - 2; i > 1; i--) {
table.deleteRow(i);
}
if (whiteListSettings) {
Object.keys(whiteListSettings).forEach(function (key) {
rowCount = table.rows.length;
if (key !== 'default') {
addWhiteListTableRow(false);
}
});
}
}
var changedCallback = null;
var whiteListSettings = null;
function applyWhiteListSettings(settings, onChange) {
try {
whiteListSettings = settings['whiteListSettings'];
createWhiteListTable(whiteListSettings);
fillNameSelects(whiteListSettings);
changedCallback = onChange;
} catch (e) {
alert(e);
}
}
function handleIpChange() {
var ip = $(this).val();
var id = $(this).attr('id');
if (ip && !validateIp(ip)) {
showMessage(_('The provided IP is not valid'));
// alert('The provided IP ' + ip + ' is not valid');
if (ips.hasOwnProperty(id)) {
$(this).val(ips[id]);
}
} else {
ips[id] = ip;
}
changedCallback && changedCallback();
}
function wireClickEvents() {
$('.delete-btn-clmn')
.off('click')
.click(function () {
var rowIndex = $(this).parent().parent().children().index($(this).parent());
deleteWhiteListTableRow(rowIndex + 2);
});
}
function wireChangeEvents() {
var table = document.getElementById('whiteListTable');
var rowCount = table.rows.length;
for (var i = 2; i < rowCount; i++) {
var row = table.rows[i];
if (i !== rowCount - 1) {
var $input = $(row.cells[1].childNodes[0]);
$input.off('change');
$input.change(handleIpChange);
}
for (var c = 2; c < row.cells.length; c++) {
var $cell = $(row.cells[c].childNodes[0]);
$cell.off('change');
$cell.change(function () {
changedCallback && changedCallback();
});
}
}
$('.select-username')
.off('change')
.change(function () {
changedCallback && changedCallback();
});
}
function hideDefaultDeleteBtn() {
$('.delete-btn').css({
display: 'block'
});
$('.delete-btn:last').css({
display: 'none'
});
}
function addOptionIfAbsent($e, value, valueText, defaultUser) {
if (!$e.find('option[value="' + value + '"]').length) {
$e.append('<option value="' + value + '" ' + ((defaultUser === value) ? 'selected' : '') + '>' + valueText + '</option>');
}
}
function fillNameSelect($this, defaultUser) {
for (var u in users) {
var value = users[u].common.name;
var valueText = users[u].common.name[0].toUpperCase() + users[u].common.name.substring(1);
addOptionIfAbsent($this, value, valueText, defaultUser);
}
}
var users = {};
function fillNameSelects(whiteListSettings) {
if (!whiteListSettings) return;
getUsers(function (err, response) {
users = response;
$('.select-username')
.off('change')
.each(function () {
fillNameSelect($(this));
});
applyRowSettings(whiteListSettings);
defaultHandling();
});
}
function applyRowSettings(whiteListSettings) {
if (!whiteListSettings) return;
var table = document.getElementById('whiteListTable');
var rowCount = table.rows.length;
var i = 2;
Object.keys(whiteListSettings).forEach(function (key) {
var row = key === 'default' ? table.rows[rowCount - 1] : table.rows[i++];
setRowSettings(row, key, whiteListSettings[key]);
});
}
function setRowSettings(row, ip, ipSettings) {
var $ip = $(row.cells[1].childNodes[0]);
$ip.val(ip);
for (var c = 2; c < row.cells.length; c++) {
var $cell = $(row.cells[c].childNodes[c === 2 ? 1 : 0]);
if (c > 2) {
var permobject = $cell.attr('permobject');
var perm = $cell.attr('perm');
if (ipSettings.hasOwnProperty(permobject) && ipSettings[permobject].hasOwnProperty(perm)) {
$cell.prop('checked', ipSettings[permobject][perm]);
}
} else {
$(row.cells[2].childNodes[0]).val(ipSettings.user).change();
}
}
}
function setDefaultIpUserToDefaultUser() {
var auth = $('#auth').prop('checked');
var defaultUser = auth ? 'Auth' : $('#defaultUser').find('option:selected').text();
$('.defaultUserName').html(defaultUser);
}
function updateNameSelects() {
var auth = $('#auth').prop('checked');
if (auth) {
$('.select-username').each(function () {
addOptionIfAbsent($(this), 'auth', 'Auth');
});
} else {
$('.select-username option[value="auth"]').remove();
}
}
function defaultHandling() {
hideDefaultDeleteBtn();
updateNameSelects();
setDefaultIpUserToDefaultUser();
wireClickEvents();
wireChangeEvents();
}
</script>
<style>
.whiteListTableHeader {
background-color: lightgrey;
color: darkslateblue;
}
.whiteListTableUnevenBlock {
background-color: gainsboro;
}
.whiteListTableEvenBlock {
background-color: lavender;
}
</style>
</head>
<body>
<div id="adapter-container">
<table>
<tr>
<td><img src="web.png"></td>
<td><h3 class="translate">Web Server adapter settings</h3></td>
</tr>
</table>
<div id="tabs">
<ul>
<li><a href="#tabs-1" class="translate">General</a></li>
<li><a href="#tabs-2" class="translate">White List</a></li>
</ul>
<div id="tabs-1">
<table>
<tr>
<td><label class="translate" for="bind">IP:</label></td>
<td><select class="value" id="bind"></select></td>
<td></td>
</tr>
<tr>
<td><label class="translate" for="port">Port:</label></td>
<td><input class="value" id="port" size="5" maxlength="5" type="number"/></td>
<td></td>
</tr>
<tr>
<td><label class="translate" for="secure">Secure(HTTPS):</label></td>
<td><input class="value" id="secure" type="checkbox"/></td>
<td></td>
</tr>
<tr id="_certPublic">
<td><label class="translate" for="certPublic">Public certificate:</label></td>
<td><select id="certPublic" class="value"></select></td>
</tr>
<tr id="_certPrivate">
<td><label class="translate" for="certPrivate">Private certificate:</label></td>
<td><select id="certPrivate" class="value"></select></td>
</tr>
<tr id="_certChained">
<td><label class="translate" for="certChained">Chained certificate:</label></td>
<td><select id="certChained" class="value"></select></td>
</tr>
<tr>
<td><label class="translate" for="auth">Authentication:</label></td>
<td><input class="value" id="auth" type="checkbox"/></td>
<td></td>
</tr>
<tr id="_ttl">
<td><label class="translate" for="ttl">Login timeout(sec):</label></td>
<td><input class="value" id="ttl" type="number"/></td>
<td></td></tr>
<tr>
<td><label class="translate" for="cache">Cache:</label></td>
<td><input class="value" id="cache" type="checkbox"/></td>
<td></td>
</tr>
<tr>
<td><label class="translate" for="socketio">Socket.IO Instance (Optional):</label></td>
<td><select class="value" id="socketio"></select><span class="translate"
style="padding-left: 20px">socket_help</span>
</td>
</tr>
<tr class="socketio">
<td><label class="translate" for="forceWebSockets">Force Web-Sockets:</label></td>
<td><input type="checkbox" class="value" id="forceWebSockets"/></td></tr>
<tr>
<td><label class="translate" for="simpleapi">Internal 'Simple API':</label></td>
<td><input type="checkbox" class="value" id="simpleapi"/></td>
</tr>
<tr class="defaultUser">
<td><label class="translate" for="defaultUser">Run as:</label></td>
<td><select class="value" id="defaultUser"></select></td>
</tr>
<tr><td colspan="2">&nbsp;</td></tr>
<tr class="le-settings"><td colspan="2"><h3 class="translate">Let's Encrypt settings</h3></tr>
<tr class="le-settings"><td><label for="leEnabled" class="translate">Use Lets Encrypt certificates:</label></td><td><input class="value" id="leEnabled" type="checkbox" /></td></tr>
<tr class="le-settings le-sub-settings"><td><label for="leUpdate" class="translate">Use this instance for automatic update:</label></td><td><input class="value" id="leUpdate" type="checkbox" /></td></tr>
<tr class="le-settings le-sub-settings le-sub-settings-update"><td><label for="lePort" class="translate">Port to check the domain:</label></td><td><input class="value number" id="lePort" type="number" size="5" maxlength="5" /></td></tr>
</table>
</div>
<div id="tabs-2">
<div>
<span><label class="translate" for="whiteListEnabled">Enabled:</label></span><input id="whiteListEnabled" class="value" type="checkbox" />
</div>
<button style="display: inline-block; width: 2em; height: 2em;" onclick="addWhiteListTableRow(true)"
class="ui-button ui-widget ui-state-default ui-corner-all ui-button-icon-only white-list-settings" role="button">
<span class="ui-button-icon-primary ui-icon ui-icon-plus"></span>
<span class="ui-button-text"></span>
</button>
<table id="whiteListTable" cellpadding="3" cellspacing="2" border="0" class="white-list-settings">
<thead>
<tr class="whiteListTableHeader">
<th rowspan="2" colspan="2" class="translate">IP</th>
<th rowspan="2" class="translate">User</th>
<th colspan="4" class="translate">object</th>
<th colspan="5" class="translate">state</th>
<th colspan="5" class="translate">file</th>
</tr>
<tr class="whiteListTableHeader">
<th class="translate">read</th>
<th class="translate">list</th>
<th class="translate">write</th>
<th class="translate">remove</th>
<th class="translate">read</th>
<th class="translate">list</th>
<th class="translate">write</th>
<th class="translate">create</th>
<th class="translate">remove</th>
<th class="translate">read</th>
<th class="translate">list</th>
<th class="translate">write</th>
<th class="translate">create</th>
<th class="translate">remove</th>
</tr>
</thead>
<tbody id="whiteListTableBody">
<tr>
<td class="whiteListTableUnevenBlock delete-btn-clmn"><a class="delete-btn" href="#"><span
class="ui-icon ui-icon-trash"></span></a></td>
<td class="whiteListTableUnevenBlock">default</td>
<td class="whiteListTableUnevenBlock defaultUserName">defaultName</td>
<td class="whiteListTableEvenBlock"><input permobject="object" perm="read" type="checkbox"
checked="true"/></td>
<td class="whiteListTableEvenBlock"><input permobject="object" perm="list" type="checkbox"
checked="true"/></td>
<td class="whiteListTableEvenBlock"><input permobject="object" perm="write" type="checkbox"
checked="true"/></td>
<td class="whiteListTableEvenBlock"><input permobject="object" perm="delete" type="checkbox"
checked="true"/></td>
<td class="whiteListTableUnevenBlock"><input permobject="state" perm="read" type="checkbox"
checked="true"/></td>
<td class="whiteListTableUnevenBlock"><input permobject="state" perm="list" type="checkbox"
checked="true"/></td>
<td class="whiteListTableUnevenBlock"><input permobject="state" perm="write" type="checkbox"
checked="true"/></td>
<td class="whiteListTableUnevenBlock"><input permobject="state" perm="create" type="checkbox"
checked="true"/></td>
<td class="whiteListTableUnevenBlock"><input permobject="state" perm="delete" type="checkbox"
checked="true"/></td>
<td class="whiteListTableEvenBlock"><input permobject="file" perm="read" type="checkbox"
checked="true"/></td>
<td class="whiteListTableEvenBlock"><input permobject="file" perm="list" type="checkbox"
checked="true"/></td>
<td class="whiteListTableEvenBlock"><input permobject="file" perm="write" type="checkbox"
checked="true"/></td>
<td class="whiteListTableEvenBlock"><input permobject="file" perm="create" type="checkbox"
checked="true"/></td>
<td class="whiteListTableEvenBlock"><input permobject="file" perm="delete" type="checkbox"
checked="true"/></td>
</tr>
</tbody>
</table >
</div>
</div>
</div>
</body>
</html>

1087
admin/index_m.html Normal file

File diff suppressed because it is too large Load Diff

BIN
admin/web.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

54
admin/words.js Normal file
View File

@ -0,0 +1,54 @@
// DO NOT EDIT THIS FILE!!! IT WILL BE AUTOMATICALLY GENERATED FROM src/i18n
/*global systemDictionary:true */
'use strict';
systemDictionary = {
"WWW Web Server adapter settings": { "en": "WWW Web Server adapter settings", "de": "WWW Web Server adapter settings", "ru": "WWW Web Server adapter settings", "pt": "Configurações do adaptador do servidor WWW", "nl": "WWW Web Server-adapterinstellingen", "fr": "Paramètres de l'adaptateur de serveur Web WWW", "it": "Impostazioni dell'adattatore del server Web WWW", "es": "Configuración del adaptador del servidor web WWW", "pl": "Ustawienia WWW serwera WWW"},
"Run as:": { "en": "Run as", "de": "Laufen unter Anwender", "ru": "Запустить от пользователя", "pt": "Correr como", "nl": "Rennen als", "fr": "Courir comme", "it": "Correre come", "es": "Correr como", "pl": "Uruchom jako"},
"IP:": { "en": "IP", "de": "IP", "ru": "IP", "pt": "IP", "nl": "IK P", "fr": "IP", "it": "IP", "es": "IP", "pl": "IP"},
"Port:": { "en": "Port", "de": "Port", "ru": "Порт", "pt": "Porta", "nl": "Haven", "fr": "Port", "it": "Porta", "es": "Puerto", "pl": "Port"},
"Secure(HTTPS):": { "en": "Secure(HTTPS)", "de": "Verschlüsselung(HTTPS)", "ru": "Шифрование(HTTPS)", "pt": "Seguro (HTTPS)", "nl": "Secure (HTTPS)", "fr": "Sécurisé (HTTPS)", "it": "Sicuro (HTTPS)", "es": "Seguro (HTTPS)", "pl": "Bezpieczne (HTTPS)"},
"Authentication:": { "en": "Authentication", "de": "Authentifikation", "ru": "Аутентификация", "pt": "Autenticação", "nl": "authenticatie", "fr": "Authentification", "it": "Autenticazione", "es": "Autenticación", "pl": "Poświadczenie"},
"Cache:": { "en": "Cache", "de": "Puffer", "ru": "Кэш", "pt": "Cache", "nl": "Cache", "fr": "Cache", "it": "nascondiglio", "es": "Cache", "pl": "Pamięć podręczna"},
"Warning!": { "en": "Warning!", "de": "Warnung!", "ru": "Предупреждение!", "pt": "Atenção!", "nl": "Waarschuwing!", "fr": "Attention!", "it": "Avvertimento!", "es": "¡Advertencia!", "pl": "Ostrzeżenie!"},
"Background": { "en": "Background", "de": "Hintergrund", "ru": "Фон", "pt": "Fundo", "nl": "Achtergrond", "fr": "Contexte", "it": "Sfondo", "es": "Fondo", "pl": "Tło"},
"Background color of the login screen": { "en": "Background color of the login screen", "de": "Hintergrundfarbe des Anmeldebildschirms", "ru": "Цвет фона экрана входа в систему", "pt": "Cor de fundo da tela de login", "nl": "Achtergrondkleur van het inlogscherm", "fr": "Couleur d'arrière-plan de l'écran de connexion", "it": "Colore di sfondo della schermata di accesso", "es": "Color de fondo de la pantalla de inicio de sesión", "pl": "Kolor tła ekranu logowania"},
"Background image": { "en": "Background image", "de": "Hintergrundbild", "ru": "Фоновое изображение", "pt": "Imagem de fundo", "nl": "Achtergrond afbeelding", "fr": "Image de fond", "it": "Immagine di sfondo", "es": "Imagen de fondo", "pl": "Zdjęcie w tle"},
"Upload image": { "en": "Upload image", "de": "Bild hochladen", "ru": "Загрузить изображение", "pt": "Enviar Imagem", "nl": "Afbeelding uploaden", "fr": "Importer une image", "it": "Carica immagine", "es": "Cargar imagen", "pl": "Załaduj obrazek"},
"Enabled:": { "en": "Enabled", "de": "Aktiviert", "ru": "Включено", "pt": "Ativado", "nl": "Ingeschakeld", "fr": "Activée", "it": "Abilitato", "es": "Habilitado", "pl": "Włączone"},
"Unsecure_Auth": { "en": "The password will be sent via unsecure connection. To protect your passwords enable the secure connection (HTTPS)!", "de": "Das Passwort wird über unsichere Verbindung gesendet. Um Ihre Passwörter zu schützen, aktivieren Sie die sichere Verbindung (HTTPS)!", "ru": "Пароль будет отправлен через незащищенное соединение. Для защиты ваших паролей активируйте безопасное соединение (HTTPS)!", "pt": "A senha será enviada por meio de conexão não segura. Para proteger suas senhas, ative a conexão segura (HTTPS)!", "nl": "Het wachtwoord wordt verzonden via onbeveiligde verbinding. Ter beveiliging van uw wachtwoorden schakelt u de beveiligde verbinding (HTTPS) in!", "fr": "Le mot de passe sera envoyé via une connexion non sécurisée. Pour protéger vos mots de passe, activez la connexion sécurisée (HTTPS)!", "it": "La password verrà inviata tramite connessione non protetta. Per proteggere le tue password abilita la connessione sicura (HTTPS)!", "es": "La contraseña se enviará a través de una conexión no segura. Para proteger sus contraseñas, ¡habilite la conexión segura (HTTPS)!", "pl": "Hasło zostanie wysłane przez połączenie bez zabezpieczeń. Aby chronić swoje hasła, włącz bezpieczne połączenie (HTTPS)!"},
"Login timeout(sec):": { "en": "Login timeout(sec)", "de": "Anmelde-Timeout (Sek.)", "ru": "Тайм-аут входа (сек)", "pt": "Tempo limite de login (seg)", "nl": "Aanmeld-time-out (sec)", "fr": "Délai d'attente de connexion (sec)", "it": "Timeout di accesso (sec)", "es": "Tiempo de espera de inicio de sesión (sec)", "pl": "Limit czasu logowania (s)"},
"IP": { "en": "IP", "de": "IP", "ru": "IP", "pt": "IP", "nl": "IP", "fr": "IP", "it": "IP", "es": "IP", "pl": "IP"},
"none": { "en": "none", "de": "keins", "ru": "none", "pt": "Nenhum", "nl": "geen", "fr": "aucun", "it": "nessuna", "es": "ninguna", "pl": "Żaden"},
"Ignore warning": { "en": "Ignore warning", "de": "Warnung ignorieren", "ru": "Игнорировать предупреждение", "pt": "Ignorar aviso", "nl": "Negeer waarschuwing", "fr": "Ignorer l'avertissement", "it": "Ignora l'avviso", "es": "Ignorar advertencia", "pl": "Zignoruj ostrzeżenie"},
"place here": { "en": "place the files here", "de": "Platziere die Dateien hier", "ru": "разместите файлы здесь", "pt": "coloque os arquivos aqui", "nl": "plaats de bestanden hier", "fr": "Placez les fichiers ici", "it": "posiziona i file qui", "es": "coloca los archivos aquí", "pl": "umieść pliki tutaj"},
"Disable authentication": { "en": "Disable authentication", "de": "Authentifizierung deaktivieren", "ru": "Отключить аутентификацию", "pt": "Desativar autenticação", "nl": "Schakel verificatie uit", "fr": "Désactiver l'authentification", "it": "Disabilitare l'autenticazione", "es": "Deshabilitar autenticación", "pl": "Wyłącz uwierzytelnianie"},
"Authentication was deactivated": { "en": "Authentication was deactivated", "de": "Die Authentifizierung wurde deaktiviert", "ru": "Аутентификация была отключена", "pt": "A autenticação foi desativada", "nl": "Verificatie was gedeactiveerd", "fr": "L'authentification a été désactivée", "it": "L'autenticazione è stata disattivata", "es": "La autenticación fue desactivada", "pl": "Uwierzytelnianie zostało dezaktywowane"},
"integrated": { "en": "integrated", "de": "integriert", "ru": "встроенный", "pt": "integrado", "nl": "geïntegreerde", "fr": "intégré", "it": "integrato", "es": "integrado", "pl": "zintegrowany"},
"Public certificate:": { "en": "Public certificate", "de": "Publikzertifikat", "ru": "'Public' сертификат", "pt": "Certificado público", "nl": "Openbaar certificaat", "fr": "Certificat public", "it": "Certificato pubblico", "es": "Certificado público", "pl": "Certyfikat publiczny"},
"Private certificate:": { "en": "Private certificate", "de": "Privatzertifikat", "ru": "'Private' сертификат", "pt": "Certificado privado", "nl": "Privé certificaat", "fr": "Certificat privé", "it": "Certificato privato", "es": "Certificado privado", "pl": "Prywatny certyfikat"},
"Chained certificate:": { "en": "Chained certificate", "de": "Kettenzertifikat", "ru": "'Chained' сертификат", "pt": "Certificado acorrentado", "nl": "Geketend certificaat", "fr": "Certificat chaîné", "it": "Certificato incatenato", "es": "Certificado encadenado", "pl": "Przykuty certyfikat"},
"Force Web-Sockets:": { "en": "Force Web-Sockets", "de": "Nur Web-Sockets", "ru": "Только Web-Sockets", "pt": "Forçar Web-Sockets", "nl": "Force Web-Sockets", "fr": "Forcer les Web-Sockets", "it": "Force Web-Sockets", "es": "Force Web-Sockets", "pl": "Wymuszaj gniazda internetowe"},
"Internal 'Simple API':": { "en": "Build-in 'Simple-API'", "de": "Eingebautes 'Simple-API'", "ru": "Встроенный 'Simple-API'", "pt": "Build-in 'Simple-API'", "nl": "Ingebouwde 'Simple-API'", "fr": "Construire 'Simple-API'", "it": "Build-in 'Simple-API'", "es": "Build-in 'Simple-API'", "pl": "Wbuduj \"Proste API\""},
"Listen on all IPs": { "en": "Listen on all IPs", "de": "Alle IPs zulassen", "ru": "Открыть для всех IP адресов", "pt": "Ouça todos os IPs", "nl": "Luister op alle IP's", "fr": "Écoutez sur toutes les adresses IP", "it": "Ascolta su tutti gli IP", "es": "Escuchar en todas las direcciones IP", "pl": "Posłuchaj na wszystkich IP"},
"Let's Encrypt settings": { "en": "Let's Encrypt settings", "de": "Einstellungen Let's Encrypt", "ru": "Настройкт Let's Encrypt", "pt": "Vamos criptografar configurações", "nl": "Laten we de instellingen versleutelen", "fr": "Cryptons les paramètres", "it": "Let's Encrypt settings", "es": "Vamos a cifrar la configuración", "pl": "Zakodujmy ustawienia"},
"Use Lets Encrypt certificates:": { "en": "Use Let's Encrypt certificates", "de": "Benutzen Let's Encrypt Zertifikate", "ru": "Использовать сертификаты Let's Encrypt", "pt": "Use Vamos criptografar certificados", "nl": "Gebruik Let's Encrypt-certificaten", "fr": "Utiliser les certificats Let's Encrypt", "it": "Utilizza Let's Encrypt certificates", "es": "Utilice los certificados Let's Encrypt", "pl": "Użyj Let's Encrypt certificates"},
"Use this instance for automatic update:": { "en": "Use this instance for automatic update", "de": "Benutze diese Instanz für automatische Updates", "ru": "Обновлять сертификаты в этом драйвере", "pt": "Use esta instância para atualização automática", "nl": "Gebruik deze instantie voor automatische update", "fr": "Utilisez cette instance pour la mise à jour automatique", "it": "Utilizza questa istanza per l'aggiornamento automatico", "es": "Use esta instancia para la actualización automática", "pl": "Użyj tej instancji do automatycznej aktualizacji"},
"Port to check the domain:": { "en": "Port to check the domain", "de": "Port um die Domain zu prüfen", "ru": "Порт для проверки доменного имени", "pt": "Porta para verificar o domínio", "nl": "Poort om het domein te controleren", "fr": "Port pour vérifier le domaine", "it": "Porta per controllare il dominio", "es": "Puerto para verificar el dominio", "pl": "Port do sprawdzenia domeny"},
"Set certificates or load it first in the system settings (right top).": {"en": "Set certificates or load it first in the system settings (right top).", "de": "Setze Zertificate oder lade die erst unter System/Einstellungen (oben rechts).", "ru": "Нужно выбрать сертификаты или сначала загрузить их в системных настройках (вверху справа).", "pt": "Defina certificados ou carregue primeiro nas configurações do sistema (parte superior direita).", "nl": "Stel certificaten in of laad het eerst in de systeeminstellingen (rechtsboven).", "fr": "Définissez des certificats ou chargez-les d'abord dans les paramètres du système (en haut à droite).", "it": "Imposta i certificati o caricali prima nelle impostazioni di sistema (in alto a destra).", "es": "Establezca certificados o cárguelos primero en la configuración del sistema (arriba a la derecha).", "pl": "Ustaw certyfikaty lub załaduj najpierw w ustawieniach systemu (prawy górny)."},
"socket_help": { "en": "Used by adapters like rickshaw or vis", "de": "Wird von Rickshaw oder Vis benutzt", "ru": "Используется для Rickshaw или Vis", "pt": "Usado por adaptadores como rickshaw ou vis", "nl": "Gebruikt door adapters zoals riksja of vis", "fr": "Utilisé par des adaptateurs comme le pousse-pousse ou vis", "it": "Utilizzato da adattatori come risciò o vis", "es": "Utilizado por adaptadores como rickshaw o vis", "pl": "Używany przez adaptery takie jak riksza lub vis"},
"Web Server adapter settings": { "en": "Web Server adapter settings", "de": "Web Server Adapter Einstellungen", "ru": "Настройки драйвера Web-Сервер", "pt": "Configurações do adaptador do servidor Web", "nl": "Web Server-adapterinstellingen", "fr": "Paramètres de l'adaptateur de serveur Web", "it": "Impostazioni dell'adattatore server Web", "es": "Configuración del adaptador del servidor web", "pl": "Ustawienia adaptera sieci Web"},
"Socket.IO Instance (Optional):": { "en": "Socket.IO Instance (Optional)", "de": "Socket.IO Instanz (Optional)", "ru": "Socket.IO (опционально)", "pt": "Instância Socket.IO (Opcional)", "nl": "Socket.IO-instantie (optioneel)", "fr": "Socket.IO Instance (facultatif)", "it": "Istanza Socket.IO (opzionale)", "es": "Instancia Socket.IO (Opcional)", "pl": "Instancja Socket.IO (opcjonalnie)"},
"The provided IP is not valid": { "en": "The provided IP is not valid", "de": "Die angegebene IP-Adresse ist ungültig", "ru": "Неверный IP-адрес", "pt": "O IP fornecido não é válido", "nl": "Het opgegeven IP-adres is niet geldig", "fr": "L'adresse IP fournie n'est pas valide", "it": "L'IP fornito non è valido", "es": "El IP proporcionado no es válido", "pl": "Podany adres IP jest nieprawidłowy"},
"General": { "en": "General", "de": "Allgemein", "ru": "Общие", "pt": "Geral", "nl": "Algemeen", "fr": "Général", "it": "Generale", "es": "General", "pl": "Generał"},
"White List": { "en": "White List", "de": "Weisse Liste", "ru": "Белый список", "pt": "Lista Branca", "nl": "Witte lijst", "fr": "Liste blanche", "it": "Lista bianca", "es": "Lista blanca", "pl": "Biała lista"},
"User": { "en": "User", "de": "Benutzer", "ru": "Пользователь", "pt": "Do utilizador", "nl": "Gebruiker", "fr": "Utilisateur", "it": "Utente", "es": "Usuario", "pl": "Użytkownik"},
"object": { "en": "object", "de": "Objekt", "ru": "объект", "pt": "objeto", "nl": "voorwerp", "fr": "objet", "it": "oggetto", "es": "objeto", "pl": "obiekt"},
"state": { "en": "state", "de": "Status", "ru": "статус", "pt": "Estado", "nl": "staat", "fr": "Etat", "it": "stato", "es": "estado", "pl": "stan"},
"file": { "en": "file", "de": "Datei", "ru": "файл", "pt": "Arquivo", "nl": "het dossier", "fr": "fichier", "it": "file", "es": "archivo", "pl": "plik"},
"read": { "en": "read", "de": "lesen", "ru": "читать", "pt": "ler", "nl": "lezen", "fr": "lis", "it": "leggere", "es": "leer", "pl": "czytać"},
"list": { "en": "list", "de": "auflisten", "ru": "список", "pt": "Lista", "nl": "lijst", "fr": "liste", "it": "elenco", "es": "lista", "pl": "lista"},
"write": { "en": "wrire", "de": "schreiben", "ru": "писать", "pt": "wrire", "nl": "wrire", "fr": "écrire", "it": "wrire", "es": "wrire", "pl": "wrire"},
"create": { "en": "create", "de": "anlegen", "ru": "создать", "pt": "crio", "nl": "creëren", "fr": "créer", "it": "creare", "es": "crear", "pl": "Stwórz"},
"remove": { "en": "delete", "de": "löschen", "ru": "удалить", "pt": "excluir", "nl": "verwijderen", "fr": "effacer", "it": "Elimina", "es": "borrar", "pl": "kasować"}
};

25
appveyor.yml Normal file
View File

@ -0,0 +1,25 @@
version: 'test-{build}'
environment:
matrix:
- nodejs_version: '4'
- nodejs_version: '6'
- nodejs_version: '8'
- nodejs_version: '10'
platform:
- x86
- x64
clone_folder: 'c:\projects\%APPVEYOR_PROJECT_NAME%'
install:
- ps: 'Install-Product node $env:nodejs_version $env:platform'
- ps: '$NpmVersion = (npm -v).Substring(0,1)'
- ps: 'if($NpmVersion -eq 5) { npm install -g npm@5 }'
- ps: npm --version
- npm install
- npm install winston@2.3.1
- 'npm install https://git.spacen.net/yunkong2/yunkong2.js-controller/tarball/master --production'
test_script:
- echo %cd%
- node --version
- npm --version
- npm test
build: 'off'

401
gulpfile.js Normal file
View File

@ -0,0 +1,401 @@
'use strict';
var gulp = require('gulp');
var fs = require('fs');
var pkg = require('./package.json');
var iopackage = require('./io-package.json');
var version = (pkg && pkg.version) ? pkg.version : iopackage.common.version;
/*var appName = getAppName();
function getAppName() {
var parts = __dirname.replace(/\\/g, '/').split('/');
return parts[parts.length - 1].split('.')[0].toLowerCase();
}
*/
const fileName = 'words.js';
var languages = {
en: {},
de: {},
ru: {},
pt: {},
nl: {},
fr: {},
it: {},
es: {},
pl: {}
};
function lang2data(lang, isFlat) {
var str = isFlat ? '' : '{\n';
var count = 0;
for (var w in lang) {
if (lang.hasOwnProperty(w)) {
count++;
if (isFlat) {
str += (lang[w] === '' ? (isFlat[w] || w) : lang[w]) + '\n';
} else {
var key = ' "' + w.replace(/"/g, '\\"') + '": ';
str += key + '"' + lang[w].replace(/"/g, '\\"') + '",\n';
}
}
}
if (!count) return isFlat ? '' : '{\n}';
if (isFlat) {
return str;
} else {
return str.substring(0, str.length - 2) + '\n}';
}
}
function readWordJs(src) {
try {
var words;
if (fs.existsSync(src + 'js/' + fileName)) {
words = fs.readFileSync(src + 'js/' + fileName).toString();
} else {
words = fs.readFileSync(src + fileName).toString();
}
var lines = words.split(/\r\n|\r|\n/g);
var i = 0;
while (!lines[i].match(/^systemDictionary = {/)) {
i++;
}
lines.splice(0, i);
// remove last empty lines
i = lines.length - 1;
while (!lines[i]) {
i--;
}
if (i < lines.length - 1) {
lines.splice(i + 1);
}
lines[0] = lines[0].replace('systemDictionary = ', '');
lines[lines.length - 1] = lines[lines.length - 1].trim().replace(/};$/, '}');
words = lines.join('\n');
var resultFunc = new Function('return ' + words + ';');
return resultFunc();
} catch (e) {
return null;
}
}
function padRight(text, totalLength) {
return text + (text.length < totalLength ? new Array(totalLength - text.length).join(' ') : '');
}
function writeWordJs(data, src) {
var text = '// DO NOT EDIT THIS FILE!!! IT WILL BE AUTOMATICALLY GENERATED FROM src/i18n\n';
text += '/*global systemDictionary:true */\n';
text += '\'use strict\';\n\n';
text += 'systemDictionary = {\n';
for (var word in data) {
if (data.hasOwnProperty(word)) {
text += ' ' + padRight('"' + word.replace(/"/g, '\\"') + '": {', 50);
var line = '';
for (var lang in data[word]) {
if (data[word].hasOwnProperty(lang)) {
line += '"' + lang + '": "' + padRight(data[word][lang].replace(/"/g, '\\"') + '",', 50) + ' ';
}
}
if (line) {
line = line.trim();
line = line.substring(0, line.length - 1);
}
text += line + '},\n';
}
}
text = text.replace(/},\n$/, '}\n');
text += '};';
if (fs.existsSync(src + 'js/' + fileName)) {
fs.writeFileSync(src + 'js/' + fileName, text);
} else {
fs.writeFileSync(src + '' + fileName, text);
}
}
const EMPTY = '';
function words2languages(src) {
var langs = Object.assign({}, languages);
var data = readWordJs(src);
if (data) {
for (var word in data) {
if (data.hasOwnProperty(word)) {
for (var lang in data[word]) {
if (data[word].hasOwnProperty(lang)) {
langs[lang][word] = data[word][lang];
// pre-fill all other languages
for (var j in langs) {
if (langs.hasOwnProperty(j)) {
langs[j][word] = langs[j][word] || EMPTY;
}
}
}
}
}
}
if (!fs.existsSync(src + 'i18n/')) {
fs.mkdirSync(src + 'i18n/');
}
for (var l in langs) {
if (!langs.hasOwnProperty(l)) continue;
var keys = Object.keys(langs[l]);
//keys.sort();
var obj = {};
for (var k = 0; k < keys.length; k++) {
obj[keys[k]] = langs[l][keys[k]];
}
if (!fs.existsSync(src + 'i18n/' + l)) {
fs.mkdirSync(src + 'i18n/' + l);
}
fs.writeFileSync(src + 'i18n/' + l + '/translations.json', lang2data(obj));
}
} else {
console.error('Cannot read or parse ' + fileName);
}
}
function words2languagesFlat(src) {
var langs = Object.assign({}, languages);
var data = readWordJs(src);
if (data) {
for (var word in data) {
if (data.hasOwnProperty(word)) {
for (var lang in data[word]) {
if (data[word].hasOwnProperty(lang)) {
langs[lang][word] = data[word][lang];
// pre-fill all other languages
for (var j in langs) {
if (langs.hasOwnProperty(j)) {
langs[j][word] = langs[j][word] || EMPTY;
}
}
}
}
}
}
var keys = Object.keys(langs.en);
//keys.sort();
for (var l in langs) {
if (!langs.hasOwnProperty(l)) continue;
var obj = {};
for (var k = 0; k < keys.length; k++) {
obj[keys[k]] = langs[l][keys[k]];
}
langs[l] = obj;
}
if (!fs.existsSync(src + 'i18n/')) {
fs.mkdirSync(src + 'i18n/');
}
for (var ll in langs) {
if (!langs.hasOwnProperty(ll)) continue;
if (!fs.existsSync(src + 'i18n/' + ll)) {
fs.mkdirSync(src + 'i18n/' + ll);
}
fs.writeFileSync(src + 'i18n/' + ll + '/flat.txt', lang2data(langs[ll], langs.en));
}
fs.writeFileSync(src + 'i18n/flat.txt', keys.join('\n'));
} else {
console.error('Cannot read or parse ' + fileName);
}
}
function languagesFlat2words(src) {
var dirs = fs.readdirSync(src + 'i18n/');
var langs = {};
var bigOne = {};
var order = Object.keys(languages);
dirs.sort(function (a, b) {
var posA = order.indexOf(a);
var posB = order.indexOf(b);
if (posA === -1 && posB === -1) {
if (a > b) return 1;
if (a < b) return -1;
return 0;
} else if (posA === -1) {
return -1;
} else if (posB === -1) {
return 1;
} else {
if (posA > posB) return 1;
if (posA < posB) return -1;
return 0;
}
});
var keys = fs.readFileSync(src + 'i18n/flat.txt').toString().split('\n');
for (var l = 0; l < dirs.length; l++) {
if (dirs[l] === 'flat.txt') continue;
var lang = dirs[l];
var values = fs.readFileSync(src + 'i18n/' + lang + '/flat.txt').toString().split('\n');
langs[lang] = {};
keys.forEach(function (word, i) {
langs[lang][word] = values[i].replace(/<\/ i>/g, '</i>').replace(/<\/ b>/g, '</b>').replace(/<\/ span>/g, '</span>').replace(/% s/g, ' %s');
});
var words = langs[lang];
for (var word in words) {
if (words.hasOwnProperty(word)) {
bigOne[word] = bigOne[word] || {};
if (words[word] !== EMPTY) {
bigOne[word][lang] = words[word];
}
}
}
}
// read actual words.js
var aWords = readWordJs();
var temporaryIgnore = ['pt', 'fr', 'nl', 'flat.txt'];
if (aWords) {
// Merge words together
for (var w in aWords) {
if (aWords.hasOwnProperty(w)) {
if (!bigOne[w]) {
console.warn('Take from actual words.js: ' + w);
bigOne[w] = aWords[w]
}
dirs.forEach(function (lang) {
if (temporaryIgnore.indexOf(lang) !== -1) return;
if (!bigOne[w][lang]) {
console.warn('Missing "' + lang + '": ' + w);
}
});
}
}
}
writeWordJs(bigOne, src);
}
function languages2words(src) {
var dirs = fs.readdirSync(src + 'i18n/');
var langs = {};
var bigOne = {};
var order = Object.keys(languages);
dirs.sort(function (a, b) {
var posA = order.indexOf(a);
var posB = order.indexOf(b);
if (posA === -1 && posB === -1) {
if (a > b) return 1;
if (a < b) return -1;
return 0;
} else if (posA === -1) {
return -1;
} else if (posB === -1) {
return 1;
} else {
if (posA > posB) return 1;
if (posA < posB) return -1;
return 0;
}
});
for (var l = 0; l < dirs.length; l++) {
if (dirs[l] === 'flat.txt') continue;
var lang = dirs[l];
langs[lang] = fs.readFileSync(src + 'i18n/' + lang + '/translations.json').toString();
langs[lang] = JSON.parse(langs[lang]);
var words = langs[lang];
for (var word in words) {
if (words.hasOwnProperty(word)) {
bigOne[word] = bigOne[word] || {};
if (words[word] !== EMPTY) {
bigOne[word][lang] = words[word];
}
}
}
}
// read actual words.js
var aWords = readWordJs();
var temporaryIgnore = ['pt', 'fr', 'nl', 'it'];
if (aWords) {
// Merge words together
for (var w in aWords) {
if (aWords.hasOwnProperty(w)) {
if (!bigOne[w]) {
console.warn('Take from actual words.js: ' + w);
bigOne[w] = aWords[w]
}
dirs.forEach(function (lang) {
if (temporaryIgnore.indexOf(lang) !== -1) return;
if (!bigOne[w][lang]) {
console.warn('Missing "' + lang + '": ' + w);
}
});
}
}
}
writeWordJs(bigOne, src);
}
gulp.task('adminWords2languages', function (done) {
words2languages('./admin/');
done();
});
gulp.task('adminWords2languagesFlat', function (done) {
words2languagesFlat('./admin/');
done();
});
gulp.task('adminLanguagesFlat2words', function (done) {
languagesFlat2words('./admin/');
done();
});
gulp.task('adminLanguages2words', function (done) {
languages2words('./admin/');
done();
});
gulp.task('updatePackages', function (done) {
iopackage.common.version = pkg.version;
iopackage.common.news = iopackage.common.news || {};
if (!iopackage.common.news[pkg.version]) {
var news = iopackage.common.news;
var newNews = {};
newNews[pkg.version] = {
en: 'news',
de: 'neues',
ru: 'новое'
};
iopackage.common.news = Object.assign(newNews, news);
}
fs.writeFileSync('io-package.json', JSON.stringify(iopackage, null, 4));
done();
});
gulp.task('updateReadme', function (done) {
var readme = fs.readFileSync('README.md').toString();
var pos = readme.indexOf('## Changelog\n');
if (pos !== -1) {
var readmeStart = readme.substring(0, pos + '## Changelog\n'.length);
var readmeEnd = readme.substring(pos + '## Changelog\n'.length);
if (readme.indexOf(version) === -1) {
var timestamp = new Date();
var date = timestamp.getFullYear() + '-' +
('0' + (timestamp.getMonth() + 1).toString(10)).slice(-2) + '-' +
('0' + (timestamp.getDate()).toString(10)).slice(-2);
var news = '';
if (iopackage.common.news && iopackage.common.news[pkg.version]) {
news += '* ' + iopackage.common.news[pkg.version].en;
}
fs.writeFileSync('README.md', readmeStart + '### ' + version + ' (' + date + ')\n' + (news ? news + '\n\n' : '\n') + readmeEnd);
}
}
done();
});
gulp.task('default', ['updatePackages', 'updateReadme']);

224
io-package.json Normal file
View File

@ -0,0 +1,224 @@
{
"common": {
"name": "web",
"version": "2.4.1",
"title": "WEB server",
"titleLang": {
"en": "WEB server",
"de": "WEB-Server",
"ru": "Веб сервер",
"pt": "Servidor web",
"nl": "Web Server",
"fr": "Serveur Web",
"it": "Server web",
"es": "Servidor web",
"pl": "Serwer internetowy"
},
"news": {
"2.4.1": {
"en": "The support of the versioned links to adapter was added\nWhiteList was corrected\nCustom login background is supported",
"de": "Die Unterstützung der versionierten Links zum Adapter wurde hinzugefügt\nWhiteList wurde korrigiert\nBenutzerdefinierter Login-Hintergrund wird unterstützt",
"ru": "Добавлена ​​поддержка версий, связанных с адаптером.\nWhiteList был исправлен\nПользовательский фоновый вход поддерживается",
"pt": "O suporte dos links com versão para o adaptador foi adicionado\nWhiteList foi corrigido\nFundo de login personalizado é suportado",
"nl": "De ondersteuning van de versie-links naar adapter is toegevoegd\nWhiteList is gecorrigeerd\nAangepaste inlogachtergrond wordt ondersteund",
"fr": "Le support des liens versionnés vers l'adaptateur a été ajouté\nWhiteList a été corrigé\nLe fond de connexion personnalisé est pris en charge",
"it": "È stato aggiunto il supporto dei collegamenti con versione all'adattatore\nWhiteList è stato corretto\nLo sfondo di login personalizzato è supportato",
"es": "Se agregó el soporte de los enlaces versionados al adaptador\nWhiteList fue corregido\nSe admite el fondo de inicio de sesión personalizado",
"pl": "Dodano wsparcie dla wersjonowanych łączy do adaptera\nWhiteList został poprawiony\nNiestandardowe tło logowania jest obsługiwane"
},
"2.4.0": {
"en": "Pre-settings for instances now supported",
"de": "Voreinstellungen für Instanzen werden jetzt unterstützt",
"ru": "Предварительные настройки для поддерживаемых экземпляров",
"pt": "Pré-configurações para instâncias agora suportadas",
"nl": "Pre-instellingen voor exemplaren die nu worden ondersteund",
"fr": "Pré-réglages pour les instances maintenant supportées",
"it": "Le preimpostazioni per le istanze ora supportate",
"es": "Pre-configuraciones para instancias ahora compatibles",
"pl": "Wstępne ustawienia instancji są teraz obsługiwane"
},
"2.3.6": {
"en": "URLs were sanitized",
"de": "URLs wurden bereinigt",
"ru": "URL-адреса были дезинфицированы",
"pt": "URLs foram higienizados",
"nl": "URL's zijn ontsmet",
"fr": "Les URL ont été nettoyées",
"it": "Gli URL sono stati disinfettati",
"es": "Las URL se desinfectaron",
"pl": "Adresy URL zostały odkażone"
},
"2.3.5": {
"en": "Socket.io version 2.1.1 was used\nAuthentication problem was fixed",
"de": "Socket.io Version 2.1.1 wurde verwendet\nAuthentifizierungsproblem wurde behoben",
"ru": "Использовалась версия 2.1.1 Socket.io\nИсправлена ​​проблема аутентификации",
"pt": "Socket.io versão 2.1.1 foi usado\nProblema de autenticação foi corrigido",
"nl": "Socket.io versie 2.1.1 werd gebruikt\nVerificatieprobleem is opgelost",
"fr": "Socket.io version 2.1.1 a été utilisé\nLe problème d'authentification a été corrigé",
"it": "È stato utilizzato Socket.io versione 2.1.1\nIl problema di autenticazione è stato risolto",
"es": "Se utilizó la versión 2.1.1 de Socket.io\nSe corrigió el problema de autenticación",
"pl": "Użyto wersji Socket.io 2.1.1\nNaprawiono problem z uwierzytelnianiem"
},
"2.3.4": {
"en": "Used socket.io version 1.7.4",
"de": "Gebrauchte socket.io Version 1.7.4",
"ru": "Используется версия socket.io 1.7.4",
"pt": "Usado socket.io versão 1.7.4",
"nl": "Gebruikte socket.io-versie 1.7.4",
"fr": "Version socket.io utilisée 1.7.4",
"it": "Usato socket.io versione 1.7.4",
"es": "Utiliza socket.io versión 1.7.4",
"pl": "Używana wersja socket.io 1.7.4"
},
"2.3.3": {
"en": "Fixing the new version of socket.io",
"de": "Fixieren der neuen Version von socket.io",
"ru": "Фиксация новой версии socket.io",
"pt": "Corrigindo a nova versão do socket.io",
"nl": "De nieuwe versie van socket.io herstellen",
"fr": "Correction de la nouvelle version de socket.io",
"it": "Correggere la nuova versione di socket.io",
"es": "Se corrigió la nueva versión de socket.io",
"pl": "Naprawianie nowej wersji pliku socket.io"
},
"2.3.2": {
"en": "fixed select ID dialog for old style",
"de": "Auswahldialog für alten Stil korrigiert",
"ru": "поправлен диалог выбора ID для старого стиля",
"pt": "Diálogo de ID de seleção fixa para estilo antigo",
"nl": "vast select-ID-dialoogvenster voor oude stijl",
"fr": "boîte de dialogue fixe de sélection d'identifiant pour le style ancien",
"it": "corretto selezionare la finestra di dialogo ID per vecchio stile",
"es": "dialogo de selección de ID fijo para el viejo estilo",
"pl": "poprawiono okno dialogowe wyboru ID dla starego stylu"
},
"2.3.1": {
"en": "Updated socket.io version to 2.1.0",
"de": "Die Version von socket.io wurde auf 2.1.0 aktualisiert",
"ru": "Обновлена ​​версия socket.io до версии 2.1.0",
"pt": "Versão atualizada do socket.io para 2.1.0",
"nl": "Nieuwe socket.io-versie bijgewerkt naar 2.1.0",
"fr": "Mise à jour de la version socket.io vers la version 2.1.0",
"it": "Versione aggiornata di socket.io alla versione 2.1.0",
"es": "Versión actualizada de socket.io a 2.1.0",
"pl": "Zaktualizowana wersja pliku socket.io do wersji 2.1.0"
},
"2.3.0": {
"en": "The required for Admin3 libraries are added",
"de": "Die für Admin3 erforderlichen Bibliotheken werden hinzugefügt",
"ru": "Добавлены необходимые для Admin3 библиотеки",
"pt": "O necessário para as bibliotecas Admin3 são adicionados",
"nl": "De vereiste voor Admin3-bibliotheken worden toegevoegd",
"fr": "Les requis pour les bibliothèques Admin3 sont ajoutés",
"it": "Il richiesto per le librerie Admin3 è stato aggiunto",
"es": "Se requiere lo necesario para las bibliotecas de Admin3",
"pl": "Wymagane dla bibliotek Admin3 zostały dodane"
},
"2.2.0": {
"en": "Ready for Admin3",
"de": "Bereit für Admin3",
"ru": "Готово для Admin3",
"pt": "Pronto para Admin3",
"nl": "Klaar voor Admin3",
"fr": "Prêt pour Admin3",
"it": "Pronto per Admin3",
"es": "Listo para Admin3",
"pl": "Gotowy na Admin3"
},
"2.1.9": {
"en": "Fix tiles on welcome screen",
"de": "Korrigiere Kacheln auf dem Welcome Screen",
"ru": "Поправлены иконки на welcome странице"
}
},
"desc": {
"en": "opens a webserver for other adapters",
"de": "Stellt webserver für 'yunkong2 Adapter' zur Verfügung",
"ru": "Запускает веб сервер для 'yunkong2 драйверов'",
"pt": "abre um servidor web para outros adaptadores",
"nl": "opent een webserver voor andere adapters",
"fr": "ouvre un serveur web pour d'autres adaptateurs",
"it": "apre un server web per altri adattatori",
"es": "abre un servidor web para otros adaptadores",
"pl": "otwiera serwer internetowy dla innych kart"
},
"mode": "daemon",
"platform": "Javascript/Node.js",
"loglevel": "info",
"icon": "web.png",
"readme": "https://git.spacen.net/yunkong2/yunkong2.web/blob/master/README.md",
"enabled": true,
"materialize": true,
"keywords": [
"web",
"server",
"www",
"express"
],
"extIcon": "https://git.spacen.net/yunkong2/yunkong2.web/master/admin/web.png",
"type": "general",
"stopBeforeUpdate": true,
"webExtendable": true,
"localLink": "%web_protocol%://%ip%:%web_port%/",
"dependencies": [
{
"js-controller": ">=0.12.0"
}
],
"authors": [
{
"name": "bluefox",
"email": "dogafox@gmail.com"
}
]
},
"native": {
"port": 8082,
"auth": false,
"secure": false,
"bind": "0.0.0.0",
"cache": false,
"socketio": "",
"simpleapi": false,
"defaultUser": "admin",
"ttl": 3600,
"certPublic": "",
"certPrivate": "",
"certChained": "",
"addUserName": false,
"forceWebSockets": false,
"whiteListEnabled": false,
"leEnabled": false,
"leUpdate": false,
"leCheckPort": 80,
"loginBackgroundColor": "",
"loginBackgroundImage": false
},
"objects": [
{
"_id": "connected",
"type": "info",
"common": {
"name": "Info about connected socket clients",
"type": "string",
"read": true,
"write": false
}
}
],
"instanceObjects": [
{
"_id": "",
"type": "meta",
"common": {
"name": "user files and images for background image",
"type": "meta.user"
},
"native": {}
}
]
}

110
lib/passport.socketio.js Normal file
View File

@ -0,0 +1,110 @@
'use strict';
const xtend = require('xtend');
function parseCookie(auth, cookieHeader) {
const cookieParser = auth.cookieParser(auth.secret);
const req = {
headers:{
cookie: cookieHeader
}
};
let result;
cookieParser(req, {}, err => {
if (err) throw err;
result = req.signedCookies || req.cookies;
});
return result;
}
function authorize(options) {
const defaults = {
passport: require('passport'),
key: 'connect.sid',
secret: null,
store: null,
success: (data, accept) => {
if (data.socketio_version_1) {
accept();
} else {
accept(null, true);
}
},
fail: (data, message, critical, accept) => {
if (data.socketio_version_1) {
accept(new Error(message));
} else {
accept(null, false);
}
}
};
const auth = xtend(defaults, options);
auth.userProperty = auth.passport._userProperty || 'user';
if (!auth.cookieParser) {
throw new Error('cookieParser is required use connect.cookieParser or express.cookieParser');
}
return function (data, accept) {
// socket.io v1.0 now provides socket handshake data via `socket.request`
if (data.request) {
data = data.request;
data.socketio_version_1 = true;
}
data.cookie = parseCookie(auth, data.headers.cookie || '');
data.sessionID = (data.query && data.query.session_id) || data.cookie[auth.key] || '';
data[auth.userProperty] = {
logged_in: false
};
if (data.xdomain && !data.sessionID) {
return auth.fail(data, 'Can not read cookies from CORS-Requests. See CORS-Workaround in the readme.', false, accept);
}
auth.store.get(data.sessionID, (err, session) => {
if (err) {
return auth.fail(data, 'Error in session store:\n' + err.message, true, accept);
} else
if (!session) {
return auth.fail(data, 'No session found', false, accept);
} else
if (!session[auth.passport._key]) {
return auth.fail(data, 'Passport was not initialized', true, accept);
}
const userKey = session[auth.passport._key][auth.userProperty];
if (!userKey) {
return auth.fail(data, 'User not authorized through passport. (User Property not found)', false, accept);
}
// Because of authentication error removed
/*auth.passport.deserializeUser(userKey, function(err, user) {
if (err)
return auth.fail(data, err, true, accept);
if (!user)
return auth.fail(data, "User not found", false, accept);
data[auth.userProperty] = user;
data[auth.userProperty].logged_in = true;
auth.success(data, accept);
});*/
data[auth.userProperty] = userKey;
data[auth.userProperty].logged_in = true;
data.client._user = userKey;
auth.success(data, accept);
});
};
}
function filterSocketsByUser(socketIo, filter) {
const handshaken = socketIo.sockets.manager.handshaken;
return Object.keys(handshaken || {})
.filter(skey => filter(handshaken[skey].user))
.map(skey => socketIo.sockets.manager.sockets.sockets[skey]);
}
exports.authorize = authorize;
exports.filterSocketsByUser = filterSocketsByUser;

83
lib/utils.js Normal file
View File

@ -0,0 +1,83 @@
'use strict';
const fs = require('fs');
const path = require('path');
let controllerDir;
let appName;
/**
* returns application name
*
* The name of the application can be different and this function finds it out.
*
* @returns {string}
*/
function getAppName() {
const parts = __dirname.replace(/\\/g, '/').split('/');
return parts[parts.length - 2].split('.')[0];
}
/**
* looks for js-controller home folder
*
* @param {boolean} isInstall
* @returns {string}
*/
function getControllerDir(isInstall) {
// Find the js-controller location
const possibilities = [
'yunkong2.js-controller',
'yunkong2.js-controller',
];
/** @type {string} */
let controllerPath;
for (const pkg of possibilities) {
try {
const possiblePath = require.resolve(pkg);
if (fs.existsSync(possiblePath)) {
controllerPath = possiblePath;
break;
}
} catch (e) { /* not found */ }
}
if (!controllerPath) {
if (!isInstall) {
console.log('Cannot find js-controller');
process.exit(10);
} else {
process.exit();
}
}
// we found the controller
return path.dirname(controllerPath);
}
/**
* reads controller base settings
*
* @alias getConfig
* @returns {object}
*/
function getConfig() {
let configPath;
if (fs.existsSync(
configPath = path.join(controllerDir, 'conf', appName + '.json')
)) {
return JSON.parse(fs.readFileSync(configPath, 'utf8'));
} else if (fs.existsSync(
configPath = path.join(controllerDir, 'conf', + appName.toLowerCase() + '.json')
)) {
return JSON.parse(fs.readFileSync(configPath, 'utf8'));
} else {
throw new Error('Cannot find ' + controllerDir + '/conf/' + appName + '.json');
}
}
appName = getAppName();
controllerDir = getControllerDir(typeof process !== 'undefined' && process.argv && process.argv.indexOf('--install') !== -1);
const adapter = require(path.join(controllerDir, 'lib/adapter.js'));
exports.controllerDir = controllerDir;
exports.getConfig = getConfig;
exports.Adapter = adapter;
exports.appName = appName;

1060
main.js Normal file

File diff suppressed because it is too large Load Diff

59
package.json Normal file
View File

@ -0,0 +1,59 @@
{
"name": "yunkong2.web",
"version": "2.4.1",
"description": "yunkong2 simple web Adapter",
"author": {
"name": "bluefox",
"email": "dogafox@gmail.com"
},
"homepage": "https://git.spacen.net/yunkong2/yunkong2.web",
"licenses": [
{
"type": "MIT",
"url": "https://git.spacen.net/yunkong2/yunkong2.web/blob/master/LICENSE"
}
],
"keywords": [
"yunkong2",
"web"
],
"repository": {
"type": "git",
"url": "https://git.spacen.net/yunkong2/yunkong2.web"
},
"dependencies": {
"body-parser": "^1.18.2",
"connect-flash": "^0.1.1",
"cookie-parser": "^1.4.3",
"express": "^4.16.3",
"express-session": "^1.15.6",
"yunkong2.simple-api": ">=1.3.0",
"yunkong2.socketio": ">=2.1.1",
"mime-types": "^2.1.18",
"passport": "^0.4.0",
"passport-local": "^1.0.0",
"passport.socketio": "^3.7.0",
"request": "^2.85.0",
"socket.io-client": "1.7.2",
"xtend": "^4.0.1"
},
"devDependencies": {
"gulp": "^3.9.1",
"mocha": "^5.1.1",
"chai": "^4.1.2"
},
"bugs": {
"url": "https://git.spacen.net/yunkong2/yunkong2.web/issues"
},
"main": "main.js",
"scripts": {
"test": "node node_modules/mocha/bin/mocha --exit"
},
"license": "MIT",
"maintainers": [
{
"name": "bluefox",
"email": "dogafox@gmail.com"
}
]
}

17
tasks/jscs.js Normal file
View File

@ -0,0 +1,17 @@
var srcDir = __dirname + "/../";
module.exports = {
all: {
src: [
srcDir + "*.js",
srcDir + "lib/*.js",
srcDir + "adapter/example/*.js",
srcDir + "tasks/**/*.js",
srcDir + "www/**/*.js",
'!' + srcDir + "www/lib/**/*.js",
'!' + srcDir + 'node_modules/**/*.js',
'!' + srcDir + 'adapter/*/node_modules/**/*.js'
],
options: require('./jscsRules.js')
}
};

36
tasks/jscsRules.js Normal file
View File

@ -0,0 +1,36 @@
module.exports = {
force: true,
"requireCurlyBraces": ["else", "for", "while", "do", "try", "catch"], /*"if",*/
"requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch"],
"requireSpaceBeforeBlockStatements": true,
"requireParenthesesAroundIIFE": true,
"disallowSpacesInFunctionDeclaration": {"beforeOpeningRoundBrace": true},
"disallowSpacesInNamedFunctionExpression": {"beforeOpeningRoundBrace": true},
"requireSpacesInFunctionExpression": {"beforeOpeningCurlyBrace": true},
"requireSpacesInAnonymousFunctionExpression": {"beforeOpeningRoundBrace": true, "beforeOpeningCurlyBrace": true},
"requireSpacesInNamedFunctionExpression": {"beforeOpeningCurlyBrace": true},
"requireSpacesInFunctionDeclaration": {"beforeOpeningCurlyBrace": true},
"disallowMultipleVarDecl": true,
"requireBlocksOnNewline": true,
"disallowEmptyBlocks": true,
"disallowSpacesInsideObjectBrackets": true,
"disallowSpacesInsideArrayBrackets": true,
"disallowSpaceAfterObjectKeys": true,
"disallowSpacesInsideParentheses": true,
"requireCommaBeforeLineBreak": true,
//"requireAlignedObjectValues": "all",
"requireOperatorBeforeLineBreak": ["?", "+", "-", "/", "*", "=", "==", "===", "!=", "!==", ">", ">=", "<", "<="],
// "disallowLeftStickedOperators": ["?", "+", "/", "*", "=", "==", "===", "!=", "!==", ">", ">=", "<", "<="],
// "requireRightStickedOperators": ["!"],
// "requireSpaceAfterBinaryOperators": ["?", "+", "/", "*", ":", "=", "==", "===", "!=", "!==", ">", ">=", "<", "<="],
//"disallowSpaceAfterBinaryOperators": [","],
"disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
"disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
"requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
"requireSpaceAfterBinaryOperators": ["?", ">", ",", ">=", "<=", "<", "+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
//"validateIndentation": 4,
//"validateQuoteMarks": { "mark": "\"", "escape": true },
"disallowMixedSpacesAndTabs": true,
"disallowKeywordsOnNewLine": ["else", "catch"]
};

17
tasks/jshint.js Normal file
View File

@ -0,0 +1,17 @@
var srcDir = __dirname + "/../";
module.exports = {
options: {
force: true
},
all: [
srcDir + "*.js",
srcDir + "lib/*.js",
srcDir + "adapter/example/*.js",
srcDir + "tasks/**/*.js",
srcDir + "www/**/*.js",
'!' + srcDir + "www/lib/**/*.js",
'!' + srcDir + 'node_modules/**/*.js',
'!' + srcDir + 'adapter/*/node_modules/**/*.js'
]
};

728
test/lib/setup.js Normal file
View File

@ -0,0 +1,728 @@
/* jshint -W097 */// jshint strict:false
/*jslint node: true */
// check if tmp directory exists
var fs = require('fs');
var path = require('path');
var child_process = require('child_process');
var rootDir = path.normalize(__dirname + '/../../');
var pkg = require(rootDir + 'package.json');
var debug = typeof v8debug === 'object';
pkg.main = pkg.main || 'main.js';
var adapterName = path.normalize(rootDir).replace(/\\/g, '/').split('/');
adapterName = adapterName[adapterName.length - 2];
var adapterStarted = false;
function getAppName() {
var parts = __dirname.replace(/\\/g, '/').split('/');
return parts[parts.length - 3].split('.')[0];
}
var appName = getAppName().toLowerCase();
var objects;
var states;
var pid = null;
function copyFileSync(source, target) {
var targetFile = target;
//if target is a directory a new file with the same name will be created
if (fs.existsSync(target)) {
if ( fs.lstatSync( target ).isDirectory() ) {
targetFile = path.join(target, path.basename(source));
}
}
try {
fs.writeFileSync(targetFile, fs.readFileSync(source));
}
catch (err) {
console.log("file copy error: " +source +" -> " + targetFile + " (error ignored)");
}
}
function copyFolderRecursiveSync(source, target, ignore) {
var files = [];
var base = path.basename(source);
if (base === adapterName) {
base = pkg.name;
}
//check if folder needs to be created or integrated
var targetFolder = path.join(target, base);
if (!fs.existsSync(targetFolder)) {
fs.mkdirSync(targetFolder);
}
//copy
if (fs.lstatSync(source).isDirectory()) {
files = fs.readdirSync(source);
files.forEach(function (file) {
if (ignore && ignore.indexOf(file) !== -1) {
return;
}
var curSource = path.join(source, file);
var curTarget = path.join(targetFolder, file);
if (fs.lstatSync(curSource).isDirectory()) {
// ignore grunt files
if (file.indexOf('grunt') !== -1) return;
if (file === 'chai') return;
if (file === 'mocha') return;
copyFolderRecursiveSync(curSource, targetFolder, ignore);
} else {
copyFileSync(curSource, curTarget);
}
});
}
}
if (!fs.existsSync(rootDir + 'tmp')) {
fs.mkdirSync(rootDir + 'tmp');
}
function storeOriginalFiles() {
console.log('Store original files...');
var dataDir = rootDir + 'tmp/' + appName + '-data/';
var f = fs.readFileSync(dataDir + 'objects.json');
var objects = JSON.parse(f.toString());
if (objects['system.adapter.admin.0'] && objects['system.adapter.admin.0'].common) {
objects['system.adapter.admin.0'].common.enabled = false;
}
if (objects['system.adapter.admin.1'] && objects['system.adapter.admin.1'].common) {
objects['system.adapter.admin.1'].common.enabled = false;
}
fs.writeFileSync(dataDir + 'objects.json.original', JSON.stringify(objects));
try {
f = fs.readFileSync(dataDir + 'states.json');
fs.writeFileSync(dataDir + 'states.json.original', f);
}
catch (err) {
console.log('no states.json found - ignore');
}
}
function restoreOriginalFiles() {
console.log('restoreOriginalFiles...');
var dataDir = rootDir + 'tmp/' + appName + '-data/';
var f = fs.readFileSync(dataDir + 'objects.json.original');
fs.writeFileSync(dataDir + 'objects.json', f);
try {
f = fs.readFileSync(dataDir + 'states.json.original');
fs.writeFileSync(dataDir + 'states.json', f);
}
catch (err) {
console.log('no states.json.original found - ignore');
}
}
function checkIsAdapterInstalled(cb, counter, customName) {
customName = customName || pkg.name.split('.').pop();
counter = counter || 0;
var dataDir = rootDir + 'tmp/' + appName + '-data/';
console.log('checkIsAdapterInstalled...');
try {
var f = fs.readFileSync(dataDir + 'objects.json');
var objects = JSON.parse(f.toString());
if (objects['system.adapter.' + customName + '.0']) {
console.log('checkIsAdapterInstalled: ready!');
setTimeout(function () {
if (cb) cb();
}, 100);
return;
} else {
console.warn('checkIsAdapterInstalled: still not ready');
}
} catch (err) {
}
if (counter > 20) {
console.error('checkIsAdapterInstalled: Cannot install!');
if (cb) cb('Cannot install');
} else {
console.log('checkIsAdapterInstalled: wait...');
setTimeout(function() {
checkIsAdapterInstalled(cb, counter + 1);
}, 1000);
}
}
function checkIsControllerInstalled(cb, counter) {
counter = counter || 0;
var dataDir = rootDir + 'tmp/' + appName + '-data/';
console.log('checkIsControllerInstalled...');
try {
var f = fs.readFileSync(dataDir + 'objects.json');
var objects = JSON.parse(f.toString());
if (objects['system.adapter.admin.0']) {
console.log('checkIsControllerInstalled: installed!');
setTimeout(function () {
if (cb) cb();
}, 100);
return;
}
} catch (err) {
}
if (counter > 20) {
console.log('checkIsControllerInstalled: Cannot install!');
if (cb) cb('Cannot install');
} else {
console.log('checkIsControllerInstalled: wait...');
setTimeout(function() {
checkIsControllerInstalled(cb, counter + 1);
}, 1000);
}
}
function installAdapter(customName, cb) {
if (typeof customName === 'function') {
cb = customName;
customName = null;
}
customName = customName || pkg.name.split('.').pop();
console.log('Install adapter...');
var startFile = 'node_modules/' + appName + '.js-controller/' + appName + '.js';
// make first install
if (debug) {
child_process.execSync('node ' + startFile + ' add ' + customName + ' --enabled false', {
cwd: rootDir + 'tmp',
stdio: [0, 1, 2]
});
checkIsAdapterInstalled(function (error) {
if (error) console.error(error);
console.log('Adapter installed.');
if (cb) cb();
});
} else {
// add controller
var _pid = child_process.fork(startFile, ['add', customName, '--enabled', 'false'], {
cwd: rootDir + 'tmp',
stdio: [0, 1, 2, 'ipc']
});
waitForEnd(_pid, function () {
checkIsAdapterInstalled(function (error) {
if (error) console.error(error);
console.log('Adapter installed.');
if (cb) cb();
});
});
}
}
function waitForEnd(_pid, cb) {
if (!_pid) {
cb(-1, -1);
return;
}
_pid.on('exit', function (code, signal) {
if (_pid) {
_pid = null;
cb(code, signal);
}
});
_pid.on('close', function (code, signal) {
if (_pid) {
_pid = null;
cb(code, signal);
}
});
}
function installJsController(cb) {
console.log('installJsController...');
if (!fs.existsSync(rootDir + 'tmp/node_modules/' + appName + '.js-controller') ||
!fs.existsSync(rootDir + 'tmp/' + appName + '-data')) {
// try to detect appName.js-controller in node_modules/appName.js-controller
// travis CI installs js-controller into node_modules
if (fs.existsSync(rootDir + 'node_modules/' + appName + '.js-controller')) {
console.log('installJsController: no js-controller => copy it from "' + rootDir + 'node_modules/' + appName + '.js-controller"');
// copy all
// stop controller
console.log('Stop controller if running...');
var _pid;
if (debug) {
// start controller
_pid = child_process.exec('node ' + appName + '.js stop', {
cwd: rootDir + 'node_modules/' + appName + '.js-controller',
stdio: [0, 1, 2]
});
} else {
_pid = child_process.fork(appName + '.js', ['stop'], {
cwd: rootDir + 'node_modules/' + appName + '.js-controller',
stdio: [0, 1, 2, 'ipc']
});
}
waitForEnd(_pid, function () {
// copy all files into
if (!fs.existsSync(rootDir + 'tmp')) fs.mkdirSync(rootDir + 'tmp');
if (!fs.existsSync(rootDir + 'tmp/node_modules')) fs.mkdirSync(rootDir + 'tmp/node_modules');
if (!fs.existsSync(rootDir + 'tmp/node_modules/' + appName + '.js-controller')){
console.log('Copy js-controller...');
copyFolderRecursiveSync(rootDir + 'node_modules/' + appName + '.js-controller', rootDir + 'tmp/node_modules/');
}
console.log('Setup js-controller...');
var __pid;
if (debug) {
// start controller
_pid = child_process.exec('node ' + appName + '.js setup first --console', {
cwd: rootDir + 'tmp/node_modules/' + appName + '.js-controller',
stdio: [0, 1, 2]
});
} else {
__pid = child_process.fork(appName + '.js', ['setup', 'first', '--console'], {
cwd: rootDir + 'tmp/node_modules/' + appName + '.js-controller',
stdio: [0, 1, 2, 'ipc']
});
}
waitForEnd(__pid, function () {
checkIsControllerInstalled(function () {
// change ports for object and state DBs
var config = require(rootDir + 'tmp/' + appName + '-data/' + appName + '.json');
config.objects.port = 19001;
config.states.port = 19000;
fs.writeFileSync(rootDir + 'tmp/' + appName + '-data/' + appName + '.json', JSON.stringify(config, null, 2));
console.log('Setup finished.');
copyAdapterToController();
installAdapter(function () {
storeOriginalFiles();
if (cb) cb(true);
});
});
});
});
} else {
// check if port 9000 is free, else admin adapter will be added to running instance
var client = new require('net').Socket();
client.connect(9000, '127.0.0.1', function() {
console.error('Cannot initiate fisrt run of test, because one instance of application is running on this PC. Stop it and repeat.');
process.exit(0);
});
setTimeout(function () {
client.destroy();
if (!fs.existsSync(rootDir + 'tmp/node_modules/' + appName + '.js-controller')) {
console.log('installJsController: no js-controller => install from git');
child_process.execSync('npm install https://git.spacen.net/' + appName + '/' + appName + '.js-controller/tarball/master --prefix ./ --production', {
cwd: rootDir + 'tmp/',
stdio: [0, 1, 2]
});
} else {
console.log('Setup js-controller...');
var __pid;
if (debug) {
// start controller
child_process.exec('node ' + appName + '.js setup first', {
cwd: rootDir + 'tmp/node_modules/' + appName + '.js-controller',
stdio: [0, 1, 2]
});
} else {
child_process.fork(appName + '.js', ['setup', 'first'], {
cwd: rootDir + 'tmp/node_modules/' + appName + '.js-controller',
stdio: [0, 1, 2, 'ipc']
});
}
}
// let npm install admin and run setup
checkIsControllerInstalled(function () {
var _pid;
if (fs.existsSync(rootDir + 'node_modules/' + appName + '.js-controller/' + appName + '.js')) {
_pid = child_process.fork(appName + '.js', ['stop'], {
cwd: rootDir + 'node_modules/' + appName + '.js-controller',
stdio: [0, 1, 2, 'ipc']
});
}
waitForEnd(_pid, function () {
// change ports for object and state DBs
var config = require(rootDir + 'tmp/' + appName + '-data/' + appName + '.json');
config.objects.port = 19001;
config.states.port = 19000;
fs.writeFileSync(rootDir + 'tmp/' + appName + '-data/' + appName + '.json', JSON.stringify(config, null, 2));
copyAdapterToController();
installAdapter(function () {
storeOriginalFiles();
if (cb) cb(true);
});
});
});
}, 1000);
}
} else {
setTimeout(function () {
console.log('installJsController: js-controller installed');
if (cb) cb(false);
}, 0);
}
}
function copyAdapterToController() {
console.log('Copy adapter...');
// Copy adapter to tmp/node_modules/appName.adapter
copyFolderRecursiveSync(rootDir, rootDir + 'tmp/node_modules/', ['.idea', 'test', 'tmp', '.git', appName + '.js-controller']);
console.log('Adapter copied.');
}
function clearControllerLog() {
var dirPath = rootDir + 'tmp/log';
var files;
try {
if (fs.existsSync(dirPath)) {
console.log('Clear controller log...');
files = fs.readdirSync(dirPath);
} else {
console.log('Create controller log directory...');
files = [];
fs.mkdirSync(dirPath);
}
} catch(e) {
console.error('Cannot read "' + dirPath + '"');
return;
}
if (files.length > 0) {
try {
for (var i = 0; i < files.length; i++) {
var filePath = dirPath + '/' + files[i];
fs.unlinkSync(filePath);
}
console.log('Controller log cleared');
} catch (err) {
console.error('cannot clear log: ' + err);
}
}
}
function clearDB() {
var dirPath = rootDir + 'tmp/yunkong2-data/sqlite';
var files;
try {
if (fs.existsSync(dirPath)) {
console.log('Clear sqlite DB...');
files = fs.readdirSync(dirPath);
} else {
console.log('Create controller log directory...');
files = [];
fs.mkdirSync(dirPath);
}
} catch(e) {
console.error('Cannot read "' + dirPath + '"');
return;
}
if (files.length > 0) {
try {
for (var i = 0; i < files.length; i++) {
var filePath = dirPath + '/' + files[i];
fs.unlinkSync(filePath);
}
console.log('Clear sqlite DB');
} catch (err) {
console.error('cannot clear DB: ' + err);
}
}
}
function setupController(cb) {
installJsController(function (isInited) {
clearControllerLog();
clearDB();
if (!isInited) {
restoreOriginalFiles();
copyAdapterToController();
}
// read system.config object
var dataDir = rootDir + 'tmp/' + appName + '-data/';
var objs;
try {
objs = fs.readFileSync(dataDir + 'objects.json');
objs = JSON.parse(objs);
}
catch (e) {
console.log('ERROR reading/parsing system configuration. Ignore');
objs = {'system.config': {}};
}
if (!objs || !objs['system.config']) {
objs = {'system.config': {}};
}
if (cb) cb(objs['system.config']);
});
}
function startAdapter(objects, states, callback) {
if (adapterStarted) {
console.log('Adapter already started ...');
if (callback) callback(objects, states);
return;
}
adapterStarted = true;
console.log('startAdapter...');
if (fs.existsSync(rootDir + 'tmp/node_modules/' + pkg.name + '/' + pkg.main)) {
try {
if (debug) {
// start controller
pid = child_process.exec('node node_modules/' + pkg.name + '/' + pkg.main + ' --console silly', {
cwd: rootDir + 'tmp',
stdio: [0, 1, 2]
});
} else {
// start controller
pid = child_process.fork('node_modules/' + pkg.name + '/' + pkg.main, ['--console', 'silly'], {
cwd: rootDir + 'tmp',
stdio: [0, 1, 2, 'ipc']
});
}
} catch (error) {
console.error(JSON.stringify(error));
}
} else {
console.error('Cannot find: ' + rootDir + 'tmp/node_modules/' + pkg.name + '/' + pkg.main);
}
if (callback) callback(objects, states);
}
function startController(isStartAdapter, onObjectChange, onStateChange, callback) {
if (typeof isStartAdapter === 'function') {
callback = onStateChange;
onStateChange = onObjectChange;
onObjectChange = isStartAdapter;
isStartAdapter = true;
}
if (onStateChange === undefined) {
callback = onObjectChange;
onObjectChange = undefined;
}
if (pid) {
console.error('Controller is already started!');
} else {
console.log('startController...');
adapterStarted = false;
var isObjectConnected;
var isStatesConnected;
var Objects = require(rootDir + 'tmp/node_modules/' + appName + '.js-controller/lib/objects/objectsInMemServer');
objects = new Objects({
connection: {
"type" : "file",
"host" : "127.0.0.1",
"port" : 19001,
"user" : "",
"pass" : "",
"noFileCache": false,
"connectTimeout": 2000
},
logger: {
silly: function (msg) {
console.log(msg);
},
debug: function (msg) {
console.log(msg);
},
info: function (msg) {
console.log(msg);
},
warn: function (msg) {
console.warn(msg);
},
error: function (msg) {
console.error(msg);
}
},
connected: function () {
isObjectConnected = true;
if (isStatesConnected) {
console.log('startController: started!');
if (isStartAdapter) {
startAdapter(objects, states, callback);
} else {
if (callback) {
callback(objects, states);
callback = null;
}
}
}
},
change: onObjectChange
});
// Just open in memory DB itself
var States = require(rootDir + 'tmp/node_modules/' + appName + '.js-controller/lib/states/statesInMemServer');
states = new States({
connection: {
type: 'file',
host: '127.0.0.1',
port: 19000,
options: {
auth_pass: null,
retry_max_delay: 15000
}
},
logger: {
silly: function (msg) {
console.log(msg);
},
debug: function (msg) {
console.log(msg);
},
info: function (msg) {
console.log(msg);
},
warn: function (msg) {
console.log(msg);
},
error: function (msg) {
console.log(msg);
}
},
connected: function () {
isStatesConnected = true;
if (isObjectConnected) {
console.log('startController: started!!');
if (isStartAdapter) {
startAdapter(objects, states, callback);
} else {
if (callback) {
callback(objects, states);
callback = null;
}
}
}
},
change: onStateChange
});
}
}
function stopAdapter(cb) {
if (!pid) {
console.error('Controller is not running!');
if (cb) {
setTimeout(function () {
cb(false);
}, 0);
}
} else {
adapterStarted = false;
pid.on('exit', function (code, signal) {
if (pid) {
console.log('child process terminated due to receipt of signal ' + signal);
if (cb) cb();
pid = null;
}
});
pid.on('close', function (code, signal) {
if (pid) {
if (cb) cb();
pid = null;
}
});
pid.kill('SIGTERM');
}
}
function _stopController() {
if (objects) {
objects.destroy();
objects = null;
}
if (states) {
states.destroy();
states = null;
}
}
function stopController(cb) {
var timeout;
if (objects) {
console.log('Set system.adapter.' + pkg.name + '.0');
objects.setObject('system.adapter.' + pkg.name + '.0', {
common:{
enabled: false
}
});
}
stopAdapter(function () {
if (timeout) {
clearTimeout(timeout);
timeout = null;
}
_stopController();
if (cb) {
cb(true);
cb = null;
}
});
timeout = setTimeout(function () {
timeout = null;
console.log('child process NOT terminated');
_stopController();
if (cb) {
cb(false);
cb = null;
}
pid = null;
}, 5000);
}
// Setup the adapter
function setAdapterConfig(common, native, instance) {
var objects = JSON.parse(fs.readFileSync(rootDir + 'tmp/' + appName + '-data/objects.json').toString());
var id = 'system.adapter.' + adapterName.split('.').pop() + '.' + (instance || 0);
if (common) objects[id].common = common;
if (native) objects[id].native = native;
fs.writeFileSync(rootDir + 'tmp/' + appName + '-data/objects.json', JSON.stringify(objects));
}
// Read config of the adapter
function getAdapterConfig(instance) {
var objects = JSON.parse(fs.readFileSync(rootDir + 'tmp/' + appName + '-data/objects.json').toString());
var id = 'system.adapter.' + adapterName.split('.').pop() + '.' + (instance || 0);
return objects[id];
}
if (typeof module !== undefined && module.parent) {
module.exports.getAdapterConfig = getAdapterConfig;
module.exports.setAdapterConfig = setAdapterConfig;
module.exports.startController = startController;
module.exports.stopController = stopController;
module.exports.setupController = setupController;
module.exports.stopAdapter = stopAdapter;
module.exports.startAdapter = startAdapter;
module.exports.installAdapter = installAdapter;
module.exports.appName = appName;
module.exports.adapterName = adapterName;
module.exports.adapterStarted = adapterStarted;
}

148
test/lib/tests.js Normal file
View File

@ -0,0 +1,148 @@
var request = require('request');
var expect = require('chai').expect;
var tests = {
'read lib/js file': function (done) {
this.timeout(2000);
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '/lib/js/selectID.js', function (error, response, body) {
expect(error).to.be.not.ok;
expect(response.statusCode).to.be.equal(200);
expect(response.headers['content-type'].split(';')[0]).to.be.equal('application/javascript');
done();
});
},
'read css file': function (done) {
this.timeout(2000);
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '/lib/css/fancytree/ui.fancytree.min.css', function (error, response, body) {
expect(error).to.be.not.ok;
expect(response.statusCode).to.be.equal(200);
expect(response.headers['content-type'].split(';')[0]).to.be.equal('text/css');
done();
});
},
'read png file': function (done) {
this.timeout(2000);
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '/lib/css/fancytree/device.png', function (error, response, body) {
expect(error).to.be.not.ok;
expect(response.statusCode).to.be.equal(200);
expect(response.headers['content-type'].split(';')[0]).to.be.equal('image/png');
done();
});
},
'read admin file': function (done) {
this.timeout(2000);
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '/adapter/web/index.html', function (error, response, body) {
expect(error).to.be.not.ok;
expect(response.headers['content-type'].split(';')[0]).to.be.equal('text/html');
expect(response.statusCode).to.be.equal(200);
done();
});
},
'read state that exists': function (done) {
this.timeout(2000);
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '/state/system.adapter.web.0.alive', function (error, response, body) {
expect(error).to.be.not.ok;
expect(response.statusCode).to.be.equal(200);
done();
});
},
'read state that not exists': function (done) {
this.timeout(2000);
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '/state/system.adapter.web.1.alive', function (error, response, body) {
expect(error).to.be.not.ok;
expect(response.statusCode).to.be.equal(404);
done();
});
},
'read file that does not exist': function (done) {
this.timeout(2000);
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '/adapter/web/index1.html', function (error, response, body) {
expect(error).to.be.not.ok;
expect(response.statusCode).to.be.equal(404);
done();
});
},
'read index.html': function (done) {
this.timeout(2000);
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '/index.html', function (error, response, body) {
expect(error).to.be.not.ok;
expect(response.statusCode).to.be.equal(200);
expect(response.headers['content-type'].split(';')[0]).to.be.equal('text/html');
done();
});
},
'read /': function (done) {
this.timeout(2000);
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '/', function (error, response, body) {
expect(error).to.be.not.ok;
expect(response.statusCode).to.be.equal(200);
expect(response.headers['content-type'].split(';')[0]).to.be.equal('text/html');
done();
});
},
'read /..%5c..%5c..%5c..%5c..%5c..%5cetc/passwd': function (done) {
this.timeout(2000);
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '/..%5c..%5c..%5c..%5c..%5c..%5cetc/passwd', function (error, response, body) {
expect(error).to.be.not.ok;
expect(response.statusCode).to.be.equal(404);
done();
});
},
'read //..%5c..%5c..%5c..%5c..%5c..%5cetc/passwd': function (done) {
this.timeout(2000);
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '/..%5c..%5c..%5c..%5c..%5c..%5cetc/passwd', function (error, response, body) {
expect(error).to.be.not.ok;
expect(response.statusCode).to.be.equal(404);
done();
});
},
'read /..%5cREADME.md': function (done) {
this.timeout(2000);
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '/..%5cREADME.md', function (error, response, body) {
expect(error).to.be.not.ok;
expect(response.statusCode).to.be.equal(404);
done();
});
},
'read /..%5c..%5cREADME.md': function (done) {
this.timeout(2000);
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '/..%5c..%5cREADME.md', function (error, response, body) {
expect(error).to.be.not.ok;
expect(response.statusCode).to.be.equal(404);
done();
});
},
'read ////..%5c..%5cREADME.md': function (done) {
this.timeout(2000);
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '////..%5c..%5cREADME.md', function (error, response, body) {
expect(error).to.be.not.ok;
expect(response.statusCode).to.be.equal(404);
done();
});
},
'read \\..%5c..%5cREADME.md': function (done) {
this.timeout(2000);
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '\\..%5c..%5cREADME.md', function (error, response, body) {
expect(error).to.be.not.ok;
expect(response.statusCode).to.be.equal(404);
done();
});
},
'read /web/..%5c..%5cREADME.md': function (done) {
this.timeout(2000);
request(process.env.TEST_PROTOCOL + '://localhost:' + process.env.TEST_PORT + '/web/..%5c..%5cREADME.md', function (error, response, body) {
expect(error).to.be.not.ok;
expect(response.statusCode).to.be.equal(404);
done();
});
}
};
module.exports.tests = tests;

81
test/testNoAuthNoSSL.js Normal file
View File

@ -0,0 +1,81 @@
'use strict';
const expect = require('chai').expect;
const setup = require(__dirname + '/lib/setup');
const request = require('request');
const tests = require(__dirname + '/lib/tests');
let objects = null;
let states = null;
process.env.HTTPS_PROXY = '';
process.env.HTTP_PROXY = '';
process.env.TEST_PORT = 18802;
process.env.TEST_PROTOCOL = 'http';
function initTests() {
for (const test in tests.tests) {
if (tests.tests.hasOwnProperty(test)) {
it('Test WEB: ' + test, tests.tests[test]);
}
}
}
function checkConnectionOfAdapter(cb, counter) {
counter = counter || 0;
if (counter > 20) {
cb && cb('Cannot check connection');
return;
}
states.getState('system.adapter.web.0.alive', (err, state) => {
if (err) console.error(err);
if (state && state.val) {
cb && cb();
} else {
setTimeout(() => checkConnectionOfAdapter(cb, counter + 1), 1000);
}
});
}
describe('Test WEB', function() {
before('Test WEB: Start js-controller', function (_done) {
this.timeout(600000); // because of first install from npm
setup.adapterStarted = false;
setup.setupController(() => {
const config = setup.getAdapterConfig();
// enable adapter
config.common.enabled = true;
config.common.loglevel = 'debug';
config.native.port = process.env.TEST_PORT;
config.native.secure = process.env.TEST_PROTOCOL === 'https';
config.native.cache = false;
config.native.certPublic = 'defaultPublic';
config.native.certPrivate = 'defaultPrivate';
setup.setAdapterConfig(config.common, config.native);
setup.startController(true, null, null, (_objects, _states) => {
objects = _objects;
states = _states;
_done();
});
});
});
it('Test WEB: Check if adapter started', done => {
checkConnectionOfAdapter(() => setTimeout(() => done(), 2000));
}).timeout(5000);
initTests();
after('Test WEB: Stop js-controller', function (done) {
this.timeout(6000);
setup.stopController((normalTerminated) => {
console.log('Adapter normal terminated: ' + normalTerminated);
done();
});
});
});

82
test/testNoAuthSSL.js Normal file
View File

@ -0,0 +1,82 @@
'use strict';
//const expect = require('chai').expect;
const setup = require(__dirname + '/lib/setup');
const request = require('request');
const tests = require(__dirname + '/lib/tests');
let objects = null;
let states = null;
process.env.HTTPS_PROXY = '';
process.env.HTTP_PROXY = '';
process.env.TEST_PORT = 18803;
process.env.TEST_PROTOCOL = 'https';
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
function initTests() {
for (const test in tests.tests) {
if (tests.tests.hasOwnProperty(test)) {
it('Test WEB(' + ((process.env.TEST_PROTOCOL === 'https') ? 'SSL' : 'NO SSL') + '): ' + test, tests.tests[test]);
}
}
}
function checkConnectionOfAdapter(cb, counter) {
counter = counter || 0;
if (counter > 20) {
cb && cb('Cannot check connection');
return;
}
states.getState('system.adapter.web.0.alive', (err, state) => {
if (err) console.error(err);
if (state && state.val) {
cb && cb();
} else {
setTimeout(() => checkConnectionOfAdapter(cb, counter + 1), 1000);
}
});
}
describe('Test WEB(' + ((process.env.TEST_PROTOCOL === 'https') ? 'SSL' : 'NO SSL') + ')', () => {
before('Test WEB(' + ((process.env.TEST_PROTOCOL === 'https') ? 'SSL' : 'NO SSL') + '): Start js-controller', function (_done) {
this.timeout(600000); // because of first install from npm
setup.adapterStarted = false;
setup.setupController(function () {
const config = setup.getAdapterConfig();
// enable adapter
config.common.enabled = true;
config.common.loglevel = 'debug';
config.native.port = process.env.TEST_PORT;
config.native.secure = process.env.TEST_PROTOCOL === 'https';
config.native.cache = false;
config.native.certPublic = config.native.secure ? 'defaultPublic' : '';
config.native.certPrivate = config.native.secure ? 'defaultPrivate' : '';
setup.setAdapterConfig(config.common, config.native);
setup.startController(true, null, null, (_objects, _states) => {
objects = _objects;
states = _states;
_done();
});
});
});
it('Test WEB(' + ((process.env.TEST_PROTOCOL === 'https') ? 'SSL' : 'NO SSL') + '): Check if adapter started', done => {
checkConnectionOfAdapter(() => setTimeout(() => done(), 2000));
}).timeout(5000);
initTests();
after('Test WEB(' + ((process.env.TEST_PROTOCOL === 'https') ? 'SSL' : 'NO SSL') + '): Stop js-controller', function (done) {
this.timeout(6000);
setup.stopController(function (normalTerminated) {
console.log('Adapter normal terminated: ' + normalTerminated);
done();
});
});
});

91
test/testPackageFiles.js Normal file
View File

@ -0,0 +1,91 @@
/* jshint -W097 */
/* jshint strict:false */
/* jslint node: true */
/* jshint expr: true */
var expect = require('chai').expect;
var fs = require('fs');
describe('Test package.json and io-package.json', function() {
it('Test package files', function (done) {
console.log();
var fileContentIOPackage = fs.readFileSync(__dirname + '/../io-package.json', 'utf8');
var ioPackage = JSON.parse(fileContentIOPackage);
var fileContentNPMPackage = fs.readFileSync(__dirname + '/../package.json', 'utf8');
var npmPackage = JSON.parse(fileContentNPMPackage);
expect(ioPackage).to.be.an('object');
expect(npmPackage).to.be.an('object');
expect(ioPackage.common.version, 'ERROR: Version number in io-package.json needs to exist').to.exist;
expect(npmPackage.version, 'ERROR: Version number in package.json needs to exist').to.exist;
expect(ioPackage.common.version, 'ERROR: Version numbers in package.json and io-package.json needs to match').to.be.equal(npmPackage.version);
if (!ioPackage.common.news || !ioPackage.common.news[ioPackage.common.version]) {
console.log('WARNING: No news entry for current version exists in io-package.json, no rollback in Admin possible!');
console.log();
}
expect(npmPackage.author, 'ERROR: Author in package.json needs to exist').to.exist;
expect(ioPackage.common.authors, 'ERROR: Authors in io-package.json needs to exist').to.exist;
if (ioPackage.common.name.indexOf('template') !== 0) {
if (Array.isArray(ioPackage.common.authors)) {
expect(ioPackage.common.authors.length, 'ERROR: Author in io-package.json needs to be set').to.not.be.equal(0);
if (ioPackage.common.authors.length === 1) {
expect(ioPackage.common.authors[0], 'ERROR: Author in io-package.json needs to be a real name').to.not.be.equal('my Name <my@email.com>');
}
}
else {
expect(ioPackage.common.authors, 'ERROR: Author in io-package.json needs to be a real name').to.not.be.equal('my Name <my@email.com>');
}
}
else {
console.log('WARNING: Testing for set authors field in io-package skipped because template adapter');
console.log();
}
expect(fs.existsSync(__dirname + '/../README.md'), 'ERROR: README.md needs to exist! Please create one with description, detail information and changelog. English is mandatory.').to.be.true;
if (!ioPackage.common.titleLang || typeof ioPackage.common.titleLang !== 'object') {
console.log('WARNING: titleLang is not existing in io-package.json. Please add');
console.log();
}
if (
ioPackage.common.title.indexOf('yunkong2') !== -1 ||
ioPackage.common.title.indexOf('yunkong2') !== -1 ||
ioPackage.common.title.indexOf('adapter') !== -1 ||
ioPackage.common.title.indexOf('Adapter') !== -1
) {
console.log('WARNING: title contains Adapter or yunkong2. It is clear anyway, that it is adapter for yunkong2.');
console.log();
}
if (ioPackage.common.name.indexOf('vis-') !== 0) {
if (!ioPackage.common.materialize || !fs.existsSync(__dirname + '/../admin/index_m.html') || !fs.existsSync(__dirname + '/../gulpfile.js')) {
console.log('WARNING: Admin3 support is missing! Please add it');
console.log();
}
if (ioPackage.common.materialize) {
expect(fs.existsSync(__dirname + '/../admin/index_m.html'), 'Admin3 support is enabled in io-package.json, but index_m.html is missing!').to.be.true;
}
}
var licenseFileExists = fs.existsSync(__dirname + '/../LICENSE');
var fileContentReadme = fs.readFileSync(__dirname + '/../README.md', 'utf8');
if (fileContentReadme.indexOf('## Changelog') === -1) {
console.log('Warning: The README.md should have a section ## Changelog');
console.log();
}
expect((licenseFileExists || fileContentReadme.indexOf('## License') !== -1), 'A LICENSE must exist as LICENSE file or as part of the README.md').to.be.true;
if (!licenseFileExists) {
console.log('Warning: The License should also exist as LICENSE file');
console.log();
}
if (fileContentReadme.indexOf('## License') === -1) {
console.log('Warning: The README.md should also have a section ## License to be shown in Admin3');
console.log();
}
done();
});
});

BIN
www/admin/img/admin.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

141
www/index.html Normal file
View File

@ -0,0 +1,141 @@
<!DOCTYPE html>
<html>
<head><title>yunkong2.web</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" href="lib/img/favicon.ico" type="image/x-icon" />
<link rel="stylesheet" href="lib/css/bootstrap.min.css" media="screen">
<link rel="stylesheet" href="lib/css/style.css">
<script src="lib/js/jquery-1.11.2.min.js"></script>
<script src="lib/js/translate.js"></script>
<style>
.adapter-link{
width: 100%;
height: 100%;
}
.adapter-overlay {
position: relative;
width: 100%;
height: 100%;
background: linear-gradient(to bottom, rgba(255, 255, 255, 0.65) 0%,rgba(0, 0, 0, 0.34) 100%);
color: white;
line-height: 150px;
}
.adapter-footer {
height: 50px;
background-color: #ffffff;
color: #2e6ebd;
line-height: 50px;
text-transform: uppercase;
}
.adapter-main {
position: relative;
height: 150px;
width: 100%;
background: white;
background-size: 85%;
background-repeat: no-repeat;
background-position-x: 10px;
background-position-y: 10px;
}
.vertical-center-row-web {
background: #3399CC;
vertical-align: middle;
min-height: calc(100% - 8rem);
text-align: center;
border-radius: 0 0 1rem 1rem;
display: flex;
padding: 2em;
justify-content: center;
flex-wrap: wrap;
}
.adapter-tile {
display: inline-flex;
margin: 10px;
width: 150px;
min-width: 150px;
max-width: 150px;
height: 200px;
border-radius: 10px;
overflow: hidden;
cursor: pointer;
}
</style>
<script>
var list = [];
systemDictionary = {
'welcome': {
'en': 'welcome to yunkong2.web',
'de': 'Wilkommen zu yunkong2.web',
'ru': 'Добро пожаловать в yunkong2.web'
},
'Directories': {'en': 'Directories', 'de': 'Verzeichnise', 'ru': 'Пути'},
'your are lost': {
'en': 'It seems to be you are lost. Here are some files, that you can open:',
'de': 'Sieht so aus, als ob du verlaufen bist. Hier sind die Pfade, wohin man gehen kann:',
'ru': 'Похоже, что кто-то потерялся. Вот пути по которым можно пойти:'
},
"Sign out": {"en": "Sign out", "de": "Ausloggen", "ru": "Выйти"}
};
// Do not delete it. It will used for dynamic generation:
// -- PLACE THE LIST HERE --
$(document).ready(function () {
translateAll();
if (document.location.href.indexOf('yunkong2.net') === -1 &&
document.location.href.indexOf('yunkong2.pro') === -1) {
$('.account-button').hide();
if (typeof authEnabled !== 'undefined' && authEnabled === false) {
$('.logout-button').hide();
}
}
$('.logo').click(function () {
window.location = '/';
});
var text = '';
for (var i = 0; i < list.length; i++) {
if (typeof list[i] === 'object') {
// pro tiles are not available on yunkong2.net
if (list[i].pro && document.location.href.match(/yunkong2\.net/)) {
continue;
}
if (!document.location.href.match(/yunkong2\.(pro|net)/) && list[i].localLink) {
list[i].link = list[i].localLink.replace('$host$', location.hostname);
}
text +=
'<div class="adapter-tile" onclick="location.href = \'' + list[i].link + '\'">' +
'<div class="adapter-link" >' +
'<div class="adapter-main" style="background-image: url(\'' + list[i].img + '\')">' +
'<div class="adapter-overlay"></div>' +
'</div>' +
'<div class="adapter-footer">' +
'<p>' + (list[i].name || list[i].link) + '</p>' +
'</div>' +
'</div>' +
'</div>';
}
}
$('.vertical-center-row-web').html(text);
});
</script>
</head>
<body>
<div class="container">
<div class="layoutMain">
<div class="layoutHeader">
<div class="logo"></div>
<a class="logout-button translate" href="/logout" id="logout">Sign out</a>
<!--a class="login-button" href="/login">Login</a--><a class="account-button" href="/account" id="account" title="Edit profile"></a>
</div>
<div class="vertical-center-row-web">
</div>
</div>
</div>
<div class="footer container">
<!--a(class="footer-link") Impressum>
<a class="footer-link" href="/policy">Privacy Notice</a-->
</div>
</body>
</html>

5
www/lib/css/bootstrap.min.css vendored Normal file

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,415 @@
.dialog-select-object-ids {
/** inline edit **/
/**/
/*select ~ .select-id-quick-edit-ok, // only if type = combobx
select ~ .select-id-quick-edit-cancel { // only if type = combobx
top:1px;
}*/
}
.dialog-select-object-ids .true {
color: #06960E;
font-weight: bold;
}
.dialog-select-object-ids .false {
color: #D92626;
font-weight: normal;
}
.dialog-select-object-ids .error {
color: #D92626;
font-weight: normal;
}
.dialog-select-object-ids .highlight {
animation: highlight 2s;
}
.dialog-select-object-ids .grid-main-div {
height: calc(100% - 50px);
}
.dialog-select-object-ids .grid-main-wh-div {
height: calc(100% - (5px + 7px + 24px + 1px * 2 + 0px * 2) + 24px - 40px);
}
.dialog-select-object-ids .grid-main-wob-div {
height: calc(100% - 5px + 7px + 24px + 1px * 2 + 0px * 2 - 24px + 1px * 2 + 0px * 2);
}
.dialog-select-object-ids .grid-main-wh-div,
.dialog-select-object-ids .grid-main-wob-div {
overflow-x: hidden;
width: 100%;
padding: 0;
overflow-y: scroll;
}
.dialog-select-object-ids .grid-main-wh-div > table,
.dialog-select-object-ids .grid-main-wob-div > table {
width: calc(100% - 5px);
}
@-moz-keyframes spin {
100% {
-moz-transform: rotate(360deg);
}
}
@-webkit-keyframes spin {
100% {
-webkit-transform: rotate(360deg);
}
}
@keyframes spin {
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
.dialog-select-object-ids .objects-folder {
height: 0.8em;
width: 0.8em;
margin: 0.3em;
}
.dialog-select-object-ids .objects-name-coll-table-td {
border-spacing: 0;
padding: 0;
margin: 0;
border: 0;
}
.dialog-select-object-ids .objects-name-coll-icon {
/*position: relative;*/
/*top: 3px;*/
vertical-align: sub;
}
.dialog-select-object-ids .objects-name-coll-title {
border-spacing: 0;
padding: 0;
margin: 0;
border: 0;
display: inline-block;
padding-left: 5px;
vertical-align: middle;
}
.dialog-select-object-ids .objects-inline-edit {
width: 100%;
height: 24px;
border: 0;
padding: 0;
margin: 0;
padding-left: 4px;
}
.dialog-select-object-ids table.objects-list-table td {
border: 1px solid #e0e0e0;
}
.dialog-select-object-ids .objects-list-table {
background: #efefef;
white-space: nowrap;
table-layout: fixed;
border-collapse: collapse;
border-spacing: 0;
padding: 0;
overflow: auto;
font-family: "Segoe UI", Tahoma, Arial, "Courier New" !important;
font-weight: normal;
font-size: 0.82rem !important;
border-top: 0;
width: calc(100% - 10px);
margin: 0 5px 0 1px;
/* for mouse over rahmen */
outline: 5px;
outline-offset: -1px;
}
.dialog-select-object-ids .objects-list-table > tbody > tr > td {
padding-left: 5px;
}
.dialog-select-object-ids .objects-list-table .fancytree-title {
font-weight: normal !important;
}
.dialog-select-object-ids .select-id-quick-edit-buttons {
position: absolute;
z-index: 3;
top: 2px;
right: 5px;
}
.dialog-select-object-ids .select-id-quick-edit-buttons.text {
top: 23px;
}
.dialog-select-object-ids .select-id-quick-edit-buttons.text .select-id-quick-edit-ok,
.dialog-select-object-ids .select-id-quick-edit-buttons.text .select-id-quick-edit-cancel {
border: 1px solid gray;
background-color: white;
}
.dialog-select-object-ids .select-id-quick-edit-buttons .select-id-quick-edit-ok,
.dialog-select-object-ids .select-id-quick-edit-buttons .select-id-quick-edit-cancel {
cursor: pointer;
width: 16px;
height: 16px;
border-radius: 0;
display: inline-block;
}
.dialog-select-object-ids .objects-inline-edit {
position: relative;
left: -4px;
padding-left: 4px;
padding-right: 4px;
width: calc(100% - 0px);
z-index: 2;
font-family: "Segoe UI", Tahoma, Arial, "Courier New" !important;
font-size: 0.82rem;
vertical-align: middle;
text-overflow-mode: clip;
}
.dialog-select-object-ids .objects-name-coll-title .objects-inline-edit {
width: calc(100% + 4px - 1);
}
.dialog-select-object-ids input.objects-inline-edit {
width: calc(100% - 2px);
z-index: 2;
}
.dialog-select-object-ids .objects-list-table > colgroup > col:nth-child(8) {
width: 80px !important;
min-width: 80px !important;
}
.dialog-select-object-ids .filter-btn {
width: 18px;
height: 18px;
border: 0;
background: #fff;
}
.dialog-select-object-ids .main-header-table tr {
background: #ffffff;
}
.dialog-select-object-ids .main-header-table td.input {
width: 100%;
}
.dialog-select-object-ids .main-header-table select.filter option {
line-height: 0.5em;
background: #fff;
}
.dialog-select-object-ids .objects-list-running {
position: absolute;
top: 50%;
left: 50%;
width: 5rem;
padding: 12px;
background: rgba(185, 185, 185, 0.5);
text-align: center;
color: white;
font-weight: bold;
border-radius: 5px;
font-size: 10px;
}
.dialog-select-object-ids .ui-state-active.fancytree-active {
color: black !important;
}
.dialog-select-object-ids .ui-state-active.fancytree-active .ui-icon {
background-image: url(../lib/css/themes/jquery-ui/redmond/images/ui-icons_777777_256x240.png) !important;
}
.dialog-select-object-ids *::-webkit-scrollbar-track {
background-color: #ccc;
}
.dialog-select-object-ids *::-webkit-scrollbar {
width: 10px;
background-color: #ccc;
}
.dialog-select-object-ids *::-webkit-scrollbar-thumb {
background-color: #575757;
}
.dialog-select-object-ids .select-button-push,
.dialog-select-object-ids .select-button-edit,
.dialog-select-object-ids .select-button-ok,
.dialog-select-object-ids .select-button-cancel {
width: 26px;
height: 20px;
}
.dialog-select-object-ids .main-toolbar-table {
position: relative;
}
.dialog-select-object-ids .main-toolbar-table .select-id-custom-buttons {
display: inline-block;
}
.dialog-select-object-ids .main-toolbar-table .iob-toolbar-sep {
display: inline-block;
margin-left: 0.5rem;
}
.dialog-select-object-ids .main-toolbar-table .panel-button {
display: inline-block;
line-height: 24px;
height: 24px;
width: 24px;
color: #fff;
position: relative;
overflow: hidden;
z-index: 1;
padding: 0;
border-radius: 50%;
transition: background-color 0.3s;
cursor: pointer;
vertical-align: middle;
}
.dialog-select-object-ids .main-toolbar-table .panel-button:hover {
border: 0;
}
.dialog-select-object-ids .main-toolbar-table .panel-button i {
margin-left: -0.5px;
font-size: 1.1rem;
line-height: 28px;
margin-top: -1px;
}
.dialog-select-object-ids .main-toolbar-table .btn-expert {
margin-right: 3px;
}
.dialog-select-object-ids .main-toolbar-table .btn-history {
position: absolute;
top: 0;
right: 20px;
}
.dialog-select-object-ids .main-toolbar-table .objects-info {
display: inline-block;
float: right;
padding-right: 1rem;
margin-top: 5px;
}
.dialog-select-object-ids .old-style .main-header-table {
width: 100%;
}
.dialog-select-object-ids .old-style .main-header-table th span {
font-size: 11px;
font-weight: normal;
}
.dialog-select-object-ids .old-style .grid-main-wob-div {
height: calc(100% - 50px);
}
.dialog-select-object-ids .old-style .iob-list-icon {
height: 16px;
}
.dialog-select-object-ids .old-style .clippy-button {
height: 16px;
}
.dialog-select-object-ids .old-style .ui-state-active,
.dialog-select-object-ids .old-style .ui-widget-content .ui-state-active {
background: inherit !important;
}
.dialog-select-object-ids .material .objects-list-running {
height: 5rem;
}
.dialog-select-object-ids .material .filter-btn i {
font-size: 12px;
}
.dialog-select-object-ids .material .td-button-placeholder {
width: 21px;
}
.dialog-select-object-ids .material .custom-obj-btn {
cursor: pointer;
color: #4c4c4c;
background: white;
border: 0;
padding-left: 4px;
margin-right: 1px;
margin-top: 3px;
}
.dialog-select-object-ids .material .custom-obj-btn:hover {
background: #64b5f6;
}
.dialog-select-object-ids .material .custom-obj-btn i {
font-size: 12px;
}
.dialog-select-object-ids .material .iob-list-icon,
.dialog-select-object-ids .material .instance-image {
width: 18px;
height: 18px;
}
.dialog-select-object-ids .material .main-toolbar-table .panel-button {
background-color: #2196f3;
}
.dialog-select-object-ids .main-header-table th {
border-right: 1px solid #b9b9b9;
color: gray;
}
.dialog-select-object-ids .main-header-table .filter {
display: inline-block;
border: 0;
height: 24px;
width: calc(100% - 5px);
padding: 0 0 0 5px;
background: transparent;
color: gray;
font-family: "Segoe UI", Tahoma, Arial, "Courier New" !important;
font-size: 0.82rem !important;
margin-bottom: 0;
}
.dialog-select-object-ids .main-header-table .filter-btn {
display: none;
}
.dialog-select-object-ids .main-header-table .filter-active .filter {
color: black;
width: calc(100% - 24px);
}
.dialog-select-object-ids .main-header-table .filter-active .filter-btn {
padding: 0;
display: inline-block;
width: 19px;
height: 16px;
background: transparent;
border: 0;
margin-top: 3px;
}
.dialog-select-object-ids .main-header-table .filter-active .filter-btn i {
font-size: 12px;
}
.dialog-select-object-ids .clippy-button,
.dialog-select-object-ids .edit-dialog-button {
position: absolute;
top: 1px;
z-index: 1;
margin-top: 1px;
}
.dialog-select-object-ids .clippy-button .tiny,
.dialog-select-object-ids .edit-dialog-button .tiny {
font-size: 10px;
}
.dialog-select-object-ids .clippy-button {
right: 0;
}
.dialog-select-object-ids .edit-dialog-button {
right: 22px;
}
.dialog-select-object-ids .select-value {
display: inline-block;
width: 100%;
padding-left: 5px;
position: relative;
}
@keyframes highlight {
0% {
color: #00f900;
}
80% {
color: green;
}
100% {
color: black;
}
}
.dialog-select-object-ids .highlight {
animation: highlight 2s;
}
#select-id-dialog > span {
float: left;
margin: 0 7px 50px 0;
}
.m #dialog-select-member {
width: calc(100% - 2rem);
height: calc(100% - 2rem) !important;
border: 3px solid #2196f3;
box-sizing: border-box;
}
.m #dialog-select-member td,
.m #dialog-select-member th {
padding: 1px 4px;
}
.m #dialog-select-member .modal-content {
padding: 0.5rem 0.2rem !important;
width: 100% !important;
overflow: hidden;
}
.m #dialog-select-member .modal-content .title {
padding: 3px 10px;
}
.m #dialog-select-member .modal-content .grid-main-wob-div {
height: calc(100% - 103px);
}
/*# sourceMappingURL=selectID.css.map */

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,13 @@
<?xml version="1.0"?>
<bindings
xmlns="http://www.mozilla.org/xbl"
xmlns:xbl="http://www.mozilla.org/xbl"
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<binding id="ellipsis">
<content>
<xul:window><!-- xul:window tag required for FF2 -->
<xul:description crop="end" xbl:inherits="value=xbl:text"><children/></xul:description>
</xul:window>
</content>
</binding>
</bindings>

View File

@ -0,0 +1,162 @@
/*Grid*/
.ui-jqgrid {position: relative;}
.ui-jqgrid .ui-jqgrid-view {position: relative;left:0; top: 0; padding: 0; font-size:11px;}
/* caption*/
.ui-jqgrid .ui-jqgrid-titlebar {padding: .3em .2em .2em .3em; position: relative; border-left: 0 none;border-right: 0 none; border-top: 0 none;}
.ui-jqgrid .ui-jqgrid-title { float: left; margin: .1em 0 .2em; }
.ui-jqgrid .ui-jqgrid-titlebar-close { position: absolute;top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height:18px; cursor:pointer;}
.ui-jqgrid .ui-jqgrid-titlebar-close span { display: block; margin: 1px; }
.ui-jqgrid .ui-jqgrid-titlebar-close:hover { padding: 0; }
/* header*/
.ui-jqgrid .ui-jqgrid-hdiv {position: relative; margin: 0;padding: 0; overflow-x: hidden; border-left: 0 none !important; border-top : 0 none !important; border-right : 0 none !important;}
.ui-jqgrid .ui-jqgrid-hbox {float: left; padding-right: 20px;}
.ui-jqgrid .ui-jqgrid-htable {table-layout:fixed;margin:0;}
.ui-jqgrid .ui-jqgrid-htable th {height:22px;padding: 0 2px 0 2px;}
.ui-jqgrid .ui-jqgrid-htable th div {overflow: hidden; position:relative; height:17px;}
.ui-th-column, .ui-jqgrid .ui-jqgrid-htable th.ui-th-column {overflow: hidden;white-space: nowrap;text-align:center;border-top : 0 none;border-bottom : 0 none;}
.ui-th-ltr, .ui-jqgrid .ui-jqgrid-htable th.ui-th-ltr {border-left : 0 none;}
.ui-th-rtl, .ui-jqgrid .ui-jqgrid-htable th.ui-th-rtl {border-right : 0 none;}
.ui-first-th-ltr {border-right: 1px solid; }
.ui-first-th-rtl {border-left: 1px solid; }
.ui-jqgrid .ui-th-div-ie {white-space: nowrap; zoom :1; height:17px;}
.ui-jqgrid .ui-jqgrid-resize {height:20px !important;position: relative; cursor :e-resize;display: inline;overflow: hidden;}
.ui-jqgrid .ui-grid-ico-sort {overflow:hidden;position:absolute;display:inline; cursor: pointer !important;}
.ui-jqgrid .ui-icon-asc {margin-top:-3px; height:12px;}
.ui-jqgrid .ui-icon-desc {margin-top:3px;height:12px;}
.ui-jqgrid .ui-i-asc {margin-top:0;height:16px;}
.ui-jqgrid .ui-i-desc {margin-top:0;margin-left:13px;height:16px;}
.ui-jqgrid .ui-jqgrid-sortable {cursor:pointer;}
.ui-jqgrid tr.ui-search-toolbar th { border-top-width: 1px !important; border-top-color: inherit !important; border-top-style: ridge !important }
tr.ui-search-toolbar input {margin: 1px 0 0 0}
tr.ui-search-toolbar select {margin: 1px 0 0 0}
/* body */
.ui-jqgrid .ui-jqgrid-bdiv {position: relative; margin: 0; padding:0; overflow: auto; text-align:left;}
.ui-jqgrid .ui-jqgrid-btable {table-layout:fixed; margin:0; outline-style: none; }
.ui-jqgrid tr.jqgrow { outline-style: none; }
.ui-jqgrid tr.jqgroup { outline-style: none; }
.ui-jqgrid tr.jqgrow td {font-weight: normal; overflow: hidden; white-space: pre; height: 22px;padding: 0 2px 0 2px;border-bottom-width: 1px; border-bottom-color: inherit; border-bottom-style: solid;}
.ui-jqgrid tr.jqgfirstrow td {padding: 0 2px 0 2px;border-right-width: 1px; border-right-style: solid;}
.ui-jqgrid tr.jqgroup td {font-weight: normal; overflow: hidden; white-space: pre; height: 22px;padding: 0 2px 0 2px;border-bottom-width: 1px; border-bottom-color: inherit; border-bottom-style: solid;}
.ui-jqgrid tr.jqfoot td {font-weight: bold; overflow: hidden; white-space: pre; height: 22px;padding: 0 2px 0 2px;border-bottom-width: 1px; border-bottom-color: inherit; border-bottom-style: solid;}
.ui-jqgrid tr.ui-row-ltr td {text-align:left;border-right-width: 1px; border-right-color: inherit; border-right-style: solid;}
.ui-jqgrid tr.ui-row-rtl td {text-align:right;border-left-width: 1px; border-left-color: inherit; border-left-style: solid;}
.ui-jqgrid td.jqgrid-rownum { padding: 0 2px 0 2px; margin: 0; border: 0 none;}
.ui-jqgrid .ui-jqgrid-resize-mark { width:2px; left:0; background-color:#777; cursor: e-resize; cursor: col-resize; position:absolute; top:0; height:100px; overflow:hidden; display:none; border:0 none; z-index: 99999;}
/* footer */
.ui-jqgrid .ui-jqgrid-sdiv {position: relative; margin: 0;padding: 0; overflow: hidden; border-left: 0 none !important; border-top : 0 none !important; border-right : 0 none !important;}
.ui-jqgrid .ui-jqgrid-ftable {table-layout:fixed; margin-bottom:0;}
.ui-jqgrid tr.footrow td {font-weight: bold; overflow: hidden; white-space:nowrap; height: 21px;padding: 0 2px 0 2px;border-top-width: 1px; border-top-color: inherit; border-top-style: solid;}
.ui-jqgrid tr.footrow-ltr td {text-align:left;border-right-width: 1px; border-right-color: inherit; border-right-style: solid;}
.ui-jqgrid tr.footrow-rtl td {text-align:right;border-left-width: 1px; border-left-color: inherit; border-left-style: solid;}
/* Pager*/
.ui-jqgrid .ui-jqgrid-pager { border-left: 0 none !important;border-right: 0 none !important; border-bottom: 0 none !important; margin: 0 !important; padding: 0 !important; position: relative; height: 25px;white-space: nowrap;overflow: hidden;font-size:11px;}
.ui-jqgrid .ui-pager-control {position: relative;}
.ui-jqgrid .ui-pg-table {position: relative; padding-bottom:2px; width:auto; margin: 0;}
.ui-jqgrid .ui-pg-table td {font-weight:normal; vertical-align:middle; padding:1px;}
.ui-jqgrid .ui-pg-button { height:19px !important;}
.ui-jqgrid .ui-pg-button span { display: block; margin: 1px; float:left;}
.ui-jqgrid .ui-pg-button:hover { padding: 0; }
.ui-jqgrid .ui-state-disabled:hover {padding:1px;}
.ui-jqgrid .ui-pg-input { height:13px;font-size:.8em; margin: 0;}
.ui-jqgrid .ui-pg-selbox {font-size:.8em; line-height:18px; display:block; height:18px; margin: 0;}
.ui-jqgrid .ui-separator {height: 18px; border-left: 1px solid #ccc ; border-right: 1px solid #ccc ; margin: 1px; float: right;}
.ui-jqgrid .ui-paging-info {font-weight: normal;height:19px; margin-top:3px;margin-right:4px;}
.ui-jqgrid .ui-jqgrid-pager .ui-pg-div {padding:1px 0;float:left;position:relative;}
.ui-jqgrid .ui-jqgrid-pager .ui-pg-button { cursor:pointer; }
.ui-jqgrid .ui-jqgrid-pager .ui-pg-div span.ui-icon {float:left;margin:0 2px;}
.ui-jqgrid td input, .ui-jqgrid td select .ui-jqgrid td textarea { margin: 0;}
.ui-jqgrid td textarea {width:auto;height:auto;}
.ui-jqgrid .ui-jqgrid-toppager {border-left: 0 none !important;border-right: 0 none !important; border-top: 0 none !important; margin: 0 !important; padding: 0 !important; position: relative; height: 25px !important;white-space: nowrap;overflow: hidden;}
.ui-jqgrid .ui-jqgrid-toppager .ui-pg-div {padding:1px 0;float:left;position:relative;}
.ui-jqgrid .ui-jqgrid-toppager .ui-pg-button { cursor:pointer; }
.ui-jqgrid .ui-jqgrid-toppager .ui-pg-div span.ui-icon {float:left;margin:0 2px;}
/*subgrid*/
.ui-jqgrid .ui-jqgrid-btable .ui-sgcollapsed span {display: block;}
.ui-jqgrid .ui-subgrid {margin:0;padding:0; width:100%;}
.ui-jqgrid .ui-subgrid table {table-layout: fixed;}
.ui-jqgrid .ui-subgrid tr.ui-subtblcell td {height:18px;border-right-width: 1px; border-right-color: inherit; border-right-style: solid;border-bottom-width: 1px; border-bottom-color: inherit; border-bottom-style: solid;}
.ui-jqgrid .ui-subgrid td.subgrid-data {border-top: 0 none !important;}
.ui-jqgrid .ui-subgrid td.subgrid-cell {border-width: 0 0 1px 0;}
.ui-jqgrid .ui-th-subgrid {height:20px;}
/* loading */
.ui-jqgrid .loading {position: absolute; top: 45%;left: 45%;width: auto;z-index:101;padding: 6px; margin: 5px;text-align: center;font-weight: bold;display: none;border-width: 2px !important; font-size:11px;}
.ui-jqgrid .jqgrid-overlay {display:none;z-index:100;}
* html .jqgrid-overlay {width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');}
* .jqgrid-overlay iframe {position:absolute;top:0;left:0;z-index:-1;width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');}
/* end loading div */
/* toolbar */
.ui-jqgrid .ui-userdata {border-left: 0 none; border-right: 0 none; height : 21px;overflow: hidden; }
/*Modal Window */
.ui-jqdialog { display: none; width: 300px; position: absolute; padding: .2em; font-size:11px; overflow:visible;}
.ui-jqdialog .ui-jqdialog-titlebar { padding: .3em .2em; position: relative; }
.ui-jqdialog .ui-jqdialog-title { margin: .1em 0 .2em; }
.ui-jqdialog .ui-jqdialog-titlebar-close { position: absolute; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; cursor:pointer;}
.ui-jqdialog .ui-jqdialog-titlebar-close span { display: block; margin: 1px; }
.ui-jqdialog .ui-jqdialog-titlebar-close:hover, .ui-jqdialog .ui-jqdialog-titlebar-close:focus { padding: 0; }
.ui-jqdialog-content, .ui-jqdialog .ui-jqdialog-content { border: 0; padding: .3em .2em; background: none; height:auto;}
.ui-jqdialog .ui-jqconfirm {padding: .4em 1em; border-width:3px;position:absolute;bottom:10px;right:10px;overflow:visible;display:none;height:80px;width:220px;text-align:center;}
.ui-jqdialog>.ui-resizable-se { bottom: -3px; right: -3px}
.ui-jqgrid>.ui-resizable-se { bottom: -3px; right: -3px }
/* end Modal window*/
/* Form edit */
.ui-jqdialog-content .FormGrid {margin: 0;}
.ui-jqdialog-content .EditTable { width: 100%; margin-bottom:0;}
.ui-jqdialog-content .DelTable { width: 100%; margin-bottom:0;}
.EditTable td input, .EditTable td select, .EditTable td textarea {margin: 0;}
.EditTable td textarea { width:auto; height:auto;}
.ui-jqdialog-content td.EditButton {text-align: right;border-top: 0 none;border-left: 0 none;border-right: 0 none; padding-bottom:5px; padding-top:5px;}
.ui-jqdialog-content td.navButton {text-align: center; border-left: 0 none;border-top: 0 none;border-right: 0 none; padding-bottom:5px; padding-top:5px;}
.ui-jqdialog-content input.FormElement {padding:.3em}
.ui-jqdialog-content select.FormElement {padding:.3em}
.ui-jqdialog-content .data-line {padding-top:.1em;border: 0 none;}
.ui-jqdialog-content .CaptionTD {vertical-align: middle;border: 0 none; padding: 2px;white-space: nowrap;}
.ui-jqdialog-content .DataTD {padding: 2px; border: 0 none; vertical-align: top;}
.ui-jqdialog-content .form-view-data {white-space:pre}
.fm-button { display: inline-block; margin:0 4px 0 0; padding: .4em .5em; text-decoration:none !important; cursor:pointer; position: relative; text-align: center; zoom: 1; }
.fm-button-icon-left { padding-left: 1.9em; }
.fm-button-icon-right { padding-right: 1.9em; }
.fm-button-icon-left .ui-icon { right: auto; left: .2em; margin-left: 0; position: absolute; top: 50%; margin-top: -8px; }
.fm-button-icon-right .ui-icon { left: auto; right: .2em; margin-left: 0; position: absolute; top: 50%; margin-top: -8px;}
#nData, #pData { float: left; margin:3px;padding: 0; width: 15px; }
/* End Eorm edit */
/*.ui-jqgrid .edit-cell {}*/
.ui-jqgrid .selected-row, div.ui-jqgrid .selected-row td {font-style : normal;border-left: 0 none;}
/* inline edit actions button*/
.ui-inline-del.ui-state-hover span, .ui-inline-edit.ui-state-hover span,
.ui-inline-save.ui-state-hover span, .ui-inline-cancel.ui-state-hover span {
margin: -1px;
}
/* Tree Grid */
.ui-jqgrid .tree-wrap {float: left; position: relative;height: 18px;white-space: nowrap;overflow: hidden;}
.ui-jqgrid .tree-minus {position: absolute; height: 18px; width: 18px; overflow: hidden;}
.ui-jqgrid .tree-plus {position: absolute; height: 18px; width: 18px; overflow: hidden;}
.ui-jqgrid .tree-leaf {position: absolute; height: 18px; width: 18px;overflow: hidden;}
.ui-jqgrid .treeclick {cursor: pointer;}
/* moda dialog */
* iframe.jqm {position:absolute;top:0;left:0;z-index:-1;width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');}
.ui-jqgrid-dnd tr td {border-right-width: 1px; border-right-color: inherit; border-right-style: solid; height:20px}
/* RTL Support */
.ui-jqgrid .ui-jqgrid-title-rtl {float:right;margin: .1em 0 .2em; }
.ui-jqgrid .ui-jqgrid-hbox-rtl {float: right; padding-left: 20px;}
.ui-jqgrid .ui-jqgrid-resize-ltr {float: right;margin: -2px -2px -2px 0;}
.ui-jqgrid .ui-jqgrid-resize-rtl {float: left;margin: -2px 0 -1px -3px;}
.ui-jqgrid .ui-sort-rtl {left:0;}
.ui-jqgrid .tree-wrap-ltr {float: left;}
.ui-jqgrid .tree-wrap-rtl {float: right;}
.ui-jqgrid .ui-ellipsis {text-overflow:ellipsis;}
/* Toolbar Search Menu */
.ui-search-menu { position: absolute; padding: 2px 5px;}
.ui-jqgrid .ui-search-table { padding: 0px 0px; border: 0px none; height:20px; width:100%;}
.ui-jqgrid .ui-search-table .ui-search-oper { width:20px; }
a.g-menu-item, a.soptclass, a.clearsearchclass { cursor: pointer; }
.ui-jqgrid .ui-search-table .ui-search-input>input,
.ui-jqgrid .ui-search-table .ui-search-input>select
{
display: block;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}

8
www/lib/css/materialize.css vendored Normal file

File diff suppressed because one or more lines are too long

711
www/lib/css/style.css Normal file
View File

@ -0,0 +1,711 @@
* {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
body {
font: "Helvetica Neue",Helvetica,Arial,sans-serif;
background: white;
}
.iob-form {
border: 1px solid white;
padding: 5px;
border-radius: 5px;
}
/* compact */
@media (max-width: 30em) {
.layoutMain {
width: 100%;
height: 100%;
overflow: auto;
}
.layoutHeader {
padding-top: 15px;
width: 100%;
}
.reconnect-button {
width: 200px;
}
#form {
max-width: 280px;
}
.iob-form {
max-width: 280px;
}
}
/* desktop */
@media (min-width: 30em) {
.layoutMain {
width: 100%;
height: 100%;
overflow: auto;
}
.layoutHeader {
padding-top: 15px;
width: 100% ;
}
.reconnect-button {
width: 350px;
}
#form {
max-width: 350px;
}
.iob-form {
max-width: 350px;
}
}
.warning {
font-size: 12px;
padding-left: 20px;
padding-right: 20px;
width: 100%;
}
@-webkit-keyframes fadeOut {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
@-moz-keyframes fadeOut {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
@-o-keyframes fadeOut {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
@keyframes fadeOut {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
.error-msg {
position: absolute;
left: calc(50% - 100px);
top: 50%;
padding: 1em;
border: 1px solid red;
background: #c40000;
border-radius: 1em;
color: #FFFFFF;
opacity: 0;
pointer-events: none;
-webkit-animation: fadeOut 3s ease-out 1;
-moz-animation: fadeOut 3s ease-out 1;
-o-animation: fadeOut 3s ease-out 1;
animation: fadeOut 3s ease-out 1;
}
.message-msg {
position: absolute;
left: calc(50% - 100px);
top: 50%;
padding: 1em;
border: 1px solid #3399cc;
background: #337ab7;
border-radius: 1em;
color: #FFFFFF;
opacity: 0;
pointer-events: none;
-webkit-animation: fadeOut 3s ease-out 1;
-moz-animation: fadeOut 3s ease-out 1;
-o-animation: fadeOut 3s ease-out 1;
animation: fadeOut 3s ease-out 1;
}
.layoutHeader {
width: 100%;
height: 70px;
background: #FFFFFF;
display: inline-block;
}
.logo {
cursor: pointer;
display: inline-block;
background-image: url(../img/logo.png);
background-repeat: no-repeat;
background-size: 15rem;
height: 4.1rem;
width: 15rem;
padding: 1rem;
background-position-y: 1rem;
}
.login-button, .logout-button {
float: right;
border: 2px solid #3399CC;
padding: 12px;
text-align: center;
border-radius: 4px;
color: #3399CC;
text-transform: uppercase;
text-decoration: none;
font-weight: bold;
background-color: transparent;
cursor: pointer;
}
.login-button:hover, .logout-button:hover {
color: #FFFFFF;
background: #3399CC;
text-transform: uppercase;
text-decoration: none;
}
.account-button {
float: right;
width: 50px;
height: 50px;
text-align: center;
border-radius: 25px;
background: #3399CC;
background-image: url(../img/person.png);
background-size: 30px 30px;
background-repeat: no-repeat;
background-position: 10px 8px;
margin-left: 1rem;
margin-right: 1rem;
cursor: pointer;
}
.leave-button, .deleteid-button, .createid-button, .reconnect-button {
border: 2px solid #FFFFFF;
padding: 12px;
text-align: center;
border-radius: 4px;
color: #FFFFFF;
text-transform: uppercase;
text-decoration: none;
font-weight: bold;
background-color: transparent;
cursor: pointer;
font-size: 14px;
}
.leave-button:hover, .deleteid-button:hover, .createid-button:hover, .reconnect-button:hover {
color: #3399CC;
background: #FFFFFF;
}
html, body, .container {
height: 100%;
overflow: hidden;
}
.deleteid-button {
width: 170px;
display: inline-block;
}
.disabled-button {
color: #b7b7b7;
border: 2px solid #b7b7b7;
cursor: inherit;
}
.disabled-button:hover {
color: #b7b7b7;
border: 2px solid #b7b7b7;
background-color: transparent;
}
.vertical-center-row {
background: #3399CC;
vertical-align: middle;
text-align: center;
border-radius: 0 0 1rem 1rem;
min-height: calc(100% - 10rem);
overflow: auto;
}
.username {
width: 100%;
text-align: center;
font-weight: bold;
font-size: large;
padding-top: 1.2rem;
}
.targets {
width: 80%;
}
.target, .target a {
width: 100%;
height: 100%;
color: #3399CC;
text-transform: uppercase;
text-decoration: none;
font-size: large;
}
@keyframes blink-animation {
to {
visibility: hidden;
}
}
@-webkit-keyframes blink-animation {
to {
visibility: hidden;
}
}
.warning {
text-align: center;
animation: blink-animation 5s steps(5, start) infinite;
-webkit-animation: blink-animation 5s steps(5, start) infinite;
position: absolute;
bottom: 2rem;
color: #FFB7B7;
}
.panel-text {
color: white;
}
.policy-text {
color: black;
}
.footer {
padding-left: 3rem;
margin-top: -2.3rem;
}
.footer-link:hover {
text-decoration: none;
cursor: pointer;
}
/*!
* Start Bootstrap - Simple Sidebar (http://startbootstrap.com/)
* Copyright 2013-2016 Start Bootstrap
* Licensed under MIT (https://git.spacen.net/BlackrockDigital/startbootstrap/blob/gh-pages/LICENSE)
* https://git.spacen.net/BlackrockDigital/startbootstrap-simple-sidebar/blob/master/css/simple-sidebar.css
*/
/* Toggle Styles */
#wrapper {
padding-left: 0;
-webkit-transition: all 0.5s ease;
-moz-transition: all 0.5s ease;
-o-transition: all 0.5s ease;
transition: all 0.5s ease;
}
#wrapper.toggled {
padding-left: 250px;
}
#sidebar-wrapper {
z-index: 1000;
position: fixed;
left: 250px;
width: 0;
height: 100%;
margin-left: -250px;
overflow-y: auto;
background: #000;
-webkit-transition: all 0.5s ease;
-moz-transition: all 0.5s ease;
-o-transition: all 0.5s ease;
transition: all 0.5s ease;
}
#wrapper.toggled #sidebar-wrapper {
width: 250px;
}
#page-content-wrapper {
width: 100%;
position: absolute;
padding: 15px;
}
#wrapper.toggled #page-content-wrapper {
position: absolute;
margin-right: -250px;
}
.button-white {
color: #fbfbfb;
}
.stripe-button-el {
width: 240px !important;
}
.button-license-el {
width: 340px !important;
overflow: hidden;
display: inline-block;
visibility: visible !important;
background-image: -webkit-linear-gradient(#28a0e5,#015e94);
background-image: -moz-linear-gradient(#28a0e5,#015e94);
background-image: -ms-linear-gradient(#28a0e5,#015e94);
background-image: -o-linear-gradient(#28a0e5,#015e94);
background-image: -webkit-linear-gradient(#28a0e5,#015e94);
background-image: -moz-linear-gradient(#28a0e5,#015e94);
background-image: -ms-linear-gradient(#28a0e5,#015e94);
background-image: -o-linear-gradient(#28a0e5,#015e94);
background-image: linear-gradient(#28a0e5,#015e94);
-webkit-font-smoothing: antialiased;
border: 0;
padding: 1px;
text-decoration: none;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
-ms-border-radius: 5px;
-o-border-radius: 5px;
border-radius: 5px;
-webkit-box-shadow: 0 1px 0 rgba(0,0,0,0.2);
-moz-box-shadow: 0 1px 0 rgba(0,0,0,0.2);
-ms-box-shadow: 0 1px 0 rgba(0,0,0,0.2);
-o-box-shadow: 0 1px 0 rgba(0,0,0,0.2);
box-shadow: 0 1px 0 rgba(0,0,0,0.2);
-webkit-touch-callout: none;
-webkit-tap-highlight-color: transparent;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
-o-user-select: none;
user-select: none;
cursor: pointer;
}
.button-license-el span {
display: block;
position: relative;
padding: 0 12px;
height: 30px;
line-height: 30px;
background: #1275ff;
background-image: -webkit-linear-gradient(#7dc5ee,#008cdd 85%,#30a2e4);
background-image: -moz-linear-gradient(#7dc5ee,#008cdd 85%,#30a2e4);
background-image: -ms-linear-gradient(#7dc5ee,#008cdd 85%,#30a2e4);
background-image: -o-linear-gradient(#7dc5ee,#008cdd 85%,#30a2e4);
background-image: -webkit-linear-gradient(#7dc5ee,#008cdd 85%,#30a2e4);
background-image: -moz-linear-gradient(#7dc5ee,#008cdd 85%,#30a2e4);
background-image: -ms-linear-gradient(#7dc5ee,#008cdd 85%,#30a2e4);
background-image: -o-linear-gradient(#7dc5ee,#008cdd 85%,#30a2e4);
background-image: linear-gradient(#7dc5ee,#008cdd 85%,#30a2e4);
font-size: 14px;
color: #fff;
font-weight: bold;
font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
text-shadow: 0 -1px 0 rgba(0,0,0,0.25);
-webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,0.25);
-moz-box-shadow: inset 0 1px 0 rgba(255,255,255,0.25);
-ms-box-shadow: inset 0 1px 0 rgba(255,255,255,0.25);
-o-box-shadow: inset 0 1px 0 rgba(255,255,255,0.25);
box-shadow: inset 0 1px 0 rgba(255,255,255,0.25);
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
-ms-border-radius: 4px;
-o-border-radius: 4px;
border-radius: 4px;
}
/* Sidebar Styles */
.sidebar-nav {
position: absolute;
top: 0;
width: 250px;
margin: 0;
padding: 0;
list-style: none;
}
.sidebar-nav li {
text-indent: 20px;
line-height: 40px;
}
.sidebar-nav li a {
display: block;
text-decoration: none;
color: #999999;
}
.sidebar-nav li a:hover {
text-decoration: none;
color: #fff;
background: rgba(255,255,255,0.2);
}
.sidebar-nav li a:active,
.sidebar-nav li a:focus {
text-decoration: none;
}
.sidebar-nav > .sidebar-brand {
height: 65px;
font-size: 18px;
line-height: 60px;
}
.sidebar-nav > .sidebar-brand a {
color: #999999;
}
.sidebar-nav > .sidebar-brand a:hover {
color: #fff;
background: none;
}
.lic-data {
text-align: left;
padding-left: 20px;
}
.lic-data-value {
padding-right: 10px;
}
.lic-data-title {
font-weight: bold;
padding-right: 15px;
padding-left: 10px;
}
.licenses-list>tbody>tr:nth-child(odd) {
background: #90c8e4
}
@media(min-width:768px) {
#wrapper {
padding-left: 250px;
}
#wrapper.toggled {
padding-left: 0;
}
#sidebar-wrapper {
width: 250px;
}
#wrapper.toggled #sidebar-wrapper {
width: 0;
}
#page-content-wrapper {
padding: 20px;
position: relative;
}
#wrapper.toggled #page-content-wrapper {
position: relative;
margin-right: 0;
}
}
.menu a, .menu a:hover {
text-decoration: none;
}
.menu {
float: left;
width: 180px;
}
.menu-item {
border: 2px solid #337ab7;
padding: 12px;
text-align: left;
/* border-radius: 4px; */
color: #3399cc;
text-transform: uppercase;
text-decoration: none;
font-weight: bold;
background-color: #d9edf7;
cursor: pointer;
white-space: nowrap;
width: 100%;
}
.menu-item-selected {
background-color: #3399cc;
color: #d9edf7;
}
/* stripe */
.stripe {
display: none;
background: rgba(128, 128, 128, 0.5);
width: 100%;
height: 100%;
top: 0;
left: 0;
position: absolute;
z-index: 2;
}
.stripe-dialog {
position: absolute;
width: 640px;
height: 700px;
border: 2px solid gray;
border-radius: 5px;
background: #E6EBF1;
align-items: center;
min-height: 480px;
top: calc(50% - 350px);
left: calc(50% - 320px);
display: flex;
}
.stripe form {
width: 480px;
margin: 20px auto;
}
.stripe .group {
background: white;
box-shadow: 0 7px 14px 0 rgba(49,49,93,0.10),
0 3px 6px 0 rgba(0,0,0,0.08);
border-radius: 4px;
margin-bottom: 20px;
}
.stripe label {
position: relative;
color: #8898AA;
font-weight: 300;
height: 40px;
line-height: 40px;
margin-left: 20px;
display: block;
}
.stripe .group label:not(:last-child) {
border-bottom: 1px solid #F0F5FA;
}
.stripe label > span {
width: 20%;
text-align: right;
float: left;
}
.stripe .field {
background: transparent;
font-weight: 300;
border: 0;
color: #31325F;
outline: none;
padding-right: 10px;
padding-left: 10px;
cursor: text;
width: 70%;
height: 40px;
float: right;
}
.stripe .field::-webkit-input-placeholder { color: #CFD7E0; }
.stripe .field::-moz-placeholder { color: #CFD7E0; }
.stripe .field:-ms-input-placeholder { color: #CFD7E0; }
.stripe button, .stripe .button-cancel {
float: left;
display: block;
background: #666EE8;
color: white;
box-shadow: 0 7px 14px 0 rgba(49,49,93,0.10),
0 3px 6px 0 rgba(0,0,0,0.08);
border-radius: 4px;
border: 0;
margin-top: 20px;
font-size: 15px;
font-weight: 400;
width: 100%;
height: 40px;
line-height: 38px;
outline: none;
}
.stripe .button-cancel {
background: #5f5f5f;
cursor: pointer;
}
.stripe button:focus, .stripe .button-cancel:focus {
background: #555ABF;
}
.stripe button:active, .stripe .button-cancel:active {
background: #43458B;
}
.stripe-price-netto, .stripe-price-vat, .stripe-price-total {
padding-right: 10px;
}
.stripe-price-total, .stripe-price-total-number {
font-weight: bold !important;
border-top: 1px solid gray;
}
.stripe-price-netto {
width: 200px;
}
.stripe-price {
width: 100%;
text-align: left;
}
.stripe-product {
padding-bottom: 10px;
}
.stripe-info {
font-size: 10px;
}
.stripe-price table {
margin-left: calc(50% - 100px);
}
.stripe .outcome {
float: left;
width: 100%;
padding-top: 8px;
min-height: 24px;
text-align: center;
}
.stripe .success, .error {
display: none;
font-size: 13px;
}
.stripe .success.visible, .error.visible {
display: inline;
}
.stripe .error {
color: #E4584C;
}
.stripe .success {
color: #666EE8;
}
.stripe .success .token {
font-weight: 500;
font-size: 13px;
}
.stripe .form-disabled {
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
opacity: 0.5;
background: black;
z-index: 10;
display: none;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 351 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 299 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 299 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 319 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 363 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,410 @@
/*!
* jQuery UI CSS Framework 1.11.2
* http://jqueryui.com
*
* Copyright 2014 jQuery Foundation and other contributors
* Released under the MIT license.
* http://jquery.org/license
*
* http://api.jqueryui.com/category/theming/
*
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=333333&bgTextureHeader=diagonals_thick&bgImgOpacityHeader=8&borderColorHeader=a3a3a3&fcHeader=eeeeee&iconColorHeader=bbbbbb&bgColorContent=f9f9f9&bgTextureContent=highlight_hard&bgImgOpacityContent=100&borderColorContent=cccccc&fcContent=222222&iconColorContent=222222&bgColorDefault=111111&bgTextureDefault=glass&bgImgOpacityDefault=40&borderColorDefault=777777&fcDefault=e3e3e3&iconColorDefault=ededed&bgColorHover=1c1c1c&bgTextureHover=glass&bgImgOpacityHover=55&borderColorHover=000000&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=ffffff&bgTextureActive=flat&bgImgOpacityActive=65&borderColorActive=cccccc&fcActive=222222&iconColorActive=222222&bgColorHighlight=ffeb80&bgTextureHighlight=inset_hard&bgImgOpacityHighlight=55&borderColorHighlight=ffde2e&fcHighlight=363636&iconColorHighlight=4ca300&bgColorError=cd0a0a&bgTextureError=inset_hard&bgImgOpacityError=45&borderColorError=9e0505&fcError=ffffff&iconColorError=ffcf29&bgColorOverlay=aaaaaa&bgTextureOverlay=highlight_hard&bgImgOpacityOverlay=40&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=highlight_soft&bgImgOpacityShadow=50&opacityShadow=20&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
*/
/* Component containers
----------------------------------*/
.ui-widget {
font-family: Verdana,Arial,sans-serif;
font-size: 1.1em;
}
.ui-widget .ui-widget {
font-size: 1em;
}
.ui-widget input,
.ui-widget select,
.ui-widget textarea,
.ui-widget button {
font-family: Verdana,Arial,sans-serif;
font-size: 1em;
}
.ui-widget-content {
border: 1px solid #cccccc;
background: #f9f9f9 url("images/ui-bg_highlight-hard_100_f9f9f9_1x100.png") 50% top repeat-x;
color: #222222;
}
.ui-widget-content a {
color: #222222;
}
.ui-widget-header {
border: 1px solid #a3a3a3;
background: #333333 url("images/ui-bg_diagonals-thick_8_333333_40x40.png") 50% 50% repeat;
color: #eeeeee;
font-weight: bold;
}
.ui-widget-header a {
color: #eeeeee;
}
/* Interaction states
----------------------------------*/
.ui-state-default,
.ui-widget-content .ui-state-default,
.ui-widget-header .ui-state-default {
border: 1px solid #777777;
background: #111111 url("images/ui-bg_glass_40_111111_1x400.png") 50% 50% repeat-x;
font-weight: normal;
color: #e3e3e3;
}
.ui-state-default a,
.ui-state-default a:link,
.ui-state-default a:visited {
color: #e3e3e3;
text-decoration: none;
}
.ui-state-hover,
.ui-widget-content .ui-state-hover,
.ui-widget-header .ui-state-hover,
.ui-state-focus,
.ui-widget-content .ui-state-focus,
.ui-widget-header .ui-state-focus {
border: 1px solid #000000;
background: #1c1c1c url("images/ui-bg_glass_55_1c1c1c_1x400.png") 50% 50% repeat-x;
font-weight: normal;
color: #ffffff;
}
.ui-state-hover a,
.ui-state-hover a:hover,
.ui-state-hover a:link,
.ui-state-hover a:visited,
.ui-state-focus a,
.ui-state-focus a:hover,
.ui-state-focus a:link,
.ui-state-focus a:visited {
color: #ffffff;
text-decoration: none;
}
.ui-state-active,
.ui-widget-content .ui-state-active,
.ui-widget-header .ui-state-active {
border: 1px solid #cccccc;
background: #ffffff url("images/ui-bg_flat_65_ffffff_40x100.png") 50% 50% repeat-x;
font-weight: normal;
color: #222222;
}
.ui-state-active a,
.ui-state-active a:link,
.ui-state-active a:visited {
color: #222222;
text-decoration: none;
}
/* Interaction Cues
----------------------------------*/
.ui-state-highlight,
.ui-widget-content .ui-state-highlight,
.ui-widget-header .ui-state-highlight {
border: 1px solid #ffde2e;
background: #ffeb80 url("images/ui-bg_inset-hard_55_ffeb80_1x100.png") 50% bottom repeat-x;
color: #363636;
}
.ui-state-highlight a,
.ui-widget-content .ui-state-highlight a,
.ui-widget-header .ui-state-highlight a {
color: #363636;
}
.ui-state-error,
.ui-widget-content .ui-state-error,
.ui-widget-header .ui-state-error {
border: 1px solid #9e0505;
background: #cd0a0a url("images/ui-bg_inset-hard_45_cd0a0a_1x100.png") 50% bottom repeat-x;
color: #ffffff;
}
.ui-state-error a,
.ui-widget-content .ui-state-error a,
.ui-widget-header .ui-state-error a {
color: #ffffff;
}
.ui-state-error-text,
.ui-widget-content .ui-state-error-text,
.ui-widget-header .ui-state-error-text {
color: #ffffff;
}
.ui-priority-primary,
.ui-widget-content .ui-priority-primary,
.ui-widget-header .ui-priority-primary {
font-weight: bold;
}
.ui-priority-secondary,
.ui-widget-content .ui-priority-secondary,
.ui-widget-header .ui-priority-secondary {
opacity: .7;
filter:Alpha(Opacity=70); /* support: IE8 */
font-weight: normal;
}
.ui-state-disabled,
.ui-widget-content .ui-state-disabled,
.ui-widget-header .ui-state-disabled {
opacity: .35;
filter:Alpha(Opacity=35); /* support: IE8 */
background-image: none;
}
.ui-state-disabled .ui-icon {
filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
}
/* Icons
----------------------------------*/
/* states and images */
.ui-icon {
width: 16px;
height: 16px;
}
.ui-icon,
.ui-widget-content .ui-icon {
background-image: url("images/ui-icons_222222_256x240.png");
}
.ui-widget-header .ui-icon {
background-image: url("images/ui-icons_bbbbbb_256x240.png");
}
.ui-state-default .ui-icon {
background-image: url("images/ui-icons_ededed_256x240.png");
}
.ui-state-hover .ui-icon,
.ui-state-focus .ui-icon {
background-image: url("images/ui-icons_ffffff_256x240.png");
}
.ui-state-active .ui-icon {
background-image: url("images/ui-icons_222222_256x240.png");
}
.ui-state-highlight .ui-icon {
background-image: url("images/ui-icons_4ca300_256x240.png");
}
.ui-state-error .ui-icon,
.ui-state-error-text .ui-icon {
background-image: url("images/ui-icons_ffcf29_256x240.png");
}
/* positioning */
.ui-icon-blank { background-position: 16px 16px; }
.ui-icon-carat-1-n { background-position: 0 0; }
.ui-icon-carat-1-ne { background-position: -16px 0; }
.ui-icon-carat-1-e { background-position: -32px 0; }
.ui-icon-carat-1-se { background-position: -48px 0; }
.ui-icon-carat-1-s { background-position: -64px 0; }
.ui-icon-carat-1-sw { background-position: -80px 0; }
.ui-icon-carat-1-w { background-position: -96px 0; }
.ui-icon-carat-1-nw { background-position: -112px 0; }
.ui-icon-carat-2-n-s { background-position: -128px 0; }
.ui-icon-carat-2-e-w { background-position: -144px 0; }
.ui-icon-triangle-1-n { background-position: 0 -16px; }
.ui-icon-triangle-1-ne { background-position: -16px -16px; }
.ui-icon-triangle-1-e { background-position: -32px -16px; }
.ui-icon-triangle-1-se { background-position: -48px -16px; }
.ui-icon-triangle-1-s { background-position: -64px -16px; }
.ui-icon-triangle-1-sw { background-position: -80px -16px; }
.ui-icon-triangle-1-w { background-position: -96px -16px; }
.ui-icon-triangle-1-nw { background-position: -112px -16px; }
.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
.ui-icon-arrow-1-n { background-position: 0 -32px; }
.ui-icon-arrow-1-ne { background-position: -16px -32px; }
.ui-icon-arrow-1-e { background-position: -32px -32px; }
.ui-icon-arrow-1-se { background-position: -48px -32px; }
.ui-icon-arrow-1-s { background-position: -64px -32px; }
.ui-icon-arrow-1-sw { background-position: -80px -32px; }
.ui-icon-arrow-1-w { background-position: -96px -32px; }
.ui-icon-arrow-1-nw { background-position: -112px -32px; }
.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
.ui-icon-arrow-4 { background-position: 0 -80px; }
.ui-icon-arrow-4-diag { background-position: -16px -80px; }
.ui-icon-extlink { background-position: -32px -80px; }
.ui-icon-newwin { background-position: -48px -80px; }
.ui-icon-refresh { background-position: -64px -80px; }
.ui-icon-shuffle { background-position: -80px -80px; }
.ui-icon-transfer-e-w { background-position: -96px -80px; }
.ui-icon-transferthick-e-w { background-position: -112px -80px; }
.ui-icon-folder-collapsed { background-position: 0 -96px; }
.ui-icon-folder-open { background-position: -16px -96px; }
.ui-icon-document { background-position: -32px -96px; }
.ui-icon-document-b { background-position: -48px -96px; }
.ui-icon-note { background-position: -64px -96px; }
.ui-icon-mail-closed { background-position: -80px -96px; }
.ui-icon-mail-open { background-position: -96px -96px; }
.ui-icon-suitcase { background-position: -112px -96px; }
.ui-icon-comment { background-position: -128px -96px; }
.ui-icon-person { background-position: -144px -96px; }
.ui-icon-print { background-position: -160px -96px; }
.ui-icon-trash { background-position: -176px -96px; }
.ui-icon-locked { background-position: -192px -96px; }
.ui-icon-unlocked { background-position: -208px -96px; }
.ui-icon-bookmark { background-position: -224px -96px; }
.ui-icon-tag { background-position: -240px -96px; }
.ui-icon-home { background-position: 0 -112px; }
.ui-icon-flag { background-position: -16px -112px; }
.ui-icon-calendar { background-position: -32px -112px; }
.ui-icon-cart { background-position: -48px -112px; }
.ui-icon-pencil { background-position: -64px -112px; }
.ui-icon-clock { background-position: -80px -112px; }
.ui-icon-disk { background-position: -96px -112px; }
.ui-icon-calculator { background-position: -112px -112px; }
.ui-icon-zoomin { background-position: -128px -112px; }
.ui-icon-zoomout { background-position: -144px -112px; }
.ui-icon-search { background-position: -160px -112px; }
.ui-icon-wrench { background-position: -176px -112px; }
.ui-icon-gear { background-position: -192px -112px; }
.ui-icon-heart { background-position: -208px -112px; }
.ui-icon-star { background-position: -224px -112px; }
.ui-icon-link { background-position: -240px -112px; }
.ui-icon-cancel { background-position: 0 -128px; }
.ui-icon-plus { background-position: -16px -128px; }
.ui-icon-plusthick { background-position: -32px -128px; }
.ui-icon-minus { background-position: -48px -128px; }
.ui-icon-minusthick { background-position: -64px -128px; }
.ui-icon-close { background-position: -80px -128px; }
.ui-icon-closethick { background-position: -96px -128px; }
.ui-icon-key { background-position: -112px -128px; }
.ui-icon-lightbulb { background-position: -128px -128px; }
.ui-icon-scissors { background-position: -144px -128px; }
.ui-icon-clipboard { background-position: -160px -128px; }
.ui-icon-copy { background-position: -176px -128px; }
.ui-icon-contact { background-position: -192px -128px; }
.ui-icon-image { background-position: -208px -128px; }
.ui-icon-video { background-position: -224px -128px; }
.ui-icon-script { background-position: -240px -128px; }
.ui-icon-alert { background-position: 0 -144px; }
.ui-icon-info { background-position: -16px -144px; }
.ui-icon-notice { background-position: -32px -144px; }
.ui-icon-help { background-position: -48px -144px; }
.ui-icon-check { background-position: -64px -144px; }
.ui-icon-bullet { background-position: -80px -144px; }
.ui-icon-radio-on { background-position: -96px -144px; }
.ui-icon-radio-off { background-position: -112px -144px; }
.ui-icon-pin-w { background-position: -128px -144px; }
.ui-icon-pin-s { background-position: -144px -144px; }
.ui-icon-play { background-position: 0 -160px; }
.ui-icon-pause { background-position: -16px -160px; }
.ui-icon-seek-next { background-position: -32px -160px; }
.ui-icon-seek-prev { background-position: -48px -160px; }
.ui-icon-seek-end { background-position: -64px -160px; }
.ui-icon-seek-start { background-position: -80px -160px; }
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
.ui-icon-seek-first { background-position: -80px -160px; }
.ui-icon-stop { background-position: -96px -160px; }
.ui-icon-eject { background-position: -112px -160px; }
.ui-icon-volume-off { background-position: -128px -160px; }
.ui-icon-volume-on { background-position: -144px -160px; }
.ui-icon-power { background-position: 0 -176px; }
.ui-icon-signal-diag { background-position: -16px -176px; }
.ui-icon-signal { background-position: -32px -176px; }
.ui-icon-battery-0 { background-position: -48px -176px; }
.ui-icon-battery-1 { background-position: -64px -176px; }
.ui-icon-battery-2 { background-position: -80px -176px; }
.ui-icon-battery-3 { background-position: -96px -176px; }
.ui-icon-circle-plus { background-position: 0 -192px; }
.ui-icon-circle-minus { background-position: -16px -192px; }
.ui-icon-circle-close { background-position: -32px -192px; }
.ui-icon-circle-triangle-e { background-position: -48px -192px; }
.ui-icon-circle-triangle-s { background-position: -64px -192px; }
.ui-icon-circle-triangle-w { background-position: -80px -192px; }
.ui-icon-circle-triangle-n { background-position: -96px -192px; }
.ui-icon-circle-arrow-e { background-position: -112px -192px; }
.ui-icon-circle-arrow-s { background-position: -128px -192px; }
.ui-icon-circle-arrow-w { background-position: -144px -192px; }
.ui-icon-circle-arrow-n { background-position: -160px -192px; }
.ui-icon-circle-zoomin { background-position: -176px -192px; }
.ui-icon-circle-zoomout { background-position: -192px -192px; }
.ui-icon-circle-check { background-position: -208px -192px; }
.ui-icon-circlesmall-plus { background-position: 0 -208px; }
.ui-icon-circlesmall-minus { background-position: -16px -208px; }
.ui-icon-circlesmall-close { background-position: -32px -208px; }
.ui-icon-squaresmall-plus { background-position: -48px -208px; }
.ui-icon-squaresmall-minus { background-position: -64px -208px; }
.ui-icon-squaresmall-close { background-position: -80px -208px; }
.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
/* Misc visuals
----------------------------------*/
/* Corner radius */
.ui-corner-all,
.ui-corner-top,
.ui-corner-left,
.ui-corner-tl {
border-top-left-radius: 4px;
}
.ui-corner-all,
.ui-corner-top,
.ui-corner-right,
.ui-corner-tr {
border-top-right-radius: 4px;
}
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-left,
.ui-corner-bl {
border-bottom-left-radius: 4px;
}
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-right,
.ui-corner-br {
border-bottom-right-radius: 4px;
}
/* Overlays */
.ui-widget-overlay {
background: #aaaaaa url("images/ui-bg_highlight-hard_40_aaaaaa_1x100.png") 50% top repeat-x;
opacity: .3;
filter: Alpha(Opacity=30); /* support: IE8 */
}
.ui-widget-shadow {
margin: -8px 0 0 -8px;
padding: 8px;
background: #aaaaaa url("images/ui-bg_highlight-soft_50_aaaaaa_1x100.png") 50% top repeat-x;
opacity: .2;
filter: Alpha(Opacity=20); /* support: IE8 */
border-radius: 8px;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 452 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 379 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,410 @@
/*!
* jQuery UI CSS Framework 1.11.2
* http://jqueryui.com
*
* Copyright 2014 jQuery Foundation and other contributors
* Released under the MIT license.
* http://jquery.org/license
*
* http://api.jqueryui.com/category/theming/
*
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=cc0000&bgTextureHeader=highlight_soft&bgImgOpacityHeader=15&borderColorHeader=e3a1a1&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=eeeeee&fcContent=333333&iconColorContent=cc0000&bgColorDefault=eeeeee&bgTextureDefault=highlight_hard&bgImgOpacityDefault=100&borderColorDefault=d8dcdf&fcDefault=004276&iconColorDefault=cc0000&bgColorHover=f6f6f6&bgTextureHover=highlight_hard&bgImgOpacityHover=100&borderColorHover=cdd5da&fcHover=111111&iconColorHover=cc0000&bgColorActive=ffffff&bgTextureActive=flat&bgImgOpacityActive=65&borderColorActive=eeeeee&fcActive=cc0000&iconColorActive=cc0000&bgColorHighlight=fbf8ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcd3a1&fcHighlight=444444&iconColorHighlight=004276&bgColorError=f3d8d8&bgTextureError=diagonals_thick&bgImgOpacityError=75&borderColorError=cc0000&fcError=2e2e2e&iconColorError=cc0000&bgColorOverlay=a6a6a6&bgTextureOverlay=dots_small&bgImgOpacityOverlay=65&opacityOverlay=40&bgColorShadow=333333&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=10&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
*/
/* Component containers
----------------------------------*/
.ui-widget {
font-family: Arial,sans-serif;
font-size: 1.1em;
}
.ui-widget .ui-widget {
font-size: 1em;
}
.ui-widget input,
.ui-widget select,
.ui-widget textarea,
.ui-widget button {
font-family: Arial,sans-serif;
font-size: 1em;
}
.ui-widget-content {
border: 1px solid #eeeeee;
background: #ffffff url("images/ui-bg_flat_75_ffffff_40x100.png") 50% 50% repeat-x;
color: #333333;
}
.ui-widget-content a {
color: #333333;
}
.ui-widget-header {
border: 1px solid #e3a1a1;
background: #cc0000 url("images/ui-bg_highlight-soft_15_cc0000_1x100.png") 50% 50% repeat-x;
color: #ffffff;
font-weight: bold;
}
.ui-widget-header a {
color: #ffffff;
}
/* Interaction states
----------------------------------*/
.ui-state-default,
.ui-widget-content .ui-state-default,
.ui-widget-header .ui-state-default {
border: 1px solid #d8dcdf;
background: #eeeeee url("images/ui-bg_highlight-hard_100_eeeeee_1x100.png") 50% 50% repeat-x;
font-weight: bold;
color: #004276;
}
.ui-state-default a,
.ui-state-default a:link,
.ui-state-default a:visited {
color: #004276;
text-decoration: none;
}
.ui-state-hover,
.ui-widget-content .ui-state-hover,
.ui-widget-header .ui-state-hover,
.ui-state-focus,
.ui-widget-content .ui-state-focus,
.ui-widget-header .ui-state-focus {
border: 1px solid #cdd5da;
background: #f6f6f6 url("images/ui-bg_highlight-hard_100_f6f6f6_1x100.png") 50% 50% repeat-x;
font-weight: bold;
color: #111111;
}
.ui-state-hover a,
.ui-state-hover a:hover,
.ui-state-hover a:link,
.ui-state-hover a:visited,
.ui-state-focus a,
.ui-state-focus a:hover,
.ui-state-focus a:link,
.ui-state-focus a:visited {
color: #111111;
text-decoration: none;
}
.ui-state-active,
.ui-widget-content .ui-state-active,
.ui-widget-header .ui-state-active {
border: 1px solid #eeeeee;
background: #ffffff url("images/ui-bg_flat_65_ffffff_40x100.png") 50% 50% repeat-x;
font-weight: bold;
color: #cc0000;
}
.ui-state-active a,
.ui-state-active a:link,
.ui-state-active a:visited {
color: #cc0000;
text-decoration: none;
}
/* Interaction Cues
----------------------------------*/
.ui-state-highlight,
.ui-widget-content .ui-state-highlight,
.ui-widget-header .ui-state-highlight {
border: 1px solid #fcd3a1;
background: #fbf8ee url("images/ui-bg_glass_55_fbf8ee_1x400.png") 50% 50% repeat-x;
color: #444444;
}
.ui-state-highlight a,
.ui-widget-content .ui-state-highlight a,
.ui-widget-header .ui-state-highlight a {
color: #444444;
}
.ui-state-error,
.ui-widget-content .ui-state-error,
.ui-widget-header .ui-state-error {
border: 1px solid #cc0000;
background: #f3d8d8 url("images/ui-bg_diagonals-thick_75_f3d8d8_40x40.png") 50% 50% repeat;
color: #2e2e2e;
}
.ui-state-error a,
.ui-widget-content .ui-state-error a,
.ui-widget-header .ui-state-error a {
color: #2e2e2e;
}
.ui-state-error-text,
.ui-widget-content .ui-state-error-text,
.ui-widget-header .ui-state-error-text {
color: #2e2e2e;
}
.ui-priority-primary,
.ui-widget-content .ui-priority-primary,
.ui-widget-header .ui-priority-primary {
font-weight: bold;
}
.ui-priority-secondary,
.ui-widget-content .ui-priority-secondary,
.ui-widget-header .ui-priority-secondary {
opacity: .7;
filter:Alpha(Opacity=70); /* support: IE8 */
font-weight: normal;
}
.ui-state-disabled,
.ui-widget-content .ui-state-disabled,
.ui-widget-header .ui-state-disabled {
opacity: .35;
filter:Alpha(Opacity=35); /* support: IE8 */
background-image: none;
}
.ui-state-disabled .ui-icon {
filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
}
/* Icons
----------------------------------*/
/* states and images */
.ui-icon {
width: 16px;
height: 16px;
}
.ui-icon,
.ui-widget-content .ui-icon {
background-image: url("images/ui-icons_cc0000_256x240.png");
}
.ui-widget-header .ui-icon {
background-image: url("images/ui-icons_ffffff_256x240.png");
}
.ui-state-default .ui-icon {
background-image: url("images/ui-icons_cc0000_256x240.png");
}
.ui-state-hover .ui-icon,
.ui-state-focus .ui-icon {
background-image: url("images/ui-icons_cc0000_256x240.png");
}
.ui-state-active .ui-icon {
background-image: url("images/ui-icons_cc0000_256x240.png");
}
.ui-state-highlight .ui-icon {
background-image: url("images/ui-icons_004276_256x240.png");
}
.ui-state-error .ui-icon,
.ui-state-error-text .ui-icon {
background-image: url("images/ui-icons_cc0000_256x240.png");
}
/* positioning */
.ui-icon-blank { background-position: 16px 16px; }
.ui-icon-carat-1-n { background-position: 0 0; }
.ui-icon-carat-1-ne { background-position: -16px 0; }
.ui-icon-carat-1-e { background-position: -32px 0; }
.ui-icon-carat-1-se { background-position: -48px 0; }
.ui-icon-carat-1-s { background-position: -64px 0; }
.ui-icon-carat-1-sw { background-position: -80px 0; }
.ui-icon-carat-1-w { background-position: -96px 0; }
.ui-icon-carat-1-nw { background-position: -112px 0; }
.ui-icon-carat-2-n-s { background-position: -128px 0; }
.ui-icon-carat-2-e-w { background-position: -144px 0; }
.ui-icon-triangle-1-n { background-position: 0 -16px; }
.ui-icon-triangle-1-ne { background-position: -16px -16px; }
.ui-icon-triangle-1-e { background-position: -32px -16px; }
.ui-icon-triangle-1-se { background-position: -48px -16px; }
.ui-icon-triangle-1-s { background-position: -64px -16px; }
.ui-icon-triangle-1-sw { background-position: -80px -16px; }
.ui-icon-triangle-1-w { background-position: -96px -16px; }
.ui-icon-triangle-1-nw { background-position: -112px -16px; }
.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
.ui-icon-arrow-1-n { background-position: 0 -32px; }
.ui-icon-arrow-1-ne { background-position: -16px -32px; }
.ui-icon-arrow-1-e { background-position: -32px -32px; }
.ui-icon-arrow-1-se { background-position: -48px -32px; }
.ui-icon-arrow-1-s { background-position: -64px -32px; }
.ui-icon-arrow-1-sw { background-position: -80px -32px; }
.ui-icon-arrow-1-w { background-position: -96px -32px; }
.ui-icon-arrow-1-nw { background-position: -112px -32px; }
.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
.ui-icon-arrow-4 { background-position: 0 -80px; }
.ui-icon-arrow-4-diag { background-position: -16px -80px; }
.ui-icon-extlink { background-position: -32px -80px; }
.ui-icon-newwin { background-position: -48px -80px; }
.ui-icon-refresh { background-position: -64px -80px; }
.ui-icon-shuffle { background-position: -80px -80px; }
.ui-icon-transfer-e-w { background-position: -96px -80px; }
.ui-icon-transferthick-e-w { background-position: -112px -80px; }
.ui-icon-folder-collapsed { background-position: 0 -96px; }
.ui-icon-folder-open { background-position: -16px -96px; }
.ui-icon-document { background-position: -32px -96px; }
.ui-icon-document-b { background-position: -48px -96px; }
.ui-icon-note { background-position: -64px -96px; }
.ui-icon-mail-closed { background-position: -80px -96px; }
.ui-icon-mail-open { background-position: -96px -96px; }
.ui-icon-suitcase { background-position: -112px -96px; }
.ui-icon-comment { background-position: -128px -96px; }
.ui-icon-person { background-position: -144px -96px; }
.ui-icon-print { background-position: -160px -96px; }
.ui-icon-trash { background-position: -176px -96px; }
.ui-icon-locked { background-position: -192px -96px; }
.ui-icon-unlocked { background-position: -208px -96px; }
.ui-icon-bookmark { background-position: -224px -96px; }
.ui-icon-tag { background-position: -240px -96px; }
.ui-icon-home { background-position: 0 -112px; }
.ui-icon-flag { background-position: -16px -112px; }
.ui-icon-calendar { background-position: -32px -112px; }
.ui-icon-cart { background-position: -48px -112px; }
.ui-icon-pencil { background-position: -64px -112px; }
.ui-icon-clock { background-position: -80px -112px; }
.ui-icon-disk { background-position: -96px -112px; }
.ui-icon-calculator { background-position: -112px -112px; }
.ui-icon-zoomin { background-position: -128px -112px; }
.ui-icon-zoomout { background-position: -144px -112px; }
.ui-icon-search { background-position: -160px -112px; }
.ui-icon-wrench { background-position: -176px -112px; }
.ui-icon-gear { background-position: -192px -112px; }
.ui-icon-heart { background-position: -208px -112px; }
.ui-icon-star { background-position: -224px -112px; }
.ui-icon-link { background-position: -240px -112px; }
.ui-icon-cancel { background-position: 0 -128px; }
.ui-icon-plus { background-position: -16px -128px; }
.ui-icon-plusthick { background-position: -32px -128px; }
.ui-icon-minus { background-position: -48px -128px; }
.ui-icon-minusthick { background-position: -64px -128px; }
.ui-icon-close { background-position: -80px -128px; }
.ui-icon-closethick { background-position: -96px -128px; }
.ui-icon-key { background-position: -112px -128px; }
.ui-icon-lightbulb { background-position: -128px -128px; }
.ui-icon-scissors { background-position: -144px -128px; }
.ui-icon-clipboard { background-position: -160px -128px; }
.ui-icon-copy { background-position: -176px -128px; }
.ui-icon-contact { background-position: -192px -128px; }
.ui-icon-image { background-position: -208px -128px; }
.ui-icon-video { background-position: -224px -128px; }
.ui-icon-script { background-position: -240px -128px; }
.ui-icon-alert { background-position: 0 -144px; }
.ui-icon-info { background-position: -16px -144px; }
.ui-icon-notice { background-position: -32px -144px; }
.ui-icon-help { background-position: -48px -144px; }
.ui-icon-check { background-position: -64px -144px; }
.ui-icon-bullet { background-position: -80px -144px; }
.ui-icon-radio-on { background-position: -96px -144px; }
.ui-icon-radio-off { background-position: -112px -144px; }
.ui-icon-pin-w { background-position: -128px -144px; }
.ui-icon-pin-s { background-position: -144px -144px; }
.ui-icon-play { background-position: 0 -160px; }
.ui-icon-pause { background-position: -16px -160px; }
.ui-icon-seek-next { background-position: -32px -160px; }
.ui-icon-seek-prev { background-position: -48px -160px; }
.ui-icon-seek-end { background-position: -64px -160px; }
.ui-icon-seek-start { background-position: -80px -160px; }
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
.ui-icon-seek-first { background-position: -80px -160px; }
.ui-icon-stop { background-position: -96px -160px; }
.ui-icon-eject { background-position: -112px -160px; }
.ui-icon-volume-off { background-position: -128px -160px; }
.ui-icon-volume-on { background-position: -144px -160px; }
.ui-icon-power { background-position: 0 -176px; }
.ui-icon-signal-diag { background-position: -16px -176px; }
.ui-icon-signal { background-position: -32px -176px; }
.ui-icon-battery-0 { background-position: -48px -176px; }
.ui-icon-battery-1 { background-position: -64px -176px; }
.ui-icon-battery-2 { background-position: -80px -176px; }
.ui-icon-battery-3 { background-position: -96px -176px; }
.ui-icon-circle-plus { background-position: 0 -192px; }
.ui-icon-circle-minus { background-position: -16px -192px; }
.ui-icon-circle-close { background-position: -32px -192px; }
.ui-icon-circle-triangle-e { background-position: -48px -192px; }
.ui-icon-circle-triangle-s { background-position: -64px -192px; }
.ui-icon-circle-triangle-w { background-position: -80px -192px; }
.ui-icon-circle-triangle-n { background-position: -96px -192px; }
.ui-icon-circle-arrow-e { background-position: -112px -192px; }
.ui-icon-circle-arrow-s { background-position: -128px -192px; }
.ui-icon-circle-arrow-w { background-position: -144px -192px; }
.ui-icon-circle-arrow-n { background-position: -160px -192px; }
.ui-icon-circle-zoomin { background-position: -176px -192px; }
.ui-icon-circle-zoomout { background-position: -192px -192px; }
.ui-icon-circle-check { background-position: -208px -192px; }
.ui-icon-circlesmall-plus { background-position: 0 -208px; }
.ui-icon-circlesmall-minus { background-position: -16px -208px; }
.ui-icon-circlesmall-close { background-position: -32px -208px; }
.ui-icon-squaresmall-plus { background-position: -48px -208px; }
.ui-icon-squaresmall-minus { background-position: -64px -208px; }
.ui-icon-squaresmall-close { background-position: -80px -208px; }
.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
/* Misc visuals
----------------------------------*/
/* Corner radius */
.ui-corner-all,
.ui-corner-top,
.ui-corner-left,
.ui-corner-tl {
border-top-left-radius: 6px;
}
.ui-corner-all,
.ui-corner-top,
.ui-corner-right,
.ui-corner-tr {
border-top-right-radius: 6px;
}
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-left,
.ui-corner-bl {
border-bottom-left-radius: 6px;
}
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-right,
.ui-corner-br {
border-bottom-right-radius: 6px;
}
/* Overlays */
.ui-widget-overlay {
background: #a6a6a6 url("images/ui-bg_dots-small_65_a6a6a6_2x2.png") 50% 50% repeat;
opacity: .4;
filter: Alpha(Opacity=40); /* support: IE8 */
}
.ui-widget-shadow {
margin: -8px 0 0 -8px;
padding: 8px;
background: #333333 url("images/ui-bg_flat_0_333333_40x100.png") 50% 50% repeat-x;
opacity: .1;
filter: Alpha(Opacity=10); /* support: IE8 */
border-radius: 8px;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 351 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 389 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 375 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 426 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,410 @@
/*!
* jQuery UI CSS Framework 1.11.2
* http://jqueryui.com
*
* Copyright 2014 jQuery Foundation and other contributors
* Released under the MIT license.
* http://jquery.org/license
*
* http://api.jqueryui.com/category/theming/
*
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande%2CLucida%20Sans%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=deedf7&bgTextureHeader=highlight_soft&bgImgOpacityHeader=100&borderColorHeader=aed0ea&fcHeader=222222&iconColorHeader=72a7cf&bgColorContent=f2f5f7&bgTextureContent=highlight_hard&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=362b36&iconColorContent=72a7cf&bgColorDefault=d7ebf9&bgTextureDefault=glass&bgImgOpacityDefault=80&borderColorDefault=aed0ea&fcDefault=2779aa&iconColorDefault=3d80b3&bgColorHover=e4f1fb&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=74b2e2&fcHover=0070a3&iconColorHover=2694e8&bgColorActive=3baae3&bgTextureActive=glass&bgImgOpacityActive=50&borderColorActive=2694e8&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=ffef8f&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=25&borderColorHighlight=f9dd34&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=cd0a0a&bgTextureError=flat&bgImgOpacityError=15&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffffff&bgColorOverlay=eeeeee&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=90&opacityOverlay=80&bgColorShadow=000000&bgTextureShadow=highlight_hard&bgImgOpacityShadow=70&opacityShadow=30&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px
*/
/* Component containers
----------------------------------*/
.ui-widget {
font-family: Lucida Grande,Lucida Sans,Arial,sans-serif;
font-size: 1.1em;
}
.ui-widget .ui-widget {
font-size: 1em;
}
.ui-widget input,
.ui-widget select,
.ui-widget textarea,
.ui-widget button {
font-family: Lucida Grande,Lucida Sans,Arial,sans-serif;
font-size: 1em;
}
.ui-widget-content {
border: 1px solid #dddddd;
background: #f2f5f7 url("images/ui-bg_highlight-hard_100_f2f5f7_1x100.png") 50% top repeat-x;
color: #362b36;
}
.ui-widget-content a {
color: #362b36;
}
.ui-widget-header {
border: 1px solid #aed0ea;
background: #deedf7 url("images/ui-bg_highlight-soft_100_deedf7_1x100.png") 50% 50% repeat-x;
color: #222222;
font-weight: bold;
}
.ui-widget-header a {
color: #222222;
}
/* Interaction states
----------------------------------*/
.ui-state-default,
.ui-widget-content .ui-state-default,
.ui-widget-header .ui-state-default {
border: 1px solid #aed0ea;
background: #d7ebf9 url("images/ui-bg_glass_80_d7ebf9_1x400.png") 50% 50% repeat-x;
font-weight: bold;
color: #2779aa;
}
.ui-state-default a,
.ui-state-default a:link,
.ui-state-default a:visited {
color: #2779aa;
text-decoration: none;
}
.ui-state-hover,
.ui-widget-content .ui-state-hover,
.ui-widget-header .ui-state-hover,
.ui-state-focus,
.ui-widget-content .ui-state-focus,
.ui-widget-header .ui-state-focus {
border: 1px solid #74b2e2;
background: #e4f1fb url("images/ui-bg_glass_100_e4f1fb_1x400.png") 50% 50% repeat-x;
font-weight: bold;
color: #0070a3;
}
.ui-state-hover a,
.ui-state-hover a:hover,
.ui-state-hover a:link,
.ui-state-hover a:visited,
.ui-state-focus a,
.ui-state-focus a:hover,
.ui-state-focus a:link,
.ui-state-focus a:visited {
color: #0070a3;
text-decoration: none;
}
.ui-state-active,
.ui-widget-content .ui-state-active,
.ui-widget-header .ui-state-active {
border: 1px solid #2694e8;
background: #3baae3 url("images/ui-bg_glass_50_3baae3_1x400.png") 50% 50% repeat-x;
font-weight: bold;
color: #ffffff;
}
.ui-state-active a,
.ui-state-active a:link,
.ui-state-active a:visited {
color: #ffffff;
text-decoration: none;
}
/* Interaction Cues
----------------------------------*/
.ui-state-highlight,
.ui-widget-content .ui-state-highlight,
.ui-widget-header .ui-state-highlight {
border: 1px solid #f9dd34;
background: #ffef8f url("images/ui-bg_highlight-soft_25_ffef8f_1x100.png") 50% top repeat-x;
color: #363636;
}
.ui-state-highlight a,
.ui-widget-content .ui-state-highlight a,
.ui-widget-header .ui-state-highlight a {
color: #363636;
}
.ui-state-error,
.ui-widget-content .ui-state-error,
.ui-widget-header .ui-state-error {
border: 1px solid #cd0a0a;
background: #cd0a0a url("images/ui-bg_flat_15_cd0a0a_40x100.png") 50% 50% repeat-x;
color: #ffffff;
}
.ui-state-error a,
.ui-widget-content .ui-state-error a,
.ui-widget-header .ui-state-error a {
color: #ffffff;
}
.ui-state-error-text,
.ui-widget-content .ui-state-error-text,
.ui-widget-header .ui-state-error-text {
color: #ffffff;
}
.ui-priority-primary,
.ui-widget-content .ui-priority-primary,
.ui-widget-header .ui-priority-primary {
font-weight: bold;
}
.ui-priority-secondary,
.ui-widget-content .ui-priority-secondary,
.ui-widget-header .ui-priority-secondary {
opacity: .7;
filter:Alpha(Opacity=70); /* support: IE8 */
font-weight: normal;
}
.ui-state-disabled,
.ui-widget-content .ui-state-disabled,
.ui-widget-header .ui-state-disabled {
opacity: .35;
filter:Alpha(Opacity=35); /* support: IE8 */
background-image: none;
}
.ui-state-disabled .ui-icon {
filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
}
/* Icons
----------------------------------*/
/* states and images */
.ui-icon {
width: 16px;
height: 16px;
}
.ui-icon,
.ui-widget-content .ui-icon {
background-image: url("images/ui-icons_72a7cf_256x240.png");
}
.ui-widget-header .ui-icon {
background-image: url("images/ui-icons_72a7cf_256x240.png");
}
.ui-state-default .ui-icon {
background-image: url("images/ui-icons_3d80b3_256x240.png");
}
.ui-state-hover .ui-icon,
.ui-state-focus .ui-icon {
background-image: url("images/ui-icons_2694e8_256x240.png");
}
.ui-state-active .ui-icon {
background-image: url("images/ui-icons_ffffff_256x240.png");
}
.ui-state-highlight .ui-icon {
background-image: url("images/ui-icons_2e83ff_256x240.png");
}
.ui-state-error .ui-icon,
.ui-state-error-text .ui-icon {
background-image: url("images/ui-icons_ffffff_256x240.png");
}
/* positioning */
.ui-icon-blank { background-position: 16px 16px; }
.ui-icon-carat-1-n { background-position: 0 0; }
.ui-icon-carat-1-ne { background-position: -16px 0; }
.ui-icon-carat-1-e { background-position: -32px 0; }
.ui-icon-carat-1-se { background-position: -48px 0; }
.ui-icon-carat-1-s { background-position: -64px 0; }
.ui-icon-carat-1-sw { background-position: -80px 0; }
.ui-icon-carat-1-w { background-position: -96px 0; }
.ui-icon-carat-1-nw { background-position: -112px 0; }
.ui-icon-carat-2-n-s { background-position: -128px 0; }
.ui-icon-carat-2-e-w { background-position: -144px 0; }
.ui-icon-triangle-1-n { background-position: 0 -16px; }
.ui-icon-triangle-1-ne { background-position: -16px -16px; }
.ui-icon-triangle-1-e { background-position: -32px -16px; }
.ui-icon-triangle-1-se { background-position: -48px -16px; }
.ui-icon-triangle-1-s { background-position: -64px -16px; }
.ui-icon-triangle-1-sw { background-position: -80px -16px; }
.ui-icon-triangle-1-w { background-position: -96px -16px; }
.ui-icon-triangle-1-nw { background-position: -112px -16px; }
.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
.ui-icon-arrow-1-n { background-position: 0 -32px; }
.ui-icon-arrow-1-ne { background-position: -16px -32px; }
.ui-icon-arrow-1-e { background-position: -32px -32px; }
.ui-icon-arrow-1-se { background-position: -48px -32px; }
.ui-icon-arrow-1-s { background-position: -64px -32px; }
.ui-icon-arrow-1-sw { background-position: -80px -32px; }
.ui-icon-arrow-1-w { background-position: -96px -32px; }
.ui-icon-arrow-1-nw { background-position: -112px -32px; }
.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
.ui-icon-arrow-4 { background-position: 0 -80px; }
.ui-icon-arrow-4-diag { background-position: -16px -80px; }
.ui-icon-extlink { background-position: -32px -80px; }
.ui-icon-newwin { background-position: -48px -80px; }
.ui-icon-refresh { background-position: -64px -80px; }
.ui-icon-shuffle { background-position: -80px -80px; }
.ui-icon-transfer-e-w { background-position: -96px -80px; }
.ui-icon-transferthick-e-w { background-position: -112px -80px; }
.ui-icon-folder-collapsed { background-position: 0 -96px; }
.ui-icon-folder-open { background-position: -16px -96px; }
.ui-icon-document { background-position: -32px -96px; }
.ui-icon-document-b { background-position: -48px -96px; }
.ui-icon-note { background-position: -64px -96px; }
.ui-icon-mail-closed { background-position: -80px -96px; }
.ui-icon-mail-open { background-position: -96px -96px; }
.ui-icon-suitcase { background-position: -112px -96px; }
.ui-icon-comment { background-position: -128px -96px; }
.ui-icon-person { background-position: -144px -96px; }
.ui-icon-print { background-position: -160px -96px; }
.ui-icon-trash { background-position: -176px -96px; }
.ui-icon-locked { background-position: -192px -96px; }
.ui-icon-unlocked { background-position: -208px -96px; }
.ui-icon-bookmark { background-position: -224px -96px; }
.ui-icon-tag { background-position: -240px -96px; }
.ui-icon-home { background-position: 0 -112px; }
.ui-icon-flag { background-position: -16px -112px; }
.ui-icon-calendar { background-position: -32px -112px; }
.ui-icon-cart { background-position: -48px -112px; }
.ui-icon-pencil { background-position: -64px -112px; }
.ui-icon-clock { background-position: -80px -112px; }
.ui-icon-disk { background-position: -96px -112px; }
.ui-icon-calculator { background-position: -112px -112px; }
.ui-icon-zoomin { background-position: -128px -112px; }
.ui-icon-zoomout { background-position: -144px -112px; }
.ui-icon-search { background-position: -160px -112px; }
.ui-icon-wrench { background-position: -176px -112px; }
.ui-icon-gear { background-position: -192px -112px; }
.ui-icon-heart { background-position: -208px -112px; }
.ui-icon-star { background-position: -224px -112px; }
.ui-icon-link { background-position: -240px -112px; }
.ui-icon-cancel { background-position: 0 -128px; }
.ui-icon-plus { background-position: -16px -128px; }
.ui-icon-plusthick { background-position: -32px -128px; }
.ui-icon-minus { background-position: -48px -128px; }
.ui-icon-minusthick { background-position: -64px -128px; }
.ui-icon-close { background-position: -80px -128px; }
.ui-icon-closethick { background-position: -96px -128px; }
.ui-icon-key { background-position: -112px -128px; }
.ui-icon-lightbulb { background-position: -128px -128px; }
.ui-icon-scissors { background-position: -144px -128px; }
.ui-icon-clipboard { background-position: -160px -128px; }
.ui-icon-copy { background-position: -176px -128px; }
.ui-icon-contact { background-position: -192px -128px; }
.ui-icon-image { background-position: -208px -128px; }
.ui-icon-video { background-position: -224px -128px; }
.ui-icon-script { background-position: -240px -128px; }
.ui-icon-alert { background-position: 0 -144px; }
.ui-icon-info { background-position: -16px -144px; }
.ui-icon-notice { background-position: -32px -144px; }
.ui-icon-help { background-position: -48px -144px; }
.ui-icon-check { background-position: -64px -144px; }
.ui-icon-bullet { background-position: -80px -144px; }
.ui-icon-radio-on { background-position: -96px -144px; }
.ui-icon-radio-off { background-position: -112px -144px; }
.ui-icon-pin-w { background-position: -128px -144px; }
.ui-icon-pin-s { background-position: -144px -144px; }
.ui-icon-play { background-position: 0 -160px; }
.ui-icon-pause { background-position: -16px -160px; }
.ui-icon-seek-next { background-position: -32px -160px; }
.ui-icon-seek-prev { background-position: -48px -160px; }
.ui-icon-seek-end { background-position: -64px -160px; }
.ui-icon-seek-start { background-position: -80px -160px; }
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
.ui-icon-seek-first { background-position: -80px -160px; }
.ui-icon-stop { background-position: -96px -160px; }
.ui-icon-eject { background-position: -112px -160px; }
.ui-icon-volume-off { background-position: -128px -160px; }
.ui-icon-volume-on { background-position: -144px -160px; }
.ui-icon-power { background-position: 0 -176px; }
.ui-icon-signal-diag { background-position: -16px -176px; }
.ui-icon-signal { background-position: -32px -176px; }
.ui-icon-battery-0 { background-position: -48px -176px; }
.ui-icon-battery-1 { background-position: -64px -176px; }
.ui-icon-battery-2 { background-position: -80px -176px; }
.ui-icon-battery-3 { background-position: -96px -176px; }
.ui-icon-circle-plus { background-position: 0 -192px; }
.ui-icon-circle-minus { background-position: -16px -192px; }
.ui-icon-circle-close { background-position: -32px -192px; }
.ui-icon-circle-triangle-e { background-position: -48px -192px; }
.ui-icon-circle-triangle-s { background-position: -64px -192px; }
.ui-icon-circle-triangle-w { background-position: -80px -192px; }
.ui-icon-circle-triangle-n { background-position: -96px -192px; }
.ui-icon-circle-arrow-e { background-position: -112px -192px; }
.ui-icon-circle-arrow-s { background-position: -128px -192px; }
.ui-icon-circle-arrow-w { background-position: -144px -192px; }
.ui-icon-circle-arrow-n { background-position: -160px -192px; }
.ui-icon-circle-zoomin { background-position: -176px -192px; }
.ui-icon-circle-zoomout { background-position: -192px -192px; }
.ui-icon-circle-check { background-position: -208px -192px; }
.ui-icon-circlesmall-plus { background-position: 0 -208px; }
.ui-icon-circlesmall-minus { background-position: -16px -208px; }
.ui-icon-circlesmall-close { background-position: -32px -208px; }
.ui-icon-squaresmall-plus { background-position: -48px -208px; }
.ui-icon-squaresmall-minus { background-position: -64px -208px; }
.ui-icon-squaresmall-close { background-position: -80px -208px; }
.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
/* Misc visuals
----------------------------------*/
/* Corner radius */
.ui-corner-all,
.ui-corner-top,
.ui-corner-left,
.ui-corner-tl {
border-top-left-radius: 6px;
}
.ui-corner-all,
.ui-corner-top,
.ui-corner-right,
.ui-corner-tr {
border-top-right-radius: 6px;
}
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-left,
.ui-corner-bl {
border-bottom-left-radius: 6px;
}
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-right,
.ui-corner-br {
border-bottom-right-radius: 6px;
}
/* Overlays */
.ui-widget-overlay {
background: #eeeeee url("images/ui-bg_diagonals-thick_90_eeeeee_40x40.png") 50% 50% repeat;
opacity: .8;
filter: Alpha(Opacity=80); /* support: IE8 */
}
.ui-widget-shadow {
margin: -7px 0 0 -7px;
padding: 7px;
background: #000000 url("images/ui-bg_highlight-hard_70_000000_1x100.png") 50% top repeat-x;
opacity: .3;
filter: Alpha(Opacity=30); /* support: IE8 */
border-radius: 8px;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 260 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 276 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Some files were not shown because too many files have changed in this diff Show More