Compare commits
241 Commits
Author | SHA1 | Date | |
---|---|---|---|
7cfe7d6a4d | |||
95c37f1777 | |||
547a415488 | |||
032306866a | |||
2779206a1a | |||
6e3f6a4201 | |||
5d728ed7fd | |||
16879885c5 | |||
fc965fd285 | |||
1c0b4f48c9 | |||
e94ba149df | |||
5afc23c446 | |||
003ba6f46b | |||
13729dac93 | |||
8bb1551f7a | |||
d9a8afeb57 | |||
d7c18215c5 | |||
2334a0ed0a | |||
e61706955a | |||
b77e2a9743 | |||
4f43280bd1 | |||
e7ae0845d8 | |||
0cfb7a74f5 | |||
84467fbb8d | |||
afa06b21e2 | |||
6747e2f557 | |||
2559630e8f | |||
097ee2b0d9 | |||
50c0b50abf | |||
f26af7f05d | |||
b42f5bdd0d | |||
92847d1a52 | |||
2532f3bc01 | |||
441e88dfa9 | |||
0f86f558ec | |||
621f5951c4 | |||
4e6eff55e5 | |||
03265a1fb0 | |||
9aef0fb2d4 | |||
|
3ee7fca025 | ||
845d250b88 | |||
efe6caee71 | |||
dcd5ecebfa | |||
32b9ba862b | |||
eb65ec9329 | |||
d6c18a5ef7 | |||
3ea9c6c893 | |||
4cd7bab1be | |||
95d95daa34 | |||
|
b5d05f5411 | ||
|
13ca97f10d | ||
|
4f483abe26 | ||
|
2400cd2588 | ||
|
035479f7a2 | ||
|
b969bf7717 | ||
|
463ff10744 | ||
|
2b3b897545 | ||
|
875bccb9d0 | ||
|
d753a68a9e | ||
|
ae2d6e95bb | ||
|
15c1127cb7 | ||
|
dbd2a058e2 | ||
|
9df971df14 | ||
|
34765f7180 | ||
|
cb373fb7f2 | ||
|
701c8e2251 | ||
a749909f90 | |||
6a867b4a92 | |||
|
d02b113f93 | ||
|
aee46f9e2a | ||
|
c053bfe283 | ||
|
7ff174aa86 | ||
|
ff141e42f2 | ||
|
1700b128b0 | ||
|
2261c1cfbe | ||
|
a68b9e6e9c | ||
|
02c43a147d | ||
|
483bc80180 | ||
|
71f9b1fa6a | ||
|
81c84f3702 | ||
|
ab922fd519 | ||
|
4257b6f87b | ||
|
049def144e | ||
|
acc86b9221 | ||
|
3715d2207e | ||
|
5595bd0f6e | ||
|
2a5943c058 | ||
|
9d9cbf7e81 | ||
|
3d368c6783 | ||
|
9cc2833364 | ||
|
f4e99a3d52 | ||
|
03dec2afb2 | ||
|
2bcffd5f4a | ||
|
84bd011a11 | ||
|
74bc8de4fb | ||
|
893d455a32 | ||
|
d61a9d30f7 | ||
|
d308977a00 | ||
|
8a39697351 | ||
|
c48cf51e58 | ||
|
acfd461617 | ||
|
0829a0bd2b | ||
|
36283f4f87 | ||
|
735225dea8 | ||
|
dd92249a0a | ||
|
7f290fd2b2 | ||
|
a58c7774a0 | ||
|
de5717e2f2 | ||
|
d0db10ae6e | ||
|
374e3307d9 | ||
|
7418e57075 | ||
|
32d64d8600 | ||
|
f65b49d49b | ||
|
b34f1727c0 | ||
|
bd97e06dab | ||
|
21d0e5ada6 | ||
|
419f161723 | ||
|
47ba545e4c | ||
|
2d77bc03f6 | ||
|
e43c517b49 | ||
|
1388151bf8 | ||
|
7cc810c683 | ||
|
e304901bd0 | ||
|
d70bfbcce0 | ||
|
a0a9a7f708 | ||
|
43e69a0e3a | ||
|
83e861cf9b | ||
|
3d42b81053 | ||
|
4eb81a1fd7 | ||
|
4bd0b9dd37 | ||
|
ffbd9397ab | ||
|
47b4a82da2 | ||
|
a0d3403cb5 | ||
|
f069d8d9b6 | ||
|
b1e2624702 | ||
|
a99a621a66 | ||
|
64f27e8805 | ||
|
d916b10276 | ||
|
e5833dcc75 | ||
|
5459b5ff4b | ||
|
4087a5f9bc | ||
|
8ff4c21993 | ||
|
1d69ead8f2 | ||
|
024fc33d78 | ||
|
fd24c49f5b | ||
|
a9b87cf5e7 | ||
|
d69f6463b4 | ||
|
b1113fcbe1 | ||
|
03dc8d7bbf | ||
|
03f4b241b3 | ||
|
755078d223 | ||
|
af1d15c401 | ||
|
d9f8b2366e | ||
|
2c0ebbe7c9 | ||
|
3e617ff62e | ||
|
ad270cf968 | ||
|
d97b7c45c6 | ||
|
465172329b | ||
|
68ec93abf6 | ||
|
4cd3cd3e47 | ||
|
07b1d1310b | ||
|
836ffcc62a | ||
|
d749e58621 | ||
|
e2b5238b78 | ||
|
b77ee7efb0 | ||
|
fd597941ee | ||
|
cecdbacf8a | ||
|
4524bafd0a | ||
|
3903449edc | ||
|
59e5325785 | ||
|
f82f10ee71 | ||
|
af3ebb058e | ||
|
3e5f3c254c | ||
|
fb7bddebdc | ||
|
eb71d62ffd | ||
|
79d789f98d | ||
|
10dcf26128 | ||
|
3994000200 | ||
|
828e59d53f | ||
|
63a083804c | ||
|
ade7d13151 | ||
|
cee36b75fc | ||
|
a2b897f91e | ||
|
904d5588e7 | ||
|
1f6946ec44 | ||
|
5b743ecdec | ||
|
491676f37e | ||
|
190f7914f4 | ||
|
91683c4de0 | ||
|
f8571cfa67 | ||
|
c2c0953aff | ||
|
86bfe87956 | ||
|
3cdfd8fd3c | ||
|
c1abc7376e | ||
|
95701358da | ||
|
2acc073581 | ||
|
85734d07a5 | ||
|
79d901847f | ||
|
923b9c944a | ||
|
01217e6b7d | ||
|
ecb7d3643f | ||
|
e453ed2757 | ||
|
cb85159474 | ||
|
fcb70074bf | ||
|
5bf6ed1acd | ||
|
0656e7d8f2 | ||
|
3d8cc81ced | ||
|
3988fe9724 | ||
|
9a054da64b | ||
|
42bb76d504 | ||
|
b39c9a8d33 | ||
|
9f4db8d39d | ||
|
7c65433c5f | ||
|
f9965f4d10 | ||
|
ecfe7ebfc4 | ||
|
d98d0e04d8 | ||
|
958423ef35 | ||
|
5b91e98928 | ||
|
2b31cc8d33 | ||
|
3a17dd02ab | ||
|
c37027ebb0 | ||
|
8824ee3923 | ||
|
c64d4d3525 | ||
|
dcc2f75732 | ||
|
a126c76477 | ||
|
67809dc9d9 | ||
|
461f9ed8e2 | ||
|
fa7330b365 | ||
|
23e6e1edb5 | ||
|
e674c47058 | ||
|
a5736fc53f | ||
|
21d38e3fd9 | ||
|
eedb94d05a | ||
|
92b23e9cd8 | ||
|
35fe72e503 | ||
|
ecad44411f | ||
|
d47e4fe437 | ||
|
28443beb9e | ||
|
e2ffddf9b5 | ||
|
1628945de0 | ||
|
0b69213378 |
64
.gitignore
vendored
@ -1,55 +1,9 @@
|
|||||||
# IDE folders
|
bin
|
||||||
.idea
|
src/messenger/.idea/workspace.xml
|
||||||
|
src/messenger/webim/install/package
|
||||||
src/mibew/install/package
|
src/messenger/absent_*
|
||||||
src/absent_*
|
src/messenger/release*
|
||||||
src/release*
|
src/mibewjava/.idea/workspace.xml
|
||||||
src/upload*
|
src/mibewjava/org.mibew.notifier/resources/
|
||||||
src/*.po
|
mibew.ini
|
||||||
|
.DS_Store
|
||||||
# Do not index actual configuration files
|
|
||||||
src/mibew/configs/config.yml
|
|
||||||
src/tests/server_side/mibew/libs/config.php
|
|
||||||
|
|
||||||
# Do not index avatars
|
|
||||||
src/mibew/files/avatar/*
|
|
||||||
!src/mibew/files/avatar/.keep
|
|
||||||
|
|
||||||
# Do not index cache files
|
|
||||||
src/mibew/cache/*
|
|
||||||
!src/mibew/cache/.keep
|
|
||||||
!src/mibew/cache/.htaccess
|
|
||||||
|
|
||||||
# Do not index plugins
|
|
||||||
src/mibew/plugins/*
|
|
||||||
!src/mibew/plugins/.keep
|
|
||||||
|
|
||||||
# Do not index custom locales
|
|
||||||
src/mibew/locales/*
|
|
||||||
!src/mibew/locales/en/
|
|
||||||
|
|
||||||
# Do not index composer files
|
|
||||||
src/composer.phar
|
|
||||||
src/composer.lock
|
|
||||||
|
|
||||||
# Do not index third-party libraries
|
|
||||||
src/mibew/vendor
|
|
||||||
src/mibew/js/vendor
|
|
||||||
|
|
||||||
# Do not index node.js modules that are used for building
|
|
||||||
src/node_modules
|
|
||||||
src/package-lock.json
|
|
||||||
|
|
||||||
# Do not index compiled js files of the core
|
|
||||||
src/mibew/js/compiled/*
|
|
||||||
!src/mibew/js/compiled/.keep
|
|
||||||
|
|
||||||
# Do not index compiled files of chat styles
|
|
||||||
src/mibew/styles/chats/*/templates_compiled/client_side/*
|
|
||||||
!src/mibew/styles/chats/*/templates_compiled/client_side/.keep
|
|
||||||
src/mibew/styles/chats/*/js/compiled/*
|
|
||||||
!src/mibew/styles/chats/*/js/compiled/.keep
|
|
||||||
|
|
||||||
# Do not index compiled files of page styles
|
|
||||||
src/mibew/styles/pages/*/templates_compiled/client_side/*
|
|
||||||
!src/mibew/styles/pages/*/templates_compiled/client_side/.keep
|
|
||||||
|
3
.gitmodules
vendored
@ -1,3 +0,0 @@
|
|||||||
[submodule "src/i18n"]
|
|
||||||
path = src/i18n
|
|
||||||
url = git@github.com:Mibew/i18n.git
|
|
@ -1,12 +0,0 @@
|
|||||||
### Environment
|
|
||||||
* Mibew Messenger version:
|
|
||||||
* OS:
|
|
||||||
* Web server:
|
|
||||||
* PHP:
|
|
||||||
* PHP extensions:
|
|
||||||
* MySQL:
|
|
||||||
### Expected behavior
|
|
||||||
|
|
||||||
### Actual behavior
|
|
||||||
|
|
||||||
### Steps to reproduce the behavior
|
|
@ -1,8 +0,0 @@
|
|||||||
Fixes # .
|
|
||||||
|
|
||||||
Changes proposed in this pull request:
|
|
||||||
-
|
|
||||||
-
|
|
||||||
-
|
|
||||||
|
|
||||||
@Mibew/core-developers
|
|
BIN
docs/design/abstract_button.psd
Normal file
BIN
docs/design/abstract_button_narrow.psd
Normal file
BIN
docs/design/abstract_rounded.psd
Normal file
BIN
docs/design/he/he_off.psd
Normal file
BIN
docs/design/he/he_on.psd
Normal file
BIN
docs/design/logo.psd
Normal file
BIN
docs/design/logo/16x16.gif
Normal file
After Width: | Height: | Size: 348 B |
BIN
docs/design/logo/32x32.gif
Normal file
After Width: | Height: | Size: 796 B |
BIN
docs/design/logo/64x64.gif
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
docs/design/message_history.psd
Normal file
BIN
docs/design/shablon-knopka_en.psd
Normal file
@ -1,4 +0,0 @@
|
|||||||
{
|
|
||||||
"directory": "./mibew/js/vendor",
|
|
||||||
"analytics": false
|
|
||||||
}
|
|
@ -1,27 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": "eslint:recommended",
|
|
||||||
"rules": {
|
|
||||||
"indent": ["error", 4, {"SwitchCase": 1}],
|
|
||||||
"no-trailing-spaces": "error",
|
|
||||||
"semi": ["error", "always"],
|
|
||||||
"guard-for-in": "error",
|
|
||||||
"no-unused-vars": ["error", {"caughtErrors": "none", "args": "none"}]
|
|
||||||
},
|
|
||||||
"globals": {
|
|
||||||
"Mibew": true,
|
|
||||||
"MibewAPI": true,
|
|
||||||
"MibewAPIInteraction": true,
|
|
||||||
"MibewAPIChatInteraction": true,
|
|
||||||
"MibewAPIUsersInteraction": true,
|
|
||||||
"MibewAPIExecutionContext": true,
|
|
||||||
"Handlebars": true,
|
|
||||||
"_": true,
|
|
||||||
"Backbone": true,
|
|
||||||
"jQuery": true,
|
|
||||||
"vex": true,
|
|
||||||
"validator": true
|
|
||||||
},
|
|
||||||
"env":{
|
|
||||||
"browser": true
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "mibew",
|
|
||||||
"private": true,
|
|
||||||
"dependencies": {
|
|
||||||
"underscore": "1.8.2",
|
|
||||||
"json": "https://github.com/douglascrockford/JSON-js.git#c98948ae1944a28e2e8ebc3717894e580aeaaa05",
|
|
||||||
"jquery": "1.11.3",
|
|
||||||
"backbone": "1.1.2",
|
|
||||||
"marionette": "2.4.1",
|
|
||||||
"handlebars": "4.3.0",
|
|
||||||
"vex": "2.3.2",
|
|
||||||
"validator-js": "3.40.0"
|
|
||||||
},
|
|
||||||
"resolutions": {
|
|
||||||
"underscore": "1.8.2"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,51 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "mibew/mibew",
|
|
||||||
"version": "3.6.0",
|
|
||||||
"description": "Mibew Messenger - open-source live support application",
|
|
||||||
"type": "project",
|
|
||||||
"homepage": "https://mibew.org",
|
|
||||||
"license": "Apache-2.0",
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Mibew Messenger Project",
|
|
||||||
"homepage": "https://mibew.org/credits"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"support": {
|
|
||||||
"email": "support@mibew.org",
|
|
||||||
"issues": "https://github.com/mibew/mibew/issues",
|
|
||||||
"forum": "https://mibew.org/forums",
|
|
||||||
"source": "https://github.com/mibew/mibew"
|
|
||||||
},
|
|
||||||
"repositories": [
|
|
||||||
{
|
|
||||||
"type": "vcs",
|
|
||||||
"url": "https://github.com/mibew/handlebars.php"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "vcs",
|
|
||||||
"url": "https://github.com/mibew/handlebars.php-helpers"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"require": {
|
|
||||||
"mibew/handlebars.php": "~0.10.5",
|
|
||||||
"mibew/handlebars.php-helpers": "1.*",
|
|
||||||
"symfony/http-foundation": "4.4.*",
|
|
||||||
"symfony/routing": "4.4.*",
|
|
||||||
"symfony/config": "4.4.*",
|
|
||||||
"symfony/yaml": "^5.2",
|
|
||||||
"symfony/translation": "2.6.*",
|
|
||||||
"tedivm/stash": "0.12.*",
|
|
||||||
"mibew/html5": "1.1.*",
|
|
||||||
"vierbergenlars/php-semver": "3.0.*",
|
|
||||||
"swiftmailer/swiftmailer": "~5.4.0",
|
|
||||||
"ua-parser/uap-php": "^3.9",
|
|
||||||
"true/punycode": "~1.1"
|
|
||||||
},
|
|
||||||
"require-dev": {
|
|
||||||
"squizlabs/php_codesniffer": "3.*"
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"vendor-dir": "mibew/vendor"
|
|
||||||
}
|
|
||||||
}
|
|
743
src/gulpfile.js
@ -1,743 +0,0 @@
|
|||||||
// Initialize requirements
|
|
||||||
var fs = require('fs'),
|
|
||||||
https = require('https'),
|
|
||||||
exec = require('child_process').exec,
|
|
||||||
eventStream = require('event-stream'),
|
|
||||||
runSequence = require('gulp4-run-sequence'),
|
|
||||||
through = require('through2'),
|
|
||||||
lodash = require('lodash'),
|
|
||||||
PoFile = require('pofile'),
|
|
||||||
strftime = require('strftime'),
|
|
||||||
del = require('del'),
|
|
||||||
bower = require('bower'),
|
|
||||||
gulp = require('gulp'),
|
|
||||||
uglify = require('gulp-uglify'),
|
|
||||||
concat = require('gulp-concat'),
|
|
||||||
phpcs = require('gulp-phpcs'),
|
|
||||||
order = require('gulp-order'),
|
|
||||||
handlebars = require('gulp-handlebars'),
|
|
||||||
handlebarsEngine = require('handlebars'),
|
|
||||||
defineModule = require('gulp-define-module'),
|
|
||||||
header = require('gulp-header'),
|
|
||||||
zip = require('gulp-zip'),
|
|
||||||
tar = require('gulp-tar'),
|
|
||||||
gzip = require('gulp-gzip'),
|
|
||||||
chmod = require('gulp-chmod'),
|
|
||||||
xgettext = require('gulp-xgettext'),
|
|
||||||
concatPo = require('gulp-concat-po'),
|
|
||||||
rename = require('gulp-rename'),
|
|
||||||
eslint = require('gulp-eslint'),
|
|
||||||
removeDuplicateHeaders = require('mibew-gulp-greh'),
|
|
||||||
mkdirp = require('mkdirp');
|
|
||||||
|
|
||||||
// Set global configuration
|
|
||||||
var config = {
|
|
||||||
mibewPath: 'mibew',
|
|
||||||
configsPath: 'mibew/configs',
|
|
||||||
phpVendorPath: 'mibew/vendor',
|
|
||||||
jsVendorPath: 'mibew/js/vendor',
|
|
||||||
pluginsPath: 'mibew/plugins',
|
|
||||||
avatarsPath: 'mibew/files/avatar',
|
|
||||||
cachePath: 'mibew/cache',
|
|
||||||
jsPath: 'mibew/js',
|
|
||||||
chatStylesPath: 'mibew/styles/chats',
|
|
||||||
pageStylesPath: 'mibew/styles/pages',
|
|
||||||
i18nPath: 'i18n',
|
|
||||||
i18nPrefix: 'mibew-i18n-',
|
|
||||||
releasePath: 'release',
|
|
||||||
uploadPath: 'upload',
|
|
||||||
compiledTemplatesHeader: fs.readFileSync('tools/compiled_templates_header.txt'),
|
|
||||||
getComposerUrl: 'https://getcomposer.org/installer',
|
|
||||||
phpBin: 'php -d "suhosin.executor.include.whitelist = phar" -d "memory_limit=512M"',
|
|
||||||
package: require('./composer.json'),
|
|
||||||
msginit: 'msginit',
|
|
||||||
msgcat: 'msgcat'
|
|
||||||
}
|
|
||||||
config.i18nSuffix = '-' + config.package.version + '-' + strftime('%Y%m%d');
|
|
||||||
|
|
||||||
// Tasks for cleaning //////////////////
|
|
||||||
|
|
||||||
// Cleans all built files
|
|
||||||
gulp.task('clean', function(callback) {
|
|
||||||
return del([
|
|
||||||
config.releasePath,
|
|
||||||
'composer.lock',
|
|
||||||
config.phpVendorPath,
|
|
||||||
config.jsVendorPath,
|
|
||||||
config.jsPath + '/compiled/**/*',
|
|
||||||
'!' + config.jsPath + '/compiled/.keep',
|
|
||||||
config.chatStylesPath + '/*/templates_compiled/client_side/*.js',
|
|
||||||
config.chatStylesPath + '/*/js/compiled/*.js',
|
|
||||||
config.pageStylesPath + '/*/templates_compiled/client_side/*.js'
|
|
||||||
], callback);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Cleans temporary English translation in the release dir
|
|
||||||
gulp.task('clean-tmp-po', function(callback) {
|
|
||||||
return del([config.releasePath + '/translation.po'], callback);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Cleans temporary files of translations in the release dir
|
|
||||||
gulp.task('clean-tmp-i18n-files', function(callback) {
|
|
||||||
return del([
|
|
||||||
config.releasePath + '/**/*',
|
|
||||||
'!' + config.releasePath + '/*.zip',
|
|
||||||
'!' + config.releasePath + '/*.tar.gz',
|
|
||||||
'!' + config.releasePath + '/*.pot'
|
|
||||||
], callback);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Cleans all files prepared for uploading to CDN
|
|
||||||
gulp.task('clean-upload', function(callback) {
|
|
||||||
return del([config.uploadPath], callback);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Cleans everything
|
|
||||||
gulp.task('clean-all', function(callback) {
|
|
||||||
runSequence( ['clean', 'clean-upload'],
|
|
||||||
callback );
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
// Watcher tasks ///////////////////////
|
|
||||||
|
|
||||||
// Watch styles
|
|
||||||
gulp.task('watch', function() {
|
|
||||||
gulp.watch(config.pageStylesPath + '/**/*.handlebars', gulp.series('page-styles'));
|
|
||||||
gulp.watch(config.chatStylesPath + '/**/js/source/**/*.js', gulp.series('chat-styles-js'));
|
|
||||||
gulp.watch(config.chatStylesPath + '/**/*.handlebars', gulp.series('chat-styles-handlebars'));
|
|
||||||
});
|
|
||||||
|
|
||||||
// Service tasks //////////////////
|
|
||||||
|
|
||||||
// Get and install PHP Composer
|
|
||||||
gulp.task('get-composer', function(callback) {
|
|
||||||
// Check whether Composer is already in place
|
|
||||||
if (fs.existsSync('./composer.phar')) {
|
|
||||||
callback(null);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get installer from the Internet
|
|
||||||
https.get(config.getComposerUrl, function(response) {
|
|
||||||
// Run PHP to install Composer
|
|
||||||
var php = exec(config.phpBin, function(error, stdout, stderr) {
|
|
||||||
callback(error ? stderr : null);
|
|
||||||
});
|
|
||||||
// Pass installer code to PHP via STDIN
|
|
||||||
response.pipe(php.stdin);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// Install Composer dependencies excluding development ones
|
|
||||||
gulp.task('composer-install', gulp.series('get-composer', function(callback) {
|
|
||||||
exec(config.phpBin + ' composer.phar install --no-dev',
|
|
||||||
function(error, stdout, stderr) {
|
|
||||||
callback(error ? stderr : null);
|
|
||||||
});
|
|
||||||
}));
|
|
||||||
|
|
||||||
// Install all Composer dependencies
|
|
||||||
gulp.task('composer-install-dev', gulp.series('get-composer', function(callback) {
|
|
||||||
exec(config.phpBin + ' composer.phar install',
|
|
||||||
function(error, stdout, stderr) {
|
|
||||||
callback(error ? stderr : null);
|
|
||||||
});
|
|
||||||
}));
|
|
||||||
|
|
||||||
// Installs bower dependencies
|
|
||||||
gulp.task('bower-install', function(callback) {
|
|
||||||
bower.commands.install([], {}, {})
|
|
||||||
.on('error', function(error) {
|
|
||||||
callback(error);
|
|
||||||
})
|
|
||||||
.on('end', function() {
|
|
||||||
// We should manually minify JavaScript files that was not minified
|
|
||||||
// by bower packages' authors
|
|
||||||
// TODO: This is a temproary workaround and should be removed once
|
|
||||||
// the packages will be fixed
|
|
||||||
var stream = eventStream.merge(
|
|
||||||
gulp.src(config.jsVendorPath + '/backbone/backbone.js',
|
|
||||||
{base: config.jsVendorPath})
|
|
||||||
.pipe(uglify({preserveComments: 'some'}))
|
|
||||||
// There are neither "@license" tag nor "!preserve" in the
|
|
||||||
// header. Add the header manually
|
|
||||||
.pipe(header(
|
|
||||||
"// Backbone.js 1.1.2\n"
|
|
||||||
+ "// (c) 2010-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n"
|
|
||||||
+ "// Backbone may be freely distributed under the MIT license.\n"
|
|
||||||
+ "// For all details and documentation:\n"
|
|
||||||
+ "// http://backbonejs.org\n"
|
|
||||||
))
|
|
||||||
.pipe(rename('backbone/backbone-min.js')),
|
|
||||||
gulp.src(config.jsVendorPath + '/json/json2.js',
|
|
||||||
{base: config.jsVendorPath})
|
|
||||||
.pipe(uglify({preserveComments: 'some'}))
|
|
||||||
// There are neither "@license" tag nor "!preserve" in the
|
|
||||||
// header, add the header manually
|
|
||||||
.pipe(header("// json2.js. Public Domain. See http://www.JSON.org/js.html\n"))
|
|
||||||
.pipe(rename('json/json2.min.js'))
|
|
||||||
)
|
|
||||||
.pipe(gulp.dest(config.jsVendorPath));
|
|
||||||
|
|
||||||
stream
|
|
||||||
.on('error', callback)
|
|
||||||
.on('end', callback);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// Tasks for checking //////////////////
|
|
||||||
|
|
||||||
// Checks all PHP files with PHP Code Sniffer
|
|
||||||
gulp.task('phpcs', gulp.series('composer-install-dev', function() {
|
|
||||||
return gulp.src([
|
|
||||||
config.mibewPath + '/**/*.php',
|
|
||||||
'!' + config.phpVendorPath + '/**/*.*',
|
|
||||||
'!' + config.pluginsPath + '/**/*.*',
|
|
||||||
'!' + config.cachePath + '/**/*.*'
|
|
||||||
], {
|
|
||||||
// Content of the cache directory is readable only for webserver.
|
|
||||||
// Thus we must to set "strict" option to false to prevent "EACCES"
|
|
||||||
// errors. At the same we need to see all errors that take place.
|
|
||||||
strict: false,
|
|
||||||
silent: false
|
|
||||||
})
|
|
||||||
.pipe(phpcs({
|
|
||||||
bin: config.phpVendorPath + '/bin/phpcs',
|
|
||||||
standard: 'PSR2',
|
|
||||||
warningSeverity: 0
|
|
||||||
}))
|
|
||||||
.pipe(phpcs.reporter('log'))
|
|
||||||
.pipe(phpcs.reporter('fail'));
|
|
||||||
}));
|
|
||||||
|
|
||||||
// Checks all JavaScript Source files with ESLint
|
|
||||||
gulp.task('eslint', function() {
|
|
||||||
return gulp.src(config.jsPath + '/source/**/*.js')
|
|
||||||
.pipe(eslint())
|
|
||||||
.pipe(eslint.format())
|
|
||||||
.pipe(eslint.failAfterError());
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
// Restore empty English translation in the source code
|
|
||||||
gulp.task('post-pack-cleanup', function(callback) {
|
|
||||||
gulp.src('translation.po')
|
|
||||||
.pipe(gulp.dest(config.mibewPath + '/locales/en/'));
|
|
||||||
|
|
||||||
del(['translation.po', config.releasePath + '/translation.po'], callback);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Tasks of compiling //////////////////
|
|
||||||
|
|
||||||
// Compile all JavaScript files of the Mibew Messenger Core
|
|
||||||
gulp.task('js', function() {
|
|
||||||
return eventStream.merge(
|
|
||||||
getClientSideApp('default'),
|
|
||||||
getClientSideApp('chat'),
|
|
||||||
getClientSideApp('thread_log'),
|
|
||||||
getClientSideApp('users'),
|
|
||||||
gulp.src(config.jsPath + '/source/**/*.js')
|
|
||||||
)
|
|
||||||
.pipe(uglify({preserveComments: 'some'}))
|
|
||||||
.pipe(removeDuplicateHeaders())
|
|
||||||
.pipe(gulp.dest(config.jsPath + '/compiled'));
|
|
||||||
});
|
|
||||||
|
|
||||||
// Compile and concatenate Handlebars templates for all chat styles
|
|
||||||
gulp.task('chat-styles-handlebars', function() {
|
|
||||||
return getChildDirs(config.chatStylesPath)
|
|
||||||
.then(function (dirs) {
|
|
||||||
return Promise.all(dirs.map(function (dir) {
|
|
||||||
return new Promise(function(resolve, reject) {
|
|
||||||
gulp.src(config.chatStylesPath + '/' + dir
|
|
||||||
+ '/templates_src/client_side/**/*.handlebars')
|
|
||||||
.pipe(handlebars({
|
|
||||||
// Use specific version of Handlebars.js
|
|
||||||
handlebars: handlebarsEngine
|
|
||||||
}))
|
|
||||||
.pipe(wrapHandlebarsTemplate())
|
|
||||||
.pipe(concat('templates.js'))
|
|
||||||
.pipe(uglify({preserveComments: 'some'}))
|
|
||||||
.pipe(header(config.compiledTemplatesHeader))
|
|
||||||
.pipe(gulp.dest(config.chatStylesPath + '/' + dir
|
|
||||||
+ '/templates_compiled/client_side'))
|
|
||||||
.on('end', resolve)
|
|
||||||
.on('error', reject);
|
|
||||||
});
|
|
||||||
}));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// Compile and concatenate js files for all chat styles
|
|
||||||
gulp.task('chat-styles-js', function() {
|
|
||||||
return getChildDirs(config.chatStylesPath)
|
|
||||||
.then(function (dirs) {
|
|
||||||
return Promise.all(dirs.map(function (dir) {
|
|
||||||
return new Promise(function(resolve, reject) {
|
|
||||||
gulp.src(config.chatStylesPath + '/' + dir
|
|
||||||
+ '/js/source/**/*.js')
|
|
||||||
.pipe(concat('scripts.js'))
|
|
||||||
.pipe(uglify({preserveComments: 'some'}))
|
|
||||||
.pipe(gulp.dest(config.chatStylesPath + '/' + dir
|
|
||||||
+ '/js/compiled'))
|
|
||||||
.on('end', resolve)
|
|
||||||
.on('error', reject);
|
|
||||||
});
|
|
||||||
}));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// Performs all job related to pages styles
|
|
||||||
gulp.task('page-styles', function() {
|
|
||||||
return getChildDirs(config.pageStylesPath)
|
|
||||||
.then(function (dirs) {
|
|
||||||
return Promise.all(dirs.map(function (dir) {
|
|
||||||
return new Promise(function(resolve, reject){
|
|
||||||
gulp.src(config.pageStylesPath + '/' + dir
|
|
||||||
+ '/templates_src/client_side/**/*.handlebars')
|
|
||||||
.pipe(handlebars({
|
|
||||||
// Use specific version of Handlebars.js
|
|
||||||
handlebars: handlebarsEngine
|
|
||||||
}))
|
|
||||||
.pipe(wrapHandlebarsTemplate())
|
|
||||||
.pipe(concat('templates.js'))
|
|
||||||
.pipe(uglify({preserveComments: 'some'}))
|
|
||||||
.pipe(header(config.compiledTemplatesHeader))
|
|
||||||
.pipe(gulp.dest(config.pageStylesPath + '/' + dir
|
|
||||||
+ '/templates_compiled/client_side'))
|
|
||||||
.on('end', resolve)
|
|
||||||
.on('error', reject);
|
|
||||||
});
|
|
||||||
}));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// Performs all job related to chat styles
|
|
||||||
gulp.task('chat-styles', gulp.series('chat-styles-handlebars', 'chat-styles-js'));
|
|
||||||
|
|
||||||
// Prepares ready to use development version of Mibew Messenger without
|
|
||||||
// packing or validating it
|
|
||||||
gulp.task('rebuild', function(callback) {
|
|
||||||
runSequence(
|
|
||||||
'clean',
|
|
||||||
['js', 'chat-styles', 'page-styles', 'composer-install',
|
|
||||||
'bower-install'],
|
|
||||||
callback
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Tasks for localization issues ///////
|
|
||||||
|
|
||||||
// Generate POT-file based upon the source code
|
|
||||||
gulp.task('generate-pot', function() {
|
|
||||||
return eventStream.merge(
|
|
||||||
gulp.src([
|
|
||||||
config.mibewPath + '/**/*.php',
|
|
||||||
'!' + config.phpVendorPath + '/**/*.*',
|
|
||||||
'!' + config.pluginsPath + '/**/*.*',
|
|
||||||
'!' + config.cachePath + '/**/*.*'
|
|
||||||
], {
|
|
||||||
// Content of the cache directory is readable only for
|
|
||||||
// webserver. Thus we must to set "strict" option to false
|
|
||||||
// to prevent "EACCES" errors. At the same we need to see all
|
|
||||||
// errors that take place.
|
|
||||||
strict: false,
|
|
||||||
silent: false
|
|
||||||
})
|
|
||||||
.pipe(xgettext({
|
|
||||||
language: 'PHP',
|
|
||||||
keywords: [
|
|
||||||
{name: 'getlocal'},
|
|
||||||
{name: 'no_field'},
|
|
||||||
{name: 'wrong_field'},
|
|
||||||
{name: 'failed_uploading_file', singular: 2}
|
|
||||||
]
|
|
||||||
})),
|
|
||||||
gulp.src(config.jsPath + '/source/**/*.js', {base: config.mibewPath})
|
|
||||||
.pipe(xgettext({
|
|
||||||
language: 'JavaScript',
|
|
||||||
keywords: [
|
|
||||||
{name: 'trans'}
|
|
||||||
]
|
|
||||||
})),
|
|
||||||
gulp.src([
|
|
||||||
config.chatStylesPath + '/default/templates_src/**/*.handlebars',
|
|
||||||
config.pageStylesPath + '/default/templates_src/**/*.handlebars'
|
|
||||||
], {base: config.mibewPath})
|
|
||||||
.pipe(xgettextHandlebars())
|
|
||||||
)
|
|
||||||
.pipe(concatPo(config.i18nPrefix + 'translation'
|
|
||||||
+ config.i18nSuffix + '.pot',
|
|
||||||
{
|
|
||||||
headers: {
|
|
||||||
'Project-Id-Version': 'Mibew Messenger '
|
|
||||||
+ config.package.version,
|
|
||||||
'Report-Msgid-Bugs-To': config.package.support.email,
|
|
||||||
'POT-Creation-Date': strftime('%Y-%m-%d %H:%M%z'),
|
|
||||||
'PO-Revision-Date': '',
|
|
||||||
'Last-Translator': '',
|
|
||||||
'Language-Team': '',
|
|
||||||
'Content-Type': 'text/plain; charset=UTF-8'
|
|
||||||
}
|
|
||||||
})
|
|
||||||
)
|
|
||||||
.pipe(gulp.dest(config.releasePath));
|
|
||||||
});
|
|
||||||
|
|
||||||
// Generate temporary English translation to be used in the release
|
|
||||||
gulp.task('generate-tmp-po', gulp.series('generate-pot', function(callback) {
|
|
||||||
return exec(config.msginit + ' --no-translator --no-wrap -i '
|
|
||||||
+ config.releasePath + '/' + config.i18nPrefix + 'translation'
|
|
||||||
+ config.i18nSuffix + '.pot' + ' -l en -o '
|
|
||||||
+ config.releasePath + '/translation.po',
|
|
||||||
function(error, stdout, stderr) {
|
|
||||||
callback(error ? stderr : null);
|
|
||||||
});
|
|
||||||
}));
|
|
||||||
|
|
||||||
// Generate complete translations (that includes missed strings) to be used
|
|
||||||
// in the release
|
|
||||||
gulp.task('generate-pos', gulp.series('generate-tmp-po', function(callback) {
|
|
||||||
|
|
||||||
return getChildDirs(config.i18nPath + '/translations')
|
|
||||||
.then(function (dirs) {
|
|
||||||
return Promise.all(dirs.map(function (dir) {
|
|
||||||
return new Promise(function(resolve, reject) {
|
|
||||||
mkdirp(config.releasePath + '/' + dir, function (error) {
|
|
||||||
if (error) {
|
|
||||||
reject(error);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
exec(config.msgcat + ' ' + config.i18nPath + '/translations/'
|
|
||||||
+ dir + '/translation.po ' + config.releasePath
|
|
||||||
+ '/translation.po --no-location --no-wrap --use-first'
|
|
||||||
+ ' -o ' + config.releasePath + '/' + dir
|
|
||||||
+ '/translation.po',
|
|
||||||
function(error, stdout, stderr) {
|
|
||||||
if (error) {
|
|
||||||
reject(error);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var sources = [
|
|
||||||
config.i18nPath + '/translations/' + dir + '/**/*',
|
|
||||||
'!' + config.i18nPath + '/translations/' + dir
|
|
||||||
+ '/translation.po'
|
|
||||||
];
|
|
||||||
|
|
||||||
gulp.src(sources)
|
|
||||||
.pipe(gulp.dest(config.releasePath + '/' + dir))
|
|
||||||
.on('error', reject)
|
|
||||||
.on('end', resolve);
|
|
||||||
});
|
|
||||||
}));
|
|
||||||
});
|
|
||||||
}));
|
|
||||||
|
|
||||||
// Packaging tasks /////////////////////
|
|
||||||
|
|
||||||
// Pack sources for release as .zip and .tar.gz archives
|
|
||||||
gulp.task('pack-sources', gulp.series('composer-install', 'bower-install', function() {
|
|
||||||
gulp.src(config.mibewPath + '/locales/en/translation.po')
|
|
||||||
.pipe(gulp.dest('.'));
|
|
||||||
gulp.src(config.releasePath + '/translation.po')
|
|
||||||
.pipe(gulp.dest(config.mibewPath + '/locales/en/'));
|
|
||||||
|
|
||||||
var sources = [
|
|
||||||
config.mibewPath + '/**/*',
|
|
||||||
// Exclude user's config
|
|
||||||
'!' + config.configsPath + '/config.yml',
|
|
||||||
// Exclude cache files but not the ".keep" file.
|
|
||||||
'!' + config.cachePath + '/**/!(.keep)',
|
|
||||||
// Exclude avatars but not the ".keep" file.
|
|
||||||
'!' + config.avatarsPath + '/!(.keep)',
|
|
||||||
// Exclude plugins but not the ".keep" file.
|
|
||||||
'!' + config.pluginsPath + '/!(.keep)',
|
|
||||||
'!' + config.pluginsPath + '/*/**/*',
|
|
||||||
// Exclude Git repositories that can be shipped with third-party libs
|
|
||||||
'!' + config.phpVendorPath + '/**/.git',
|
|
||||||
'!' + config.phpVendorPath + '/**/.git/**/*',
|
|
||||||
// Exclude vendors binaries
|
|
||||||
'!' + config.phpVendorPath + '/bin/**/*',
|
|
||||||
// Exclude JavaScript sources
|
|
||||||
'!' + config.jsPath + '/source/**/*',
|
|
||||||
// Actually we does not need backbone.babysitter and backbone.wreqr
|
|
||||||
// dependencies because they embed into marionette.js. So we exclude
|
|
||||||
// "backbone.babysitter" and "backbone.wreqr" directories and all their
|
|
||||||
// contents.
|
|
||||||
'!' + config.jsVendorPath + '/backbone.babysitter{,/**}',
|
|
||||||
'!' + config.jsVendorPath + '/backbone.wreqr{,/**}',
|
|
||||||
// Exclude dot files within third-party JS libraries.
|
|
||||||
'!' + config.jsVendorPath + '/**/.*',
|
|
||||||
// Exclude config files of various package systems
|
|
||||||
'!' + config.jsVendorPath + '/**/{bower,component,package,composer}.json',
|
|
||||||
// Exclude config files of various build systems
|
|
||||||
'!' + config.jsVendorPath + '/**/Gruntfile.*',
|
|
||||||
'!' + config.jsVendorPath + '/**/gulpfile.*',
|
|
||||||
'!' + config.jsVendorPath + '/**/Makefile',
|
|
||||||
// Exclude HTML files from third-party JS libraries. Such files can be
|
|
||||||
// used for docs or for tests, we need none of them.
|
|
||||||
'!' + config.jsVendorPath + '/**/*.html',
|
|
||||||
// There are too many useless files in Vex.js library. Exclude them.
|
|
||||||
'!' + config.jsVendorPath + '/vex/sass{,/**}',
|
|
||||||
'!' + config.jsVendorPath + '/vex/docs{,/**}',
|
|
||||||
'!' + config.jsVendorPath + '/vex/docs{,/**}',
|
|
||||||
'!' + config.jsVendorPath + '/vex/coffee{,/**}'
|
|
||||||
];
|
|
||||||
var srcOptions = {
|
|
||||||
// Dot files (.htaccess, .keep, etc.) must be included in the package
|
|
||||||
dot: true,
|
|
||||||
// Content of the cache directory is readable only for webserver. Thus
|
|
||||||
// we must to set "strict" option to false to prevent "EACCES" errors.
|
|
||||||
// At the same we need to see all errors that take place.
|
|
||||||
strict: false,
|
|
||||||
silent: false,
|
|
||||||
// Preserve root directory name (i.e. 'mibew/')
|
|
||||||
base: '.'
|
|
||||||
}
|
|
||||||
var version = config.package.version;
|
|
||||||
|
|
||||||
return eventStream.merge(
|
|
||||||
gulp.src(sources, srcOptions)
|
|
||||||
.pipe(zip('mibew-' + version + '.zip')),
|
|
||||||
gulp.src(sources, srcOptions)
|
|
||||||
.pipe(tar('mibew-' + version + '.tar'))
|
|
||||||
.pipe(gzip())
|
|
||||||
)
|
|
||||||
.pipe(chmod(644))
|
|
||||||
.pipe(gulp.dest(config.releasePath));
|
|
||||||
}));
|
|
||||||
|
|
||||||
// Pack translations for release as .zip and .tar.gz archives
|
|
||||||
gulp.task('pack-i18n', function(callback) {
|
|
||||||
return getChildDirs(config.i18nPath + '/translations')
|
|
||||||
.then(function (dirs) {
|
|
||||||
return Promise.all(dirs.map(function (dir) {
|
|
||||||
return new Promise(function(resolve, reject) {
|
|
||||||
|
|
||||||
var srcOptions = {
|
|
||||||
base: config.releasePath
|
|
||||||
};
|
|
||||||
|
|
||||||
eventStream.merge(
|
|
||||||
gulp.src(config.releasePath + '/' + dir
|
|
||||||
+ '/**/*', srcOptions)
|
|
||||||
.pipe(zip(config.i18nPrefix + dir
|
|
||||||
+ config.i18nSuffix + '.zip')),
|
|
||||||
gulp.src(config.releasePath + '/' + dir
|
|
||||||
+ '/**/*', srcOptions)
|
|
||||||
.pipe(tar(config.i18nPrefix + dir
|
|
||||||
+ config.i18nSuffix + '.tar'))
|
|
||||||
.pipe(gzip())
|
|
||||||
)
|
|
||||||
.pipe(chmod(644))
|
|
||||||
.pipe(gulp.dest(config.releasePath))
|
|
||||||
.on('error', reject)
|
|
||||||
.on('end', resolve);
|
|
||||||
|
|
||||||
});
|
|
||||||
}));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// Tasks of releasing //////////////////
|
|
||||||
|
|
||||||
// Prepare release of Mibew Messenger
|
|
||||||
gulp.task('prepare-release', function(callback) {
|
|
||||||
runSequence(
|
|
||||||
'clean',
|
|
||||||
['phpcs', 'js', 'chat-styles', 'page-styles', 'generate-pot',
|
|
||||||
'generate-tmp-po'],
|
|
||||||
'pack-sources',
|
|
||||||
'post-pack-cleanup',
|
|
||||||
callback
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Prepare releases of translations for Mibew Messenger
|
|
||||||
gulp.task('prepare-i18n-release', function(callback) {
|
|
||||||
runSequence( 'clean-tmp-po',
|
|
||||||
'generate-pos',
|
|
||||||
'pack-i18n',
|
|
||||||
'clean-tmp-i18n-files',
|
|
||||||
callback
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Mirror prepared releases of Mibew Messenger and its translations in a form
|
|
||||||
// intended for uploading into the CDN
|
|
||||||
gulp.task('prepare-for-upload', function(callback) {
|
|
||||||
gulp.src(config.releasePath + '/mibew-' + config.package.version + '.*')
|
|
||||||
.pipe(gulp.dest(config.uploadPath + '/core/' + config.package.version + '/'));
|
|
||||||
|
|
||||||
gulp.src(config.releasePath + '/mibew-i18n-translation-' + config.package.version + '-*.pot')
|
|
||||||
.pipe(gulp.dest(config.uploadPath + '/i18n/_pot/' + config.package.version + '/'));
|
|
||||||
|
|
||||||
return getChildDirs(config.i18nPath + '/translations')
|
|
||||||
.then(function (dirs) {
|
|
||||||
return Promise.all(dirs.map(function (dir) {
|
|
||||||
return new Promise(function(resolve, reject) {
|
|
||||||
gulp.src(config.releasePath + '/mibew-i18n-' + dir + '-' + config.package.version + '-*.*')
|
|
||||||
.pipe(gulp.dest(config.uploadPath + '/i18n/' + dir + '/' + config.package.version + '/'))
|
|
||||||
.on('error', reject)
|
|
||||||
.on('end', resolve);
|
|
||||||
});
|
|
||||||
}));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// Perform all preparations before uploading the release of Mibew Messenger and
|
|
||||||
// its translations into the CDN
|
|
||||||
gulp.task('prepare-all', function(callback) {
|
|
||||||
runSequence('clean-all', 'prepare-release', 'prepare-i18n-release',
|
|
||||||
'prepare-for-upload', callback);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Prepare release archives of the development version of Mibew Messenger
|
|
||||||
gulp.task('default', function(callback) {
|
|
||||||
runSequence(
|
|
||||||
'clean',
|
|
||||||
['js', 'chat-styles', 'page-styles', 'generate-tmp-po'],
|
|
||||||
'pack-sources',
|
|
||||||
['post-pack-cleanup', 'clean-tmp-po'],
|
|
||||||
callback
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Loads and prepare js file for a client side application with the specified
|
|
||||||
* name.
|
|
||||||
*
|
|
||||||
* @param {String} name Application name.
|
|
||||||
* @returns A files stream that can be piped to any gulp plugin.
|
|
||||||
*/
|
|
||||||
var getClientSideApp = function(name) {
|
|
||||||
var appSource = config.jsPath + '/source/' + name;
|
|
||||||
|
|
||||||
return gulp.src(appSource + '/**/*.js')
|
|
||||||
.pipe(order(
|
|
||||||
[
|
|
||||||
appSource + '/init.js',
|
|
||||||
// The following line is equivalent to
|
|
||||||
// gulp.src([appSource + '/*.js', '!' + appSource + '/app.js']);
|
|
||||||
appSource + '/!(app).js',
|
|
||||||
appSource + '/models/**/base*.js',
|
|
||||||
appSource + '/models/**/*.js',
|
|
||||||
appSource + '/collections/**/base*.js',
|
|
||||||
appSource + '/collections/**/*.js',
|
|
||||||
appSource + '/model_views/**/base*.js',
|
|
||||||
appSource + '/model_views/**/*.js',
|
|
||||||
appSource + '/collection_views/**/base*.js',
|
|
||||||
appSource + '/collection_views/**/*.js',
|
|
||||||
appSource + '/regions/**/base*.js',
|
|
||||||
appSource + '/regions/**/*.js',
|
|
||||||
appSource + '/layouts/**/base*.js',
|
|
||||||
appSource + '/layouts/**/*.js',
|
|
||||||
appSource + '/**/base*.js',
|
|
||||||
// The following line is equivalent to
|
|
||||||
// gulp.src([appSource + '/**/*.js', '!' + appSource + '/app.js']);
|
|
||||||
'!' + appSource + '/app.js',
|
|
||||||
appSource + '/app.js'
|
|
||||||
],
|
|
||||||
{base: process.cwd()}
|
|
||||||
))
|
|
||||||
.pipe(concat(name + '_app.js'));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wraps a handlebars template with a function and attach it to the
|
|
||||||
* Handlebars.templates object.
|
|
||||||
*
|
|
||||||
* @returns {Function} A function that can be used in pipe() method of a file
|
|
||||||
* stream right after gulp-handlebars plugin.
|
|
||||||
*/
|
|
||||||
var wrapHandlebarsTemplate = function() {
|
|
||||||
return defineModule('plain', {
|
|
||||||
wrapper: '(function() {\n'
|
|
||||||
+ 'var templates = Handlebars.templates = Handlebars.templates || {};\n'
|
|
||||||
+ 'Handlebars.templates["<%= relative %>"] = <%= handlebars %>;\n'
|
|
||||||
+ '})()',
|
|
||||||
context: function(context) {
|
|
||||||
return {relative: context.file.relative.replace(/\.js$/, '').replace(/\\/g, '/')};
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extracts gettext messages from handlebars templates.
|
|
||||||
*
|
|
||||||
* @returns {Function} A function that can be used in pipe() method of a file
|
|
||||||
* stream.
|
|
||||||
*/
|
|
||||||
var xgettextHandlebars = function() {
|
|
||||||
var helperRegExp = /\{{2}l10n\s*('|")(.*?[^\\])\1.*?\}{2}/g;
|
|
||||||
|
|
||||||
return through.obj(function (file, enc, callback) {
|
|
||||||
var po = new PoFile();
|
|
||||||
match = false,
|
|
||||||
contents = file.contents.toString();
|
|
||||||
|
|
||||||
while (match = helperRegExp.exec(contents)) {
|
|
||||||
// Try to find item in the .po file by its name
|
|
||||||
var item = lodash.find(po.items, function(item) {
|
|
||||||
return match[2] === item.msgid;
|
|
||||||
});
|
|
||||||
|
|
||||||
var line = contents.substr(0, match.index).split(/\r?\n|\r/g).length;
|
|
||||||
|
|
||||||
if (!item) {
|
|
||||||
// There is no such item, create new one
|
|
||||||
item = new PoFile.Item();
|
|
||||||
item.msgid = match[2].replace(/\\'/g, "'").replace(/\\"/g, '"');
|
|
||||||
po.items.push(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add new reference
|
|
||||||
item.references.push(file.relative + ':' + line);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update file contents
|
|
||||||
file.contents = Buffer.from(po.toString());
|
|
||||||
this.push(file);
|
|
||||||
|
|
||||||
callback();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves list of all dirs which are placed in the specified one.
|
|
||||||
*
|
|
||||||
* @param {String} srcDir A dir to search.
|
|
||||||
* @returns Promise A promise which will be resolved with list of child dirs or
|
|
||||||
* rejected with the occured error.
|
|
||||||
*/
|
|
||||||
var getChildDirs = function(srcDir) {
|
|
||||||
return (new Promise(function(resolve, reject) {
|
|
||||||
fs.readdir(srcDir, function (err, files) {
|
|
||||||
if (err) {
|
|
||||||
reject(err);
|
|
||||||
} else {
|
|
||||||
resolve(files);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
})).then(function (files) {
|
|
||||||
// Replace all files that are not a directory with nulls.
|
|
||||||
return Promise.all(files.map(function (file) {
|
|
||||||
return new Promise(function (resolve, reject) {
|
|
||||||
fs.lstat(srcDir + '/' + file, function (err, stat) {
|
|
||||||
if (err) {
|
|
||||||
reject(err);
|
|
||||||
} else {
|
|
||||||
resolve(stat.isDirectory() ? file : null);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}));
|
|
||||||
}).then(function(dirs) {
|
|
||||||
// Remove all nulls from the array.
|
|
||||||
return dirs.filter(function (dir) {
|
|
||||||
return null !== dir;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
1
src/i18n
@ -1 +0,0 @@
|
|||||||
Subproject commit 55868d9973f531c3550575481bde4233cc625b91
|
|
1
src/messenger/.idea/.name
Normal file
@ -0,0 +1 @@
|
|||||||
|
messenger
|
31
src/messenger/.idea/codeStyleSettings.xml
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectCodeStyleSettingsManager">
|
||||||
|
<option name="PER_PROJECT_SETTINGS">
|
||||||
|
<value>
|
||||||
|
<option name="OTHER_INDENT_OPTIONS">
|
||||||
|
<value>
|
||||||
|
<option name="INDENT_SIZE" value="4" />
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
||||||
|
<option name="TAB_SIZE" value="4" />
|
||||||
|
<option name="USE_TAB_CHARACTER" value="true" />
|
||||||
|
<option name="SMART_TABS" value="false" />
|
||||||
|
<option name="LABEL_INDENT_SIZE" value="0" />
|
||||||
|
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
||||||
|
<option name="USE_RELATIVE_INDENTS" value="false" />
|
||||||
|
</value>
|
||||||
|
</option>
|
||||||
|
<XML>
|
||||||
|
<option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" />
|
||||||
|
</XML>
|
||||||
|
<codeStyleSettings language="PHP">
|
||||||
|
<indentOptions>
|
||||||
|
<option name="USE_TAB_CHARACTER" value="true" />
|
||||||
|
</indentOptions>
|
||||||
|
</codeStyleSettings>
|
||||||
|
</value>
|
||||||
|
</option>
|
||||||
|
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
|
|
13
src/messenger/.idea/encodings.xml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="Encoding" useUTFGuessing="true" native2AsciiForPropertiesFiles="false">
|
||||||
|
<file url="file://$PROJECT_DIR$" charset="UTF-8" />
|
||||||
|
<file url="file://$PROJECT_DIR$/webim/locales/be/properties" charset="windows-1251" />
|
||||||
|
<file url="file://$PROJECT_DIR$/webim/locales/bg/properties" charset="windows-1251" />
|
||||||
|
<file url="file://$PROJECT_DIR$/webim/locales/ca/properties" charset="ISO-8859-1" />
|
||||||
|
<file url="file://$PROJECT_DIR$/webim/locales/ru/properties" charset="windows-1251" />
|
||||||
|
<file url="file://$PROJECT_DIR$/webim/locales/sp/properties" charset="ISO-8859-1" />
|
||||||
|
<file url="file://$PROJECT_DIR$/webim/locales/ua/properties" charset="windows-1251" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
|
|
11
src/messenger/.idea/inspectionProfiles/Project_Default.xml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<profile version="1.0" is_locked="false">
|
||||||
|
<option name="myName" value="Project Default" />
|
||||||
|
<option name="myLocal" value="false" />
|
||||||
|
<inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false">
|
||||||
|
<option name="processCode" value="true" />
|
||||||
|
<option name="processLiterals" value="true" />
|
||||||
|
<option name="processComments" value="true" />
|
||||||
|
</inspection_tool>
|
||||||
|
</profile>
|
||||||
|
</component>
|
@ -0,0 +1,7 @@
|
|||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<settings>
|
||||||
|
<option name="PROJECT_PROFILE" value="Project Default" />
|
||||||
|
<option name="USE_PROJECT_PROFILE" value="true" />
|
||||||
|
<version value="1.0" />
|
||||||
|
</settings>
|
||||||
|
</component>
|
15
src/messenger/.idea/messenger.iml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="WEB_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager">
|
||||||
|
<content url="file://$MODULE_DIR$" />
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
<orderEntry type="module-library">
|
||||||
|
<library name="PHP">
|
||||||
|
<CLASSES />
|
||||||
|
<SOURCES />
|
||||||
|
</library>
|
||||||
|
</orderEntry>
|
||||||
|
</component>
|
||||||
|
</module>
|
||||||
|
|
8
src/messenger/.idea/misc.xml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectResources">
|
||||||
|
<default-html-doctype>http://www.w3.org/1999/xhtml</default-html-doctype>
|
||||||
|
</component>
|
||||||
|
<component name="ProjectRootManager" version="2" />
|
||||||
|
</project>
|
||||||
|
|
9
src/messenger/.idea/modules.xml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/messenger.iml" filepath="$PROJECT_DIR$/.idea/messenger.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
|
|
80
src/messenger/.idea/projectCodeStyle.xml
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="CodeStyleSettingsManager">
|
||||||
|
<option name="PER_PROJECT_SETTINGS">
|
||||||
|
<value>
|
||||||
|
<ADDITIONAL_INDENT_OPTIONS fileType="js">
|
||||||
|
<option name="INDENT_SIZE" value="4" />
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
||||||
|
<option name="TAB_SIZE" value="4" />
|
||||||
|
<option name="USE_TAB_CHARACTER" value="false" />
|
||||||
|
<option name="SMART_TABS" value="false" />
|
||||||
|
<option name="LABEL_INDENT_SIZE" value="0" />
|
||||||
|
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
||||||
|
<option name="USE_RELATIVE_INDENTS" value="false" />
|
||||||
|
</ADDITIONAL_INDENT_OPTIONS>
|
||||||
|
<ADDITIONAL_INDENT_OPTIONS fileType="jsp">
|
||||||
|
<option name="INDENT_SIZE" value="4" />
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
||||||
|
<option name="TAB_SIZE" value="4" />
|
||||||
|
<option name="USE_TAB_CHARACTER" value="false" />
|
||||||
|
<option name="SMART_TABS" value="false" />
|
||||||
|
<option name="LABEL_INDENT_SIZE" value="0" />
|
||||||
|
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
||||||
|
<option name="USE_RELATIVE_INDENTS" value="false" />
|
||||||
|
</ADDITIONAL_INDENT_OPTIONS>
|
||||||
|
<ADDITIONAL_INDENT_OPTIONS fileType="php">
|
||||||
|
<option name="INDENT_SIZE" value="4" />
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
||||||
|
<option name="TAB_SIZE" value="4" />
|
||||||
|
<option name="USE_TAB_CHARACTER" value="false" />
|
||||||
|
<option name="SMART_TABS" value="false" />
|
||||||
|
<option name="LABEL_INDENT_SIZE" value="0" />
|
||||||
|
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
||||||
|
<option name="USE_RELATIVE_INDENTS" value="false" />
|
||||||
|
</ADDITIONAL_INDENT_OPTIONS>
|
||||||
|
<ADDITIONAL_INDENT_OPTIONS fileType="sass">
|
||||||
|
<option name="INDENT_SIZE" value="2" />
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
||||||
|
<option name="TAB_SIZE" value="4" />
|
||||||
|
<option name="USE_TAB_CHARACTER" value="false" />
|
||||||
|
<option name="SMART_TABS" value="false" />
|
||||||
|
<option name="LABEL_INDENT_SIZE" value="0" />
|
||||||
|
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
||||||
|
<option name="USE_RELATIVE_INDENTS" value="false" />
|
||||||
|
</ADDITIONAL_INDENT_OPTIONS>
|
||||||
|
<ADDITIONAL_INDENT_OPTIONS fileType="sql">
|
||||||
|
<option name="INDENT_SIZE" value="2" />
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
||||||
|
<option name="TAB_SIZE" value="4" />
|
||||||
|
<option name="USE_TAB_CHARACTER" value="false" />
|
||||||
|
<option name="SMART_TABS" value="false" />
|
||||||
|
<option name="LABEL_INDENT_SIZE" value="0" />
|
||||||
|
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
||||||
|
<option name="USE_RELATIVE_INDENTS" value="false" />
|
||||||
|
</ADDITIONAL_INDENT_OPTIONS>
|
||||||
|
<ADDITIONAL_INDENT_OPTIONS fileType="xml">
|
||||||
|
<option name="INDENT_SIZE" value="4" />
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
||||||
|
<option name="TAB_SIZE" value="4" />
|
||||||
|
<option name="USE_TAB_CHARACTER" value="false" />
|
||||||
|
<option name="SMART_TABS" value="false" />
|
||||||
|
<option name="LABEL_INDENT_SIZE" value="0" />
|
||||||
|
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
||||||
|
<option name="USE_RELATIVE_INDENTS" value="false" />
|
||||||
|
</ADDITIONAL_INDENT_OPTIONS>
|
||||||
|
<ADDITIONAL_INDENT_OPTIONS fileType="yml">
|
||||||
|
<option name="INDENT_SIZE" value="2" />
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="8" />
|
||||||
|
<option name="TAB_SIZE" value="4" />
|
||||||
|
<option name="USE_TAB_CHARACTER" value="false" />
|
||||||
|
<option name="SMART_TABS" value="false" />
|
||||||
|
<option name="LABEL_INDENT_SIZE" value="0" />
|
||||||
|
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
|
||||||
|
<option name="USE_RELATIVE_INDENTS" value="false" />
|
||||||
|
</ADDITIONAL_INDENT_OPTIONS>
|
||||||
|
</value>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
|
|
5
src/messenger/.idea/scopes/scope_settings.xml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<component name="DependencyValidationManager">
|
||||||
|
<state>
|
||||||
|
<option name="SKIP_IMPORT_STATEMENTS" value="false" />
|
||||||
|
</state>
|
||||||
|
</component>
|
7
src/messenger/.idea/vcs.xml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
|
|
56
src/messenger/check_translation.pl
Executable file
@ -0,0 +1,56 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
sub read_transl($) {
|
||||||
|
my($from) = @_;
|
||||||
|
my %translation = ();
|
||||||
|
open(IN, "webim/locales/$from/properties");
|
||||||
|
while(<IN>) {
|
||||||
|
chomp;
|
||||||
|
if(/^([\w\.]+)=(.*)$/) {
|
||||||
|
if($1 ne "encoding" && $1 ne "output_charset" && $1 ne "output_encoding") {
|
||||||
|
$translation{$1} = $2;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
die "wrong line in $from: $_\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(IN);
|
||||||
|
return %translation;
|
||||||
|
}
|
||||||
|
|
||||||
|
%tr_en = read_transl("en");
|
||||||
|
|
||||||
|
@all_keys = keys %tr_en;
|
||||||
|
|
||||||
|
sub check_transl($%) {
|
||||||
|
my($name,%tr) = @_;
|
||||||
|
print "checking $name...\n";
|
||||||
|
my @totransl = ();
|
||||||
|
for $key (@all_keys) {
|
||||||
|
unless(exists $tr{$key}) {
|
||||||
|
push @totransl, "$key=".$tr_en{$key};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for $key(keys %tr) {
|
||||||
|
unless(exists $tr_en{$key}) {
|
||||||
|
print "unknown key in $name: $key\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if($#totransl >= 0) {
|
||||||
|
print "@{[$#totransl+1]} lines absent in locales/$name/properties\n";
|
||||||
|
open(OUT, "> absent_$name");
|
||||||
|
for(sort @totransl) {
|
||||||
|
print OUT "$_\n";
|
||||||
|
}
|
||||||
|
close(OUT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
check_transl("ru", read_transl("ru"));
|
||||||
|
check_transl("fr", read_transl("fr"));
|
||||||
|
check_transl("de", read_transl("de"));
|
||||||
|
check_transl("sp", read_transl("sp"));
|
||||||
|
check_transl("it", read_transl("it"));
|
||||||
|
check_transl("pl", read_transl("pl"));
|
||||||
|
check_transl("zh-tw", read_transl("zh-tw"));
|
||||||
|
|
5
src/messenger/compile_js
Executable file
@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
cd webim/js/source
|
||||||
|
ant
|
||||||
|
rm -rf bin
|
245
src/messenger/compute_resources.pl
Executable file
@ -0,0 +1,245 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use Digest::MD5 qw(md5 md5_hex md5_base64);
|
||||||
|
|
||||||
|
@rules = (
|
||||||
|
["redirect(ed)?\\.tpl", 1],
|
||||||
|
["\\.tpl", 0],
|
||||||
|
|
||||||
|
["view/license.php", 0],
|
||||||
|
["view/themes.php", 2],
|
||||||
|
["view/translate.php", 2],
|
||||||
|
["view/translatelist.php", 2],
|
||||||
|
["view/settings.php", 2],
|
||||||
|
["view/updates.php", 2],
|
||||||
|
["view/features.php", 2],
|
||||||
|
["view/performance.php", 2],
|
||||||
|
["view/avatar.php", 2],
|
||||||
|
["view/permissions.php", 2],
|
||||||
|
["view/agent.php", 2],
|
||||||
|
["view/agents.php", 2],
|
||||||
|
["view/group.php", 2],
|
||||||
|
["view/groupmembers.php", 2],
|
||||||
|
["view/groups.php", 2],
|
||||||
|
["view/operator_groups.php", 2],
|
||||||
|
["view/gen_button.php", 2],
|
||||||
|
["view/install_err.php", 2],
|
||||||
|
["view/install_index.php", 2],
|
||||||
|
["view/.*\\.php", 1],
|
||||||
|
|
||||||
|
["install/.*\\.php", 2],
|
||||||
|
|
||||||
|
["operator/themes.php", 2],
|
||||||
|
["operator/translate.php", 2],
|
||||||
|
["operator/settings.php", 2],
|
||||||
|
["operator/updates.php", 2],
|
||||||
|
["operator/features.php", 2],
|
||||||
|
["operator/performance.php", 2],
|
||||||
|
["operator/avatar.php", 2],
|
||||||
|
["operator/permissions.php", 2],
|
||||||
|
["operator/operator.php", 2],
|
||||||
|
["operator/operators.php", 2],
|
||||||
|
["operator/group.php", 2],
|
||||||
|
["operator/groupmembers.php", 2],
|
||||||
|
["operator/groups.php", 2],
|
||||||
|
["operator/opgroups.php", 2],
|
||||||
|
["operator/getcode.php", 2],
|
||||||
|
["operator/.*\\.php", 1],
|
||||||
|
|
||||||
|
["webim/client.php", 0],
|
||||||
|
["webim/leavemessage.php", 0],
|
||||||
|
["webim/captcha.php", 0],
|
||||||
|
["webim/license.php", 0],
|
||||||
|
["webim/mail.php", 0],
|
||||||
|
|
||||||
|
["libs/operator_settings.php", 2],
|
||||||
|
["webim/libs/chat.php", 0],
|
||||||
|
["libs/pagination.php", 1],
|
||||||
|
["libs/settings.php", 2],
|
||||||
|
["libs/groups.php", 2],
|
||||||
|
["libs/demothread.php", 2],
|
||||||
|
|
||||||
|
["webim/thread.php", 0],
|
||||||
|
["webim/b.php", 0],
|
||||||
|
["webim/button.php", 0],
|
||||||
|
["webim/index.php", 0],
|
||||||
|
|
||||||
|
["webim/libs/.*\\.php", 1],
|
||||||
|
);
|
||||||
|
|
||||||
|
%messagekeys = (
|
||||||
|
"localeid" => 0,
|
||||||
|
"output_charset" => 0,
|
||||||
|
"output_encoding" => 0,
|
||||||
|
"harderrors.header" => 0,
|
||||||
|
|
||||||
|
"errors.required" => 0,
|
||||||
|
"errors.wrong_field" => 0,
|
||||||
|
"errors.file.move.error" => 2,
|
||||||
|
"errors.invalid.file.type" => 2,
|
||||||
|
"errors.file.size.exceeded" => 2,
|
||||||
|
|
||||||
|
"permission.admin" => 1,
|
||||||
|
"permission.takeover" => 1,
|
||||||
|
"permission.viewthreads" => 1,
|
||||||
|
|
||||||
|
"chat.thread.state_chatting_with_agent" => 1,
|
||||||
|
"chat.thread.state_closed" => 1,
|
||||||
|
"chat.thread.state_loading" => 1,
|
||||||
|
"chat.thread.state_wait" => 1,
|
||||||
|
"chat.thread.state_wait_for_another_agent" => 1,
|
||||||
|
|
||||||
|
"clients.queue.chat" => 1,
|
||||||
|
"clients.queue.prio" => 1,
|
||||||
|
"clients.queue.wait" => 1,
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
$webimPath = "webim";
|
||||||
|
|
||||||
|
%urls = ();
|
||||||
|
|
||||||
|
%usermessages = ();
|
||||||
|
%operatormessages = ();
|
||||||
|
$current_level = 0;
|
||||||
|
|
||||||
|
sub usemsg($) {
|
||||||
|
my ($m) = @_;
|
||||||
|
$messagekeys{$m} = exists $messagekeys{$m} && $messagekeys{$m} < $current_level ? $messagekeys{$m} : $current_level;
|
||||||
|
if($current_level == -1) {
|
||||||
|
print " .. $m\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub file_content($) {
|
||||||
|
my $input = $_[0];
|
||||||
|
open( IN1, "< $input" ) or die "cannot find file $input";
|
||||||
|
my $oldslash = $/;
|
||||||
|
$/ = EOI;
|
||||||
|
$content = <IN1>;
|
||||||
|
close( IN1 );
|
||||||
|
if($content =~ s/\r//g) {
|
||||||
|
open( OUT1, "> $input") or die "cannot fix $input";
|
||||||
|
print OUT1 $content;
|
||||||
|
close(OUT1);
|
||||||
|
}
|
||||||
|
$/ = $oldslash;
|
||||||
|
return $content;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub process_tpl($) {
|
||||||
|
my ($filename) = @_;
|
||||||
|
my $m = file_content($filename);
|
||||||
|
while( $m =~ /\${msg:([\w\.]+)(,[\w\.]+)?}/g ) {
|
||||||
|
usemsg($1);
|
||||||
|
}
|
||||||
|
while( $m =~ /\${url:([\w\.]+)(,[\w\.]+)?}/g ) {
|
||||||
|
usemsg($1);
|
||||||
|
$urls{"%$1"} = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub process_php($) {
|
||||||
|
my ($source) = @_;
|
||||||
|
my $content = file_content($source);
|
||||||
|
$content =~ s/<\?xml version=\\"1\.0\\" encoding=\\"UTF-8\\"\?>//;
|
||||||
|
|
||||||
|
while( $content =~ s/<\?(?!xml)(.*?)\?>//s ) {
|
||||||
|
my $inner = $1;
|
||||||
|
while($inner =~ s/(getlocal|getstring|no_field)2?_?\((.*?)[,\)]//s) {
|
||||||
|
my $firstarg = $2;
|
||||||
|
if( $firstarg =~ /^["']([\w\.]+)['"]$/) {
|
||||||
|
usemsg($1);
|
||||||
|
} elsif($firstarg =~ /^\$\w+$/ || $firstarg eq '"$var.header"' || $firstarg eq '"permission.$permid"' || $firstarg eq '$threadstate_key[$thread[\'istate\']]') {
|
||||||
|
# skip
|
||||||
|
} else {
|
||||||
|
print "> unknown: $firstarg\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub file_checksum($) {
|
||||||
|
my ($source) = @_;
|
||||||
|
if($source =~ /\.(png|gif|jpg|ico|wav)$/ || $source =~ /config\.php$/) {
|
||||||
|
return "-";
|
||||||
|
}
|
||||||
|
|
||||||
|
my $content = file_content($source);
|
||||||
|
return md5_hex($content);
|
||||||
|
}
|
||||||
|
|
||||||
|
@allsources = ();
|
||||||
|
|
||||||
|
sub process_one($) {
|
||||||
|
my($source) = @_;
|
||||||
|
push @allsources, $source unless $source =~ /$webimPath\/locales/ && $source !~ /$webimPath\/locales\/(en|names)/ || $source =~ /\/package$/;
|
||||||
|
|
||||||
|
if($source !~ /\.(php|tpl)$/) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$current_level = -1;
|
||||||
|
|
||||||
|
A: foreach $rule (@rules) {
|
||||||
|
my $key = $$rule[0];
|
||||||
|
if($source =~ /$key/) {
|
||||||
|
$current_level = $$rule[1];
|
||||||
|
last A;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if($current_level < 0 || $current_level > 2) {
|
||||||
|
print "not detected for: $source\n";
|
||||||
|
$current_level = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($source =~ /\.php$/) {
|
||||||
|
# print "$source ($current_level)\n";
|
||||||
|
process_php($source);
|
||||||
|
} elsif($source =~ /\.tpl$/) {
|
||||||
|
process_tpl($source);
|
||||||
|
} else {
|
||||||
|
#print ". $source\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub process_files($) {
|
||||||
|
my($from) = @_;
|
||||||
|
opendir(DIR, $from) || die "can't opendir $from: $!";
|
||||||
|
my @content = readdir(DIR);
|
||||||
|
closedir DIR;
|
||||||
|
|
||||||
|
for(grep { -f "$from/$_" && ($_ !~ /^\./ || $_ eq ".htaccess") } @content) {
|
||||||
|
process_one("$from/$_");
|
||||||
|
}
|
||||||
|
for(grep { -d "$from/$_" && $_ !~ /^\./ } @content) {
|
||||||
|
process_files("$from/$_");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process_files($webimPath);
|
||||||
|
|
||||||
|
# fix
|
||||||
|
$messagekeys{'page.analysis.userhistory.title'} = 1;
|
||||||
|
$messagekeys{'errors.failed.uploading.file'} = 2;
|
||||||
|
|
||||||
|
|
||||||
|
open( OUT, "> $webimPath/locales/names/level1") or die "cannot write file, $!";
|
||||||
|
for $key(sort grep { $messagekeys{$_} == 0 } keys %messagekeys) {
|
||||||
|
print OUT "$key\n";
|
||||||
|
}
|
||||||
|
close( OUT );
|
||||||
|
|
||||||
|
open( OUT, "> $webimPath/locales/names/level2") or die "cannot write file, $!";
|
||||||
|
for $key(sort grep { $messagekeys{$_} == 1 } keys %messagekeys) {
|
||||||
|
print OUT "$key\n";
|
||||||
|
}
|
||||||
|
close( OUT );
|
||||||
|
|
||||||
|
open( OUT, "> $webimPath/install/package") or die "cannot write file, $!";
|
||||||
|
for $key(sort @allsources) {
|
||||||
|
$digest = file_checksum($key);
|
||||||
|
$key =~ s/$webimPath\///;
|
||||||
|
print OUT "$key $digest\n";
|
||||||
|
}
|
||||||
|
close( OUT );
|
66
src/messenger/pack.pl
Executable file
@ -0,0 +1,66 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
##################################################################
|
||||||
|
# Arguments
|
||||||
|
##################################################################
|
||||||
|
|
||||||
|
$targetFolder = "deploy";
|
||||||
|
$suffix = "166";
|
||||||
|
|
||||||
|
##################################################################
|
||||||
|
# Copies tree into target folder, preprocess .phps
|
||||||
|
##################################################################
|
||||||
|
|
||||||
|
sub process_dir($$) {
|
||||||
|
my ($from,$to) = @_;
|
||||||
|
opendir(DIR, $from) || die "can't opendir $from: $!";
|
||||||
|
my @content = readdir(DIR);
|
||||||
|
closedir DIR;
|
||||||
|
mkdir $to;
|
||||||
|
|
||||||
|
for(grep { -f "$from/$_" && ($_ !~ /^\./ || $_ eq ".htaccess" || $_ eq ".keep") } @content) {
|
||||||
|
my ($source,$target) = ("$from/$_","$to/$_");
|
||||||
|
|
||||||
|
open (IN,"$source");
|
||||||
|
binmode(IN);
|
||||||
|
open (OUT,">$target");
|
||||||
|
binmode(OUT);
|
||||||
|
print OUT $buffer while (read (IN,$buffer,65536));
|
||||||
|
}
|
||||||
|
|
||||||
|
for(grep { -d "$from/$_" && $_ !~ /^\./ } @content) {
|
||||||
|
process_dir("$from/$_","$to/$_");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
##################################################################
|
||||||
|
# Main
|
||||||
|
##################################################################
|
||||||
|
|
||||||
|
`rm -rf $targetFolder`;
|
||||||
|
die "Target folder exists: $targetFolder" if -e $targetFolder;
|
||||||
|
|
||||||
|
process_dir("./webim", $targetFolder);
|
||||||
|
|
||||||
|
`rm -rf release$suffix`;
|
||||||
|
die "release folder exists: release$suffix" if -e "release$suffix";
|
||||||
|
mkdir "release$suffix";
|
||||||
|
|
||||||
|
chdir "$targetFolder";
|
||||||
|
|
||||||
|
`zip -r ../release$suffix/mibew${suffix}_all.zip * .htaccess`;
|
||||||
|
|
||||||
|
chdir "locales";
|
||||||
|
|
||||||
|
foreach $locale qw ( ar be bg ca cs da de el fa fi fr he hr hu id it ka lv nl pl pt-br pt-pt ro ru sp sv th tr ua zh-cn zh-tw ) {
|
||||||
|
|
||||||
|
`zip -r ../../release$suffix/mibew${suffix}_$locale.zip $locale`;
|
||||||
|
`rm -rf $locale`;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
chdir "..";
|
||||||
|
`zip -r ../release$suffix/mibew$suffix.zip * .htaccess`;
|
||||||
|
|
||||||
|
chdir "..";
|
||||||
|
`rm -rf $targetFolder`;
|
@ -1,6 +1,4 @@
|
|||||||
This file is a part of Mibew Messenger.
|
Copyright 2005-2013 the original author or authors.
|
||||||
|
|
||||||
Copyright 2005-2023 the original author or authors.
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
56
src/messenger/tools/header_update.pl
Executable file
@ -0,0 +1,56 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
$sourceFolder = "../webim";
|
||||||
|
|
||||||
|
sub file_content($) {
|
||||||
|
my $input = $_[0];
|
||||||
|
open( IN1, "< $input" ) or die "cannot find file $input";
|
||||||
|
$/ = EOI;
|
||||||
|
$content = <IN1>;
|
||||||
|
$content =~ s/\r//g;
|
||||||
|
close( IN1 );
|
||||||
|
return $content;
|
||||||
|
}
|
||||||
|
|
||||||
|
$php_header = file_content("header.txt");
|
||||||
|
$php_header =~ s/\s+$//;
|
||||||
|
|
||||||
|
@allfiles = ();
|
||||||
|
|
||||||
|
sub process_folder($) {
|
||||||
|
my($from) = @_;
|
||||||
|
|
||||||
|
opendir(DIR, $from) || die "can't opendir $from: $!";
|
||||||
|
my @content = readdir(DIR);
|
||||||
|
closedir DIR;
|
||||||
|
|
||||||
|
for(grep { -f "$from/$_" && ($_ !~ /^\./ || $_ eq ".htaccess") } @content) {
|
||||||
|
push @allfiles, "$from/$_";
|
||||||
|
}
|
||||||
|
for(grep { -d "$from/$_" && $_ !~ /^\./ } @content) {
|
||||||
|
process_folder("$from/$_");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process_folder($sourceFolder);
|
||||||
|
|
||||||
|
P: for $phpfile (grep { /\.php$/ } @allfiles) {
|
||||||
|
$content = file_content($phpfile);
|
||||||
|
$content =~ s/\s+$//g;
|
||||||
|
die "not a php: $phpfile" unless $content =~ /^<\?php\n(\/\*.*?\*\/)?/s;
|
||||||
|
die "no comment in $phpfile" unless defined($1);
|
||||||
|
$comment = $1;
|
||||||
|
if($comment =~ /\[external\]/) {
|
||||||
|
next P;
|
||||||
|
};
|
||||||
|
$newcomment = "$php_header";
|
||||||
|
$newcomment =~ s/^/ * /gm;
|
||||||
|
$newcomment =~ s/\s+$//gm;
|
||||||
|
$newcomment = "/*\n$newcomment\n */";
|
||||||
|
|
||||||
|
$content =~ s/^(<\?php\n)\/\*.*?\*\//$1$newcomment/s;
|
||||||
|
|
||||||
|
open( OUT, "> $phpfile" ) or die "cannot write file: $phpfile\n";
|
||||||
|
print OUT $content;
|
||||||
|
close( OUT );
|
||||||
|
}
|
33
src/messenger/tools/sortit.pl
Executable file
@ -0,0 +1,33 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
sub sort_transl($) {
|
||||||
|
my($from) = @_;
|
||||||
|
my @translation = ();
|
||||||
|
my $header = "";
|
||||||
|
open(IN, "$from");
|
||||||
|
while(<IN>) {
|
||||||
|
chomp;
|
||||||
|
my $curr = $_;
|
||||||
|
if(/^([\w\.]+)=(.*)$/) {
|
||||||
|
if($1 ne "encoding" && $1 ne "output_charset" && $1 ne "output_encoding") {
|
||||||
|
push @translation, $curr;
|
||||||
|
} else {
|
||||||
|
$header .= "$curr\n";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
die "wrong line in $from: $curr\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(IN);
|
||||||
|
open(OUT, "> $from");
|
||||||
|
print OUT $header;
|
||||||
|
for$line(sort @translation) {
|
||||||
|
print OUT "$line\n";
|
||||||
|
}
|
||||||
|
close(OUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
die "no parameter\n" if $#ARGV < 0;
|
||||||
|
die "doesn't exists\n" unless -e $ARGV[0];
|
||||||
|
|
||||||
|
sort_transl($ARGV[0]);
|
4
src/messenger/webim/.htaccess
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<IfModule mod_security.c>
|
||||||
|
SecFilterEngine Off
|
||||||
|
SecFilterScanPOST Off
|
||||||
|
</IfModule>
|
41
src/messenger/webim/README
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
Mibew Messenger
|
||||||
|
Copyright 2005-2013 the original author or authors.
|
||||||
|
|
||||||
|
REQUIREMENTS
|
||||||
|
|
||||||
|
* Apache web server 1.3.34 or above
|
||||||
|
* MySQL database 5.0 or above
|
||||||
|
* PHP 4.x or above with MySQL support
|
||||||
|
|
||||||
|
INSTALLATION
|
||||||
|
|
||||||
|
1. Create folder with name 'mibew' in the root of your website.
|
||||||
|
2. Upload all the files contained in this archive (retaining the directory structure) into created folder.
|
||||||
|
Be sure to chromo the mibew folder to 755 and the install folder to 644.
|
||||||
|
3. Add a MySQL database with the name 'mibew'
|
||||||
|
4. Edit /mibew/libs/config.php to the information needed to connect to the database
|
||||||
|
5. Using your web browser visit http://<yourdomain>/mibew/install/ and
|
||||||
|
hit 'Create tables'
|
||||||
|
6. Remove /mibew/install/ directory from your server
|
||||||
|
7. Logon as
|
||||||
|
user: admin
|
||||||
|
password: <empty>
|
||||||
|
8. Get button code and setup it on your site.
|
||||||
|
9. Change your password and name.
|
||||||
|
10. Wait for your visitors on 'Pending users' page.
|
||||||
|
|
||||||
|
On unix/linux platforms change the owner of /mibew/images/avatar folder
|
||||||
|
to the user, under which the web server is running (for instance, www).
|
||||||
|
The owner should have all rights on the folder /mibew/images/avatar
|
||||||
|
(chmod 700 /mibew/images/avatar).
|
||||||
|
|
||||||
|
UPDATE
|
||||||
|
|
||||||
|
1. Backup your /mibew/libs/config.php
|
||||||
|
2. Backup your /mibew/images/avatar folder.
|
||||||
|
3. Delete the items in the mibew folder on the server.
|
||||||
|
4. Upload all the files contained in the downloaded archive (retaining the directory structure) into mibew folder.
|
||||||
|
5. Re-edit the MySQL database settings you config.php
|
||||||
|
6. Visit http://<yourdomain>/mibew/install/ and follow the instructions to update database (if needed).
|
||||||
|
7. Remove /mibew/install/ directory from your server
|
||||||
|
8. Restore contents of /mibew/images/avatar folder.
|
1
src/messenger/webim/VERSION
Normal file
@ -0,0 +1 @@
|
|||||||
|
Mibew/1.6.6
|
74
src/messenger/webim/b.php
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2005-2013 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
require_once('libs/common.php');
|
||||||
|
require_once('libs/chat.php');
|
||||||
|
require_once('libs/operator.php');
|
||||||
|
require_once('libs/groups.php');
|
||||||
|
|
||||||
|
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : "";
|
||||||
|
if($referer && isset($_SESSION['threadid'])) {
|
||||||
|
$link = connect();
|
||||||
|
$thread = thread_by_id_($_SESSION['threadid'], $link);
|
||||||
|
if ($thread && $thread['istate'] != $state_closed) {
|
||||||
|
$msg = getstring2_("chat.client.visited.page", array($referer), $thread['locale'], true);
|
||||||
|
post_message_($thread['threadid'], $kind_for_agent,$msg,$link);
|
||||||
|
}
|
||||||
|
mysql_close($link);
|
||||||
|
}
|
||||||
|
|
||||||
|
$image = verifyparam(isset($_GET['image']) ? "image" : "i", "/^\w+$/", "mibew");
|
||||||
|
$lang = verifyparam(isset($_GET['language']) ? "language" : "lang", "/^[\w-]{2,5}$/", "");
|
||||||
|
if(!$lang || !locale_pattern_check($lang) || !locale_exists($lang)) {
|
||||||
|
$lang = $current_locale;
|
||||||
|
}
|
||||||
|
|
||||||
|
$groupid = verifyparam( "group", "/^\d{1,10}$/", "");
|
||||||
|
if($groupid) {
|
||||||
|
loadsettings();
|
||||||
|
if($settings['enablegroups'] == '1') {
|
||||||
|
$group = group_by_id($groupid);
|
||||||
|
if(!$group) {
|
||||||
|
$groupid = "";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$groupid = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$image_postfix = has_online_operators($groupid) ? "on" : "off";
|
||||||
|
$filename = dirname(__FILE__) . "/locales/${lang}/button/${image}_${image_postfix}.gif";
|
||||||
|
if (!file_exists($filename)) {
|
||||||
|
die("no image");
|
||||||
|
}
|
||||||
|
$fp = fopen($filename, 'rb') or die("unable to get image");
|
||||||
|
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
|
||||||
|
header("Cache-Control: no-store, no-cache, must-revalidate");
|
||||||
|
header("Pragma: no-cache");
|
||||||
|
header("Content-Type: image/gif");
|
||||||
|
header("Content-Length: ".filesize($filename));
|
||||||
|
if(function_exists('fpassthru')){
|
||||||
|
@fpassthru($fp);
|
||||||
|
} else {
|
||||||
|
while( (!feof($fp)) && (connection_status()==0)){
|
||||||
|
print(fread($fp, 1024*8));
|
||||||
|
flush();
|
||||||
|
}
|
||||||
|
fclose($fp);
|
||||||
|
}
|
||||||
|
exit;
|
||||||
|
?>
|
@ -1,7 +1,6 @@
|
|||||||
/*!
|
<?php
|
||||||
* This file is a part of Mibew Messenger.
|
/*
|
||||||
*
|
* Copyright 2005-2013 the original author or authors.
|
||||||
* Copyright 2005-2023 the original author or authors.
|
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -15,3 +14,7 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
require_once('b.php');
|
||||||
|
exit;
|
||||||
|
?>
|
@ -1,5 +1,6 @@
|
|||||||
|
<?php
|
||||||
/*
|
/*
|
||||||
* Copyright 2005-2023 the original author or authors.
|
* Copyright 2005-2013 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -14,12 +15,12 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* common controls */
|
require_once('libs/common.php');
|
||||||
.control,
|
require_once('libs/captcha.php');
|
||||||
.user-name-control-set,
|
|
||||||
.user-name-control-change,
|
$captchaCode = gen_captcha();
|
||||||
.user-name-control-input-background,
|
$_SESSION["mibew_captcha"] = $captchaCode;
|
||||||
#confirm-pane .submit-button {
|
draw_captcha($captchaCode);
|
||||||
display: inline;
|
|
||||||
zoom: 1;
|
exit;
|
||||||
}
|
?>
|
180
src/messenger/webim/client.php
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2005-2013 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
require_once('libs/common.php');
|
||||||
|
require_once('libs/chat.php');
|
||||||
|
require_once('libs/operator.php');
|
||||||
|
require_once('libs/groups.php');
|
||||||
|
require_once('libs/expand.php');
|
||||||
|
require_once('libs/captcha.php');
|
||||||
|
require_once('libs/notify.php');
|
||||||
|
|
||||||
|
loadsettings();
|
||||||
|
if($settings['enablessl'] == "1" && $settings['forcessl'] == "1") {
|
||||||
|
if(!is_secure_request()) {
|
||||||
|
$requested = $_SERVER['PHP_SELF'];
|
||||||
|
if($_SERVER['REQUEST_METHOD'] == 'GET' && $_SERVER['QUERY_STRING']) {
|
||||||
|
header("Location: ".get_app_location(true,true)."/client.php?".$_SERVER['QUERY_STRING']);
|
||||||
|
} else {
|
||||||
|
die("only https connections are handled");
|
||||||
|
}
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !isset($_GET['token']) || !isset($_GET['thread']) ) {
|
||||||
|
|
||||||
|
$thread = NULL;
|
||||||
|
if( isset($_SESSION['threadid']) ) {
|
||||||
|
$thread = reopen_thread($_SESSION['threadid']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !$thread ) {
|
||||||
|
$groupid = "";
|
||||||
|
$groupname = "";
|
||||||
|
if($settings['enablegroups'] == '1') {
|
||||||
|
$groupid = verifyparam( "group", "/^\d{1,10}$/", "");
|
||||||
|
if($groupid) {
|
||||||
|
$group = group_by_id($groupid);
|
||||||
|
if(!$group) {
|
||||||
|
$groupid = "";
|
||||||
|
} else {
|
||||||
|
$groupname = get_group_name($group);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$visitor = visitor_from_request();
|
||||||
|
|
||||||
|
if(isset($_POST['survey']) && $_POST['survey'] == 'on') {
|
||||||
|
$firstmessage = getparam("message");
|
||||||
|
$info = getparam("info");
|
||||||
|
$email = getparam("email");
|
||||||
|
$referrer = urldecode(getparam("referrer"));
|
||||||
|
if ($settings["surveyaskcaptcha"] == "1") {
|
||||||
|
$captcha = getparam('captcha');
|
||||||
|
$original = isset($_SESSION["mibew_captcha"])
|
||||||
|
? $_SESSION["mibew_captcha"]
|
||||||
|
: "";
|
||||||
|
$survey_captcha_failed = empty($original)
|
||||||
|
|| empty($captcha)
|
||||||
|
|| $captcha != $original;
|
||||||
|
unset($_SESSION['mibew_captcha']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if($settings['usercanchangename'] == "1" && isset($_POST['name'])) {
|
||||||
|
$newname = getparam("name");
|
||||||
|
if($newname != $visitor['name']) {
|
||||||
|
$data = strtr(base64_encode(myiconv($mibew_encoding,"utf-8",$newname)), '+/=', '-_,');
|
||||||
|
setcookie($namecookie, $data, time()+60*60*24*365);
|
||||||
|
$visitor['name'] = $newname;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$firstmessage = NULL;
|
||||||
|
$info = getgetparam('info');
|
||||||
|
$email = getgetparam('email');
|
||||||
|
$referrer = isset($_GET['url']) ? $_GET['url'] :
|
||||||
|
(isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : "");
|
||||||
|
if(isset($_GET['referrer']) && $_GET['referrer']) {
|
||||||
|
$referrer .= "\n".$_GET['referrer'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!has_online_operators($groupid)) {
|
||||||
|
$page = array();
|
||||||
|
setup_logo();
|
||||||
|
setup_leavemessage($visitor['name'],$email,$firstmessage,$groupid,$groupname,$info,$referrer,can_show_captcha());
|
||||||
|
expand("styles", getchatstyle(), "leavemessage.tpl");
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$show_survey = $settings['enablepresurvey'] == '1'
|
||||||
|
&& (
|
||||||
|
!(isset($_POST['survey']) && $_POST['survey'] == 'on')
|
||||||
|
|| ($settings["surveyaskcaptcha"] == "1" && !empty($survey_captcha_failed))
|
||||||
|
);
|
||||||
|
if($show_survey) {
|
||||||
|
$page = array();
|
||||||
|
setup_logo();
|
||||||
|
if (!empty($survey_captcha_failed)) {
|
||||||
|
$errors[] = getlocal('errors.captcha');
|
||||||
|
}
|
||||||
|
setup_survey($visitor['name'], $email, $groupid, $info, $referrer, can_show_captcha());
|
||||||
|
expand("styles", getchatstyle(), "survey.tpl");
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$remoteHost = get_remote_host();
|
||||||
|
$userbrowser = $_SERVER['HTTP_USER_AGENT'];
|
||||||
|
|
||||||
|
$link = connect();
|
||||||
|
if(!check_connections_from_remote($remoteHost, $link)) {
|
||||||
|
mysql_close($link);
|
||||||
|
die("number of connections from your IP is exceeded, try again later");
|
||||||
|
}
|
||||||
|
$thread = create_thread($groupid,$visitor['name'], $remoteHost, $referrer,$current_locale,$visitor['id'], $userbrowser,$state_loading,$link);
|
||||||
|
$_SESSION['threadid'] = $thread['threadid'];
|
||||||
|
|
||||||
|
if( $referrer ) {
|
||||||
|
post_message_($thread['threadid'],$kind_for_agent,getstring2('chat.came.from',array($referrer),true),$link);
|
||||||
|
}
|
||||||
|
post_message_($thread['threadid'],$kind_info,getstring('chat.wait', true),$link);
|
||||||
|
if($email) {
|
||||||
|
post_message_($thread['threadid'],$kind_for_agent,getstring2('chat.visitor.email',array($email),true),$link);
|
||||||
|
}
|
||||||
|
if($info) {
|
||||||
|
post_message_($thread['threadid'],$kind_for_agent,getstring2('chat.visitor.info',array($info),true),$link);
|
||||||
|
}
|
||||||
|
if($firstmessage) {
|
||||||
|
$postedid = post_message_($thread['threadid'],$kind_user,$firstmessage,$link,$visitor['name']);
|
||||||
|
commit_thread( $thread['threadid'], array('shownmessageid' => intval($postedid)), $link);
|
||||||
|
}
|
||||||
|
notify_operators($thread, $firstmessage, $link);
|
||||||
|
mysql_close($link);
|
||||||
|
}
|
||||||
|
$threadid = $thread['threadid'];
|
||||||
|
$token = $thread['ltoken'];
|
||||||
|
$level = get_remote_level($_SERVER['HTTP_USER_AGENT']);
|
||||||
|
$chatstyle = verifyparam( "style", "/^\w+$/", "");
|
||||||
|
header("Location: $mibewroot/client.php?thread=$threadid&token=$token&level=$level".($chatstyle ? "&style=$chatstyle" : ""));
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$token = verifyparam( "token", "/^\d{1,10}$/");
|
||||||
|
$threadid = verifyparam( "thread", "/^\d{1,10}$/");
|
||||||
|
$level = verifyparam( "level", "/^(ajaxed|simple|old)$/");
|
||||||
|
|
||||||
|
$thread = thread_by_id($threadid);
|
||||||
|
if( !$thread || !isset($thread['ltoken']) || $token != $thread['ltoken'] ) {
|
||||||
|
die("wrong thread");
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_chatview_for_user($thread, $level);
|
||||||
|
|
||||||
|
$pparam = verifyparam( "act", "/^(mailthread)$/", "default");
|
||||||
|
if( $pparam == "mailthread" ) {
|
||||||
|
expand("styles", getchatstyle(), "mail.tpl");
|
||||||
|
} else if( $level == "ajaxed" ) {
|
||||||
|
expand("styles", getchatstyle(), "chat.tpl");
|
||||||
|
} else if( $level == "simple" ) {
|
||||||
|
expand("styles", getchatstyle(), "chatsimple.tpl");
|
||||||
|
} else if( $level == "old" ) {
|
||||||
|
expand("styles", getchatstyle(), "nochat.tpl");
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
917
src/messenger/webim/default.css
Normal file
@ -0,0 +1,917 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2005-2013 Evgeny Gryaznov
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* reset all */
|
||||||
|
|
||||||
|
html, body, div, h1, h2, h3, h4, h5, h6, ul, ol, dl, li, dt, dd, p, blockquote, pre, form, fieldset, table, th, td { margin: 0; padding: 0; }
|
||||||
|
table { border-collapse:collapse; border-spacing:0; }
|
||||||
|
fieldset,img { border:0; }
|
||||||
|
ol,ul { list-style:none; }
|
||||||
|
h1,h2,h3,h4,h5,h6 { font-size:100%; font-weight:normal; }
|
||||||
|
q:before,q:after { content:''; }
|
||||||
|
|
||||||
|
body {
|
||||||
|
background: #FFFFFF url(images/header.gif) repeat-x;
|
||||||
|
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
|
||||||
|
font-size: 0.8em;
|
||||||
|
line-height: 140%;
|
||||||
|
color: #333333;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 100% height with footer, 200 px sidebar */
|
||||||
|
|
||||||
|
html, body {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
min-width: 750px;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #2f7599;
|
||||||
|
}
|
||||||
|
|
||||||
|
#wrap400, #wrap700, #fixedwrap {
|
||||||
|
position:relative;
|
||||||
|
margin: 0px auto -41px;
|
||||||
|
height:auto !important;
|
||||||
|
height:100%;
|
||||||
|
min-height:100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#wrap400 {
|
||||||
|
width: 100%;
|
||||||
|
min-width:450px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#wrap700 {
|
||||||
|
width: 100%;
|
||||||
|
min-width:750px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#fixedwrap {
|
||||||
|
width: 750px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.contentdiv {
|
||||||
|
float:left;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.contentinner {
|
||||||
|
margin-right: 210px;
|
||||||
|
padding: 10px 60px 10px 20px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.contentnomenu {
|
||||||
|
padding: 10px 60px 10px 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.empty_inner {
|
||||||
|
height:40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#footer {
|
||||||
|
background: white url(images/footer.gif) bottom repeat-x;
|
||||||
|
font-size:11px;
|
||||||
|
position:relative;
|
||||||
|
|
||||||
|
min-height: 40px;
|
||||||
|
height:40px;
|
||||||
|
vertical-align:middle;
|
||||||
|
|
||||||
|
width:100%;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
#legal {
|
||||||
|
clear: both;
|
||||||
|
line-height: 30px;
|
||||||
|
padding-top:10px;
|
||||||
|
text-align: center;
|
||||||
|
color: #375C69;
|
||||||
|
margin-bottom: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#footer .flink {
|
||||||
|
color: #2f7599;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
#togglediv {
|
||||||
|
float:right;
|
||||||
|
padding-right:10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Header */
|
||||||
|
|
||||||
|
#header {
|
||||||
|
width: 100%;
|
||||||
|
height: 32px;
|
||||||
|
margin: 0px -2px 10px 0px;
|
||||||
|
padding-top: 10px;
|
||||||
|
padding-bottom: 5px;
|
||||||
|
background: url(images/graydot.gif) repeat-x left bottom;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
img.left {
|
||||||
|
float: left;
|
||||||
|
margin-right: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header h1 {
|
||||||
|
font-size: 2em;
|
||||||
|
line-height: 32px;
|
||||||
|
color: #494949;
|
||||||
|
margin-left: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header h1 a {
|
||||||
|
color: #494949;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header a {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#title {
|
||||||
|
float: left;
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
#path {
|
||||||
|
float: right;
|
||||||
|
padding: 10px 20px 0px 0px;
|
||||||
|
line-height: 22px;
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sidebar */
|
||||||
|
|
||||||
|
#sidebar {
|
||||||
|
float: left;
|
||||||
|
width: 185px;
|
||||||
|
margin-left: -210px;
|
||||||
|
margin-top: 20px;
|
||||||
|
position:relative;
|
||||||
|
line-height: 180%
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar ul {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar li {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar li ul {
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar li li {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sidebar h2 {
|
||||||
|
text-transform: lowercase;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
background: url(images/graydot.gif) repeat-x left bottom;
|
||||||
|
font-size: 1.3em;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.locales a {
|
||||||
|
color: #2f7599;
|
||||||
|
font-size: 1em;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.locales .active a {
|
||||||
|
color: #555;
|
||||||
|
}
|
||||||
|
|
||||||
|
.locales a:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.submenu a {
|
||||||
|
padding-left: 15px;
|
||||||
|
color: #2f7599;
|
||||||
|
font-size: 1em;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.submenu a.inner { padding-left: 0px; }
|
||||||
|
.submenu span.small { font-size: 80%; padding-left: 5px; }
|
||||||
|
|
||||||
|
.submenu .active a {
|
||||||
|
background: url(images/li.gif) no-repeat left 1px;
|
||||||
|
color: #555;
|
||||||
|
}
|
||||||
|
|
||||||
|
.submenu .active a.inner {
|
||||||
|
background: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.submenu a:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* form, tabbed form */
|
||||||
|
|
||||||
|
.mform {
|
||||||
|
background: url(images/loginbg.gif);
|
||||||
|
clear: both;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tabs {
|
||||||
|
float: right;
|
||||||
|
margin-left: 15px;
|
||||||
|
display: inline;
|
||||||
|
margin-right: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tabs li {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tabs a {
|
||||||
|
display: block;
|
||||||
|
float: left;
|
||||||
|
padding: 2px 9px 3px 9px;
|
||||||
|
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
|
||||||
|
font-size: 11px;
|
||||||
|
color: #2f7599;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tabs li.active a {
|
||||||
|
background: url(images/loginbg.gif);
|
||||||
|
border-left:1px solid #bbbbbb;border-top:1px solid #bbbbbb;border-right:1px solid #bbbbbb;
|
||||||
|
color: #000;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.formtop, .formbottom, .formtopi, .formbottomi { height: 15px;}
|
||||||
|
.formtop { background: url(images/logincrnrt.gif) no-repeat top right;}
|
||||||
|
.formtopi { background: url(images/logincrnlt.gif) no-repeat top left; }
|
||||||
|
.formbottom { background: url(images/logincrnrb.gif) no-repeat bottom right; }
|
||||||
|
.formbottomi { background: url(images/logincrnlb.gif) no-repeat bottom left; }
|
||||||
|
.forminner { margin: 0px 15px;}
|
||||||
|
.forminner p { margin-bottom: 1em; }
|
||||||
|
|
||||||
|
/* fieldForm */
|
||||||
|
|
||||||
|
.fieldForm {
|
||||||
|
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
|
||||||
|
font-size: 11px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.packedFormField {
|
||||||
|
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
|
||||||
|
font-size: 11px;
|
||||||
|
float:left;
|
||||||
|
margin-right:25px;
|
||||||
|
margin-bottom:8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.packedFormField select {
|
||||||
|
min-width: 130px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.errinfo {
|
||||||
|
color: #c13030;
|
||||||
|
}
|
||||||
|
|
||||||
|
.field {
|
||||||
|
width: 100%;
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.flabel {
|
||||||
|
position: relative;
|
||||||
|
margin: 8px auto 2px;
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fleftlabel {
|
||||||
|
float: left;
|
||||||
|
width: 11em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.flabel span.required {
|
||||||
|
font-size:8.0pt;
|
||||||
|
color:red;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.field .subfield {
|
||||||
|
padding-left: 30px;
|
||||||
|
background: url(images/subitem.gif) no-repeat 10px 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fieldinrow {
|
||||||
|
min-width: 300px;
|
||||||
|
display: inline;
|
||||||
|
float:left;
|
||||||
|
width: 45%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fvalue {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fvaluewithta {
|
||||||
|
float: left;
|
||||||
|
width: 67%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fvaluewithta textarea {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fvaluenodesc {
|
||||||
|
}
|
||||||
|
|
||||||
|
.fvalueframe {
|
||||||
|
overflow: auto;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fvalueframe iframe {
|
||||||
|
border: solid 1px #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fdescr {
|
||||||
|
float:left;
|
||||||
|
padding-left:10px;
|
||||||
|
color: #676767;
|
||||||
|
font-size: 10px;
|
||||||
|
min-width: 200px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fbutton {
|
||||||
|
background: url(images/formline.gif) repeat-x;
|
||||||
|
margin-top: 20px;
|
||||||
|
padding-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fbutton .links {
|
||||||
|
float: right;
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fbutton .submitbutton {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.formauth {
|
||||||
|
}
|
||||||
|
|
||||||
|
textarea.wide {
|
||||||
|
border:1px solid #878787;
|
||||||
|
overflow:auto;
|
||||||
|
width: 95%;
|
||||||
|
}
|
||||||
|
|
||||||
|
input.formauth {
|
||||||
|
border: 1px solid #878787;
|
||||||
|
color: #333;
|
||||||
|
margin-right:15px;
|
||||||
|
padding-right: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#formmessage {
|
||||||
|
border: 1px solid #4C96D4;
|
||||||
|
background-color: #E7F1F9;
|
||||||
|
padding: 8px 11px;
|
||||||
|
font-size: 0.85em;
|
||||||
|
font-weight:bold;
|
||||||
|
max-width: 700px;
|
||||||
|
margin: -10px 2px 10px;
|
||||||
|
color: #515151;
|
||||||
|
}
|
||||||
|
|
||||||
|
#offwarn {
|
||||||
|
border: 1px solid #4CD496;
|
||||||
|
background-color: #E7F9F1;
|
||||||
|
color: #515151;
|
||||||
|
padding: 8px 11px;
|
||||||
|
font-size: 0.85em;
|
||||||
|
font-weight:bold;
|
||||||
|
line-height: 140%;
|
||||||
|
margin: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#offwarn img {
|
||||||
|
margin-top: .4em;
|
||||||
|
float: left;
|
||||||
|
padding-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.asterisk {
|
||||||
|
padding: 10px 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* tables */
|
||||||
|
|
||||||
|
.tabletool {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tabletool a {
|
||||||
|
color: #296685;
|
||||||
|
vertical-align: top;
|
||||||
|
padding-left: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tabletitle {
|
||||||
|
background: url(images/graydot.gif) repeat-x left bottom;
|
||||||
|
font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
|
||||||
|
font-size: 1.4em;
|
||||||
|
margin: 10px 0px 20px;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
color: #1D485E;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.list, table.translate, table.statistics {
|
||||||
|
font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
|
||||||
|
background: #fff;
|
||||||
|
width: 100%;
|
||||||
|
border-collapse: collapse;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.list th, table.translate th, table.statistics th {
|
||||||
|
font-size: 1.2em;
|
||||||
|
font-weight: normal;
|
||||||
|
padding: 10px 8px;
|
||||||
|
border-bottom: 2px solid #2F7598;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.list th, table.translate th { color: #1D485E; }
|
||||||
|
table.statistics th { color: #2F7598; }
|
||||||
|
|
||||||
|
table.list td, table.statistics td {
|
||||||
|
color: #2f7599;
|
||||||
|
padding: 10px 8px;
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.translate td {
|
||||||
|
font-family: Arial, Helvetica, sans-serif;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #515151;
|
||||||
|
padding: 2px 8px;
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.list td a.man {
|
||||||
|
background: url(images/tbliclogin.gif) no-repeat left center;
|
||||||
|
padding-left: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.list td a.mail {
|
||||||
|
background: url(images/mail.png) no-repeat left center;
|
||||||
|
padding-left: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.list td a.xmpp {
|
||||||
|
background: url(images/xmpp.png) no-repeat left center;
|
||||||
|
padding-left: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.list tbody tr:hover td, table.list tbody tr:hover td a, table.statistics tbody tr:hover td {
|
||||||
|
color: #1D485E;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* awaiting */
|
||||||
|
|
||||||
|
table.awaiting {
|
||||||
|
font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
|
||||||
|
background: #fff;
|
||||||
|
width: 100%;
|
||||||
|
border-collapse: collapse;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.awaiting th {
|
||||||
|
font-size: 1.2em;
|
||||||
|
font-weight: normal;
|
||||||
|
color: #1D485E;
|
||||||
|
padding: 10px 8px;
|
||||||
|
border-bottom: 2px solid #2F7598;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.awaiting th.first {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.awaiting table.inner {
|
||||||
|
border: none;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.awaiting table.inner .icon {
|
||||||
|
width: 30px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.awaiting td.visitor {
|
||||||
|
color: #296685;
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
padding: 10px 8px;
|
||||||
|
margin: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.awaiting .visitor a { color: #296685; }
|
||||||
|
.awaiting tr:hover .visitor, .awaiting tr:hover .visitor a { color: #1D485E; }
|
||||||
|
|
||||||
|
.awaiting tr.ban .visitor, .awaiting tr.ban .visitor a { color: #9AC8E0; }
|
||||||
|
.awaiting tr.ban:hover .visitor, .awaiting tr.ban:hover .visitor a { color: #4C9CC8; }
|
||||||
|
|
||||||
|
.awaiting tr.inwait .visitor, .awaiting tr.inwait a { font-weight: bold; }
|
||||||
|
.awaiting tr.inprio .visitor, .awaiting tr.inprio a { font-weight: bold; font-size: 1.05em; }
|
||||||
|
.awaiting tr.inchat .visitor, .awaiting tr.inchat .visitor a { color: #777; }
|
||||||
|
.awaiting tr.inchat:hover .visitor, .awaiting tr.inchat:hover .visitor a { color: #444; }
|
||||||
|
.awaiting tr.inchat a { text-decoration: none; }
|
||||||
|
|
||||||
|
.firstmessage {
|
||||||
|
text-align: right;
|
||||||
|
font-size: 0.8em;
|
||||||
|
padding-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.firstmessage a {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.firstmessage a:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
#connstatus {
|
||||||
|
float:right;
|
||||||
|
margin: 10px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#connlinks {
|
||||||
|
margin: 10px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#connlinks a {
|
||||||
|
color: #777;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#connlinks a:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* online operators */
|
||||||
|
|
||||||
|
#onlineoperators {
|
||||||
|
padding-right: 10px;
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* search */
|
||||||
|
|
||||||
|
#searchtext {
|
||||||
|
float:left;
|
||||||
|
display: inline;
|
||||||
|
margin:7px 20px 5px 0px;
|
||||||
|
width:75%;
|
||||||
|
padding-right:5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.searchctrl {
|
||||||
|
float: left;
|
||||||
|
margin:7px 20px 5px 0px;
|
||||||
|
padding-right:5px;
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
#searchtext input {
|
||||||
|
width: 100%;
|
||||||
|
margin: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#searchbutton {
|
||||||
|
float:left;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* login */
|
||||||
|
|
||||||
|
#loginsmallpane {
|
||||||
|
float: right;
|
||||||
|
padding: 10px 15px 0px 0px;
|
||||||
|
margin-right: 0px;
|
||||||
|
line-height: 22px;
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
#loginsmallpane input {
|
||||||
|
margin: 0px 3px;
|
||||||
|
padding: 0px 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#loginsmallpane .butt {
|
||||||
|
height: 1.3em;
|
||||||
|
border: 0px;
|
||||||
|
background: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#loginsmallpane .butt:hover {
|
||||||
|
background: #aaa;
|
||||||
|
}
|
||||||
|
|
||||||
|
#loginintro {
|
||||||
|
width: 400px;
|
||||||
|
margin: 10px 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#loginpane {
|
||||||
|
width: 400px;
|
||||||
|
margin: 30px 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#loginpane .header h2 {
|
||||||
|
font-size: 2em;
|
||||||
|
margin-bottom: 0.9em;
|
||||||
|
padding-bottom: 0.8em;
|
||||||
|
border-bottom: 2px solid #2F7598;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* nice button */
|
||||||
|
|
||||||
|
#confirmpane {
|
||||||
|
width:450px;
|
||||||
|
margin:0px auto 5px;
|
||||||
|
padding-top: 70px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nicebutton {
|
||||||
|
border: none;
|
||||||
|
float: left;
|
||||||
|
margin-left: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.submit a {
|
||||||
|
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
|
||||||
|
font-size: 11px;
|
||||||
|
line-height: 35px;
|
||||||
|
color: #000000;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.submit {
|
||||||
|
background: url(images/submitbg.gif) repeat-x;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* thread log */
|
||||||
|
|
||||||
|
.logpane {
|
||||||
|
margin: 10px 0px;
|
||||||
|
line-height: 150%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logpane .header {
|
||||||
|
padding-bottom: 0.8em;
|
||||||
|
border-bottom: 2px solid #2F7598;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logpane .wlabel {
|
||||||
|
width: 10em;
|
||||||
|
float: left;
|
||||||
|
margin-right:10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logpane .wvalue {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* dashboard */
|
||||||
|
|
||||||
|
#dashboard {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashitem {
|
||||||
|
width:33%;
|
||||||
|
margin: 0px 2em 5em 0px;
|
||||||
|
padding: 5px 2em 5em;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashitem:hover {
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashitem a {
|
||||||
|
padding-top:2px;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashitem img, #dashlocalesPopup h2 img {
|
||||||
|
float: left;
|
||||||
|
padding-right:10px;
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#dashlocalesPopup h2 img {
|
||||||
|
margin-top: -3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#dashlocalesPopup .locales {
|
||||||
|
line-height: 180%;
|
||||||
|
margin-left:10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#dashlocalesPopup h2 {
|
||||||
|
font-size: 1.5em;
|
||||||
|
margin-bottom: 0.9em;
|
||||||
|
padding: 5px 30px 0.8em 0px;
|
||||||
|
border-bottom: 2px solid #2F7598;
|
||||||
|
}
|
||||||
|
|
||||||
|
#dashlocalesPopupClose {
|
||||||
|
float: right;
|
||||||
|
position:absolute;
|
||||||
|
right:5px;
|
||||||
|
top:5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#dashlocalesPopup {
|
||||||
|
display:none;
|
||||||
|
position:fixed;
|
||||||
|
_position:absolute; /* ie6*/
|
||||||
|
background:#FFFFFF;
|
||||||
|
border:2px solid #2F7598;
|
||||||
|
z-index:110;
|
||||||
|
padding:1em 1em;
|
||||||
|
font-size:1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#backgroundPopup{
|
||||||
|
display:none;
|
||||||
|
position:fixed;
|
||||||
|
_position:absolute; /* ie6*/
|
||||||
|
height:100%;
|
||||||
|
opacity: .5;
|
||||||
|
width:100%;
|
||||||
|
top:0;
|
||||||
|
left:0;
|
||||||
|
background:#000000;
|
||||||
|
border:1px solid #cecece;
|
||||||
|
z-index:101;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* install */
|
||||||
|
|
||||||
|
#install li {
|
||||||
|
list-style-type: circle;
|
||||||
|
list-style-position: inside;
|
||||||
|
margin-left: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#check-nv, #check-nm {
|
||||||
|
color: #2f7599;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#check-nv:hover, #check-nm:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* chat */
|
||||||
|
|
||||||
|
.message {
|
||||||
|
font-family: Arial, Helvetica, sans-serif;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #4F4F4F;
|
||||||
|
padding: 15px 0px 0px 0px;
|
||||||
|
line-height: 17px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.message span.time {
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.message span.nuser {
|
||||||
|
color: #B11E23;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.message span.nagent {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.message span.minf {
|
||||||
|
color: #1E48B1;
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.message span.mevent {
|
||||||
|
color: #A1A1A1;
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.message span.mhidden {
|
||||||
|
color: #A1A1A1;
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.message span.mconn {
|
||||||
|
color: #A1A1A1;
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* updates */
|
||||||
|
|
||||||
|
#news {
|
||||||
|
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
|
||||||
|
font-size: 11px;
|
||||||
|
margin-bottom:15px;
|
||||||
|
padding:4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.newstext {
|
||||||
|
margin-bottom:1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* rtl rules */
|
||||||
|
|
||||||
|
.lrtl .dashitem img, .lrtl #dashlocalesPopup h2 img, .lrtl #offwarn img {
|
||||||
|
float: right;
|
||||||
|
padding-right:0px;
|
||||||
|
padding-left:10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lrtl .fleftlabel {
|
||||||
|
float: right;
|
||||||
|
width: 11em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lrtl .fdescr {
|
||||||
|
float:right;
|
||||||
|
padding-right:10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.lrtl .field .subfield {
|
||||||
|
padding-right: 30px;
|
||||||
|
background: url(images/subitem_rtl.gif) no-repeat 99% 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.lrtl .fvalue {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lrtl .logpane .wlabel {
|
||||||
|
float: right;
|
||||||
|
margin-left:10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lrtl .logpane .wvalue {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lrtl .fvaluewithta {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lrtl #togglediv {
|
||||||
|
float:left;
|
||||||
|
padding-left:10px;
|
||||||
|
}
|
Before Width: | Height: | Size: 372 B After Width: | Height: | Size: 372 B |
BIN
src/messenger/webim/images/buttons/createagent.gif
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/messenger/webim/images/buttons/createban.gif
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/messenger/webim/images/buttons/createdep.gif
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/messenger/webim/images/dash/blocked.gif
Normal file
After Width: | Height: | Size: 732 B |
BIN
src/messenger/webim/images/dash/canned.gif
Normal file
After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 340 B After Width: | Height: | Size: 340 B |
BIN
src/messenger/webim/images/dash/dep.gif
Normal file
After Width: | Height: | Size: 728 B |
BIN
src/messenger/webim/images/dash/exit.gif
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/messenger/webim/images/dash/getcode.gif
Normal file
After Width: | Height: | Size: 604 B |
BIN
src/messenger/webim/images/dash/history.gif
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/messenger/webim/images/dash/locale.gif
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
src/messenger/webim/images/dash/notifications.gif
Normal file
After Width: | Height: | Size: 690 B |
BIN
src/messenger/webim/images/dash/operators.gif
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/messenger/webim/images/dash/profile.gif
Normal file
After Width: | Height: | Size: 1.1 KiB |
19
src/messenger/webim/images/dash/readme.txt
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
"34aL volume 3.1" icons set
|
||||||
|
|
||||||
|
Ammount of icons:
|
||||||
|
60
|
||||||
|
|
||||||
|
Colors:
|
||||||
|
Colored, grey
|
||||||
|
|
||||||
|
Icon Sizes:
|
||||||
|
24x24
|
||||||
|
|
||||||
|
File Types:
|
||||||
|
.ico (RGBA, 256 color, 16 color),
|
||||||
|
.tiff (RGBA)
|
||||||
|
.gif (indexed)
|
||||||
|
.bmp (RGB - 1 color background),
|
||||||
|
.png (RGBA)
|
||||||
|
|
||||||
|
Note: These icons are free for use.
|
BIN
src/messenger/webim/images/dash/settings.gif
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/messenger/webim/images/dash/stat.gif
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/messenger/webim/images/dash/updates.gif
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
src/messenger/webim/images/dash/visitors.gif
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/messenger/webim/images/dash/warn.gif
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/messenger/webim/images/favicon.ico
Normal file
After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 162 B After Width: | Height: | Size: 162 B |
Before Width: | Height: | Size: 43 B After Width: | Height: | Size: 43 B |
Before Width: | Height: | Size: 49 B After Width: | Height: | Size: 49 B |
Before Width: | Height: | Size: 43 B After Width: | Height: | Size: 43 B |
Before Width: | Height: | Size: 162 B After Width: | Height: | Size: 162 B |
Before Width: | Height: | Size: 713 B After Width: | Height: | Size: 713 B |
Before Width: | Height: | Size: 60 B After Width: | Height: | Size: 60 B |
Before Width: | Height: | Size: 377 B After Width: | Height: | Size: 377 B |
Before Width: | Height: | Size: 68 B After Width: | Height: | Size: 68 B |
Before Width: | Height: | Size: 148 B After Width: | Height: | Size: 148 B |
Before Width: | Height: | Size: 199 B After Width: | Height: | Size: 199 B |
Before Width: | Height: | Size: 139 B After Width: | Height: | Size: 139 B |
Before Width: | Height: | Size: 142 B After Width: | Height: | Size: 142 B |
BIN
src/messenger/webim/images/logo.gif
Normal file
After Width: | Height: | Size: 796 B |
BIN
src/messenger/webim/images/mail.png
Normal file
After Width: | Height: | Size: 328 B |
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 915 B After Width: | Height: | Size: 915 B |
Before Width: | Height: | Size: 905 B After Width: | Height: | Size: 905 B |
Before Width: | Height: | Size: 906 B After Width: | Height: | Size: 906 B |
Before Width: | Height: | Size: 914 B After Width: | Height: | Size: 914 B |
Before Width: | Height: | Size: 75 B After Width: | Height: | Size: 75 B |
Before Width: | Height: | Size: 74 B After Width: | Height: | Size: 74 B |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 55 B After Width: | Height: | Size: 55 B |
Before Width: | Height: | Size: 89 B After Width: | Height: | Size: 89 B |
Before Width: | Height: | Size: 43 B After Width: | Height: | Size: 43 B |