Compare commits
704 Commits
Author | SHA1 | Date | |
---|---|---|---|
4e429a97c3 | |||
fbc1b7f22c | |||
6de4a56fa3 | |||
0c316eeef3 | |||
44f2e36071 | |||
38332ba801 | |||
c9f72e47c3 | |||
4e41e64308 | |||
e36e88127d | |||
73cc2d9b1e | |||
8840ce67e4 | |||
afb7d3a577 | |||
54d7b0d1a1 | |||
962ae92943 | |||
f5bba1732a | |||
ecf456db1f | |||
297a015b72 | |||
d20b76aea6 | |||
eb4c68109d | |||
50ab236ea9 | |||
e81b456ec3 | |||
c27ac1a8e9 | |||
8ab6b24925 | |||
dab5c1e2ea | |||
6ce9a94509 | |||
5421d45d82 | |||
1b5f40278d | |||
3d805b1191 | |||
83823e0ccf | |||
bc987a5663 | |||
a7133dd6ed | |||
e8fa029de6 | |||
5263cb6a8b | |||
719a127205 | |||
e9abde6194 | |||
6c851a5772 | |||
ec1d312c41 | |||
489695268f | |||
48fb8c5909 | |||
31586cb6e1 | |||
f638f98fa3 | |||
4e787aa8a4 | |||
7d371cc66d | |||
78c76f6b7e | |||
408687e9ed | |||
cd60aa7568 | |||
771b01aec0 | |||
62b506470c | |||
9375340426 | |||
7016f65ae3 | |||
7cb9502c1e | |||
200135164b | |||
b92d9900ac | |||
d7a0cdb662 | |||
cb6f109b4f | |||
47c830116a | |||
8496818dec | |||
7aaa6d3ea6 | |||
5343cabcdc | |||
cdb27c836f | |||
b76a568a8b | |||
c32b8462e2 | |||
16131d3c87 | |||
1b1004c87e | |||
d10eab8471 | |||
dfc0bdde21 | |||
0cb503db49 | |||
7f58dd9a79 | |||
cb74322d1a | |||
e15c019eea | |||
588c537199 | |||
fe5c3bb63d | |||
68f49c0be6 | |||
6fb39c0e69 | |||
325acdf89a | |||
5bb4ae5db6 | |||
447678413e | |||
ae0ced0a67 | |||
e4a5d09fd9 | |||
84830a86c5 | |||
047be5ac0a | |||
57aa1846b9 | |||
384976a780 | |||
cc6de2dfa1 | |||
598358e99e | |||
25e94d28cb | |||
1db72efa5e | |||
a8321eefe5 | |||
324e2539c1 | |||
decaa8ed66 | |||
ddf1bbb3b5 | |||
546ad07150 | |||
ff81e6b897 | |||
d4688be7e2 | |||
fe343ad2f9 | |||
54eb7be023 | |||
59a098303b | |||
d67b8c1ea7 | |||
d21f96f211 | |||
d00ebe7176 | |||
4ee37cb9a9 | |||
47ed08d61b | |||
a1fc1863fb | |||
f20e8205d8 | |||
5c492f3089 | |||
1ab9ff778a | |||
eef3582b93 | |||
cd20dc00b7 | |||
a47a497597 | |||
4324f13714 | |||
6caaea6b34 | |||
7a75f04952 | |||
233c906d57 | |||
67c3d8bd13 | |||
94466a0d1f | |||
728c17b5f5 | |||
7ac909566f | |||
4a43c155a7 | |||
56a5faaf44 | |||
872ae0d536 | |||
5c951bbfb3 | |||
8ebf735e9d | |||
30156f108e | |||
5686e415cc | |||
a4c05d34e9 | |||
e09d6a06b8 | |||
43ca5a8a1f | |||
3cc0448446 | |||
44279ea9c1 | |||
33600fe1ba | |||
20f3dfa86f | |||
4caf169c9d | |||
8fa2c56060 | |||
93010826ee | |||
f1d4771aba | |||
ce2b83f06d | |||
0460c92775 | |||
67db5ac40c | |||
88729db0cc | |||
d57446b6dc | |||
3400c02b45 | |||
765ffb3232 | |||
8c6c95e32d | |||
26c90d4bec | |||
0091e59adb | |||
74bd19b241 | |||
119b2e2a6c | |||
c643f81ce5 | |||
d74ff4f01d | |||
1c846d4e5b | |||
bd12669b88 | |||
eb53315861 | |||
9fb398a5ee | |||
d5caba5e11 | |||
2c0264a436 | |||
188b22d65d | |||
f647f16b7b | |||
89cb711f55 | |||
e91638552a | |||
e1867c01dc | |||
930e074e2f | |||
b6763ad40f | |||
40d9bd1b85 | |||
39d1e1eb5a | |||
5cc0b548c6 | |||
3a3aec4d66 | |||
83eb20d138 | |||
782a7c05be | |||
c93f97ce2e | |||
03ead39f2c | |||
f60af9b8f8 | |||
ccb70befc3 | |||
529646520d | |||
b23fef2fa4 | |||
0bf985103c | |||
cf5fb86e4b | |||
4c45a7e33d | |||
1dfa98446b | |||
ccd3f1dbc2 | |||
f2b0773fb5 | |||
a1b1d9ad93 | |||
3e4517ec42 | |||
1ffaf4ce92 | |||
15e72edb5f | |||
a96da64830 | |||
de44f23594 | |||
2e580b29f0 | |||
46141b7e50 | |||
5c95242111 | |||
93c16d4e03 | |||
4e44082cd8 | |||
79b197822a | |||
fad12d120d | |||
7fabead92d | |||
cb7ec86765 | |||
ddbe0f9bb6 | |||
b37afe3268 | |||
dbd69c8d59 | |||
d930c08a45 | |||
09c564c68d | |||
30ea9ff2b5 | |||
42602d2ce3 | |||
3359bd3f9a | |||
0115ee3b77 | |||
aa574e9205 | |||
8f38cbd736 | |||
3260e68c90 | |||
6e238cc095 | |||
3ebeebef10 | |||
8fd60fb9a9 | |||
f7bfc72cd2 | |||
97a62d3efe | |||
80b7682f89 | |||
d5d43d0c71 | |||
d1e5c6d360 | |||
3bbefdc845 | |||
16bbaf4b3a | |||
8d005f5a70 | |||
2e86bbafd0 | |||
6a4083a7a3 | |||
3b73b1c5e5 | |||
4c39ae9edf | |||
e8c38550c9 | |||
fb5bbcd1e1 | |||
35ff034786 | |||
09ac5f3f85 | |||
d8794950c0 | |||
112e3d2c33 | |||
c9d3dab042 | |||
586cd2a882 | |||
d9272d5c52 | |||
c1d8516d84 | |||
bfd0b22676 | |||
a9d56daaa0 | |||
e925c47b78 | |||
4588948d0c | |||
008cb7c023 | |||
1d075f4b3b | |||
2b9c98bbc7 | |||
689a8b9f12 | |||
590855fe75 | |||
178a81c24b | |||
a459597759 | |||
60b2d99c09 | |||
a652b0d8c5 | |||
ae9330be96 | |||
9efc68b62d | |||
a237ce85d0 | |||
eff72f41a9 | |||
60774c0532 | |||
788cea98a1 | |||
42630ab62e | |||
01cdfca7fb | |||
c143eac015 | |||
8e038d403c | |||
e916c5100d | |||
de9c9b6eb1 | |||
bb42602cb3 | |||
ed862b9666 | |||
d4e5aae7bf | |||
56672eec23 | |||
330d047495 | |||
ea9631790e | |||
28ed6b2a24 | |||
e7d4800ad7 | |||
032aefadb3 | |||
208cd03a11 | |||
212ac6764a | |||
93a7cfeb8c | |||
b45284bc0f | |||
f91ef8d9cc | |||
b7862cd9bf | |||
ef5b35378b | |||
d9af495862 | |||
ce3d9655a1 | |||
d3b15cd40a | |||
c2c02ff351 | |||
a49633f377 | |||
44132c9c52 | |||
8f14054606 | |||
0f57b9f623 | |||
cf328ef126 | |||
8dd678a118 | |||
564c6a97f7 | |||
71b31218b0 | |||
4b8d60feff | |||
a3dcc12cde | |||
7f0f312a37 | |||
2e9f5e48c4 | |||
528eb45738 | |||
708471a640 | |||
c3af49f401 | |||
9289fa17e7 | |||
0188970367 | |||
7769e34794 | |||
14cd1f0838 | |||
d0d63461e2 | |||
e70cfb1fcc | |||
d6a843bd71 | |||
a13d7a26c4 | |||
bf8c087622 | |||
1525e62429 | |||
49bdceaccf | |||
4812061c12 | |||
31b1423b7a | |||
751820a178 | |||
d2aa3c5f77 | |||
77d5bdc108 | |||
fe30f536e2 | |||
f561c8c951 | |||
5e5144c57f | |||
ad66bdc9d9 | |||
0e917deb7c | |||
753a53334f | |||
7bc8b6ea92 | |||
a8eaabda4f | |||
4de394ee88 | |||
35a5a38a9a | |||
dd4eff2efd | |||
c84235c620 | |||
3b0b12ac6c | |||
a81decf6df | |||
d0064394ad | |||
f10e51dd6d | |||
359eb5990d | |||
0b0462f8d6 | |||
7fc5bd4a70 | |||
60f8b2c2e0 | |||
e8553504c3 | |||
ba17ae3811 | |||
2f2ad5bbe0 | |||
c5b238b7f7 | |||
0a2ff37fa1 | |||
8913fd4536 | |||
db2bdbca4d | |||
77eb96f65e | |||
085b96cae7 | |||
5291c97db7 | |||
98552275d0 | |||
4cd1f2e284 | |||
1defa162a8 | |||
f25f57dc37 | |||
a4c1a1b72c | |||
32fe1ffb5f | |||
1906b6baad | |||
00d5d95221 | |||
9170486cbf | |||
0c7a9234bf | |||
994df7d6da | |||
c77fd90472 | |||
acac4f0459 | |||
b9a4ee211d | |||
cf3764cd1d | |||
eee6612b0b | |||
ad69497ce4 | |||
94f0b984dd | |||
ff9d6ec972 | |||
cceefb569c | |||
8b177c4b05 | |||
0ee032131b | |||
d2b26f5e0f | |||
f2581f0438 | |||
8cb76c0966 | |||
141b7bf72d | |||
ed01a55960 | |||
8e14009d3d | |||
ed52e7e3d8 | |||
bb201d86b1 | |||
58da41ab85 | |||
8df3ed5d8f | |||
b0f43a2077 | |||
32592b03dc | |||
d4deff1340 | |||
2254ec6c49 | |||
fe3306885c | |||
4d9ba6f971 | |||
ebdd729212 | |||
dead8eac3d | |||
7ec9a8df8f | |||
271230bb62 | |||
a351c7d2d8 | |||
c036270510 | |||
75836f6afc | |||
8c2362e719 | |||
cb992d08a7 | |||
0e25ca5584 | |||
54aa508b11 | |||
245b6e6135 | |||
8b2f39972f | |||
7b1af0a947 | |||
e91d5eac4f | |||
abc3cbc1a2 | |||
35546e7fa1 | |||
a1c6510131 | |||
eb632e27cc | |||
de61ba4a65 | |||
fad7571875 | |||
9a9cb55917 | |||
d17e9bf6fe | |||
99765bebf0 | |||
9a4538bb37 | |||
c093aff25c | |||
c0e220b1bd | |||
e28d56b053 | |||
7089917126 | |||
0e61de538e | |||
ca33060d25 | |||
75765c2063 | |||
f9db50f03a | |||
4ecee3f677 | |||
24851eb58d | |||
a0982e9bb6 | |||
10b99953f1 | |||
d50f9c5c24 | |||
306107d1c6 | |||
7d0e0a8fa6 | |||
f1a350c5b3 | |||
66708e2b76 | |||
9e0f65b147 | |||
42daba8ba6 | |||
3c7fea1e0f | |||
1589dc96fe | |||
1502a7e22b | |||
eb0f119f7a | |||
ff7fa9d9ab | |||
b0eeb9b836 | |||
c34416690c | |||
e49f508b04 | |||
0591e44775 | |||
407a636913 | |||
bc300ae594 | |||
c789261917 | |||
0d5eb38bc7 | |||
8b30fe9507 | |||
ecfbfe411d | |||
2f4241a865 | |||
ab33b268fd | |||
e0ff50089d | |||
cbd2e62539 | |||
fa238275ac | |||
fb376fe3fa | |||
896c2bc0c9 | |||
442a8b1696 | |||
d0f138a105 | |||
f155123aa4 | |||
120bf377d8 | |||
ee45e5e3a6 | |||
dcbff8c44a | |||
ddc23aafd8 | |||
f7ce65ab94 | |||
6ae32fe294 | |||
88ab56c617 | |||
56538c10d8 | |||
0514c38e54 | |||
ed36d8b709 | |||
2a312b4802 | |||
a419efe9c4 | |||
74f71a9f59 | |||
775180af8b | |||
ce56d52dd1 | |||
b48a7a393f | |||
e9094fe286 | |||
75caa9baa6 | |||
0145b26cda | |||
091bd57520 | |||
586fbd7a93 | |||
1f343ce404 | |||
dea471b766 | |||
1c4aa9f1b0 | |||
cfc80f6ab2 | |||
954a37211c | |||
bca4cf6a75 | |||
3655988315 | |||
b9c52925f9 | |||
04e9854470 | |||
04250f2fc3 | |||
1725de8c48 | |||
5d6a8914d6 | |||
b8a571065d | |||
bd7c5bd983 | |||
88132a0b59 | |||
e56fb56f7c | |||
cd8359332d | |||
cfd02321cc | |||
1228f5d97a | |||
af80d6a790 | |||
ca22a892b1 | |||
3c0062b273 | |||
acab8b346e | |||
0121371048 | |||
2662566677 | |||
900c7ff4ed | |||
109413cfa8 | |||
eafcc2dffc | |||
c2dae8ebc2 | |||
6f0ca30ad9 | |||
f5f20cfae9 | |||
c8fb0116df | |||
3b95dcfb48 | |||
3b7f9a313d | |||
343dc170bb | |||
b061f1c692 | |||
47b3491f3a | |||
51298f0662 | |||
0a2fe975b7 | |||
3ee0649275 | |||
2ee7b6c95e | |||
3b1321908e | |||
db25322daf | |||
1cc9eb8a9c | |||
bb5c78d025 | |||
0225d4aea8 | |||
39f7dc17b0 | |||
b3e4e6efdb | |||
c9c63743c5 | |||
b8b73fd6d9 | |||
76d136afac | |||
9ac4a768d4 | |||
3344f19b11 | |||
aa274a59d0 | |||
195ce98efc | |||
7cb99c62ef | |||
cbdc036422 | |||
a06e7d5ea1 | |||
8f71c56a51 | |||
5cf7a45638 | |||
3ffcaf133c | |||
65497cb9d8 | |||
b7b215b6f1 | |||
c4fdf564b2 | |||
cd6319a102 | |||
5835f9d2ad | |||
ad532b3d98 | |||
a53d1ee0d6 | |||
1d9879d966 | |||
5a518bac95 | |||
2fc71eb8e3 | |||
55f8ab5e22 | |||
dd92609cf8 | |||
9a561fe4ba | |||
1309037643 | |||
21e78ee0b9 | |||
93024c39f1 | |||
ea0ec54aad | |||
61d58dcf56 | |||
87edcfdcdc | |||
58952f884a | |||
6e7a622c88 | |||
8fa0e2a427 | |||
9c1fc63bb7 | |||
30a3246591 | |||
7ae2a75e59 | |||
f68621fd43 | |||
8b31862b02 | |||
a5c980fb99 | |||
c4f099d9f3 | |||
d2cffdfebe | |||
4915351421 | |||
f0f13bb360 | |||
eecc791540 | |||
9f868c7e04 | |||
5c4c856b84 | |||
04ddd07312 | |||
7fcd82be2a | |||
9e469cdc72 | |||
ea08824172 | |||
535a398bff | |||
02464bc6d5 | |||
5a63ceb105 | |||
44b4aa527a | |||
2f73e97f64 | |||
b03a9a1ead | |||
05af938cb8 | |||
42383489bd | |||
91ba18f3bd | |||
0765c02aa5 | |||
84c1729a81 | |||
fdce2ebd8e | |||
d6cabd2e09 | |||
c7b777dfb2 | |||
6453954565 | |||
3248c81c62 | |||
c8c6f914c2 | |||
139dc7cec7 | |||
5c57f8a1a7 | |||
e7206f2e30 | |||
babefe4160 | |||
8b50316787 | |||
494cb061c3 | |||
3aacd81d26 | |||
e5ec9c5e44 | |||
14d759d18b | |||
18a07a15f7 | |||
f0834dc9c5 | |||
ba233165ab | |||
79d4618345 | |||
8c121c5457 | |||
7bb469f3c7 | |||
96041807a0 | |||
068545a2a9 | |||
e59bd1098f | |||
88eb3ae68d | |||
b75e04dcab | |||
fbb475123f | |||
3cf7321d3b | |||
7615dfa443 | |||
2fbdd56a0d | |||
5eee20877a | |||
76a825b887 | |||
2b1dc0efc2 | |||
a23b23b774 | |||
8689bc993e | |||
9b3e3aa738 | |||
e713c72bfa | |||
b5c3b13dce | |||
0570e2cdf2 | |||
17fd7108f1 | |||
7b4b2370ff | |||
271313c025 | |||
e09ff53d58 | |||
d6a58ff1ac | |||
474b8b2121 | |||
04812a5131 | |||
86b4247b81 | |||
63fa5e6811 | |||
d7a2bcb266 | |||
f5cc9bcee6 | |||
618e485460 | |||
6424e6e426 | |||
cc1ce40858 | |||
474565a66d | |||
a6348344f1 | |||
4012bfd2cf | |||
3d4b3e059d | |||
2a4316079a | |||
b445e9f4e2 | |||
50904504cf | |||
4f8e5ee948 | |||
7f9771081a | |||
64b08f61bf | |||
794f037727 | |||
4502497371 | |||
7d184a5e55 | |||
08ebab728c | |||
d9bb7419cc | |||
099751a8b9 | |||
7d5e4feada | |||
33082a98ed | |||
71899930aa | |||
f6ac5fc776 | |||
a621d4b6f7 | |||
6f79f007de | |||
08bc17d186 | |||
a562c85dac | |||
ed2d12dbba | |||
2c69626a1d | |||
ea7b2c9499 | |||
5f61d9d8e6 | |||
83a3829206 | |||
5fec8a7e09 | |||
8bd7dd6157 | |||
68636deeaf | |||
b1f0e12111 | |||
c587e97eba | |||
9b41a2468c | |||
dc641b9298 | |||
75236067e5 | |||
d56a7db02a | |||
7de5103fcc | |||
ca002781c2 | |||
107f689595 | |||
5a29be3f92 | |||
2180e8a287 | |||
41d22a804d | |||
b5ced99621 | |||
fc791c497d | |||
76936c9afd | |||
0f28572ef1 | |||
a5f7e4885d | |||
10459db183 | |||
77950f77bc | |||
f0192cce73 | |||
e215dd610e | |||
e32fad5185 | |||
43235e69ba | |||
6fd9ea1b72 | |||
9110dd0f38 | |||
7aecaa22ba | |||
5c0f778666 | |||
e1e60c736e | |||
e73604dfb5 | |||
5a23138268 | |||
5c89cd2fe4 | |||
ab7e3b7279 | |||
dcad1b2387 | |||
abb7b8dd5d | |||
2465e29628 | |||
51e951ef3b | |||
7f1fc72e3e | |||
d9fe19a8d7 | |||
cc73cefd3f | |||
f3ce95b6b8 | |||
7b190170c5 | |||
c7071e527e |
@ -13,8 +13,8 @@ error_reporting(-1);
|
||||
putenv('RES_OPTIONS=retrans:1 retry:1 timeout:1 attempts:1');
|
||||
|
||||
|
||||
$DEVILBOX_VERSION = 'v0.12.1';
|
||||
$DEVILBOX_DATE = '2018-01-30';
|
||||
$DEVILBOX_VERSION = 'v0.15.0';
|
||||
$DEVILBOX_DATE = '2019-03-09';
|
||||
$DEVILBOX_API_PAGE = 'devilbox-api/status.json';
|
||||
|
||||
//
|
||||
@ -127,8 +127,28 @@ function loadClass($class) {
|
||||
break;
|
||||
|
||||
case 'Redis':
|
||||
|
||||
// Check if redis is using a password
|
||||
$REDIS_ROOT_PASSWORD = '';
|
||||
|
||||
$_REDIS_ARGS = loadClass('Helper')->getEnv('REDIS_ARGS');
|
||||
$_REDIS_PASS = preg_split("/--requirepass\s+/", $_REDIS_ARGS);
|
||||
if (is_array($_REDIS_PASS) && count($_REDIS_PASS)) {
|
||||
// In case the option is specified multiple times, use the last effective one.
|
||||
$_REDIS_PASS = $_REDIS_PASS[count($_REDIS_PASS)-1];
|
||||
if (strlen($_REDIS_PASS) > 0) {
|
||||
$REDIS_ROOT_PASSWORD = $_REDIS_PASS;
|
||||
}
|
||||
}
|
||||
|
||||
loadFile($class, $cnt_dir);
|
||||
$_LOADED_LIBS[$class] = \devilbox\Redis::getInstance($GLOBALS['REDIS_HOST_NAME']);
|
||||
if ($REDIS_ROOT_PASSWORD == '') {
|
||||
$_LOADED_LIBS[$class] = \devilbox\Redis::getInstance($GLOBALS['REDIS_HOST_NAME']);
|
||||
} else {
|
||||
$_LOADED_LIBS[$class] = \devilbox\Redis::getInstance($GLOBALS['REDIS_HOST_NAME'], array(
|
||||
'pass' => $REDIS_ROOT_PASSWORD,
|
||||
));
|
||||
}
|
||||
break;
|
||||
|
||||
case 'Memcd':
|
||||
@ -143,7 +163,7 @@ function loadClass($class) {
|
||||
|
||||
// Get optional docker classes
|
||||
default:
|
||||
// Redis
|
||||
// Unknown class
|
||||
exit('Class does not exist: '.$class);
|
||||
}
|
||||
return $_LOADED_LIBS[$class];
|
||||
|
@ -48,9 +48,19 @@ if (loadClass('Helper')->isLoggedIn()) {
|
||||
$_GET['software'] => (($version = loadClass('Php')->getDrupalConsoleVersion()) !== false) ? $version : $no
|
||||
));
|
||||
}
|
||||
else if ($_GET['software'] == 'drush') {
|
||||
else if ($_GET['software'] == 'drush7') {
|
||||
echo json_encode(array(
|
||||
$_GET['software'] => (($version = loadClass('Php')->getDrushVersion()) !== false) ? $version : $no
|
||||
$_GET['software'] => (($version = loadClass('Php')->getDrushVersion(7)) !== false) ? $version : $no
|
||||
));
|
||||
}
|
||||
else if ($_GET['software'] == 'drush8') {
|
||||
echo json_encode(array(
|
||||
$_GET['software'] => (($version = loadClass('Php')->getDrushVersion(8)) !== false) ? $version : $no
|
||||
));
|
||||
}
|
||||
else if ($_GET['software'] == 'drush9') {
|
||||
echo json_encode(array(
|
||||
$_GET['software'] => (($version = loadClass('Php')->getDrushVersion(9)) !== false) ? $version : $no
|
||||
));
|
||||
}
|
||||
else if ($_GET['software'] == 'git') {
|
||||
|
@ -19,7 +19,7 @@
|
||||
|
||||
<div class="col-md-6">
|
||||
<h2>Contributors</h2>
|
||||
<p>The following people have contributed to the <a href="https://github.com/cytopia/devilbox">Devilbox</a>.</p>
|
||||
<p>The following people have contributed to the <a href="https://github.com/cytopia/devilbox/graphs/contributors">Devilbox</a>.</p>
|
||||
<table class="table table-striped ">
|
||||
<thead class="thead-inverse ">
|
||||
<tr>
|
||||
@ -60,32 +60,47 @@
|
||||
<tr>
|
||||
<td>Adminer</td>
|
||||
<td>Apache License 2.0 or GPL 2</td>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a href="https://github.com/vrana/adminer">vrana/adminer</a></td>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/vrana/adminer">vrana/adminer</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Bootstrap</td>
|
||||
<td>MIT</td>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a href="https://github.com/twbs/bootstrap">twbs/bootstrap</a></td>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/twbs/bootstrap">twbs/bootstrap</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Font Awesome (css)</td>
|
||||
<td>MIT</td>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a href="https://github.com/FortAwesome/Font-Awesome">FortAwesome/Font-Awesome</a></td>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/FortAwesome/Font-Awesome">FortAwesome/Font-Awesome</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Font Awesome (fonts)</td>
|
||||
<td>SIL OFL 1.1</td>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a href="https://github.com/FortAwesome/Font-Awesome">FortAwesome/Font-Awesome</a></td>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/FortAwesome/Font-Awesome">FortAwesome/Font-Awesome</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Opcache GUI</td>
|
||||
<td>MIT</td>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a href="https://github.com/amnuts/opcache-gui">amnuts/opcache-gui</a></td>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/amnuts/opcache-gui">amnuts/opcache-gui</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>PHPMemcachedAdmin</td>
|
||||
<td>Apache 2.0</td>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/elijaa/phpmemcachedadmin">elijaa/phpmemcachedadmin</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>phpMyAdmin</td>
|
||||
<td>GPL 2.0</td>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a href="https://github.com/phpmyadmin/phpmyadmin">phpmyadmin/phpmyadmin</a></td>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/phpmyadmin/phpmyadmin">phpmyadmin/phpmyadmin</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>phpPgAdmin</td>
|
||||
<td>GPL 2.0</td>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/phppgadmin/phppgadmin">phppgadmin/phppgadmin</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>PHPRedMin</td>
|
||||
<td>BSD 3-Clause License</td>
|
||||
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/sasanrose/phpredmin">sasanrose/phpredmin</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
@ -25,6 +25,8 @@
|
||||
<thead class="thead-inverse ">
|
||||
<tr>
|
||||
<th>Key</th>
|
||||
<th>Size</th>
|
||||
<th>TTL</th>
|
||||
<th>Value</th>
|
||||
</th>
|
||||
</thead>
|
||||
@ -32,7 +34,9 @@
|
||||
<?php foreach (loadClass('Memcd')->getKeys() as $data): ?>
|
||||
<tr>
|
||||
<td><?php print_r($data['key']);?></td>
|
||||
<td><?php print_r($data['value']);?></td>
|
||||
<td><?php print_r($data['size']);?></td>
|
||||
<td><?php print_r($data['ttl']);?></td>
|
||||
<td><?php print_r($data['val']);?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
|
@ -1,5 +1,12 @@
|
||||
<?php require '../config.php'; ?>
|
||||
<?php loadClass('Helper')->authPage(); ?>
|
||||
<?php
|
||||
if (isset($_GET['redisdb'])) {
|
||||
|
||||
loadClass('Redis')->flushDB($_GET['redisdb']);
|
||||
loadClass('Helper')->redirect('/db_redis.php');
|
||||
}
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
@ -15,6 +22,27 @@
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<?php $databases = array_keys(loadClass('Redis')->getKeys()); ?>
|
||||
<?php if (count($databases)): ?>
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<form class="form-inline">
|
||||
<div class="form-group">
|
||||
<label class="sr-only" for="redisdb">Redis DB</label>
|
||||
<select class="form-control" name="redisdb">
|
||||
<option value="" selected disabled>Select Redis DB</option>
|
||||
<?php foreach ($databases as $db): ?>
|
||||
<option value="<?php echo $db;?>"><?php echo $db;?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary">Flush database</button>
|
||||
</form>
|
||||
<br/>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
|
||||
@ -22,19 +50,43 @@
|
||||
<p>Redis container is not running.</p>
|
||||
<?php else: ?>
|
||||
<table class="table table-striped ">
|
||||
<thead class="thead-inverse ">
|
||||
<tr>
|
||||
<th>Key</th>
|
||||
<th>Value</th>
|
||||
</th>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach (loadClass('Redis')->getKeys() as $key => $value): ?>
|
||||
<tr>
|
||||
<td><?php echo $key;?></td>
|
||||
<td><?php print_r($value);?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
<?php $redisKeys = loadClass('Redis')->getKeys(); ?>
|
||||
<?php if (count($redisKeys)): ?>
|
||||
<?php foreach ($redisKeys as $db_name => $keys): ?>
|
||||
<tr class="thead-inverse ">
|
||||
<th colspan="5">
|
||||
Database: <?php echo $db_name; ?>
|
||||
Items: <?php echo count($keys); ?>
|
||||
</th>
|
||||
</th>
|
||||
<tr class="table-info">
|
||||
<tr>
|
||||
<th>DB</th>
|
||||
<th>Key</th>
|
||||
<th>Expires</th>
|
||||
<th>Type</th>
|
||||
<th>Value</th>
|
||||
</th>
|
||||
</tr>
|
||||
<?php foreach ($keys as $key): ?>
|
||||
<tr>
|
||||
<td><?php echo $db_name;?></td>
|
||||
<td class="break-word" style="width:30%;"><?php echo $key['name'];?></td>
|
||||
<td><?php echo $key['ttl'];?>s</td>
|
||||
<td><?php echo $key['type'];?></td>
|
||||
<td class="break-word">
|
||||
<code>
|
||||
<?php echo htmlentities($key['val']);?>
|
||||
</code>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
|
||||
<?php endforeach; ?>
|
||||
<?php else: ?>
|
||||
<p>No keys set.</p>
|
||||
<?php endif; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php endif; ?>
|
||||
|
@ -372,40 +372,6 @@ $HEALTH_PERCENT = 100 - ceil(100 * $HEALTH_FAILS / $HEALTH_TOTAL);
|
||||
<th>Postfix</th>
|
||||
<td><?php echo loadClass('Helper')->getEnv('ENABLE_MAIL') ? 'Enabled' : '<span class="bg-danger">No</span> Disabled';?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Xdebug</th>
|
||||
<td>
|
||||
<?php $Xdebug = (loadClass('Helper')->getEnv('PHP_XDEBUG_ENABLE') == 0) ? '' : loadClass('Helper')->getEnv('PHP_XDEBUG_ENABLE'); ?>
|
||||
<?php if ($Xdebug == loadClass('Php')->getConfig('xdebug.remote_enable')): ?>
|
||||
<?php echo loadClass('Php')->getConfig('xdebug.remote_enable') == 1 ? 'Yes' : 'No'; ?>
|
||||
<?php else: ?>
|
||||
<?php echo '<span class="text-danger">not installed</span>.env file setting differs from custom php .ini file</span><br/>'; ?>
|
||||
<?php echo 'Effective setting: '.loadClass('Php')->getConfig('xdebug.remote_enable'); ?>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Xdebug Remote</th>
|
||||
<td>
|
||||
<?php if (loadClass('Helper')->getEnv('PHP_XDEBUG_REMOTE_HOST') == loadClass('Php')->getConfig('xdebug.remote_host')): ?>
|
||||
<?php echo loadClass('Php')->getConfig('xdebug.remote_host'); ?>
|
||||
<?php else: ?>
|
||||
<?php echo '<span class="text-danger">not installed</span>.env file setting differs from custom php .ini file</span><br/>'; ?>
|
||||
<?php echo 'Effective setting: '.loadClass('Php')->getConfig('xdebug.remote_host'); ?>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Xdebug Port</th>
|
||||
<td>
|
||||
<?php if (loadClass('Helper')->getEnv('PHP_XDEBUG_REMOTE_PORT') == loadClass('Php')->getConfig('xdebug.remote_port')): ?>
|
||||
<?php echo loadClass('Php')->getConfig('xdebug.remote_port'); ?>
|
||||
<?php else: ?>
|
||||
<?php echo '<span class="text-danger">not installed</span>.env file setting differs from custom php .ini file</span><br/>'; ?>
|
||||
<?php echo 'Effective setting: '.loadClass('Php')->getConfig('xdebug.remote_port'); ?>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@ -425,8 +391,16 @@ $HEALTH_PERCENT = 100 - ceil(100 * $HEALTH_FAILS / $HEALTH_TOTAL);
|
||||
<td id="app_drupalc"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>drush</th>
|
||||
<td id="app_drush"></td>
|
||||
<th>drush7</th>
|
||||
<td id="app_drush7"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>drush8</th>
|
||||
<td id="app_drush8"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>drush9</th>
|
||||
<td id="app_drush9"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>git</th>
|
||||
@ -618,8 +592,11 @@ $HEALTH_PERCENT = 100 - ceil(100 * $HEALTH_FAILS / $HEALTH_TOTAL);
|
||||
</tr>
|
||||
<tr>
|
||||
<th>httpd</th>
|
||||
<td><?php echo loadClass('Helper')->getEnv('LOCAL_LISTEN_ADDR').loadClass('Helper')->getEnv('HOST_PORT_HTTPD');?></td>
|
||||
<td>80</td>
|
||||
<td>
|
||||
<?php echo loadClass('Helper')->getEnv('LOCAL_LISTEN_ADDR').loadClass('Helper')->getEnv('HOST_PORT_HTTPD');?><br/>
|
||||
<?php echo loadClass('Helper')->getEnv('LOCAL_LISTEN_ADDR').loadClass('Helper')->getEnv('HOST_PORT_HTTPD_SSL');?>
|
||||
</td>
|
||||
<td>80<br/>443</td>
|
||||
</tr>
|
||||
<?php if ($avail_mysql): ?>
|
||||
<tr>
|
||||
@ -765,10 +742,15 @@ $HEALTH_PERCENT = 100 - ceil(100 * $HEALTH_FAILS / $HEALTH_TOTAL);
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>php</th>
|
||||
<td>./cfg/<?php echo loadClass('Helper')->getEnv('PHP_SERVER'); ?></td>
|
||||
<th>php (ini)</th>
|
||||
<td>./cfg/php-ini-<?php echo loadClass('Helper')->getEnv('PHP_SERVER'); ?></td>
|
||||
<td>/etc/php-custom.d</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>php (fpm)</th>
|
||||
<td>./cfg/php-fpm-<?php echo loadClass('Helper')->getEnv('PHP_SERVER'); ?></td>
|
||||
<td>/etc/php-fpm-custom.d</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>httpd</th>
|
||||
<td>./cfg/<?php echo loadClass('Helper')->getEnv('HTTPD_SERVER'); ?></td>
|
||||
@ -841,7 +823,7 @@ $HEALTH_PERCENT = 100 - ceil(100 * $HEALTH_FAILS / $HEALTH_TOTAL);
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>php</th>
|
||||
<td>./log/<?php echo loadClass('Helper')->getEnv('PHP_SERVER'); ?></td>
|
||||
<td>./log/php-fpm-<?php echo loadClass('Helper')->getEnv('PHP_SERVER'); ?></td>
|
||||
<td>/var/log/php</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@ -933,7 +915,9 @@ $HEALTH_PERCENT = 100 - ceil(100 * $HEALTH_FAILS / $HEALTH_TOTAL);
|
||||
}
|
||||
updateVersions('composer');
|
||||
updateVersions('drupalc');
|
||||
updateVersions('drush');
|
||||
updateVersions('drush7');
|
||||
updateVersions('drush8');
|
||||
updateVersions('drush9');
|
||||
updateVersions('git');
|
||||
updateVersions('laravel');
|
||||
updateVersions('mds');
|
||||
|
66
.devilbox/www/htdocs/info_vhostgen.php
Normal file
@ -0,0 +1,66 @@
|
||||
<?php require '../config.php'; ?>
|
||||
<?php loadClass('Helper')->authPage(); ?>
|
||||
<?php
|
||||
if (!isset($_GET['name'])) {
|
||||
loadClass('Helper')->redirect('/vhosts.php');
|
||||
}
|
||||
if (!strlen($_GET['name'])) {
|
||||
loadClass('Helper')->redirect('/vhosts.php');
|
||||
}
|
||||
$vhost = $_GET['name'];
|
||||
$found = false;
|
||||
$vhosts = loadClass('Httpd')->getVirtualHosts();
|
||||
foreach ($vhosts as $v) {
|
||||
if ($vhost == $v['name']) {
|
||||
$found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// Be safe before using outputs
|
||||
$vhost = htmlentities($vhost);
|
||||
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<?php echo loadClass('Html')->getHead(true); ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<?php echo loadClass('Html')->getNavbar(); ?>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<h1>vhost-gen: <?php echo $vhost;?></h1>
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<?php if (!$found): ?>
|
||||
<p>The Virtual Host "<?php echo $vhost; ?>" does not exist.</p>
|
||||
<?php else: ?>
|
||||
<?php $tpl = loadClass('Httpd')->getVhostgenTemplatePath($vhost); ?>
|
||||
<?php if (!$tpl): ?>
|
||||
<p>No custom vhost-gen configuration found for "<?php echo $vhost; ?>".</p>
|
||||
<?php else: ?>
|
||||
<p>Note: If the resulting virtual host config does not reflect the vhost-gen template changes, you will need to restart the Devilbox.</p>
|
||||
<a href="/vhosts.php"><i class="fa fa-chevron-left" aria-hidden="true"></i> Overview</a><br/>
|
||||
<br/><h3>virtual host config</h3><br/>
|
||||
<a title="Virtual host: <?php echo $vhost;?>.conf" target="_blank" href="/vhost.d/<?php echo $vhost;?>.conf">
|
||||
<i class="fa fa-external-link" aria-hidden="true"></i> <?php echo $vhost;?>.conf
|
||||
</a>
|
||||
<br/><br/><h3>vhost-gen config</h3><br/>
|
||||
<code><?php echo $tpl; ?></code><br/><br/>
|
||||
<?php $lines = file($tpl); ?>
|
||||
<pre style="border: 1px solid black; padding:5px;"><code><?php foreach ($lines as $line): ?><?php echo $line; ?><?php endforeach; ?></code></pre>
|
||||
<?php endif; ?>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- /.container -->
|
||||
|
||||
<?php echo loadClass('Html')->getFooter(); ?>
|
||||
</body>
|
||||
</html>
|
@ -157,7 +157,7 @@ $messages = $MyMbox->get($sortOrderArr);
|
||||
<tbody>
|
||||
<?php foreach ($messages as $data): ?>
|
||||
<?php
|
||||
$message = $data['raw'];
|
||||
$message = htmlentities($data['raw']);
|
||||
$structure = $data['decoded'];
|
||||
?>
|
||||
<tr id="<?php echo $data['num'];?>" class="subject">
|
||||
@ -167,17 +167,17 @@ $messages = $MyMbox->get($sortOrderArr);
|
||||
<small><?php echo date('Y-m-d', strtotime($structure->headers['date']));?></small>
|
||||
</td>
|
||||
<td><?php echo htmlentities($structure->headers['from']);?></td>
|
||||
<td><?php echo $structure->headers['x-original-to'];?></td>
|
||||
<td><?php echo $structure->headers['subject'];?></td>
|
||||
<td><?php echo htmlentities($structure->headers['x-original-to']);?></td>
|
||||
<td><?php echo htmlentities($structure->headers['subject']);?></td>
|
||||
</tr>
|
||||
<tr></tr>
|
||||
<tr id="mail-<?php echo $data['num'];?>" style="display:none">
|
||||
<td></td>
|
||||
<td colspan="4">
|
||||
<?php if (isset($structure->body)): ?>
|
||||
<?php echo $structure->body ?>
|
||||
<?php echo htmlentities($structure->body) ?>
|
||||
<?php elseif(isset($structure->parts[1]->body)): ?>
|
||||
<?php echo $structure->parts[1]->body ?>
|
||||
<?php echo htmlentities($structure->parts[1]->body) ?>
|
||||
<?php elseif(isset($structure->parts[0]->body)): ?>
|
||||
<?php echo htmlentities($structure->parts[0]->body) ?>
|
||||
<?php else: ?>
|
||||
|
1831
.devilbox/www/htdocs/vendor/adminer-4.3.1-en.php
vendored
1934
.devilbox/www/htdocs/vendor/adminer-4.6.3-en.php
vendored
Normal file
2038
.devilbox/www/htdocs/vendor/adminer-4.7.1-en.php
vendored
Normal file
25
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Config/Memcache.php
vendored
Normal file
@ -0,0 +1,25 @@
|
||||
<?php
|
||||
return array (
|
||||
'stats_api' => 'Server',
|
||||
'slabs_api' => 'Server',
|
||||
'items_api' => 'Server',
|
||||
'get_api' => 'Server',
|
||||
'set_api' => 'Server',
|
||||
'delete_api' => 'Server',
|
||||
'flush_all_api' => 'Server',
|
||||
'connection_timeout' => 1,
|
||||
'max_item_dump'=> 100,
|
||||
'refresh_rate' => 2,
|
||||
'memory_alert' => 80,
|
||||
'hit_rate_alert' => 90,
|
||||
'eviction_alert' => 0,
|
||||
'file_path' => '/tmp',
|
||||
'servers' => array (
|
||||
'Devilbox Memcached' => array (
|
||||
'memcd' => array (
|
||||
'hostname' => 'memcd',
|
||||
'port' => '11211',
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
30
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Bootstrap.php
vendored
Normal file
@ -0,0 +1,30 @@
|
||||
<?php
|
||||
# Headers
|
||||
header('Content-type: text/html;');
|
||||
header('Cache-Control: no-cache, must-revalidate');
|
||||
|
||||
# Constants declaration
|
||||
define('CURRENT_VERSION', '1.3.0');
|
||||
|
||||
# PHP < 5.3 Compatibility
|
||||
if (defined('ENT_IGNORE') === false) {
|
||||
define('ENT_IGNORE', 0);
|
||||
}
|
||||
|
||||
# XSS / User input check
|
||||
foreach ($_REQUEST as $index => $data) {
|
||||
$_REQUEST[$index] = htmlentities($data);
|
||||
}
|
||||
|
||||
# Autoloader
|
||||
function autoloader($class)
|
||||
{
|
||||
require_once str_replace('_', DIRECTORY_SEPARATOR, $class) . '.php';
|
||||
}
|
||||
spl_autoload_register('autoloader');
|
||||
|
||||
# Loading ini file
|
||||
$_ini = Library_Configuration_Loader::singleton();
|
||||
|
||||
# Date timezone
|
||||
date_default_timezone_set('Europe/Paris');
|
110
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Command/Factory.php
vendored
Normal file
@ -0,0 +1,110 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2010 Cyrille Mahieux
|
||||
* 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.
|
||||
*
|
||||
* ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°>
|
||||
*
|
||||
* Factory for communication with Memcache Server
|
||||
*
|
||||
* @author elijaa@free.fr
|
||||
* @since 30/03/2010
|
||||
*/
|
||||
class Library_Command_Factory
|
||||
{
|
||||
private static $_object = array();
|
||||
|
||||
# No explicit call of constructor
|
||||
private function __construct()
|
||||
{}
|
||||
|
||||
# No explicit call of clone()
|
||||
private function __clone()
|
||||
{}
|
||||
|
||||
/**
|
||||
* Accessor to command class instance by command type
|
||||
*
|
||||
* @param String $command Type of command
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function instance($command)
|
||||
{
|
||||
# Importing configuration
|
||||
$_ini = Library_Configuration_Loader::singleton();
|
||||
|
||||
# Instance does not exists
|
||||
if (! isset(self::$_object[$_ini->get($command)]) || ($_ini->get($command) != 'Server')) {
|
||||
# Switching by API
|
||||
switch ($_ini->get($command)) {
|
||||
case 'Memcache' :
|
||||
# PECL Memcache API
|
||||
require_once 'Memcache.php';
|
||||
self::$_object['Memcache'] = new Library_Command_Memcache();
|
||||
break;
|
||||
|
||||
case 'Memcached' :
|
||||
# PECL Memcached API
|
||||
require_once 'Memcached.php';
|
||||
self::$_object['Memcached'] = new Library_Command_Memcached();
|
||||
break;
|
||||
|
||||
case 'Server' :
|
||||
default :
|
||||
# Server API (eg communicating directly with the memcache server)
|
||||
require_once 'Server.php';
|
||||
self::$_object['Server'] = new Library_Command_Server();
|
||||
break;
|
||||
}
|
||||
}
|
||||
return self::$_object[$_ini->get($command)];
|
||||
}
|
||||
|
||||
/**
|
||||
* Accessor to command class instance by type
|
||||
*
|
||||
* @param String $command Type of command
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function api($api)
|
||||
{
|
||||
# Instance does not exists
|
||||
if (! isset(self::$_object[$api]) || ($api != 'Server')) {
|
||||
# Switching by API
|
||||
switch ($api) {
|
||||
case 'Memcache' :
|
||||
# PECL Memcache API
|
||||
require_once 'Memcache.php';
|
||||
self::$_object['Memcache'] = new Library_Command_Memcache();
|
||||
break;
|
||||
|
||||
case 'Memcached' :
|
||||
# PECL Memcached API
|
||||
require_once 'Memcached.php';
|
||||
self::$_object['Memcached'] = new Library_Command_Memcached();
|
||||
break;
|
||||
|
||||
case 'Server' :
|
||||
default :
|
||||
# Server API (eg communicating directly with the memcache server)
|
||||
require_once 'Server.php';
|
||||
self::$_object['Server'] = new Library_Command_Server();
|
||||
break;
|
||||
}
|
||||
}
|
||||
return self::$_object[$api];
|
||||
}
|
||||
}
|
178
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Command/Interface.php
vendored
Normal file
@ -0,0 +1,178 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright 2010 Cyrille Mahieux
|
||||
* 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.
|
||||
*
|
||||
* ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°>
|
||||
*
|
||||
* Interface of communication to MemCache Server
|
||||
*
|
||||
* @author elijaa@free.fr
|
||||
* @since 20/03/2010
|
||||
*/
|
||||
interface Library_Command_Interface
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function __construct();
|
||||
|
||||
/**
|
||||
* Send stats command to server
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
function stats($server, $port);
|
||||
|
||||
/**
|
||||
* Send stats settings command to server
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
public function settings($server, $port);
|
||||
|
||||
/**
|
||||
* Retrieve slabs stats
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
function slabs($server, $port);
|
||||
|
||||
/**
|
||||
* Retrieve items from a slabs
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param Integer $slab Slab ID
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
function items($server, $port, $slab);
|
||||
|
||||
/**
|
||||
* Send get command to server to retrieve an item
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to retrieve
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function get($server, $port, $key);
|
||||
|
||||
/**
|
||||
* Set an item
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to store
|
||||
* @param Mixed $data Data to store
|
||||
* @param Integer $duration Duration
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function set($server, $port, $key, $data, $duration);
|
||||
|
||||
/**
|
||||
* Delete an item
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to delete
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function delete($server, $port, $key);
|
||||
|
||||
/**
|
||||
* Increment the key by value
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to increment
|
||||
* @param Integer $value Value to increment
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function increment($server, $port, $key, $value);
|
||||
|
||||
/**
|
||||
* Decrement the key by value
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to decrement
|
||||
* @param Integer $value Value to decrement
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function decrement($server, $port, $key, $value);
|
||||
|
||||
/**
|
||||
* Flush all items on a server after delay
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param Integer $delay Delay before flushing server
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function flush_all($server, $port, $delay);
|
||||
|
||||
/**
|
||||
* Search for item
|
||||
* Return all the items matching parameters if successful, false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to search
|
||||
* @param Boolean $level Level of detail
|
||||
* @param Boolean $more More action
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function search($server, $port, $search, $level = false, $more = false);
|
||||
|
||||
/**
|
||||
* Execute a telnet command on a server
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $command Command to execute
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function telnet($server, $port, $command);
|
||||
}
|
309
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Command/Memcache.php
vendored
Normal file
@ -0,0 +1,309 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2010 Cyrille Mahieux
|
||||
* 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.
|
||||
*
|
||||
* ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°>
|
||||
*
|
||||
* Sending command to memcache server via PECL memcache API http://pecl.php.net/package/memcache
|
||||
*
|
||||
* @author elijaa@free.fr
|
||||
* @since 20/03/2010
|
||||
*/
|
||||
class Library_Command_Memcache implements Library_Command_Interface
|
||||
{
|
||||
private static $_ini;
|
||||
private static $_memcache;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param Array $ini Array from ini_parse
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
# Importing configuration
|
||||
self::$_ini = Library_Configuration_Loader::singleton();
|
||||
|
||||
# Initializing
|
||||
self::$_memcache = new Memcache();
|
||||
}
|
||||
|
||||
/**
|
||||
* Send stats command to server
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
public function stats($server, $port)
|
||||
{
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command
|
||||
if (($return = self::$_memcache->getExtendedStats())) {
|
||||
# Delete server key based
|
||||
$stats = $return[$server . ':' . $port];
|
||||
return $stats;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send stats settings command to server
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
public function settings($server, $port)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send stats items command to server to retrieve slabs stats
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
public function slabs($server, $port)
|
||||
{
|
||||
# Initializing
|
||||
$slabs = array();
|
||||
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command : slabs
|
||||
if (($slabs = self::$_memcache->getStats('slabs'))) {
|
||||
# Finding uptime
|
||||
$stats = $this->stats($server, $port);
|
||||
$slabs['uptime'] = $stats['uptime'];
|
||||
unset($stats);
|
||||
|
||||
# Executing command : items
|
||||
if (($result = self::$_memcache->getStats('items'))) {
|
||||
# Indexing by slabs
|
||||
foreach ($result['items'] as $id => $items) {
|
||||
foreach ($items as $key => $value) {
|
||||
$slabs[$id]['items:' . $key] = $value;
|
||||
}
|
||||
}
|
||||
return $slabs;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send stats cachedump command to server to retrieve slabs items
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param Interger $slab Slab ID
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
public function items($server, $port, $slab)
|
||||
{
|
||||
# Initializing
|
||||
$items = false;
|
||||
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command : slabs stats
|
||||
if (($items = self::$_memcache->getStats('cachedump', $slab, self::$_ini->get('max_item_dump')))) {
|
||||
return $items;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send get command to server to retrieve an item
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to retrieve
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public function get($server, $port, $key)
|
||||
{
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command : get
|
||||
if ($item = self::$_memcache->get($key)) {
|
||||
return print_r($item, true);
|
||||
}
|
||||
return 'NOT_FOUND';
|
||||
}
|
||||
|
||||
/**
|
||||
* Set an item
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to store
|
||||
* @param Mixed $data Data to store
|
||||
* @param Integer $duration Duration
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function set($server, $port, $key, $data, $duration)
|
||||
{
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command : set
|
||||
if (self::$_memcache->set($key, $data, 0, $duration)) {
|
||||
return 'STORED';
|
||||
}
|
||||
return 'ERROR';
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete an item
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to delete
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public function delete($server, $port, $key)
|
||||
{
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command : delete
|
||||
if (self::$_memcache->delete($key)) {
|
||||
return 'DELETED';
|
||||
}
|
||||
return 'NOT_FOUND';
|
||||
}
|
||||
|
||||
/**
|
||||
* Increment the key by value
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to increment
|
||||
* @param Integer $value Value to increment
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function increment($server, $port, $key, $value)
|
||||
{
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command : increment
|
||||
if ($result = self::$_memcache->increment($key, $value)) {
|
||||
return $result;
|
||||
}
|
||||
return 'NOT_FOUND';
|
||||
}
|
||||
|
||||
/**
|
||||
* Decrement the key by value
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to decrement
|
||||
* @param Integer $value Value to decrement
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function decrement($server, $port, $key, $value)
|
||||
{
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command : decrement
|
||||
if ($result = self::$_memcache->decrement($key, $value)) {
|
||||
return $result;
|
||||
}
|
||||
return 'NOT_FOUND';
|
||||
}
|
||||
|
||||
/**
|
||||
* Flush all items on a server
|
||||
* Warning, delay won't work with Memcache API
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param Integer $delay Delay before flushing server
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function flush_all($server, $port, $delay)
|
||||
{
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command : flush_all
|
||||
self::$_memcache->flush();
|
||||
return 'OK';
|
||||
}
|
||||
|
||||
/**
|
||||
* Search for item
|
||||
* Return all the items matching parameters if successful, false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to search
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function search($server, $port, $search, $level = false, $more = false)
|
||||
{
|
||||
throw new Exception('PECL Memcache does not support search function, use Server instead');
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute a telnet command on a server
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $command Command to execute
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function telnet($server, $port, $command)
|
||||
{
|
||||
throw new Exception('PECL Memcache does not support telnet, use Server instead');
|
||||
}
|
||||
}
|
287
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Command/Memcached.php
vendored
Normal file
@ -0,0 +1,287 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2010 Cyrille Mahieux
|
||||
* 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.
|
||||
*
|
||||
* ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°>
|
||||
*
|
||||
* Sending command to memcache server via PECL memcache API http://pecl.php.net/package/memcache
|
||||
*
|
||||
* @author elijaa@free.fr
|
||||
* @since 20/03/2010
|
||||
*/
|
||||
class Library_Command_Memcached implements Library_Command_Interface
|
||||
{
|
||||
private static $_ini;
|
||||
private static $_memcache;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param Array $ini Array from ini_parse
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
# Importing configuration
|
||||
self::$_ini = Library_Configuration_Loader::singleton();
|
||||
|
||||
# Initializing
|
||||
self::$_memcache = new Memcached();
|
||||
}
|
||||
|
||||
/**
|
||||
* Send stats command to server
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
public function stats($server, $port)
|
||||
{
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command
|
||||
if (($return = self::$_memcache->getStats())) {
|
||||
# Delete server key based
|
||||
$stats = $return[$server . ':' . $port];
|
||||
|
||||
# Adding value that miss
|
||||
$stats['delete_hits'] = '';
|
||||
$stats['delete_misses'] = '';
|
||||
$stats['incr_hits'] = '';
|
||||
$stats['incr_misses'] = '';
|
||||
$stats['decr_hits'] = '';
|
||||
$stats['decr_misses'] = '';
|
||||
$stats['cas_hits'] = '';
|
||||
$stats['cas_misses'] = '';
|
||||
$stats['cas_badval'] = '';
|
||||
|
||||
return $stats;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send stats settings command to server
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
public function settings($server, $port)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send stats items command to server to retrieve slabs stats
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
public function slabs($server, $port)
|
||||
{
|
||||
throw new Exception('PECL Memcache does not support slabs stats, use Server or Memcache instead');
|
||||
}
|
||||
|
||||
/**
|
||||
* Send stats cachedump command to server to retrieve slabs items
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param Interger $slab Slab ID
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
public function items($server, $port, $slab)
|
||||
{
|
||||
throw new Exception('PECL Memcache does not support slabs items stats, use Server or Memcache instead');
|
||||
}
|
||||
|
||||
/**
|
||||
* Send get command to server to retrieve an item
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to retrieve
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public function get($server, $port, $key)
|
||||
{
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command : get
|
||||
if ($item = self::$_memcache->get($key)) {
|
||||
return print_r($item, true);
|
||||
}
|
||||
return self::$_memcache->getResultMessage();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set an item
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to store
|
||||
* @param Mixed $data Data to store
|
||||
* @param Integer $duration Duration
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function set($server, $port, $key, $data, $duration)
|
||||
{
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Checking duration
|
||||
if ($duration == '') {
|
||||
$duration = 0;
|
||||
}
|
||||
|
||||
# Executing command : set
|
||||
self::$_memcache->set($key, $data, $duration);
|
||||
return self::$_memcache->getResultMessage();
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete an item
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to delete
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public function delete($server, $port, $key)
|
||||
{
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command : delete
|
||||
self::$_memcache->delete($key);
|
||||
return self::$_memcache->getResultMessage();
|
||||
}
|
||||
|
||||
/**
|
||||
* Increment the key by value
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to increment
|
||||
* @param Integer $value Value to increment
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function increment($server, $port, $key, $value)
|
||||
{
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command : increment
|
||||
if ($result = self::$_memcache->increment($key, $value)) {
|
||||
return $result;
|
||||
}
|
||||
return self::$_memcache->getResultMessage();
|
||||
}
|
||||
|
||||
/**
|
||||
* Decrement the key by value
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to decrement
|
||||
* @param Integer $value Value to decrement
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function decrement($server, $port, $key, $value)
|
||||
{
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command : decrement
|
||||
if ($result = self::$_memcache->decrement($key, $value)) {
|
||||
return $result;
|
||||
}
|
||||
return self::$_memcache->getResultMessage();
|
||||
}
|
||||
|
||||
/**
|
||||
* Flush all items on a server
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param Integer $delay Delay before flushing server
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public function flush_all($server, $port, $delay)
|
||||
{
|
||||
# Adding server
|
||||
self::$_memcache->addServer($server, $port);
|
||||
|
||||
# Executing command : delete
|
||||
self::$_memcache->flush($delay);
|
||||
return self::$_memcache->getResultMessage();
|
||||
}
|
||||
|
||||
/**
|
||||
* Search for item
|
||||
* Return all the items matching parameters if successful, false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to search
|
||||
*
|
||||
* @return Array
|
||||
*/
|
||||
function search($server, $port, $search, $level = false, $more = false)
|
||||
{
|
||||
throw new Exception('PECL Memcached does not support search function, use Server instead');
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute a telnet command on a server
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $command Command to execute
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function telnet($server, $port, $command)
|
||||
{
|
||||
throw new Exception('PECL Memcached does not support telnet, use Server instead');
|
||||
}
|
||||
}
|
486
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Command/Server.php
vendored
Normal file
@ -0,0 +1,486 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2010 Cyrille Mahieux
|
||||
* 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.
|
||||
*
|
||||
* ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°>
|
||||
*
|
||||
* Sending command to memcache server
|
||||
*
|
||||
* @author elijaa@free.fr
|
||||
* @since 20/03/2010
|
||||
*/
|
||||
class Library_Command_Server implements Library_Command_Interface
|
||||
{
|
||||
private static $_ini;
|
||||
private static $_log;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param Array $ini Array from ini_parse
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
# Importing configuration
|
||||
self::$_ini = Library_Configuration_Loader::singleton();
|
||||
}
|
||||
|
||||
/**
|
||||
* Executing a Command on a MemCache Server
|
||||
* With the help of http://github.com/memcached/memcached/blob/master/doc/protocol.txt
|
||||
* Return the response, or false otherwise
|
||||
*
|
||||
* @param String $command Command
|
||||
* @param String $server Server Hostname
|
||||
* @param Integer $port Server Port
|
||||
*
|
||||
* @return String|Boolean
|
||||
*/
|
||||
public function exec($command, $server, $port)
|
||||
{
|
||||
# Variables
|
||||
$buffer = '';
|
||||
$handle = null;
|
||||
|
||||
# Socket Opening
|
||||
if (! ($handle = @fsockopen($server, $port, $errno, $errstr, self::$_ini->get('connection_timeout')))) {
|
||||
# Adding error to log
|
||||
self::$_log = utf8_encode($errstr);
|
||||
Library_Data_Error::add(utf8_encode($errstr));
|
||||
return false;
|
||||
}
|
||||
|
||||
# Sending Command ...
|
||||
fwrite($handle, $command . "\r\n");
|
||||
|
||||
# Getting first line
|
||||
$buffer = fgets($handle);
|
||||
|
||||
# Checking if result is valid
|
||||
if ($this->end($buffer, $command)) {
|
||||
# Closing socket
|
||||
fclose($handle);
|
||||
|
||||
# Adding error to log
|
||||
self::$_log = $buffer;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
# Reading Results
|
||||
while ((! feof($handle))) {
|
||||
# Getting line
|
||||
$line = fgets($handle);
|
||||
|
||||
$buffer .= $line;
|
||||
|
||||
# Checking for end of MemCache command
|
||||
if ($this->end($line, $command)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
# Closing socket
|
||||
fclose($handle);
|
||||
|
||||
return $buffer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if response is at the end from memcached server
|
||||
* Return true if response end, true otherwise
|
||||
*
|
||||
* @param String $buffer Buffer received from memcached server
|
||||
* @param String $command Command issued to memcached server
|
||||
*
|
||||
* @return Boolean
|
||||
*/
|
||||
private function end($buffer, $command)
|
||||
{
|
||||
# incr or decr also return integer
|
||||
if ((preg_match('/^(incr|decr)/', $command))) {
|
||||
if (preg_match('/^(END|ERROR|SERVER_ERROR|CLIENT_ERROR|NOT_FOUND|[0-9]*)/', $buffer)) {
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
# Checking command response end
|
||||
if (preg_match('/^(END|DELETED|OK|ERROR|SERVER_ERROR|CLIENT_ERROR|NOT_FOUND|STORED|RESET|TOUCHED)/', $buffer)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse result to make an array
|
||||
*
|
||||
* @param String $string String to parse
|
||||
* @param Boolean $string (optionnal) Parsing stats ?
|
||||
*
|
||||
* @return Array
|
||||
*/
|
||||
public function parse($string, $stats = true)
|
||||
{
|
||||
# Variable
|
||||
$return = array();
|
||||
|
||||
# Exploding by \r\n
|
||||
$lines = preg_split('/\r\n/', $string);
|
||||
|
||||
# Stats
|
||||
if ($stats) {
|
||||
# Browsing each line
|
||||
foreach ($lines as $line) {
|
||||
$data = preg_split('/ /', $line);
|
||||
if (isset($data[2])) {
|
||||
$return[$data[1]] = $data[2];
|
||||
}
|
||||
}
|
||||
} # Items
|
||||
else {
|
||||
# Browsing each line
|
||||
foreach ($lines as $line) {
|
||||
$data = preg_split('/ /', $line);
|
||||
if (isset($data[1])) {
|
||||
$return[$data[1]] = array(substr($data[2], 1), $data[4]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send stats command to server
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
public function stats($server, $port)
|
||||
{
|
||||
# Executing command
|
||||
if (($return = $this->exec('stats', $server, $port))) {
|
||||
return $this->parse($return);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send stats settings command to server
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
public function settings($server, $port)
|
||||
{
|
||||
# Executing command
|
||||
if (($return = $this->exec('stats settings', $server, $port))) {
|
||||
return $this->parse($return);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send stats items command to server to retrieve slabs stats
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
public function slabs($server, $port)
|
||||
{
|
||||
# Initializing
|
||||
$slabs = array();
|
||||
|
||||
# Finding uptime
|
||||
$stats = $this->stats($server, $port);
|
||||
$slabs['uptime'] = $stats['uptime'];
|
||||
unset($stats);
|
||||
|
||||
# Executing command : slabs stats
|
||||
if (($result = $this->exec('stats slabs', $server, $port))) {
|
||||
# Parsing result
|
||||
$result = $this->parse($result);
|
||||
$slabs['active_slabs'] = $result['active_slabs'];
|
||||
$slabs['total_malloced'] = $result['total_malloced'];
|
||||
unset($result['active_slabs']);
|
||||
unset($result['total_malloced']);
|
||||
|
||||
# Indexing by slabs
|
||||
foreach ($result as $key => $value) {
|
||||
$key = preg_split('/:/', $key);
|
||||
$slabs[$key[0]][$key[1]] = $value;
|
||||
}
|
||||
|
||||
# Executing command : items stats
|
||||
if (($result = $this->exec('stats items', $server, $port))) {
|
||||
# Parsing result
|
||||
$result = $this->parse($result);
|
||||
|
||||
# Indexing by slabs
|
||||
foreach ($result as $key => $value) {
|
||||
$key = preg_split('/:/', $key);
|
||||
$slabs[$key[1]]['items:' . $key[2]] = $value;
|
||||
}
|
||||
|
||||
return $slabs;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send stats cachedump command to server to retrieve slabs items
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param Interger $slab Slab ID
|
||||
*
|
||||
* @return Array|Boolean
|
||||
*/
|
||||
public function items($server, $port, $slab)
|
||||
{
|
||||
# Initializing
|
||||
$items = false;
|
||||
|
||||
# Executing command : stats cachedump
|
||||
if (($result = $this->exec('stats cachedump ' . $slab . ' ' . self::$_ini->get('max_item_dump'), $server, $port))) {
|
||||
# Parsing result
|
||||
$items = $this->parse($result, false);
|
||||
}
|
||||
return $items;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send get command to server to retrieve an item
|
||||
* Return the result if successful or false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to retrieve
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public function get($server, $port, $key)
|
||||
{
|
||||
# Executing command : get
|
||||
if (($string = $this->exec('get ' . $key, $server, $port))) {
|
||||
$string = preg_replace('/^VALUE ' . preg_quote($key, '/') . '[0-9 ]*\r\n/', '', $string);
|
||||
if (ord($string[0]) == 0x78 && in_array(ord($string[1]), array(0x01, 0x5e, 0x9c, 0xda))) {
|
||||
return gzuncompress($string);
|
||||
}
|
||||
return $string;
|
||||
}
|
||||
return self::$_log;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set an item
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to store
|
||||
* @param Mixed $data Data to store
|
||||
* @param Integer $duration Duration
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function set($server, $port, $key, $data, $duration)
|
||||
{
|
||||
# Formatting data
|
||||
$data = preg_replace('/\r/', '', $data);
|
||||
|
||||
# Executing command : set
|
||||
if (($result = $this->exec('set ' . $key . ' 0 ' . $duration . ' ' . strlen($data) . "\r\n" . $data, $server, $port))) {
|
||||
return $result;
|
||||
}
|
||||
return self::$_log;
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete an item
|
||||
* Return true if successful, false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to delete
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public function delete($server, $port, $key)
|
||||
{
|
||||
# Executing command : delete
|
||||
if (($result = $this->exec('delete ' . $key, $server, $port))) {
|
||||
return $result;
|
||||
}
|
||||
return self::$_log;
|
||||
}
|
||||
|
||||
/**
|
||||
* Increment the key by value
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to increment
|
||||
* @param Integer $value Value to increment
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function increment($server, $port, $key, $value)
|
||||
{
|
||||
# Executing command : increment
|
||||
if (($result = $this->exec('incr ' . $key . ' ' . $value, $server, $port))) {
|
||||
return $result;
|
||||
}
|
||||
return self::$_log;
|
||||
}
|
||||
|
||||
/**
|
||||
* Decrement the key by value
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to decrement
|
||||
* @param Integer $value Value to decrement
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function decrement($server, $port, $key, $value)
|
||||
{
|
||||
# Executing command : decrement
|
||||
if (($result = $this->exec('decr ' . $key . ' ' . $value, $server, $port))) {
|
||||
return $result;
|
||||
}
|
||||
return self::$_log;
|
||||
}
|
||||
|
||||
/**
|
||||
* Flush all items on a server
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param Integer $delay Delay before flushing server
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function flush_all($server, $port, $delay)
|
||||
{
|
||||
# Executing command : flush_all
|
||||
if (($result = $this->exec('flush_all ' . $delay, $server, $port))) {
|
||||
return $result;
|
||||
}
|
||||
return self::$_log;
|
||||
}
|
||||
|
||||
/**
|
||||
* Search for item
|
||||
* Return all the items matching parameters if successful, false otherwise
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $key Key to search
|
||||
* @param String $level Level of Detail
|
||||
* @param String $more More action
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function search($server, $port, $search, $level = false, $more = false)
|
||||
{
|
||||
$slabs = array();
|
||||
$items = false;
|
||||
|
||||
# Executing command : stats
|
||||
if (($level == 'full') && ($result = $this->exec('stats', $server, $port))) {
|
||||
# Parsing result
|
||||
$result = $this->parse($result);
|
||||
$infinite = (isset($result['time'], $result['uptime'])) ? ($result['time'] - $result['uptime']) : 0;
|
||||
}
|
||||
|
||||
# Executing command : slabs stats
|
||||
if (($result = $this->exec('stats slabs', $server, $port))) {
|
||||
# Parsing result
|
||||
$result = $this->parse($result);
|
||||
unset($result['active_slabs']);
|
||||
unset($result['total_malloced']);
|
||||
# Indexing by slabs
|
||||
foreach ($result as $key => $value) {
|
||||
$key = preg_split('/:/', $key);
|
||||
$slabs[$key[0]] = true;
|
||||
}
|
||||
}
|
||||
|
||||
# Exploring each slabs
|
||||
foreach ($slabs as $slab => $unused) {
|
||||
# Executing command : stats cachedump
|
||||
if (($result = $this->exec('stats cachedump ' . $slab . ' 0', $server, $port))) {
|
||||
# Parsing result
|
||||
preg_match_all('/^ITEM ((?:.*)' . preg_quote($search, '/') . '(?:.*)) \[([0-9]*) b; ([0-9]*) s\]\r\n/imU', $result, $matchs, PREG_SET_ORDER);
|
||||
foreach ($matchs as $item) {
|
||||
# Search & Delete
|
||||
if ($more == 'delete') {
|
||||
$items[] = $item[1] . ' : ' . $this->delete($server, $port, $item[1]);
|
||||
# Basic search
|
||||
} else {
|
||||
# Detail level
|
||||
if ($level == 'full') {
|
||||
$items[] = $item[1] . ' : [' . trim(Library_Data_Analysis::byteResize($item[2])) . 'b, expire in ' . (($item[3] == $infinite) ? '∞' : Library_Data_Analysis::uptime($item[3] - time(), true)) . ']';
|
||||
} else {
|
||||
$items[] = $item[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
unset($slabs[$slab]);
|
||||
}
|
||||
|
||||
if (is_array($items)) {
|
||||
sort($items);
|
||||
}
|
||||
|
||||
return $items;
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute a telnet command on a server
|
||||
* Return the result
|
||||
*
|
||||
* @param String $server Hostname
|
||||
* @param Integer $port Hostname Port
|
||||
* @param String $command Command to execute
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
function telnet($server, $port, $command)
|
||||
{
|
||||
# Executing command
|
||||
if (($result = $this->exec($command, $server, $port))) {
|
||||
return $result;
|
||||
}
|
||||
return self::$_log;
|
||||
}
|
||||
}
|
186
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Configuration/Loader.php
vendored
Normal file
@ -0,0 +1,186 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2010 Cyrille Mahieux
|
||||
* 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.
|
||||
*
|
||||
* ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°>
|
||||
*
|
||||
* Configuration class for editing, saving, ...
|
||||
*
|
||||
* @author elijaa@free.fr
|
||||
* @since 19/05/2010
|
||||
*/
|
||||
class Library_Configuration_Loader
|
||||
{
|
||||
# Singleton
|
||||
protected static $_instance = null;
|
||||
|
||||
# Configuration file
|
||||
protected static $_iniPath = './Config/Memcache.php';
|
||||
|
||||
# Configuration needed keys and default values
|
||||
protected static $_iniKeys = array('stats_api' => 'Server',
|
||||
'slabs_api' => 'Server',
|
||||
'items_api' => 'Server',
|
||||
'get_api' => 'Server',
|
||||
'set_api' => 'Server',
|
||||
'delete_api' => 'Server',
|
||||
'flush_all_api' => 'Server',
|
||||
'connection_timeout' => 1,
|
||||
'max_item_dump' => 100,
|
||||
'refresh_rate' => 2,
|
||||
'memory_alert' => 80,
|
||||
'hit_rate_alert' => 90,
|
||||
'eviction_alert' => 0,
|
||||
'file_path' => 'Temp/',
|
||||
'servers' => array('Default' => array('127.0.0.1:11211' => array('hostname' => '127.0.0.1', 'port' => 11211))));
|
||||
|
||||
# Storage
|
||||
protected static $_ini = array();
|
||||
|
||||
/**
|
||||
* Constructor, load configuration file and parse server list
|
||||
*
|
||||
* @return Void
|
||||
*/
|
||||
protected function __construct()
|
||||
{
|
||||
# Checking ini File
|
||||
if (file_exists(self::$_iniPath)) {
|
||||
# Opening ini file
|
||||
self::$_ini = require self::$_iniPath;
|
||||
} else {
|
||||
# Fallback
|
||||
self::$_ini = self::$_iniKeys;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Library_Configuration_Loader singleton
|
||||
*
|
||||
* @return Library_Configuration_Loader
|
||||
*/
|
||||
public static function singleton()
|
||||
{
|
||||
if (! isset(self::$_instance)) {
|
||||
self::$_instance = new self();
|
||||
}
|
||||
return self::$_instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Config key to retrieve
|
||||
* Return the value, or false if does not exists
|
||||
*
|
||||
* @param String $key Key to get
|
||||
*
|
||||
* @return Mixed
|
||||
*/
|
||||
public function get($key)
|
||||
{
|
||||
if (isset(self::$_ini[$key])) {
|
||||
return self::$_ini[$key];
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Servers to retrieve from cluster
|
||||
* Return the value, or false if does not exists
|
||||
*
|
||||
* @param String $cluster Cluster to retreive
|
||||
*
|
||||
* @return Array
|
||||
*/
|
||||
public function cluster($cluster)
|
||||
{
|
||||
if (isset(self::$_ini['servers'][$cluster])) {
|
||||
return self::$_ini['servers'][$cluster];
|
||||
}
|
||||
return array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check and return server data
|
||||
* Return the value, or false if does not exists
|
||||
*
|
||||
* @param String $server Server to retreive
|
||||
*
|
||||
* @return Array
|
||||
*/
|
||||
public function server($server)
|
||||
{
|
||||
foreach (self::$_ini['servers'] as $cluster => $servers) {
|
||||
if (isset(self::$_ini['servers'][$cluster][$server])) {
|
||||
return self::$_ini['servers'][$cluster][$server];
|
||||
}
|
||||
}
|
||||
return array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Config key to set
|
||||
*
|
||||
* @param String $key Key to set
|
||||
* @param Mixed $value Value to set
|
||||
*
|
||||
* @return Boolean
|
||||
*/
|
||||
public function set($key, $value)
|
||||
{
|
||||
self::$_ini[$key] = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return actual ini file path
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public function path()
|
||||
{
|
||||
return self::$_iniPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if every ini keys are set
|
||||
* Return true if ini is correct, false otherwise
|
||||
*
|
||||
* @return Boolean
|
||||
*/
|
||||
public function check()
|
||||
{
|
||||
# Checking configuration keys
|
||||
foreach (array_keys(self::$_iniKeys) as $iniKey) {
|
||||
# Ini file key not set
|
||||
if (isset(self::$_ini[$iniKey]) === false) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write ini file
|
||||
* Return true if written, false otherwise
|
||||
*
|
||||
* @return Boolean
|
||||
*/
|
||||
public function write()
|
||||
{
|
||||
if ($this->check()) {
|
||||
return is_numeric(file_put_contents(self::$_iniPath, '<?php' . PHP_EOL . 'return ' . var_export(self::$_ini, true) . ';'));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
327
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Data/Analysis.php
vendored
Normal file
@ -0,0 +1,327 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2010 Cyrille Mahieux
|
||||
* 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.
|
||||
*
|
||||
* ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°>
|
||||
*
|
||||
* Analysis of memcached command response
|
||||
*
|
||||
* @author elijaa@free.fr
|
||||
* @since 20/03/2010
|
||||
*/
|
||||
class Library_Data_Analysis
|
||||
{
|
||||
private static $_non_additive = array(
|
||||
'libevent',
|
||||
'pid',
|
||||
'pointer_size',
|
||||
'time',
|
||||
'uptime',
|
||||
'version',
|
||||
);
|
||||
|
||||
/**
|
||||
* Merge two arrays of stats from Command_XX::stats()
|
||||
*
|
||||
* @param Array $array Statistic from Command_XX::stats()
|
||||
* @param Array $stats Statistic from Command_XX::stats()
|
||||
*
|
||||
* @return Array
|
||||
*/
|
||||
public static function merge($array, $stats)
|
||||
{
|
||||
# Checking input
|
||||
if (! is_array($array)) {
|
||||
return $stats;
|
||||
} elseif (! is_array($stats)) {
|
||||
return $array;
|
||||
}
|
||||
|
||||
# Merging Stats
|
||||
foreach ($stats as $key => $value) {
|
||||
if (! isset($array[$key]) || in_array($key, self::$_non_additive)) {
|
||||
$array[$key] = $value;
|
||||
} else {
|
||||
$array[$key] += $value;
|
||||
}
|
||||
}
|
||||
return $array;
|
||||
}
|
||||
|
||||
/**
|
||||
* Diff two arrays of stats from Command_XX::stats()
|
||||
*
|
||||
* @param Array $array Statistic from Command_XX::stats()
|
||||
* @param Array $stats Statistic from Command_XX::stats()
|
||||
*
|
||||
* @return Array
|
||||
*/
|
||||
public static function diff($array, $stats)
|
||||
{
|
||||
# Checking input
|
||||
if (! is_array($array)) {
|
||||
return $stats;
|
||||
} elseif (! is_array($stats)) {
|
||||
return $array;
|
||||
}
|
||||
|
||||
# Diff for each key
|
||||
foreach ($stats as $key => $value) {
|
||||
if (isset($array[$key]) && ! in_array($key, self::$_non_additive)) {
|
||||
$stats[$key] = $value - $array[$key];
|
||||
}
|
||||
}
|
||||
|
||||
return $stats;
|
||||
}
|
||||
|
||||
/**
|
||||
* Analyse and return memcache stats command
|
||||
*
|
||||
* @param Array $stats Statistic from Command_XX::stats()
|
||||
*
|
||||
* @return Array
|
||||
*/
|
||||
public static function stats($stats)
|
||||
{
|
||||
if (! is_array($stats) || (count($stats) == 0)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
# Command set()
|
||||
$stats['set_rate'] = ($stats['cmd_set'] == 0) ? '0.0' : sprintf('%.1f', $stats['cmd_set'] / $stats['uptime'], 1);
|
||||
|
||||
# Command get()
|
||||
$stats['get_hits_percent'] = ($stats['cmd_get'] == 0) ? ' - ' : sprintf('%.1f', $stats['get_hits'] / $stats['cmd_get'] * 100, 1);
|
||||
$stats['get_misses_percent'] = ($stats['cmd_get'] == 0) ? ' - ' : sprintf('%.1f', $stats['get_misses'] / $stats['cmd_get'] * 100, 1);
|
||||
$stats['get_rate'] = ($stats['cmd_get'] == 0) ? '0.0' : sprintf('%.1f', $stats['cmd_get'] / $stats['uptime'], 1);
|
||||
|
||||
# Command delete(), version > 1.2.X
|
||||
if (isset($stats['delete_hits'], $stats['delete_misses'])) {
|
||||
$stats['cmd_delete'] = $stats['delete_hits'] + $stats['delete_misses'];
|
||||
$stats['delete_hits_percent'] = ($stats['cmd_delete'] == 0) ? ' - ' : sprintf('%.1f', $stats['delete_hits'] / $stats['cmd_delete'] * 100, 1);
|
||||
$stats['delete_misses_percent'] = ($stats['cmd_delete'] == 0) ? ' - ' : sprintf('%.1f', $stats['delete_misses'] / $stats['cmd_delete'] * 100, 1);
|
||||
} else {
|
||||
$stats['cmd_delete'] = 0;
|
||||
$stats['delete_hits_percent'] = ' - ';
|
||||
$stats['delete_misses_percent'] = ' - ';
|
||||
}
|
||||
$stats['delete_rate'] = ($stats['cmd_delete'] == 0) ? '0.0' : sprintf('%.1f', $stats['cmd_delete'] / $stats['uptime'], 1);
|
||||
|
||||
# Command cas(), version > 1.2.X
|
||||
if (isset($stats['cas_hits'], $stats['cas_misses'], $stats['cas_badval'])) {
|
||||
$stats['cmd_cas'] = $stats['cas_hits'] + $stats['cas_misses'] + $stats['cas_badval'];
|
||||
$stats['cas_hits_percent'] = ($stats['cmd_cas'] == 0) ? ' - ' : sprintf('%.1f', $stats['cas_hits'] / $stats['cmd_cas'] * 100, 1);
|
||||
$stats['cas_misses_percent'] = ($stats['cmd_cas'] == 0) ? ' - ' : sprintf('%.1f', $stats['cas_misses'] / $stats['cmd_cas'] * 100, 1);
|
||||
$stats['cas_badval_percent'] = ($stats['cmd_cas'] == 0) ? ' - ' : sprintf('%.1f', $stats['cas_badval'] / $stats['cmd_cas'] * 100, 1);
|
||||
} else {
|
||||
$stats['cmd_cas'] = 0;
|
||||
$stats['cas_hits_percent'] = ' - ';
|
||||
$stats['cas_misses_percent'] = ' - ';
|
||||
$stats['cas_badval_percent'] = ' - ';
|
||||
}
|
||||
$stats['cas_rate'] = ($stats['cmd_cas'] == 0) ? '0.0' : sprintf('%.1f', $stats['cmd_cas'] / $stats['uptime'], 1);
|
||||
|
||||
# Command increment(), version > 1.2.X
|
||||
if (isset($stats['incr_hits'], $stats['incr_misses'])) {
|
||||
$stats['cmd_incr'] = $stats['incr_hits'] + $stats['incr_misses'];
|
||||
$stats['incr_hits_percent'] = ($stats['cmd_incr'] == 0) ? ' - ' : sprintf('%.1f', $stats['incr_hits'] / $stats['cmd_incr'] * 100, 1);
|
||||
$stats['incr_misses_percent'] = ($stats['cmd_incr'] == 0) ? ' - ' : sprintf('%.1f', $stats['incr_misses'] / $stats['cmd_incr'] * 100, 1);
|
||||
} else {
|
||||
$stats['cmd_incr'] = 0;
|
||||
$stats['incr_hits_percent'] = ' - ';
|
||||
$stats['incr_misses_percent'] = ' - ';
|
||||
}
|
||||
$stats['incr_rate'] = ($stats['cmd_incr'] == 0) ? '0.0' : sprintf('%.1f', $stats['cmd_incr'] / $stats['uptime'], 1);
|
||||
|
||||
# Command decrement(), version > 1.2.X
|
||||
if (isset($stats['decr_hits'], $stats['decr_misses'])) {
|
||||
$stats['cmd_decr'] = $stats['decr_hits'] + $stats['decr_misses'];
|
||||
$stats['decr_hits_percent'] = ($stats['cmd_decr'] == 0) ? ' - ' : sprintf('%.1f', $stats['decr_hits'] / $stats['cmd_decr'] * 100, 1);
|
||||
$stats['decr_misses_percent'] = ($stats['cmd_decr'] == 0) ? ' - ' : sprintf('%.1f', $stats['decr_misses'] / $stats['cmd_decr'] * 100, 1);
|
||||
} else {
|
||||
$stats['cmd_decr'] = 0;
|
||||
$stats['decr_hits_percent'] = ' - ';
|
||||
$stats['decr_misses_percent'] = ' - ';
|
||||
}
|
||||
$stats['decr_rate'] = ($stats['cmd_decr'] == 0) ? '0.0' : sprintf('%.1f', $stats['cmd_decr'] / $stats['uptime'], 1);
|
||||
|
||||
# Command decrement(), version > 1.4.7
|
||||
if (isset($stats['touch_hits'], $stats['touch_misses'])) {
|
||||
$stats['cmd_touch'] = $stats['touch_hits'] + $stats['touch_misses'];
|
||||
$stats['touch_hits_percent'] = ($stats['cmd_touch'] == 0) ? ' - ' : sprintf('%.1f', $stats['touch_hits'] / $stats['cmd_touch'] * 100, 1);
|
||||
$stats['touch_misses_percent'] = ($stats['cmd_touch'] == 0) ? ' - ' : sprintf('%.1f', $stats['touch_misses'] / $stats['cmd_touch'] * 100, 1);
|
||||
} else {
|
||||
$stats['cmd_touch'] = 0;
|
||||
$stats['touch_hits_percent'] = ' - ';
|
||||
$stats['touch_misses_percent'] = ' - ';
|
||||
}
|
||||
$stats['touch_rate'] = ($stats['cmd_touch'] == 0) ? '0.0' : sprintf('%.1f', $stats['cmd_touch'] / $stats['uptime'], 1);
|
||||
|
||||
# Total hit & miss
|
||||
#$stats['cmd_total'] = $stats['cmd_get'] + $stats['cmd_set'] + $stats['cmd_delete'] + $stats['cmd_cas'] + $stats['cmd_incr'] + $stats['cmd_decr'];
|
||||
#$stats['hit_percent'] = ($stats['cmd_get'] == 0) ? '0.0' : sprintf('%.1f', ($stats['get_hits']) / ($stats['get_hits'] + $stats['get_misses']) * 100, 1);
|
||||
#$stats['miss_percent'] = ($stats['cmd_get'] == 0) ? '0.0' : sprintf('%.1f', ($stats['get_misses']) / ($stats['get_hits'] + $stats['get_misses']) * 100, 1);
|
||||
|
||||
|
||||
# Command flush_all
|
||||
if (isset($stats['cmd_flush'])) {
|
||||
$stats['flush_rate'] = ($stats['cmd_flush'] == 0) ? '0.0' : sprintf('%.1f', $stats['cmd_flush'] / $stats['uptime'], 1);
|
||||
} else {
|
||||
$stats['flush_rate'] = '0.0';
|
||||
}
|
||||
|
||||
# Cache size
|
||||
$stats['bytes_percent'] = ($stats['limit_maxbytes'] == 0) ? '0.0' : sprintf('%.1f', $stats['bytes'] / $stats['limit_maxbytes'] * 100, 1);
|
||||
|
||||
# Request rate
|
||||
$stats['request_rate'] = sprintf('%.1f', ($stats['cmd_get'] + $stats['cmd_set'] + $stats['cmd_delete'] + $stats['cmd_cas'] + $stats['cmd_incr'] + $stats['cmd_decr']) / $stats['uptime'], 1);
|
||||
$stats['hit_rate'] = sprintf('%.1f', ($stats['get_hits']) / $stats['uptime'], 1);
|
||||
$stats['miss_rate'] = sprintf('%.1f', ($stats['get_misses']) / $stats['uptime'], 1);
|
||||
|
||||
# Eviction & reclaimed rate
|
||||
$stats['eviction_rate'] = ($stats['evictions'] == 0) ? '0.0' : sprintf('%.1f', $stats['evictions'] / $stats['uptime'], 1);
|
||||
$stats['reclaimed_rate'] = (! isset($stats['reclaimed']) || ($stats['reclaimed'] == 0)) ? '0.0' : sprintf('%.1f', $stats['reclaimed'] / $stats['uptime'], 1);
|
||||
|
||||
return $stats;
|
||||
}
|
||||
|
||||
/**
|
||||
* Analyse and return memcache slabs command
|
||||
*
|
||||
* @param Array $slabs Statistic from Command_XX::slabs()
|
||||
*
|
||||
* @return Array
|
||||
*/
|
||||
public static function slabs($slabs)
|
||||
{
|
||||
# Initializing Used Slabs
|
||||
$slabs['used_slabs'] = 0;
|
||||
$slabs['total_wasted'] = 0;
|
||||
|
||||
# Request Rate par Slabs
|
||||
foreach ($slabs as $id => $slab) {
|
||||
# Check if it's a Slab
|
||||
if (is_numeric($id)) {
|
||||
# Check if Slab is used
|
||||
if ($slab['used_chunks'] > 0) {
|
||||
$slabs['used_slabs'] ++;
|
||||
}
|
||||
$slabs[$id]['request_rate'] = sprintf('%.1f', ($slab['get_hits'] + $slab['cmd_set'] + $slab['delete_hits'] + $slab['cas_hits'] + $slab['cas_badval'] + $slab['incr_hits'] + $slab['decr_hits']) / $slabs['uptime'], 1);
|
||||
$slabs[$id]['mem_wasted'] = (($slab['total_chunks'] * $slab['chunk_size']) < $slab['mem_requested']) ? (($slab['total_chunks'] - $slab['used_chunks']) * $slab['chunk_size']) : (($slab['total_chunks'] * $slab['chunk_size']) - $slab['mem_requested']);
|
||||
$slabs['total_wasted'] += $slabs[$id]['mem_wasted'];
|
||||
}
|
||||
}
|
||||
|
||||
# Cheking server total malloced > 0
|
||||
if (! isset($slabs['total_malloced'])) {
|
||||
$slabs['total_malloced'] = 0;
|
||||
}
|
||||
|
||||
return $slabs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate Uptime
|
||||
*
|
||||
* @param Integer $uptime Uptime timestamp
|
||||
* @param Boolean $compact Compact Mode
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public static function uptime($uptime, $compact = false)
|
||||
{
|
||||
if ($uptime > 0) {
|
||||
$days = floor($uptime / 60 / 60 / 24);
|
||||
$hours = $uptime / 60 / 60 % 24;
|
||||
$mins = $uptime / 60 % 60;
|
||||
if (($days + $hours + $mins) == 0) {
|
||||
return ' less than 1 min';
|
||||
}
|
||||
if ($compact == false) {
|
||||
return $days . ' day' . (($days > 1) ? 's' : '') . ' ' . $hours . ' hr' . (($hours > 1) ? 's' : '') . ' ' . $mins . ' min' . (($mins > 1) ? 's' : '');
|
||||
} else {
|
||||
return $days . 'd ' . $hours . 'h ' . $mins . 'm';
|
||||
}
|
||||
}
|
||||
return ' - ';
|
||||
}
|
||||
|
||||
/**
|
||||
* Resize a byte value
|
||||
*
|
||||
* @param Integer $value Value to resize
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public static function byteResize($value)
|
||||
{
|
||||
# Unit list
|
||||
$units = array('', 'K', 'M', 'G', 'T');
|
||||
|
||||
# Resizing
|
||||
foreach ($units as $unit) {
|
||||
if ($value < 1024) {
|
||||
break;
|
||||
}
|
||||
$value /= 1024;
|
||||
}
|
||||
return sprintf('%.1f %s', $value, $unit);
|
||||
}
|
||||
|
||||
/**
|
||||
* Resize a value
|
||||
*
|
||||
* @param Integer $value Value to resize
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public static function valueResize($value)
|
||||
{
|
||||
# Unit list
|
||||
$units = array('', 'K', 'M', 'G', 'T');
|
||||
|
||||
# Resizing
|
||||
foreach ($units as $unit) {
|
||||
if ($value < 1000) {
|
||||
break;
|
||||
}
|
||||
$value /= 1000;
|
||||
}
|
||||
return sprintf('%.1f%s', $value, $unit);
|
||||
}
|
||||
|
||||
/**
|
||||
* Resize a hit value
|
||||
*
|
||||
* @param Integer $value Hit value to resize
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public static function hitResize($value)
|
||||
{
|
||||
# Unit list
|
||||
$units = array('', 'K', 'M', 'G', 'T');
|
||||
|
||||
# Resizing
|
||||
foreach ($units as $unit) {
|
||||
if ($value < 10000000) {
|
||||
break;
|
||||
}
|
||||
$value /= 1000;
|
||||
}
|
||||
return sprintf('%.0f%s', $value, $unit);
|
||||
}
|
||||
}
|
60
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Data/Error.php
vendored
Normal file
@ -0,0 +1,60 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2010 Cyrille Mahieux
|
||||
* 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.
|
||||
*
|
||||
* ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°>
|
||||
*
|
||||
* Error container
|
||||
*
|
||||
* @author elijaa@free.fr
|
||||
* @since 11/10/2010
|
||||
*/
|
||||
class Library_Data_Error
|
||||
{
|
||||
private static $_errors = array();
|
||||
|
||||
/**
|
||||
* Add an error to the container
|
||||
* Return true if successful, false otherwise
|
||||
*
|
||||
* @param String $error Error message
|
||||
*
|
||||
* @return Boolean
|
||||
*/
|
||||
public static function add($error)
|
||||
{
|
||||
return array_push(self::$_errors, $error);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return last Error message
|
||||
*
|
||||
* @return Mixed
|
||||
*/
|
||||
public static function last()
|
||||
{
|
||||
return (isset(self::$_errors[count(self::$_errors) - 1])) ? self::$_errors[count(self::$_errors) - 1] : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return errors count
|
||||
*
|
||||
* @return Integer
|
||||
*/
|
||||
public static function count()
|
||||
{
|
||||
return count(self::$_errors);
|
||||
}
|
||||
}
|
72
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/Data/Version.php
vendored
Normal file
@ -0,0 +1,72 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2011 Cyrille Mahieux
|
||||
* 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.
|
||||
*
|
||||
* ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°>
|
||||
*
|
||||
* Version container
|
||||
*
|
||||
* @author cyrille.mahieux@free.fr
|
||||
* @since 24/08/2011
|
||||
*/
|
||||
class Library_Data_Version
|
||||
{
|
||||
# Version file
|
||||
protected static $_file = 'latest';
|
||||
|
||||
# Google Code latest version data file
|
||||
protected static $_latest = 'https://blog.elijaa.org/public/latest';
|
||||
|
||||
# Time between HTTP check
|
||||
protected static $_time = 1296000; # 15 days
|
||||
|
||||
|
||||
/**
|
||||
* Check for the latest version, from local cache or via http
|
||||
* Return true if a newer version is available, false otherwise
|
||||
*
|
||||
* @return Boolean
|
||||
*/
|
||||
public static function check()
|
||||
{
|
||||
# Loading ini file
|
||||
$_ini = Library_Configuration_Loader::singleton();
|
||||
|
||||
# Version definition file path
|
||||
$path = rtrim($_ini->get('file_path'), '/') . DIRECTORY_SEPARATOR . self::$_file;
|
||||
|
||||
# Checking if path is writable
|
||||
if (is_writable($_ini->get('file_path'))) {
|
||||
# Checking if file was modified for less than 15 days ago
|
||||
if ((is_array($stats = @stat($path))) && (isset($stats['mtime'])) && ($stats['mtime'] > (time() - self::$_time))) {
|
||||
# Opening file and checking for latest version
|
||||
return (version_compare(CURRENT_VERSION, file_get_contents($path)) == - 1);
|
||||
} else {
|
||||
# Getting last version from Google Code
|
||||
if ($latest = @file_get_contents(self::$_latest)) {
|
||||
# Saving latest version in file
|
||||
file_put_contents($path, $latest);
|
||||
|
||||
# Checking for latest version
|
||||
return (version_compare(CURRENT_VERSION, $latest) == - 1);
|
||||
} else {
|
||||
# To avoid error spam
|
||||
file_put_contents($path, 'Net unreachable');
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
143
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Library/HTML/Components.php
vendored
Normal file
@ -0,0 +1,143 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Copyright 2010 Cyrille Mahieux
|
||||
* 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.
|
||||
*
|
||||
* ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°>
|
||||
*
|
||||
* Manipulation of HTML
|
||||
*
|
||||
* @author elijaa@free.fr
|
||||
* @since 05/04/2010
|
||||
*/
|
||||
class Library_HTML_Components
|
||||
{
|
||||
|
||||
/**
|
||||
* Dump server list in an HTML select
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public static function serverSelect($name, $selected = '', $class = '', $events = '')
|
||||
{
|
||||
# Loading ini file
|
||||
$_ini = Library_Configuration_Loader::singleton();
|
||||
|
||||
# Select Name
|
||||
$serverList = '<select id="' . $name . '" ';
|
||||
|
||||
# CSS Class
|
||||
$serverList .= ($class != '') ? 'class="' . $class . '"' : '';
|
||||
|
||||
# Javascript Events
|
||||
$serverList .= ' ' . $events . '>';
|
||||
|
||||
foreach ($_ini->get('servers') as $cluster => $servers) {
|
||||
# Cluster
|
||||
$serverList .= '<option value="' . $cluster . '" ';
|
||||
$serverList .= ($selected == $cluster) ? 'selected="selected"' : '';
|
||||
$serverList .= '>' . $cluster . ' cluster</option>';
|
||||
|
||||
# Cluster server
|
||||
foreach ($servers as $name => $servers) {
|
||||
$serverList .= '<option value="' . $name . '" ';
|
||||
$serverList .= ($selected == $name) ? 'selected="selected"' : '';
|
||||
$serverList .= '> - ' . ((strlen($name) > 38) ? substr($name, 0, 38) . ' [...]' : $name) . '</option>';
|
||||
}
|
||||
}
|
||||
return $serverList . '</select>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump cluster list in an HTML select
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public static function clusterSelect($name, $selected = '', $class = '', $events = '')
|
||||
{
|
||||
# Loading ini file
|
||||
$_ini = Library_Configuration_Loader::singleton();
|
||||
|
||||
# Select Name
|
||||
$clusterList = '<select id="' . $name . '" ';
|
||||
|
||||
# CSS Class
|
||||
$clusterList .= ($class != '') ? 'class="' . $class . '"' : '';
|
||||
|
||||
# Javascript Events
|
||||
$clusterList .= ' ' . $events . '>';
|
||||
|
||||
foreach ($_ini->get('servers') as $cluster => $servers) {
|
||||
# Option value and selected case
|
||||
$clusterList .= '<option value="' . $cluster . '" ';
|
||||
$clusterList .= ($selected == $cluster) ? 'selected="selected"' : '';
|
||||
$clusterList .= '>' . $cluster . ' cluster</option>';
|
||||
}
|
||||
return $clusterList . '</select>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump server response in proper formatting
|
||||
*
|
||||
* @param String $hostname Hostname
|
||||
* @param String $port Port
|
||||
* @param Mixed $data Data (reponse)
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public static function serverResponse($hostname, $port, $data)
|
||||
{
|
||||
$header = '<span class="red">Server ' . $hostname . ':' . $port . "</span>\r\n";
|
||||
$return = '';
|
||||
if (is_array($data)) {
|
||||
foreach ($data as $string) {
|
||||
$return .= $string . "\r\n";
|
||||
}
|
||||
return $header . htmlentities($return, ENT_NOQUOTES | 0, 'UTF-8') . "\r\n";
|
||||
}
|
||||
return $header . $return . $data . "\r\n";
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump api list un HTML select with select name
|
||||
*
|
||||
* @param String $iniAPI API Name from ini file
|
||||
* @param String $id Select ID
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
public static function apiList($iniAPI = '', $id)
|
||||
{
|
||||
return '<select id="' . $id . '" name="' . $id . '">
|
||||
<option value="Server" ' . self::selected('Server', $iniAPI) . '>Server API</option>
|
||||
<option value="Memcache" ' . self::selected('Memcache', $iniAPI) . '>Memcache API</option>
|
||||
<option value="Memcached" ' . self::selected('Memcached', $iniAPI) . '>Memcached API</option>
|
||||
</select>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to see if an option is selected
|
||||
*
|
||||
* @param String $actual Actual value
|
||||
* @param String $selected Selected value
|
||||
*
|
||||
* @return String
|
||||
*/
|
||||
private static function selected($actual, $selected)
|
||||
{
|
||||
if ($actual == $selected) {
|
||||
return 'selected="selected"';
|
||||
}
|
||||
}
|
||||
}
|
391
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Public/Scripts/Highcharts/highcharts.js
vendored
Normal file
@ -0,0 +1,391 @@
|
||||
/*
|
||||
Highcharts JS v5.0.9 (2017-03-08)
|
||||
|
||||
(c) 2009-2016 Torstein Honsi
|
||||
|
||||
License: www.highcharts.com/license
|
||||
*/
|
||||
(function(I,a){"object"===typeof module&&module.exports?module.exports=I.document?a(I):a:I.Highcharts=a(I)})("undefined"!==typeof window?window:this,function(I){I=function(){var a=window,B=a.document,z=a.navigator&&a.navigator.userAgent||"",C=B&&B.createElementNS&&!!B.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect,E=/(edge|msie|trident)/i.test(z)&&!window.opera,u=!C,h=/Firefox/.test(z),n=h&&4>parseInt(z.split("Firefox/")[1],10);return a.Highcharts?a.Highcharts.error(16,!0):{product:"Highcharts",
|
||||
version:"5.0.9",deg2rad:2*Math.PI/360,doc:B,hasBidiBug:n,hasTouch:B&&void 0!==B.documentElement.ontouchstart,isMS:E,isWebKit:/AppleWebKit/.test(z),isFirefox:h,isTouchDevice:/(Mobile|Android|Windows Phone)/.test(z),SVG_NS:"http://www.w3.org/2000/svg",chartCount:0,seriesTypes:{},symbolSizes:{},svg:C,vml:u,win:a,charts:[],marginNames:["plotTop","marginRight","marginBottom","plotLeft"],noop:function(){}}}();(function(a){var B=[],z=a.charts,C=a.doc,E=a.win;a.error=function(u,h){u=a.isNumber(u)?"Highcharts error #"+
|
||||
u+": www.highcharts.com/errors/"+u:u;if(h)throw Error(u);E.console&&console.log(u)};a.Fx=function(a,h,n){this.options=h;this.elem=a;this.prop=n};a.Fx.prototype={dSetter:function(){var a=this.paths[0],h=this.paths[1],n=[],t=this.now,l=a.length,k;if(1===t)n=this.toD;else if(l===h.length&&1>t)for(;l--;)k=parseFloat(a[l]),n[l]=isNaN(k)?a[l]:t*parseFloat(h[l]-k)+k;else n=h;this.elem.attr("d",n,null,!0)},update:function(){var a=this.elem,h=this.prop,n=this.now,t=this.options.step;if(this[h+"Setter"])this[h+
|
||||
"Setter"]();else a.attr?a.element&&a.attr(h,n,null,!0):a.style[h]=n+this.unit;t&&t.call(a,n,this)},run:function(a,h,n){var u=this,l=function(a){return l.stopped?!1:u.step(a)},k;this.startTime=+new Date;this.start=a;this.end=h;this.unit=n;this.now=this.start;this.pos=0;l.elem=this.elem;l.prop=this.prop;l()&&1===B.push(l)&&(l.timerId=setInterval(function(){for(k=0;k<B.length;k++)B[k]()||B.splice(k--,1);B.length||clearInterval(l.timerId)},13))},step:function(a){var h=+new Date,u,t=this.options;u=this.elem;
|
||||
var l=t.complete,k=t.duration,e=t.curAnim,c;if(u.attr&&!u.element)u=!1;else if(a||h>=k+this.startTime){this.now=this.end;this.pos=1;this.update();a=e[this.prop]=!0;for(c in e)!0!==e[c]&&(a=!1);a&&l&&l.call(u);u=!1}else this.pos=t.easing((h-this.startTime)/k),this.now=this.start+(this.end-this.start)*this.pos,this.update(),u=!0;return u},initPath:function(u,h,n){function t(a){var b,f;for(r=a.length;r--;)b="M"===a[r]||"L"===a[r],f=/[a-zA-Z]/.test(a[r+3]),b&&f&&a.splice(r+1,0,a[r+1],a[r+2],a[r+1],a[r+
|
||||
2])}function l(a,f){for(;a.length<m;){a[0]=f[m-a.length];var d=a.slice(0,b);[].splice.apply(a,[0,0].concat(d));A&&(d=a.slice(a.length-b),[].splice.apply(a,[a.length,0].concat(d)),r--)}a[0]="M"}function k(a,f){for(var c=(m-a.length)/b;0<c&&c--;)d=a.slice().splice(a.length/v-b,b*v),d[0]=f[m-b-c*b],H&&(d[b-6]=d[b-2],d[b-5]=d[b-1]),[].splice.apply(a,[a.length/v,0].concat(d)),A&&c--}h=h||"";var e,c=u.startX,p=u.endX,H=-1<h.indexOf("C"),b=H?7:3,m,d,r;h=h.split(" ");n=n.slice();var A=u.isArea,v=A?2:1,f;
|
||||
H&&(t(h),t(n));if(c&&p){for(r=0;r<c.length;r++)if(c[r]===p[0]){e=r;break}else if(c[0]===p[p.length-c.length+r]){e=r;f=!0;break}void 0===e&&(h=[])}h.length&&a.isNumber(e)&&(m=n.length+e*v*b,f?(l(h,n),k(n,h)):(l(n,h),k(h,n)));return[h,n]}};a.extend=function(a,h){var u;a||(a={});for(u in h)a[u]=h[u];return a};a.merge=function(){var u,h=arguments,n,t={},l=function(k,e){var c,p;"object"!==typeof k&&(k={});for(p in e)e.hasOwnProperty(p)&&(c=e[p],a.isObject(c,!0)&&"renderTo"!==p&&"number"!==typeof c.nodeType?
|
||||
k[p]=l(k[p]||{},c):k[p]=e[p]);return k};!0===h[0]&&(t=h[1],h=Array.prototype.slice.call(h,2));n=h.length;for(u=0;u<n;u++)t=l(t,h[u]);return t};a.pInt=function(a,h){return parseInt(a,h||10)};a.isString=function(a){return"string"===typeof a};a.isArray=function(a){a=Object.prototype.toString.call(a);return"[object Array]"===a||"[object Array Iterator]"===a};a.isObject=function(u,h){return u&&"object"===typeof u&&(!h||!a.isArray(u))};a.isNumber=function(a){return"number"===typeof a&&!isNaN(a)};a.erase=
|
||||
function(a,h){for(var u=a.length;u--;)if(a[u]===h){a.splice(u,1);break}};a.defined=function(a){return void 0!==a&&null!==a};a.attr=function(u,h,n){var t,l;if(a.isString(h))a.defined(n)?u.setAttribute(h,n):u&&u.getAttribute&&(l=u.getAttribute(h));else if(a.defined(h)&&a.isObject(h))for(t in h)u.setAttribute(t,h[t]);return l};a.splat=function(u){return a.isArray(u)?u:[u]};a.syncTimeout=function(a,h,n){if(h)return setTimeout(a,h,n);a.call(0,n)};a.pick=function(){var a=arguments,h,n,t=a.length;for(h=
|
||||
0;h<t;h++)if(n=a[h],void 0!==n&&null!==n)return n};a.css=function(u,h){a.isMS&&!a.svg&&h&&void 0!==h.opacity&&(h.filter="alpha(opacity\x3d"+100*h.opacity+")");a.extend(u.style,h)};a.createElement=function(u,h,n,t,l){u=C.createElement(u);var k=a.css;h&&a.extend(u,h);l&&k(u,{padding:0,border:"none",margin:0});n&&k(u,n);t&&t.appendChild(u);return u};a.extendClass=function(u,h){var n=function(){};n.prototype=new u;a.extend(n.prototype,h);return n};a.pad=function(a,h,n){return Array((h||2)+1-String(a).length).join(n||
|
||||
0)+a};a.relativeLength=function(a,h){return/%$/.test(a)?h*parseFloat(a)/100:parseFloat(a)};a.wrap=function(a,h,n){var t=a[h];a[h]=function(){var a=Array.prototype.slice.call(arguments),k=arguments,e=this;e.proceed=function(){t.apply(e,arguments.length?arguments:k)};a.unshift(t);a=n.apply(this,a);e.proceed=null;return a}};a.getTZOffset=function(u){var h=a.Date;return 6E4*(h.hcGetTimezoneOffset&&h.hcGetTimezoneOffset(u)||h.hcTimezoneOffset||0)};a.dateFormat=function(u,h,n){if(!a.defined(h)||isNaN(h))return a.defaultOptions.lang.invalidDate||
|
||||
"";u=a.pick(u,"%Y-%m-%d %H:%M:%S");var t=a.Date,l=new t(h-a.getTZOffset(h)),k,e=l[t.hcGetHours](),c=l[t.hcGetDay](),p=l[t.hcGetDate](),H=l[t.hcGetMonth](),b=l[t.hcGetFullYear](),m=a.defaultOptions.lang,d=m.weekdays,r=m.shortWeekdays,A=a.pad,t=a.extend({a:r?r[c]:d[c].substr(0,3),A:d[c],d:A(p),e:A(p,2," "),w:c,b:m.shortMonths[H],B:m.months[H],m:A(H+1),y:b.toString().substr(2,2),Y:b,H:A(e),k:e,I:A(e%12||12),l:e%12||12,M:A(l[t.hcGetMinutes]()),p:12>e?"AM":"PM",P:12>e?"am":"pm",S:A(l.getSeconds()),L:A(Math.round(h%
|
||||
1E3),3)},a.dateFormats);for(k in t)for(;-1!==u.indexOf("%"+k);)u=u.replace("%"+k,"function"===typeof t[k]?t[k](h):t[k]);return n?u.substr(0,1).toUpperCase()+u.substr(1):u};a.formatSingle=function(u,h){var n=/\.([0-9])/,t=a.defaultOptions.lang;/f$/.test(u)?(n=(n=u.match(n))?n[1]:-1,null!==h&&(h=a.numberFormat(h,n,t.decimalPoint,-1<u.indexOf(",")?t.thousandsSep:""))):h=a.dateFormat(u,h);return h};a.format=function(u,h){for(var n="{",t=!1,l,k,e,c,p=[],H;u;){n=u.indexOf(n);if(-1===n)break;l=u.slice(0,
|
||||
n);if(t){l=l.split(":");k=l.shift().split(".");c=k.length;H=h;for(e=0;e<c;e++)H=H[k[e]];l.length&&(H=a.formatSingle(l.join(":"),H));p.push(H)}else p.push(l);u=u.slice(n+1);n=(t=!t)?"}":"{"}p.push(u);return p.join("")};a.getMagnitude=function(a){return Math.pow(10,Math.floor(Math.log(a)/Math.LN10))};a.normalizeTickInterval=function(u,h,n,t,l){var k,e=u;n=a.pick(n,1);k=u/n;h||(h=l?[1,1.2,1.5,2,2.5,3,4,5,6,8,10]:[1,2,2.5,5,10],!1===t&&(1===n?h=a.grep(h,function(a){return 0===a%1}):.1>=n&&(h=[1/n])));
|
||||
for(t=0;t<h.length&&!(e=h[t],l&&e*n>=u||!l&&k<=(h[t]+(h[t+1]||h[t]))/2);t++);return e=a.correctFloat(e*n,-Math.round(Math.log(.001)/Math.LN10))};a.stableSort=function(a,h){var n=a.length,t,l;for(l=0;l<n;l++)a[l].safeI=l;a.sort(function(a,e){t=h(a,e);return 0===t?a.safeI-e.safeI:t});for(l=0;l<n;l++)delete a[l].safeI};a.arrayMin=function(a){for(var h=a.length,n=a[0];h--;)a[h]<n&&(n=a[h]);return n};a.arrayMax=function(a){for(var h=a.length,n=a[0];h--;)a[h]>n&&(n=a[h]);return n};a.destroyObjectProperties=
|
||||
function(a,h){for(var n in a)a[n]&&a[n]!==h&&a[n].destroy&&a[n].destroy(),delete a[n]};a.discardElement=function(u){var h=a.garbageBin;h||(h=a.createElement("div"));u&&h.appendChild(u);h.innerHTML=""};a.correctFloat=function(a,h){return parseFloat(a.toPrecision(h||14))};a.setAnimation=function(u,h){h.renderer.globalAnimation=a.pick(u,h.options.chart.animation,!0)};a.animObject=function(u){return a.isObject(u)?a.merge(u):{duration:u?500:0}};a.timeUnits={millisecond:1,second:1E3,minute:6E4,hour:36E5,
|
||||
day:864E5,week:6048E5,month:24192E5,year:314496E5};a.numberFormat=function(u,h,n,t){u=+u||0;h=+h;var l=a.defaultOptions.lang,k=(u.toString().split(".")[1]||"").length,e,c;-1===h?h=Math.min(k,20):a.isNumber(h)||(h=2);c=(Math.abs(u)+Math.pow(10,-Math.max(h,k)-1)).toFixed(h);k=String(a.pInt(c));e=3<k.length?k.length%3:0;n=a.pick(n,l.decimalPoint);t=a.pick(t,l.thousandsSep);u=(0>u?"-":"")+(e?k.substr(0,e)+t:"");u+=k.substr(e).replace(/(\d{3})(?=\d)/g,"$1"+t);h&&(u+=n+c.slice(-h));return u};Math.easeInOutSine=
|
||||
function(a){return-.5*(Math.cos(Math.PI*a)-1)};a.getStyle=function(u,h){return"width"===h?Math.min(u.offsetWidth,u.scrollWidth)-a.getStyle(u,"padding-left")-a.getStyle(u,"padding-right"):"height"===h?Math.min(u.offsetHeight,u.scrollHeight)-a.getStyle(u,"padding-top")-a.getStyle(u,"padding-bottom"):(u=E.getComputedStyle(u,void 0))&&a.pInt(u.getPropertyValue(h))};a.inArray=function(a,h){return h.indexOf?h.indexOf(a):[].indexOf.call(h,a)};a.grep=function(a,h){return[].filter.call(a,h)};a.find=function(a,
|
||||
h){return[].find.call(a,h)};a.map=function(a,h){for(var n=[],t=0,l=a.length;t<l;t++)n[t]=h.call(a[t],a[t],t,a);return n};a.offset=function(a){var h=C.documentElement;a=a.getBoundingClientRect();return{top:a.top+(E.pageYOffset||h.scrollTop)-(h.clientTop||0),left:a.left+(E.pageXOffset||h.scrollLeft)-(h.clientLeft||0)}};a.stop=function(a,h){for(var n=B.length;n--;)B[n].elem!==a||h&&h!==B[n].prop||(B[n].stopped=!0)};a.each=function(a,h,n){return Array.prototype.forEach.call(a,h,n)};a.addEvent=function(u,
|
||||
h,n){function t(a){a.target=a.srcElement||E;n.call(u,a)}var l=u.hcEvents=u.hcEvents||{};u.addEventListener?u.addEventListener(h,n,!1):u.attachEvent&&(u.hcEventsIE||(u.hcEventsIE={}),u.hcEventsIE[n.toString()]=t,u.attachEvent("on"+h,t));l[h]||(l[h]=[]);l[h].push(n);return function(){a.removeEvent(u,h,n)}};a.removeEvent=function(u,h,n){function t(a,c){u.removeEventListener?u.removeEventListener(a,c,!1):u.attachEvent&&(c=u.hcEventsIE[c.toString()],u.detachEvent("on"+a,c))}function l(){var a,c;if(u.nodeName)for(c in h?
|
||||
(a={},a[h]=!0):a=e,a)if(e[c])for(a=e[c].length;a--;)t(c,e[c][a])}var k,e=u.hcEvents,c;e&&(h?(k=e[h]||[],n?(c=a.inArray(n,k),-1<c&&(k.splice(c,1),e[h]=k),t(h,n)):(l(),e[h]=[])):(l(),u.hcEvents={}))};a.fireEvent=function(u,h,n,t){var l;l=u.hcEvents;var k,e;n=n||{};if(C.createEvent&&(u.dispatchEvent||u.fireEvent))l=C.createEvent("Events"),l.initEvent(h,!0,!0),a.extend(l,n),u.dispatchEvent?u.dispatchEvent(l):u.fireEvent(h,l);else if(l)for(l=l[h]||[],k=l.length,n.target||a.extend(n,{preventDefault:function(){n.defaultPrevented=
|
||||
!0},target:u,type:h}),h=0;h<k;h++)(e=l[h])&&!1===e.call(u,n)&&n.preventDefault();t&&!n.defaultPrevented&&t(n)};a.animate=function(u,h,n){var t,l="",k,e,c;a.isObject(n)||(t=arguments,n={duration:t[2],easing:t[3],complete:t[4]});a.isNumber(n.duration)||(n.duration=400);n.easing="function"===typeof n.easing?n.easing:Math[n.easing]||Math.easeInOutSine;n.curAnim=a.merge(h);for(c in h)a.stop(u,c),e=new a.Fx(u,n,c),k=null,"d"===c?(e.paths=e.initPath(u,u.d,h.d),e.toD=h.d,t=0,k=1):u.attr?t=u.attr(c):(t=parseFloat(a.getStyle(u,
|
||||
c))||0,"opacity"!==c&&(l="px")),k||(k=h[c]),k&&k.match&&k.match("px")&&(k=k.replace(/px/g,"")),e.run(t,k,l)};a.seriesType=function(u,h,n,t,l){var k=a.getOptions(),e=a.seriesTypes;k.plotOptions[u]=a.merge(k.plotOptions[h],n);e[u]=a.extendClass(e[h]||function(){},t);e[u].prototype.type=u;l&&(e[u].prototype.pointClass=a.extendClass(a.Point,l));return e[u]};a.uniqueKey=function(){var a=Math.random().toString(36).substring(2,9),h=0;return function(){return"highcharts-"+a+"-"+h++}}();E.jQuery&&(E.jQuery.fn.highcharts=
|
||||
function(){var u=[].slice.call(arguments);if(this[0])return u[0]?(new (a[a.isString(u[0])?u.shift():"Chart"])(this[0],u[0],u[1]),this):z[a.attr(this[0],"data-highcharts-chart")]});C&&!C.defaultView&&(a.getStyle=function(u,h){var n={width:"clientWidth",height:"clientHeight"}[h];if(u.style[h])return a.pInt(u.style[h]);"opacity"===h&&(h="filter");if(n)return u.style.zoom=1,Math.max(u[n]-2*a.getStyle(u,"padding"),0);u=u.currentStyle[h.replace(/\-(\w)/g,function(a,l){return l.toUpperCase()})];"filter"===
|
||||
h&&(u=u.replace(/alpha\(opacity=([0-9]+)\)/,function(a,l){return l/100}));return""===u?1:a.pInt(u)});Array.prototype.forEach||(a.each=function(a,h,n){for(var t=0,l=a.length;t<l;t++)if(!1===h.call(n,a[t],t,a))return t});Array.prototype.indexOf||(a.inArray=function(a,h){var n,t=0;if(h)for(n=h.length;t<n;t++)if(h[t]===a)return t;return-1});Array.prototype.filter||(a.grep=function(a,h){for(var n=[],t=0,l=a.length;t<l;t++)h(a[t],t)&&n.push(a[t]);return n});Array.prototype.find||(a.find=function(a,h){var n,
|
||||
t=a.length;for(n=0;n<t;n++)if(h(a[n],n))return a[n]})})(I);(function(a){var B=a.each,z=a.isNumber,C=a.map,E=a.merge,u=a.pInt;a.Color=function(h){if(!(this instanceof a.Color))return new a.Color(h);this.init(h)};a.Color.prototype={parsers:[{regex:/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/,parse:function(a){return[u(a[1]),u(a[2]),u(a[3]),parseFloat(a[4],10)]}},{regex:/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/,parse:function(a){return[u(a[1]),
|
||||
u(a[2]),u(a[3]),1]}}],names:{white:"#ffffff",black:"#000000"},init:function(h){var n,t,l,k;if((this.input=h=this.names[h]||h)&&h.stops)this.stops=C(h.stops,function(e){return new a.Color(e[1])});else if(h&&"#"===h[0]&&(n=h.length,h=parseInt(h.substr(1),16),7===n?t=[(h&16711680)>>16,(h&65280)>>8,h&255,1]:4===n&&(t=[(h&3840)>>4|(h&3840)>>8,(h&240)>>4|h&240,(h&15)<<4|h&15,1])),!t)for(l=this.parsers.length;l--&&!t;)k=this.parsers[l],(n=k.regex.exec(h))&&(t=k.parse(n));this.rgba=t||[]},get:function(a){var h=
|
||||
this.input,t=this.rgba,l;this.stops?(l=E(h),l.stops=[].concat(l.stops),B(this.stops,function(k,e){l.stops[e]=[l.stops[e][0],k.get(a)]})):l=t&&z(t[0])?"rgb"===a||!a&&1===t[3]?"rgb("+t[0]+","+t[1]+","+t[2]+")":"a"===a?t[3]:"rgba("+t.join(",")+")":h;return l},brighten:function(a){var h,t=this.rgba;if(this.stops)B(this.stops,function(l){l.brighten(a)});else if(z(a)&&0!==a)for(h=0;3>h;h++)t[h]+=u(255*a),0>t[h]&&(t[h]=0),255<t[h]&&(t[h]=255);return this},setOpacity:function(a){this.rgba[3]=a;return this}};
|
||||
a.color=function(h){return new a.Color(h)}})(I);(function(a){var B,z,C=a.addEvent,E=a.animate,u=a.attr,h=a.charts,n=a.color,t=a.css,l=a.createElement,k=a.defined,e=a.deg2rad,c=a.destroyObjectProperties,p=a.doc,H=a.each,b=a.extend,m=a.erase,d=a.grep,r=a.hasTouch,A=a.inArray,v=a.isArray,f=a.isFirefox,y=a.isMS,G=a.isObject,F=a.isString,q=a.isWebKit,x=a.merge,J=a.noop,K=a.pick,L=a.pInt,g=a.removeEvent,D=a.stop,S=a.svg,M=a.SVG_NS,R=a.symbolSizes,N=a.win;B=a.SVGElement=function(){return this};B.prototype=
|
||||
{opacity:1,SVG_NS:M,textProps:"direction fontSize fontWeight fontFamily fontStyle color lineHeight width textAlign textDecoration textOverflow textOutline".split(" "),init:function(a,g){this.element="span"===g?l(g):p.createElementNS(this.SVG_NS,g);this.renderer=a},animate:function(w,g,b){g=a.animObject(K(g,this.renderer.globalAnimation,!0));0!==g.duration?(b&&(g.complete=b),E(this,w,g)):(this.attr(w,null,b),g.step&&g.step.call(this));return this},colorGradient:function(w,g,b){var f=this.renderer,
|
||||
d,c,q,D,O,y,r,G,e,m,p,l=[],Q;w.linearGradient?c="linearGradient":w.radialGradient&&(c="radialGradient");if(c){q=w[c];O=f.gradients;r=w.stops;m=b.radialReference;v(q)&&(w[c]=q={x1:q[0],y1:q[1],x2:q[2],y2:q[3],gradientUnits:"userSpaceOnUse"});"radialGradient"===c&&m&&!k(q.gradientUnits)&&(D=q,q=x(q,f.getRadialAttr(m,D),{gradientUnits:"userSpaceOnUse"}));for(p in q)"id"!==p&&l.push(p,q[p]);for(p in r)l.push(r[p]);l=l.join(",");O[l]?m=O[l].attr("id"):(q.id=m=a.uniqueKey(),O[l]=y=f.createElement(c).attr(q).add(f.defs),
|
||||
y.radAttr=D,y.stops=[],H(r,function(w){0===w[1].indexOf("rgba")?(d=a.color(w[1]),G=d.get("rgb"),e=d.get("a")):(G=w[1],e=1);w=f.createElement("stop").attr({offset:w[0],"stop-color":G,"stop-opacity":e}).add(y);y.stops.push(w)}));Q="url("+f.url+"#"+m+")";b.setAttribute(g,Q);b.gradient=l;w.toString=function(){return Q}}},applyTextOutline:function(a){var w=this.element,g,b,f,d;-1!==a.indexOf("contrast")&&(a=a.replace(/contrast/g,this.renderer.getContrast(w.style.fill)));this.fakeTS=!0;this.ySetter=this.xSetter;
|
||||
g=[].slice.call(w.getElementsByTagName("tspan"));a=a.split(" ");b=a[a.length-1];(f=a[0])&&"none"!==f&&(f=f.replace(/(^[\d\.]+)(.*?)$/g,function(a,w,g){return 2*w+g}),H(g,function(a){"highcharts-text-outline"===a.getAttribute("class")&&m(g,w.removeChild(a))}),d=w.firstChild,H(g,function(a,g){0===g&&(a.setAttribute("x",w.getAttribute("x")),g=w.getAttribute("y"),a.setAttribute("y",g||0),null===g&&w.setAttribute("y",0));a=a.cloneNode(1);u(a,{"class":"highcharts-text-outline",fill:b,stroke:b,"stroke-width":f,
|
||||
"stroke-linejoin":"round"});w.insertBefore(a,d)}))},attr:function(a,g,b,f){var w,d=this.element,q,c=this,y;"string"===typeof a&&void 0!==g&&(w=a,a={},a[w]=g);if("string"===typeof a)c=(this[a+"Getter"]||this._defaultGetter).call(this,a,d);else{for(w in a)g=a[w],y=!1,f||D(this,w),this.symbolName&&/^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(w)&&(q||(this.symbolAttr(a),q=!0),y=!0),!this.rotation||"x"!==w&&"y"!==w||(this.doTransform=!0),y||(y=this[w+"Setter"]||this._defaultSetter,y.call(this,
|
||||
g,w,d),this.shadows&&/^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(w)&&this.updateShadows(w,g,y));this.doTransform&&(this.updateTransform(),this.doTransform=!1)}b&&b();return c},updateShadows:function(a,g,b){for(var w=this.shadows,f=w.length;f--;)b.call(w[f],"height"===a?Math.max(g-(w[f].cutHeight||0),0):"d"===a?this.d:g,a,w[f])},addClass:function(a,g){var w=this.attr("class")||"";-1===w.indexOf(a)&&(g||(a=(w+(w?" ":"")+a).replace(" "," ")),this.attr("class",a));return this},hasClass:function(a){return-1!==
|
||||
u(this.element,"class").indexOf(a)},removeClass:function(a){u(this.element,"class",(u(this.element,"class")||"").replace(a,""));return this},symbolAttr:function(a){var w=this;H("x y r start end width height innerR anchorX anchorY".split(" "),function(g){w[g]=K(a[g],w[g])});w.attr({d:w.renderer.symbols[w.symbolName](w.x,w.y,w.width,w.height,w)})},clip:function(a){return this.attr("clip-path",a?"url("+this.renderer.url+"#"+a.id+")":"none")},crisp:function(a,g){var w,f={},b;g=g||a.strokeWidth||0;b=Math.round(g)%
|
||||
2/2;a.x=Math.floor(a.x||this.x||0)+b;a.y=Math.floor(a.y||this.y||0)+b;a.width=Math.floor((a.width||this.width||0)-2*b);a.height=Math.floor((a.height||this.height||0)-2*b);k(a.strokeWidth)&&(a.strokeWidth=g);for(w in a)this[w]!==a[w]&&(this[w]=f[w]=a[w]);return f},css:function(a){var w=this.styles,g={},f=this.element,d,q="",c=!w,D=["textOverflow","width"];a&&a.color&&(a.fill=a.color);if(w)for(d in a)a[d]!==w[d]&&(g[d]=a[d],c=!0);if(c){w&&(a=b(w,g));w=this.textWidth=a&&a.width&&"auto"!==a.width&&"text"===
|
||||
f.nodeName.toLowerCase()&&L(a.width);this.styles=a;w&&!S&&this.renderer.forExport&&delete a.width;if(y&&!S)t(this.element,a);else{w=function(a,w){return"-"+w.toLowerCase()};for(d in a)-1===A(d,D)&&(q+=d.replace(/([A-Z])/g,w)+":"+a[d]+";");q&&u(f,"style",q)}this.added&&("text"===this.element.nodeName&&this.renderer.buildText(this),a&&a.textOutline&&this.applyTextOutline(a.textOutline))}return this},strokeWidth:function(){return this["stroke-width"]||0},on:function(a,g){var w=this,f=w.element;r&&"click"===
|
||||
a?(f.ontouchstart=function(a){w.touchEventFired=Date.now();a.preventDefault();g.call(f,a)},f.onclick=function(a){(-1===N.navigator.userAgent.indexOf("Android")||1100<Date.now()-(w.touchEventFired||0))&&g.call(f,a)}):f["on"+a]=g;return this},setRadialReference:function(a){var w=this.renderer.gradients[this.element.gradient];this.element.radialReference=a;w&&w.radAttr&&w.animate(this.renderer.getRadialAttr(a,w.radAttr));return this},translate:function(a,g){return this.attr({translateX:a,translateY:g})},
|
||||
invert:function(a){this.inverted=a;this.updateTransform();return this},updateTransform:function(){var a=this.translateX||0,g=this.translateY||0,f=this.scaleX,b=this.scaleY,d=this.inverted,q=this.rotation,c=this.element;d&&(a+=this.width,g+=this.height);a=["translate("+a+","+g+")"];d?a.push("rotate(90) scale(-1,1)"):q&&a.push("rotate("+q+" "+(c.getAttribute("x")||0)+" "+(c.getAttribute("y")||0)+")");(k(f)||k(b))&&a.push("scale("+K(f,1)+" "+K(b,1)+")");a.length&&c.setAttribute("transform",a.join(" "))},
|
||||
toFront:function(){var a=this.element;a.parentNode.appendChild(a);return this},align:function(a,g,f){var w,b,d,q,c={};b=this.renderer;d=b.alignedObjects;var D,y;if(a){if(this.alignOptions=a,this.alignByTranslate=g,!f||F(f))this.alignTo=w=f||"renderer",m(d,this),d.push(this),f=null}else a=this.alignOptions,g=this.alignByTranslate,w=this.alignTo;f=K(f,b[w],b);w=a.align;b=a.verticalAlign;d=(f.x||0)+(a.x||0);q=(f.y||0)+(a.y||0);"right"===w?D=1:"center"===w&&(D=2);D&&(d+=(f.width-(a.width||0))/D);c[g?
|
||||
"translateX":"x"]=Math.round(d);"bottom"===b?y=1:"middle"===b&&(y=2);y&&(q+=(f.height-(a.height||0))/y);c[g?"translateY":"y"]=Math.round(q);this[this.placed?"animate":"attr"](c);this.placed=!0;this.alignAttr=c;return this},getBBox:function(a,g){var w,f=this.renderer,d,q=this.element,c=this.styles,D,y=this.textStr,x,r=f.cache,G=f.cacheKeys,m;g=K(g,this.rotation);d=g*e;D=c&&c.fontSize;void 0!==y&&(m=y.toString(),-1===m.indexOf("\x3c")&&(m=m.replace(/[0-9]/g,"0")),m+=["",g||0,D,c&&c.width,c&&c.textOverflow].join());
|
||||
m&&!a&&(w=r[m]);if(!w){if(q.namespaceURI===this.SVG_NS||f.forExport){try{(x=this.fakeTS&&function(a){H(q.querySelectorAll(".highcharts-text-outline"),function(w){w.style.display=a})})&&x("none"),w=q.getBBox?b({},q.getBBox()):{width:q.offsetWidth,height:q.offsetHeight},x&&x("")}catch(X){}if(!w||0>w.width)w={width:0,height:0}}else w=this.htmlGetBBox();f.isSVG&&(a=w.width,f=w.height,c&&"11px"===c.fontSize&&17===Math.round(f)&&(w.height=f=14),g&&(w.width=Math.abs(f*Math.sin(d))+Math.abs(a*Math.cos(d)),
|
||||
w.height=Math.abs(f*Math.cos(d))+Math.abs(a*Math.sin(d))));if(m&&0<w.height){for(;250<G.length;)delete r[G.shift()];r[m]||G.push(m);r[m]=w}}return w},show:function(a){return this.attr({visibility:a?"inherit":"visible"})},hide:function(){return this.attr({visibility:"hidden"})},fadeOut:function(a){var w=this;w.animate({opacity:0},{duration:a||150,complete:function(){w.attr({y:-9999})}})},add:function(a){var w=this.renderer,g=this.element,f;a&&(this.parentGroup=a);this.parentInverted=a&&a.inverted;
|
||||
void 0!==this.textStr&&w.buildText(this);this.added=!0;if(!a||a.handleZ||this.zIndex)f=this.zIndexSetter();f||(a?a.element:w.box).appendChild(g);if(this.onAdd)this.onAdd();return this},safeRemoveChild:function(a){var w=a.parentNode;w&&w.removeChild(a)},destroy:function(){var a=this.element||{},g=this.renderer.isSVG&&"SPAN"===a.nodeName&&this.parentGroup,f,b;a.onclick=a.onmouseout=a.onmouseover=a.onmousemove=a.point=null;D(this);this.clipPath&&(this.clipPath=this.clipPath.destroy());if(this.stops){for(b=
|
||||
0;b<this.stops.length;b++)this.stops[b]=this.stops[b].destroy();this.stops=null}this.safeRemoveChild(a);for(this.destroyShadows();g&&g.div&&0===g.div.childNodes.length;)a=g.parentGroup,this.safeRemoveChild(g.div),delete g.div,g=a;this.alignTo&&m(this.renderer.alignedObjects,this);for(f in this)delete this[f];return null},shadow:function(a,g,f){var w=[],b,d,c=this.element,q,D,y,x;if(!a)this.destroyShadows();else if(!this.shadows){D=K(a.width,3);y=(a.opacity||.15)/D;x=this.parentInverted?"(-1,-1)":
|
||||
"("+K(a.offsetX,1)+", "+K(a.offsetY,1)+")";for(b=1;b<=D;b++)d=c.cloneNode(0),q=2*D+1-2*b,u(d,{isShadow:"true",stroke:a.color||"#000000","stroke-opacity":y*b,"stroke-width":q,transform:"translate"+x,fill:"none"}),f&&(u(d,"height",Math.max(u(d,"height")-q,0)),d.cutHeight=q),g?g.element.appendChild(d):c.parentNode.insertBefore(d,c),w.push(d);this.shadows=w}return this},destroyShadows:function(){H(this.shadows||[],function(a){this.safeRemoveChild(a)},this);this.shadows=void 0},xGetter:function(a){"circle"===
|
||||
this.element.nodeName&&("x"===a?a="cx":"y"===a&&(a="cy"));return this._defaultGetter(a)},_defaultGetter:function(a){a=K(this[a],this.element?this.element.getAttribute(a):null,0);/^[\-0-9\.]+$/.test(a)&&(a=parseFloat(a));return a},dSetter:function(a,g,f){a&&a.join&&(a=a.join(" "));/(NaN| {2}|^$)/.test(a)&&(a="M 0 0");f.setAttribute(g,a);this[g]=a},dashstyleSetter:function(a){var w,g=this["stroke-width"];"inherit"===g&&(g=1);if(a=a&&a.toLowerCase()){a=a.replace("shortdashdotdot","3,1,1,1,1,1,").replace("shortdashdot",
|
||||
"3,1,1,1").replace("shortdot","1,1,").replace("shortdash","3,1,").replace("longdash","8,3,").replace(/dot/g,"1,3,").replace("dash","4,3,").replace(/,$/,"").split(",");for(w=a.length;w--;)a[w]=L(a[w])*g;a=a.join(",").replace(/NaN/g,"none");this.element.setAttribute("stroke-dasharray",a)}},alignSetter:function(a){this.element.setAttribute("text-anchor",{left:"start",center:"middle",right:"end"}[a])},opacitySetter:function(a,g,f){this[g]=a;f.setAttribute(g,a)},titleSetter:function(a){var w=this.element.getElementsByTagName("title")[0];
|
||||
w||(w=p.createElementNS(this.SVG_NS,"title"),this.element.appendChild(w));w.firstChild&&w.removeChild(w.firstChild);w.appendChild(p.createTextNode(String(K(a),"").replace(/<[^>]*>/g,"")))},textSetter:function(a){a!==this.textStr&&(delete this.bBox,this.textStr=a,this.added&&this.renderer.buildText(this))},fillSetter:function(a,g,f){"string"===typeof a?f.setAttribute(g,a):a&&this.colorGradient(a,g,f)},visibilitySetter:function(a,g,f){"inherit"===a?f.removeAttribute(g):f.setAttribute(g,a)},zIndexSetter:function(a,
|
||||
g){var w=this.renderer,f=this.parentGroup,b=(f||w).element||w.box,d,c=this.element,q;d=this.added;var D;k(a)&&(c.zIndex=a,a=+a,this[g]===a&&(d=!1),this[g]=a);if(d){(a=this.zIndex)&&f&&(f.handleZ=!0);g=b.childNodes;for(D=0;D<g.length&&!q;D++)f=g[D],d=f.zIndex,f!==c&&(L(d)>a||!k(a)&&k(d)||0>a&&!k(d)&&b!==w.box)&&(b.insertBefore(c,f),q=!0);q||b.appendChild(c)}return q},_defaultSetter:function(a,g,f){f.setAttribute(g,a)}};B.prototype.yGetter=B.prototype.xGetter;B.prototype.translateXSetter=B.prototype.translateYSetter=
|
||||
B.prototype.rotationSetter=B.prototype.verticalAlignSetter=B.prototype.scaleXSetter=B.prototype.scaleYSetter=function(a,g){this[g]=a;this.doTransform=!0};B.prototype["stroke-widthSetter"]=B.prototype.strokeSetter=function(a,g,f){this[g]=a;this.stroke&&this["stroke-width"]?(B.prototype.fillSetter.call(this,this.stroke,"stroke",f),f.setAttribute("stroke-width",this["stroke-width"]),this.hasStroke=!0):"stroke-width"===g&&0===a&&this.hasStroke&&(f.removeAttribute("stroke"),this.hasStroke=!1)};z=a.SVGRenderer=
|
||||
function(){this.init.apply(this,arguments)};z.prototype={Element:B,SVG_NS:M,init:function(a,g,b,d,c,D){var w;d=this.createElement("svg").attr({version:"1.1","class":"highcharts-root"}).css(this.getStyle(d));w=d.element;a.appendChild(w);-1===a.innerHTML.indexOf("xmlns")&&u(w,"xmlns",this.SVG_NS);this.isSVG=!0;this.box=w;this.boxWrapper=d;this.alignedObjects=[];this.url=(f||q)&&p.getElementsByTagName("base").length?N.location.href.replace(/#.*?$/,"").replace(/<[^>]*>/g,"").replace(/([\('\)])/g,"\\$1").replace(/ /g,
|
||||
"%20"):"";this.createElement("desc").add().element.appendChild(p.createTextNode("Created with Highcharts 5.0.9"));this.defs=this.createElement("defs").add();this.allowHTML=D;this.forExport=c;this.gradients={};this.cache={};this.cacheKeys=[];this.imgCount=0;this.setSize(g,b,!1);var y;f&&a.getBoundingClientRect&&(g=function(){t(a,{left:0,top:0});y=a.getBoundingClientRect();t(a,{left:Math.ceil(y.left)-y.left+"px",top:Math.ceil(y.top)-y.top+"px"})},g(),this.unSubPixelFix=C(N,"resize",g))},getStyle:function(a){return this.style=
|
||||
b({fontFamily:'"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif',fontSize:"12px"},a)},setStyle:function(a){this.boxWrapper.css(this.getStyle(a))},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var a=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();c(this.gradients||{});this.gradients=null;a&&(this.defs=a.destroy());this.unSubPixelFix&&this.unSubPixelFix();return this.alignedObjects=null},createElement:function(a){var g=new this.Element;
|
||||
g.init(this,a);return g},draw:J,getRadialAttr:function(a,g){return{cx:a[0]-a[2]/2+g.cx*a[2],cy:a[1]-a[2]/2+g.cy*a[2],r:g.r*a[2]}},buildText:function(a){var g=a.element,f=this,w=f.forExport,b=K(a.textStr,"").toString(),c=-1!==b.indexOf("\x3c"),q=g.childNodes,D,y,x,r,G=u(g,"x"),m=a.styles,e=a.textWidth,l=m&&m.lineHeight,v=m&&m.textOutline,k=m&&"ellipsis"===m.textOverflow,h=m&&"nowrap"===m.whiteSpace,F=m&&m.fontSize,A,J=q.length,m=e&&!a.added&&this.box,n=function(a){var w;w=/(px|em)$/.test(a&&a.style.fontSize)?
|
||||
a.style.fontSize:F||f.style.fontSize||12;return l?L(l):f.fontMetrics(w,a.getAttribute("style")?a:g).h};A=[b,k,h,l,v,F,e].join();if(A!==a.textCache){for(a.textCache=A;J--;)g.removeChild(q[J]);c||v||k||e||-1!==b.indexOf(" ")?(D=/<.*class="([^"]+)".*>/,y=/<.*style="([^"]+)".*>/,x=/<.*href="(http[^"]+)".*>/,m&&m.appendChild(g),b=c?b.replace(/<(b|strong)>/g,'\x3cspan style\x3d"font-weight:bold"\x3e').replace(/<(i|em)>/g,'\x3cspan style\x3d"font-style:italic"\x3e').replace(/<a/g,"\x3cspan").replace(/<\/(b|strong|i|em|a)>/g,
|
||||
"\x3c/span\x3e").split(/<br.*?>/g):[b],b=d(b,function(a){return""!==a}),H(b,function(b,d){var c,q=0;b=b.replace(/^\s+|\s+$/g,"").replace(/<span/g,"|||\x3cspan").replace(/<\/span>/g,"\x3c/span\x3e|||");c=b.split("|||");H(c,function(b){if(""!==b||1===c.length){var m={},v=p.createElementNS(f.SVG_NS,"tspan"),l,F;D.test(b)&&(l=b.match(D)[1],u(v,"class",l));y.test(b)&&(F=b.match(y)[1].replace(/(;| |^)color([ :])/,"$1fill$2"),u(v,"style",F));x.test(b)&&!w&&(u(v,"onclick",'location.href\x3d"'+b.match(x)[1]+
|
||||
'"'),t(v,{cursor:"pointer"}));b=(b.replace(/<(.|\n)*?>/g,"")||" ").replace(/</g,"\x3c").replace(/>/g,"\x3e");if(" "!==b){v.appendChild(p.createTextNode(b));q?m.dx=0:d&&null!==G&&(m.x=G);u(v,m);g.appendChild(v);!q&&d&&(!S&&w&&t(v,{display:"block"}),u(v,"dy",n(v)));if(e){m=b.replace(/([^\^])-/g,"$1- ").split(" ");l=1<c.length||d||1<m.length&&!h;for(var A,H,O=[],J=n(v),K=a.rotation,L=b,P=L.length;(l||k)&&(m.length||O.length);)a.rotation=0,A=a.getBBox(!0),H=A.width,!S&&f.forExport&&(H=f.measureSpanWidth(v.firstChild.data,
|
||||
a.styles)),A=H>e,void 0===r&&(r=A),k&&r?(P/=2,""===L||!A&&.5>P?m=[]:(L=b.substring(0,L.length+(A?-1:1)*Math.ceil(P)),m=[L+(3<e?"\u2026":"")],v.removeChild(v.firstChild))):A&&1!==m.length?(v.removeChild(v.firstChild),O.unshift(m.pop())):(m=O,O=[],m.length&&!h&&(v=p.createElementNS(M,"tspan"),u(v,{dy:J,x:G}),F&&u(v,"style",F),g.appendChild(v)),H>e&&(e=H)),m.length&&v.appendChild(p.createTextNode(m.join(" ").replace(/- /g,"-")));a.rotation=K}q++}}})}),r&&a.attr("title",a.textStr),m&&m.removeChild(g),
|
||||
v&&a.applyTextOutline&&a.applyTextOutline(v)):g.appendChild(p.createTextNode(b.replace(/</g,"\x3c").replace(/>/g,"\x3e")))}},getContrast:function(a){a=n(a).rgba;return 510<a[0]+a[1]+a[2]?"#000000":"#FFFFFF"},button:function(a,g,f,d,c,q,D,m,r){var w=this.label(a,g,f,r,null,null,null,null,"button"),G=0;w.attr(x({padding:8,r:2},c));var e,v,p,l;c=x({fill:"#f7f7f7",stroke:"#cccccc","stroke-width":1,style:{color:"#333333",cursor:"pointer",fontWeight:"normal"}},c);e=c.style;delete c.style;q=x(c,{fill:"#e6e6e6"},
|
||||
q);v=q.style;delete q.style;D=x(c,{fill:"#e6ebf5",style:{color:"#000000",fontWeight:"bold"}},D);p=D.style;delete D.style;m=x(c,{style:{color:"#cccccc"}},m);l=m.style;delete m.style;C(w.element,y?"mouseover":"mouseenter",function(){3!==G&&w.setState(1)});C(w.element,y?"mouseout":"mouseleave",function(){3!==G&&w.setState(G)});w.setState=function(a){1!==a&&(w.state=G=a);w.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/).addClass("highcharts-button-"+["normal","hover","pressed","disabled"][a||
|
||||
0]);w.attr([c,q,D,m][a||0]).css([e,v,p,l][a||0])};w.attr(c).css(b({cursor:"default"},e));return w.on("click",function(a){3!==G&&d.call(w,a)})},crispLine:function(a,g){a[1]===a[4]&&(a[1]=a[4]=Math.round(a[1])-g%2/2);a[2]===a[5]&&(a[2]=a[5]=Math.round(a[2])+g%2/2);return a},path:function(a){var g={fill:"none"};v(a)?g.d=a:G(a)&&b(g,a);return this.createElement("path").attr(g)},circle:function(a,g,f){a=G(a)?a:{x:a,y:g,r:f};g=this.createElement("circle");g.xSetter=g.ySetter=function(a,g,f){f.setAttribute("c"+
|
||||
g,a)};return g.attr(a)},arc:function(a,g,f,b,d,c){G(a)?(b=a,g=b.y,f=b.r,a=b.x):b={innerR:b,start:d,end:c};a=this.symbol("arc",a,g,f,f,b);a.r=f;return a},rect:function(a,g,f,b,d,c){d=G(a)?a.r:d;var w=this.createElement("rect");a=G(a)?a:void 0===a?{}:{x:a,y:g,width:Math.max(f,0),height:Math.max(b,0)};void 0!==c&&(a.strokeWidth=c,a=w.crisp(a));a.fill="none";d&&(a.r=d);w.rSetter=function(a,g,f){u(f,{rx:a,ry:a})};return w.attr(a)},setSize:function(a,g,f){var b=this.alignedObjects,d=b.length;this.width=
|
||||
a;this.height=g;for(this.boxWrapper.animate({width:a,height:g},{step:function(){this.attr({viewBox:"0 0 "+this.attr("width")+" "+this.attr("height")})},duration:K(f,!0)?void 0:0});d--;)b[d].align()},g:function(a){var g=this.createElement("g");return a?g.attr({"class":"highcharts-"+a}):g},image:function(a,g,f,d,c){var w={preserveAspectRatio:"none"};1<arguments.length&&b(w,{x:g,y:f,width:d,height:c});w=this.createElement("image").attr(w);w.element.setAttributeNS?w.element.setAttributeNS("http://www.w3.org/1999/xlink",
|
||||
"href",a):w.element.setAttribute("hc-svg-href",a);return w},symbol:function(a,g,f,d,c,q){var w=this,D,y=this.symbols[a],m=k(g)&&y&&this.symbols[a](Math.round(g),Math.round(f),d,c,q),x=/^url\((.*?)\)$/,G,r;y?(D=this.path(m),D.attr("fill","none"),b(D,{symbolName:a,x:g,y:f,width:d,height:c}),q&&b(D,q)):x.test(a)&&(G=a.match(x)[1],D=this.image(G),D.imgwidth=K(R[G]&&R[G].width,q&&q.width),D.imgheight=K(R[G]&&R[G].height,q&&q.height),r=function(){D.attr({width:D.width,height:D.height})},H(["width","height"],
|
||||
function(a){D[a+"Setter"]=function(a,g){var f={},b=this["img"+g],d="width"===g?"translateX":"translateY";this[g]=a;k(b)&&(this.element&&this.element.setAttribute(g,b),this.alignByTranslate||(f[d]=((this[g]||0)-b)/2,this.attr(f)))}}),k(g)&&D.attr({x:g,y:f}),D.isImg=!0,k(D.imgwidth)&&k(D.imgheight)?r():(D.attr({width:0,height:0}),l("img",{onload:function(){var a=h[w.chartIndex];0===this.width&&(t(this,{position:"absolute",top:"-999em"}),p.body.appendChild(this));R[G]={width:this.width,height:this.height};
|
||||
D.imgwidth=this.width;D.imgheight=this.height;D.element&&r();this.parentNode&&this.parentNode.removeChild(this);w.imgCount--;if(!w.imgCount&&a&&a.onload)a.onload()},src:G}),this.imgCount++));return D},symbols:{circle:function(a,g,f,b){return this.arc(a+f/2,g+b/2,f/2,b/2,{start:0,end:2*Math.PI,open:!1})},square:function(a,g,f,b){return["M",a,g,"L",a+f,g,a+f,g+b,a,g+b,"Z"]},triangle:function(a,g,f,b){return["M",a+f/2,g,"L",a+f,g+b,a,g+b,"Z"]},"triangle-down":function(a,g,f,b){return["M",a,g,"L",a+f,
|
||||
g,a+f/2,g+b,"Z"]},diamond:function(a,g,f,b){return["M",a+f/2,g,"L",a+f,g+b/2,a+f/2,g+b,a,g+b/2,"Z"]},arc:function(a,g,f,b,d){var c=d.start,w=d.r||f,q=d.r||b||f,D=d.end-.001;f=d.innerR;b=d.open;var y=Math.cos(c),m=Math.sin(c),x=Math.cos(D),D=Math.sin(D);d=d.end-c<Math.PI?0:1;w=["M",a+w*y,g+q*m,"A",w,q,0,d,1,a+w*x,g+q*D];k(f)&&w.push(b?"M":"L",a+f*x,g+f*D,"A",f,f,0,d,0,a+f*y,g+f*m);w.push(b?"":"Z");return w},callout:function(a,g,f,b,d){var c=Math.min(d&&d.r||0,f,b),q=c+6,D=d&&d.anchorX;d=d&&d.anchorY;
|
||||
var w;w=["M",a+c,g,"L",a+f-c,g,"C",a+f,g,a+f,g,a+f,g+c,"L",a+f,g+b-c,"C",a+f,g+b,a+f,g+b,a+f-c,g+b,"L",a+c,g+b,"C",a,g+b,a,g+b,a,g+b-c,"L",a,g+c,"C",a,g,a,g,a+c,g];D&&D>f?d>g+q&&d<g+b-q?w.splice(13,3,"L",a+f,d-6,a+f+6,d,a+f,d+6,a+f,g+b-c):w.splice(13,3,"L",a+f,b/2,D,d,a+f,b/2,a+f,g+b-c):D&&0>D?d>g+q&&d<g+b-q?w.splice(33,3,"L",a,d+6,a-6,d,a,d-6,a,g+c):w.splice(33,3,"L",a,b/2,D,d,a,b/2,a,g+c):d&&d>b&&D>a+q&&D<a+f-q?w.splice(23,3,"L",D+6,g+b,D,g+b+6,D-6,g+b,a+c,g+b):d&&0>d&&D>a+q&&D<a+f-q&&w.splice(3,
|
||||
3,"L",D-6,g,D,g-6,D+6,g,f-c,g);return w}},clipRect:function(g,f,b,d){var c=a.uniqueKey(),q=this.createElement("clipPath").attr({id:c}).add(this.defs);g=this.rect(g,f,b,d,0).add(q);g.id=c;g.clipPath=q;g.count=0;return g},text:function(a,g,f,b){var d=!S&&this.forExport,c={};if(b&&(this.allowHTML||!this.forExport))return this.html(a,g,f);c.x=Math.round(g||0);f&&(c.y=Math.round(f));if(a||0===a)c.text=a;a=this.createElement("text").attr(c);d&&a.css({position:"absolute"});b||(a.xSetter=function(a,g,f){var b=
|
||||
f.getElementsByTagName("tspan"),d,c=f.getAttribute(g),q;for(q=0;q<b.length;q++)d=b[q],d.getAttribute(g)===c&&d.setAttribute(g,a);f.setAttribute(g,a)});return a},fontMetrics:function(a,g){a=a||g&&g.style&&g.style.fontSize||this.style&&this.style.fontSize;a=/px/.test(a)?L(a):/em/.test(a)?parseFloat(a)*(g?this.fontMetrics(null,g.parentNode).f:16):12;g=24>a?a+3:Math.round(1.2*a);return{h:g,b:Math.round(.8*g),f:a}},rotCorr:function(a,g,f){var b=a;g&&f&&(b=Math.max(b*Math.cos(g*e),4));return{x:-a/3*Math.sin(g*
|
||||
e),y:b}},label:function(f,d,c,q,D,y,m,G,r){var w=this,e=w.g("button"!==r&&"label"),v=e.text=w.text("",0,0,m).attr({zIndex:1}),p,l,F=0,A=3,h=0,J,t,S,n,M,K={},L,u,O=/^url\((.*?)\)$/.test(q),R=O,P,Q,N,U;r&&e.addClass("highcharts-"+r);R=O;P=function(){return(L||0)%2/2};Q=function(){var a=v.element.style,g={};l=(void 0===J||void 0===t||M)&&k(v.textStr)&&v.getBBox();e.width=(J||l.width||0)+2*A+h;e.height=(t||l.height||0)+2*A;u=A+w.fontMetrics(a&&a.fontSize,v).b;R&&(p||(e.box=p=w.symbols[q]||O?w.symbol(q):
|
||||
w.rect(),p.addClass(("button"===r?"":"highcharts-label-box")+(r?" highcharts-"+r+"-box":"")),p.add(e),a=P(),g.x=a,g.y=(G?-u:0)+a),g.width=Math.round(e.width),g.height=Math.round(e.height),p.attr(b(g,K)),K={})};N=function(){var a=h+A,g;g=G?0:u;k(J)&&l&&("center"===M||"right"===M)&&(a+={center:.5,right:1}[M]*(J-l.width));if(a!==v.x||g!==v.y)v.attr("x",a),void 0!==g&&v.attr("y",g);v.x=a;v.y=g};U=function(a,g){p?p.attr(a,g):K[a]=g};e.onAdd=function(){v.add(e);e.attr({text:f||0===f?f:"",x:d,y:c});p&&k(D)&&
|
||||
e.attr({anchorX:D,anchorY:y})};e.widthSetter=function(g){J=a.isNumber(g)?g:null};e.heightSetter=function(a){t=a};e["text-alignSetter"]=function(a){M=a};e.paddingSetter=function(a){k(a)&&a!==A&&(A=e.padding=a,N())};e.paddingLeftSetter=function(a){k(a)&&a!==h&&(h=a,N())};e.alignSetter=function(a){a={left:0,center:.5,right:1}[a];a!==F&&(F=a,l&&e.attr({x:S}))};e.textSetter=function(a){void 0!==a&&v.textSetter(a);Q();N()};e["stroke-widthSetter"]=function(a,g){a&&(R=!0);L=this["stroke-width"]=a;U(g,a)};
|
||||
e.strokeSetter=e.fillSetter=e.rSetter=function(a,g){"fill"===g&&a&&(R=!0);U(g,a)};e.anchorXSetter=function(a,g){D=a;U(g,Math.round(a)-P()-S)};e.anchorYSetter=function(a,g){y=a;U(g,a-n)};e.xSetter=function(a){e.x=a;F&&(a-=F*((J||l.width)+2*A));S=Math.round(a);e.attr("translateX",S)};e.ySetter=function(a){n=e.y=Math.round(a);e.attr("translateY",n)};var W=e.css;return b(e,{css:function(a){if(a){var g={};a=x(a);H(e.textProps,function(f){void 0!==a[f]&&(g[f]=a[f],delete a[f])});v.css(g)}return W.call(e,
|
||||
a)},getBBox:function(){return{width:l.width+2*A,height:l.height+2*A,x:l.x-A,y:l.y-A}},shadow:function(a){a&&(Q(),p&&p.shadow(a));return e},destroy:function(){g(e.element,"mouseenter");g(e.element,"mouseleave");v&&(v=v.destroy());p&&(p=p.destroy());B.prototype.destroy.call(e);e=w=Q=N=U=null}})}};a.Renderer=z})(I);(function(a){var B=a.attr,z=a.createElement,C=a.css,E=a.defined,u=a.each,h=a.extend,n=a.isFirefox,t=a.isMS,l=a.isWebKit,k=a.pInt,e=a.SVGRenderer,c=a.win,p=a.wrap;h(a.SVGElement.prototype,
|
||||
{htmlCss:function(a){var b=this.element;if(b=a&&"SPAN"===b.tagName&&a.width)delete a.width,this.textWidth=b,this.updateTransform();a&&"ellipsis"===a.textOverflow&&(a.whiteSpace="nowrap",a.overflow="hidden");this.styles=h(this.styles,a);C(this.element,a);return this},htmlGetBBox:function(){var a=this.element;"text"===a.nodeName&&(a.style.position="absolute");return{x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}},htmlUpdateTransform:function(){if(this.added){var a=this.renderer,
|
||||
b=this.element,c=this.translateX||0,d=this.translateY||0,e=this.x||0,p=this.y||0,v=this.textAlign||"left",f={left:0,center:.5,right:1}[v],y=this.styles;C(b,{marginLeft:c,marginTop:d});this.shadows&&u(this.shadows,function(a){C(a,{marginLeft:c+1,marginTop:d+1})});this.inverted&&u(b.childNodes,function(f){a.invertChild(f,b)});if("SPAN"===b.tagName){var G=this.rotation,F=k(this.textWidth),q=y&&y.whiteSpace,x=[G,v,b.innerHTML,this.textWidth,this.textAlign].join();x!==this.cTT&&(y=a.fontMetrics(b.style.fontSize).b,
|
||||
E(G)&&this.setSpanRotation(G,f,y),C(b,{width:"",whiteSpace:q||"nowrap"}),b.offsetWidth>F&&/[ \-]/.test(b.textContent||b.innerText)&&C(b,{width:F+"px",display:"block",whiteSpace:q||"normal"}),this.getSpanCorrection(b.offsetWidth,y,f,G,v));C(b,{left:e+(this.xCorr||0)+"px",top:p+(this.yCorr||0)+"px"});l&&(y=b.offsetHeight);this.cTT=x}}else this.alignOnAdd=!0},setSpanRotation:function(a,b,e){var d={},m=t?"-ms-transform":l?"-webkit-transform":n?"MozTransform":c.opera?"-o-transform":"";d[m]=d.transform=
|
||||
"rotate("+a+"deg)";d[m+(n?"Origin":"-origin")]=d.transformOrigin=100*b+"% "+e+"px";C(this.element,d)},getSpanCorrection:function(a,b,c){this.xCorr=-a*c;this.yCorr=-b}});h(e.prototype,{html:function(a,b,c){var d=this.createElement("span"),e=d.element,m=d.renderer,v=m.isSVG,f=function(a,f){u(["opacity","visibility"],function(b){p(a,b+"Setter",function(a,b,d,c){a.call(this,b,d,c);f[d]=b})})};d.textSetter=function(a){a!==e.innerHTML&&delete this.bBox;e.innerHTML=this.textStr=a;d.htmlUpdateTransform()};
|
||||
v&&f(d,d.element.style);d.xSetter=d.ySetter=d.alignSetter=d.rotationSetter=function(a,f){"align"===f&&(f="textAlign");d[f]=a;d.htmlUpdateTransform()};d.attr({text:a,x:Math.round(b),y:Math.round(c)}).css({fontFamily:this.style.fontFamily,fontSize:this.style.fontSize,position:"absolute"});e.style.whiteSpace="nowrap";d.css=d.htmlCss;v&&(d.add=function(a){var b,c=m.box.parentNode,q=[];if(this.parentGroup=a){if(b=a.div,!b){for(;a;)q.push(a),a=a.parentGroup;u(q.reverse(),function(a){var y,e=B(a.element,
|
||||
"class");e&&(e={className:e});b=a.div=a.div||z("div",e,{position:"absolute",left:(a.translateX||0)+"px",top:(a.translateY||0)+"px",display:a.display,opacity:a.opacity,pointerEvents:a.styles&&a.styles.pointerEvents},b||c);y=b.style;h(a,{on:function(){d.on.apply({element:q[0].div},arguments);return a},translateXSetter:function(f,g){y.left=f+"px";a[g]=f;a.doTransform=!0},translateYSetter:function(f,g){y.top=f+"px";a[g]=f;a.doTransform=!0}});f(a,y)})}}else b=c;b.appendChild(e);d.added=!0;d.alignOnAdd&&
|
||||
d.htmlUpdateTransform();return d});return d}})})(I);(function(a){var B,z,C=a.createElement,E=a.css,u=a.defined,h=a.deg2rad,n=a.discardElement,t=a.doc,l=a.each,k=a.erase,e=a.extend;B=a.extendClass;var c=a.isArray,p=a.isNumber,H=a.isObject,b=a.merge;z=a.noop;var m=a.pick,d=a.pInt,r=a.SVGElement,A=a.SVGRenderer,v=a.win;a.svg||(z={docMode8:t&&8===t.documentMode,init:function(a,b){var f=["\x3c",b,' filled\x3d"f" stroked\x3d"f"'],d=["position: ","absolute",";"],c="div"===b;("shape"===b||c)&&d.push("left:0;top:0;width:1px;height:1px;");
|
||||
d.push("visibility: ",c?"hidden":"visible");f.push(' style\x3d"',d.join(""),'"/\x3e');b&&(f=c||"span"===b||"img"===b?f.join(""):a.prepVML(f),this.element=C(f));this.renderer=a},add:function(a){var f=this.renderer,b=this.element,d=f.box,c=a&&a.inverted,d=a?a.element||a:d;a&&(this.parentGroup=a);c&&f.invertChild(b,d);d.appendChild(b);this.added=!0;this.alignOnAdd&&!this.deferUpdateTransform&&this.updateTransform();if(this.onAdd)this.onAdd();this.className&&this.attr("class",this.className);return this},
|
||||
updateTransform:r.prototype.htmlUpdateTransform,setSpanRotation:function(){var a=this.rotation,b=Math.cos(a*h),d=Math.sin(a*h);E(this.element,{filter:a?["progid:DXImageTransform.Microsoft.Matrix(M11\x3d",b,", M12\x3d",-d,", M21\x3d",d,", M22\x3d",b,", sizingMethod\x3d'auto expand')"].join(""):"none"})},getSpanCorrection:function(a,b,d,c,q){var f=c?Math.cos(c*h):1,e=c?Math.sin(c*h):0,y=m(this.elemHeight,this.element.offsetHeight),r;this.xCorr=0>f&&-a;this.yCorr=0>e&&-y;r=0>f*e;this.xCorr+=e*b*(r?1-
|
||||
d:d);this.yCorr-=f*b*(c?r?d:1-d:1);q&&"left"!==q&&(this.xCorr-=a*d*(0>f?-1:1),c&&(this.yCorr-=y*d*(0>e?-1:1)),E(this.element,{textAlign:q}))},pathToVML:function(a){for(var f=a.length,b=[];f--;)p(a[f])?b[f]=Math.round(10*a[f])-5:"Z"===a[f]?b[f]="x":(b[f]=a[f],!a.isArc||"wa"!==a[f]&&"at"!==a[f]||(b[f+5]===b[f+7]&&(b[f+7]+=a[f+7]>a[f+5]?1:-1),b[f+6]===b[f+8]&&(b[f+8]+=a[f+8]>a[f+6]?1:-1)));return b.join(" ")||"x"},clip:function(a){var f=this,b;a?(b=a.members,k(b,f),b.push(f),f.destroyClip=function(){k(b,
|
||||
f)},a=a.getCSS(f)):(f.destroyClip&&f.destroyClip(),a={clip:f.docMode8?"inherit":"rect(auto)"});return f.css(a)},css:r.prototype.htmlCss,safeRemoveChild:function(a){a.parentNode&&n(a)},destroy:function(){this.destroyClip&&this.destroyClip();return r.prototype.destroy.apply(this)},on:function(a,b){this.element["on"+a]=function(){var a=v.event;a.target=a.srcElement;b(a)};return this},cutOffPath:function(a,b){var f;a=a.split(/[ ,]/);f=a.length;if(9===f||11===f)a[f-4]=a[f-2]=d(a[f-2])-10*b;return a.join(" ")},
|
||||
shadow:function(a,b,c){var f=[],q,e=this.element,y=this.renderer,r,v=e.style,g,D=e.path,p,l,G,k;D&&"string"!==typeof D.value&&(D="x");l=D;if(a){G=m(a.width,3);k=(a.opacity||.15)/G;for(q=1;3>=q;q++)p=2*G+1-2*q,c&&(l=this.cutOffPath(D.value,p+.5)),g=['\x3cshape isShadow\x3d"true" strokeweight\x3d"',p,'" filled\x3d"false" path\x3d"',l,'" coordsize\x3d"10 10" style\x3d"',e.style.cssText,'" /\x3e'],r=C(y.prepVML(g),null,{left:d(v.left)+m(a.offsetX,1),top:d(v.top)+m(a.offsetY,1)}),c&&(r.cutOff=p+1),g=['\x3cstroke color\x3d"',
|
||||
a.color||"#000000",'" opacity\x3d"',k*q,'"/\x3e'],C(y.prepVML(g),null,null,r),b?b.element.appendChild(r):e.parentNode.insertBefore(r,e),f.push(r);this.shadows=f}return this},updateShadows:z,setAttr:function(a,b){this.docMode8?this.element[a]=b:this.element.setAttribute(a,b)},classSetter:function(a){(this.added?this.element:this).className=a},dashstyleSetter:function(a,b,d){(d.getElementsByTagName("stroke")[0]||C(this.renderer.prepVML(["\x3cstroke/\x3e"]),null,null,d))[b]=a||"solid";this[b]=a},dSetter:function(a,
|
||||
b,d){var f=this.shadows;a=a||[];this.d=a.join&&a.join(" ");d.path=a=this.pathToVML(a);if(f)for(d=f.length;d--;)f[d].path=f[d].cutOff?this.cutOffPath(a,f[d].cutOff):a;this.setAttr(b,a)},fillSetter:function(a,b,d){var f=d.nodeName;"SPAN"===f?d.style.color=a:"IMG"!==f&&(d.filled="none"!==a,this.setAttr("fillcolor",this.renderer.color(a,d,b,this)))},"fill-opacitySetter":function(a,b,d){C(this.renderer.prepVML(["\x3c",b.split("-")[0],' opacity\x3d"',a,'"/\x3e']),null,null,d)},opacitySetter:z,rotationSetter:function(a,
|
||||
b,d){d=d.style;this[b]=d[b]=a;d.left=-Math.round(Math.sin(a*h)+1)+"px";d.top=Math.round(Math.cos(a*h))+"px"},strokeSetter:function(a,b,d){this.setAttr("strokecolor",this.renderer.color(a,d,b,this))},"stroke-widthSetter":function(a,b,d){d.stroked=!!a;this[b]=a;p(a)&&(a+="px");this.setAttr("strokeweight",a)},titleSetter:function(a,b){this.setAttr(b,a)},visibilitySetter:function(a,b,d){"inherit"===a&&(a="visible");this.shadows&&l(this.shadows,function(f){f.style[b]=a});"DIV"===d.nodeName&&(a="hidden"===
|
||||
a?"-999em":0,this.docMode8||(d.style[b]=a?"visible":"hidden"),b="top");d.style[b]=a},xSetter:function(a,b,d){this[b]=a;"x"===b?b="left":"y"===b&&(b="top");this.updateClipping?(this[b]=a,this.updateClipping()):d.style[b]=a},zIndexSetter:function(a,b,d){d.style[b]=a}},z["stroke-opacitySetter"]=z["fill-opacitySetter"],a.VMLElement=z=B(r,z),z.prototype.ySetter=z.prototype.widthSetter=z.prototype.heightSetter=z.prototype.xSetter,z={Element:z,isIE8:-1<v.navigator.userAgent.indexOf("MSIE 8.0"),init:function(a,
|
||||
b,d){var f,c;this.alignedObjects=[];f=this.createElement("div").css({position:"relative"});c=f.element;a.appendChild(f.element);this.isVML=!0;this.box=c;this.boxWrapper=f;this.gradients={};this.cache={};this.cacheKeys=[];this.imgCount=0;this.setSize(b,d,!1);if(!t.namespaces.hcv){t.namespaces.add("hcv","urn:schemas-microsoft-com:vml");try{t.createStyleSheet().cssText="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "}catch(x){t.styleSheets[0].cssText+=
|
||||
"hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "}}},isHidden:function(){return!this.box.offsetWidth},clipRect:function(a,b,d,c){var f=this.createElement(),m=H(a);return e(f,{members:[],count:0,left:(m?a.x:a)+1,top:(m?a.y:b)+1,width:(m?a.width:d)-1,height:(m?a.height:c)-1,getCSS:function(a){var b=a.element,d=b.nodeName,g=a.inverted,f=this.top-("shape"===d?b.offsetTop:0),c=this.left,b=c+this.width,q=f+this.height,f={clip:"rect("+Math.round(g?
|
||||
c:f)+"px,"+Math.round(g?q:b)+"px,"+Math.round(g?b:q)+"px,"+Math.round(g?f:c)+"px)"};!g&&a.docMode8&&"DIV"===d&&e(f,{width:b+"px",height:q+"px"});return f},updateClipping:function(){l(f.members,function(a){a.element&&a.css(f.getCSS(a))})}})},color:function(b,d,c,e){var f=this,m,r=/^rgba/,v,p,g="none";b&&b.linearGradient?p="gradient":b&&b.radialGradient&&(p="pattern");if(p){var D,y,k=b.linearGradient||b.radialGradient,A,h,w,G,t,F="";b=b.stops;var n,H=[],u=function(){v=['\x3cfill colors\x3d"'+H.join(",")+
|
||||
'" opacity\x3d"',w,'" o:opacity2\x3d"',h,'" type\x3d"',p,'" ',F,'focus\x3d"100%" method\x3d"any" /\x3e'];C(f.prepVML(v),null,null,d)};A=b[0];n=b[b.length-1];0<A[0]&&b.unshift([0,A[1]]);1>n[0]&&b.push([1,n[1]]);l(b,function(g,b){r.test(g[1])?(m=a.color(g[1]),D=m.get("rgb"),y=m.get("a")):(D=g[1],y=1);H.push(100*g[0]+"% "+D);b?(w=y,G=D):(h=y,t=D)});if("fill"===c)if("gradient"===p)c=k.x1||k[0]||0,b=k.y1||k[1]||0,A=k.x2||k[2]||0,k=k.y2||k[3]||0,F='angle\x3d"'+(90-180*Math.atan((k-b)/(A-c))/Math.PI)+'"',
|
||||
u();else{var g=k.r,z=2*g,B=2*g,E=k.cx,V=k.cy,I=d.radialReference,T,g=function(){I&&(T=e.getBBox(),E+=(I[0]-T.x)/T.width-.5,V+=(I[1]-T.y)/T.height-.5,z*=I[2]/T.width,B*=I[2]/T.height);F='src\x3d"'+a.getOptions().global.VMLRadialGradientURL+'" size\x3d"'+z+","+B+'" origin\x3d"0.5,0.5" position\x3d"'+E+","+V+'" color2\x3d"'+t+'" ';u()};e.added?g():e.onAdd=g;g=G}else g=D}else r.test(b)&&"IMG"!==d.tagName?(m=a.color(b),e[c+"-opacitySetter"](m.get("a"),c,d),g=m.get("rgb")):(g=d.getElementsByTagName(c),
|
||||
g.length&&(g[0].opacity=1,g[0].type="solid"),g=b);return g},prepVML:function(a){var b=this.isIE8;a=a.join("");b?(a=a.replace("/\x3e",' xmlns\x3d"urn:schemas-microsoft-com:vml" /\x3e'),a=-1===a.indexOf('style\x3d"')?a.replace("/\x3e",' style\x3d"display:inline-block;behavior:url(#default#VML);" /\x3e'):a.replace('style\x3d"','style\x3d"display:inline-block;behavior:url(#default#VML);')):a=a.replace("\x3c","\x3chcv:");return a},text:A.prototype.html,path:function(a){var b={coordsize:"10 10"};c(a)?b.d=
|
||||
a:H(a)&&e(b,a);return this.createElement("shape").attr(b)},circle:function(a,b,d){var f=this.symbol("circle");H(a)&&(d=a.r,b=a.y,a=a.x);f.isCircle=!0;f.r=d;return f.attr({x:a,y:b})},g:function(a){var b;a&&(b={className:"highcharts-"+a,"class":"highcharts-"+a});return this.createElement("div").attr(b)},image:function(a,b,d,c,q){var f=this.createElement("img").attr({src:a});1<arguments.length&&f.attr({x:b,y:d,width:c,height:q});return f},createElement:function(a){return"rect"===a?this.symbol(a):A.prototype.createElement.call(this,
|
||||
a)},invertChild:function(a,b){var f=this;b=b.style;var c="IMG"===a.tagName&&a.style;E(a,{flip:"x",left:d(b.width)-(c?d(c.top):1),top:d(b.height)-(c?d(c.left):1),rotation:-90});l(a.childNodes,function(b){f.invertChild(b,a)})},symbols:{arc:function(a,b,d,c,q){var f=q.start,e=q.end,m=q.r||d||c;d=q.innerR;c=Math.cos(f);var r=Math.sin(f),g=Math.cos(e),D=Math.sin(e);if(0===e-f)return["x"];f=["wa",a-m,b-m,a+m,b+m,a+m*c,b+m*r,a+m*g,b+m*D];q.open&&!d&&f.push("e","M",a,b);f.push("at",a-d,b-d,a+d,b+d,a+d*g,
|
||||
b+d*D,a+d*c,b+d*r,"x","e");f.isArc=!0;return f},circle:function(a,b,d,c,q){q&&u(q.r)&&(d=c=2*q.r);q&&q.isCircle&&(a-=d/2,b-=c/2);return["wa",a,b,a+d,b+c,a+d,b+c/2,a+d,b+c/2,"e"]},rect:function(a,b,d,c,q){return A.prototype.symbols[u(q)&&q.r?"callout":"square"].call(0,a,b,d,c,q)}}},a.VMLRenderer=B=function(){this.init.apply(this,arguments)},B.prototype=b(A.prototype,z),a.Renderer=B);A.prototype.measureSpanWidth=function(a,b){var d=t.createElement("span");a=t.createTextNode(a);d.appendChild(a);E(d,
|
||||
b);this.box.appendChild(d);b=d.offsetWidth;n(d);return b}})(I);(function(a){function B(){var l=a.defaultOptions.global,k=t.moment;if(l.timezone){if(k)return function(a){return-k.tz(a,l.timezone).utcOffset()};a.error(25)}return l.useUTC&&l.getTimezoneOffset}function z(){var l=a.defaultOptions.global,k,e=l.useUTC,c=e?"getUTC":"get",p=e?"setUTC":"set";a.Date=k=l.Date||t.Date;k.hcTimezoneOffset=e&&l.timezoneOffset;k.hcGetTimezoneOffset=B();k.hcMakeTime=function(a,b,c,d,r,p){var m;e?(m=k.UTC.apply(0,arguments),
|
||||
m+=u(m)):m=(new k(a,b,n(c,1),n(d,0),n(r,0),n(p,0))).getTime();return m};E("Minutes Hours Day Date Month FullYear".split(" "),function(a){k["hcGet"+a]=c+a});E("Milliseconds Seconds Minutes Hours Date Month FullYear".split(" "),function(a){k["hcSet"+a]=p+a})}var C=a.color,E=a.each,u=a.getTZOffset,h=a.merge,n=a.pick,t=a.win;a.defaultOptions={colors:"#7cb5ec #434348 #90ed7d #f7a35c #8085e9 #f15c80 #e4d354 #2b908f #f45b5b #91e8e1".split(" "),symbols:["circle","diamond","square","triangle","triangle-down"],
|
||||
lang:{loading:"Loading...",months:"January February March April May June July August September October November December".split(" "),shortMonths:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),weekdays:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),decimalPoint:".",numericSymbols:"kMGTPE".split(""),resetZoom:"Reset zoom",resetZoomTitle:"Reset zoom level 1:1",thousandsSep:" "},global:{useUTC:!0,VMLRadialGradientURL:"http://code.highcharts.com/5.0.9/gfx/vml-radial-gradient.png"},
|
||||
chart:{borderRadius:0,defaultSeriesType:"line",ignoreHiddenSeries:!0,spacing:[10,10,15,10],resetZoomButton:{theme:{zIndex:20},position:{align:"right",x:-10,y:10}},width:null,height:null,borderColor:"#335cad",backgroundColor:"#ffffff",plotBorderColor:"#cccccc"},title:{text:"Chart title",align:"center",margin:15,widthAdjust:-44},subtitle:{text:"",align:"center",widthAdjust:-44},plotOptions:{},labels:{style:{position:"absolute",color:"#333333"}},legend:{enabled:!0,align:"center",layout:"horizontal",
|
||||
labelFormatter:function(){return this.name},borderColor:"#999999",borderRadius:0,navigation:{activeColor:"#003399",inactiveColor:"#cccccc"},itemStyle:{color:"#333333",fontSize:"12px",fontWeight:"bold"},itemHoverStyle:{color:"#000000"},itemHiddenStyle:{color:"#cccccc"},shadow:!1,itemCheckboxStyle:{position:"absolute",width:"13px",height:"13px"},squareSymbol:!0,symbolPadding:5,verticalAlign:"bottom",x:0,y:0,title:{style:{fontWeight:"bold"}}},loading:{labelStyle:{fontWeight:"bold",position:"relative",
|
||||
top:"45%"},style:{position:"absolute",backgroundColor:"#ffffff",opacity:.5,textAlign:"center"}},tooltip:{enabled:!0,animation:a.svg,borderRadius:3,dateTimeLabelFormats:{millisecond:"%A, %b %e, %H:%M:%S.%L",second:"%A, %b %e, %H:%M:%S",minute:"%A, %b %e, %H:%M",hour:"%A, %b %e, %H:%M",day:"%A, %b %e, %Y",week:"Week from %A, %b %e, %Y",month:"%B %Y",year:"%Y"},footerFormat:"",padding:8,snap:a.isTouchDevice?25:10,backgroundColor:C("#f7f7f7").setOpacity(.85).get(),borderWidth:1,headerFormat:'\x3cspan style\x3d"font-size: 10px"\x3e{point.key}\x3c/span\x3e\x3cbr/\x3e',
|
||||
pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.y}\x3c/b\x3e\x3cbr/\x3e',shadow:!0,style:{color:"#333333",cursor:"default",fontSize:"12px",pointerEvents:"none",whiteSpace:"nowrap"}},credits:{enabled:!0,href:"http://www.highcharts.com",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",color:"#999999",fontSize:"9px"},text:"Highcharts.com"}};a.setOptions=function(l){a.defaultOptions=h(!0,a.defaultOptions,l);z();
|
||||
return a.defaultOptions};a.getOptions=function(){return a.defaultOptions};a.defaultPlotOptions=a.defaultOptions.plotOptions;z()})(I);(function(a){var B=a.arrayMax,z=a.arrayMin,C=a.defined,E=a.destroyObjectProperties,u=a.each,h=a.erase,n=a.merge,t=a.pick;a.PlotLineOrBand=function(a,k){this.axis=a;k&&(this.options=k,this.id=k.id)};a.PlotLineOrBand.prototype={render:function(){var a=this,k=a.axis,e=k.horiz,c=a.options,p=c.label,h=a.label,b=c.to,m=c.from,d=c.value,r=C(m)&&C(b),A=C(d),v=a.svgElem,f=!v,
|
||||
y=[],G,F=c.color,q=t(c.zIndex,0),x=c.events,y={"class":"highcharts-plot-"+(r?"band ":"line ")+(c.className||"")},J={},u=k.chart.renderer,L=r?"bands":"lines",g=k.log2lin;k.isLog&&(m=g(m),b=g(b),d=g(d));A?(y={stroke:F,"stroke-width":c.width},c.dashStyle&&(y.dashstyle=c.dashStyle)):r&&(F&&(y.fill=F),c.borderWidth&&(y.stroke=c.borderColor,y["stroke-width"]=c.borderWidth));J.zIndex=q;L+="-"+q;(F=k[L])||(k[L]=F=u.g("plot-"+L).attr(J).add());f&&(a.svgElem=v=u.path().attr(y).add(F));if(A)y=k.getPlotLinePath(d,
|
||||
v.strokeWidth());else if(r)y=k.getPlotBandPath(m,b,c);else return;if(f&&y&&y.length){if(v.attr({d:y}),x)for(G in c=function(b){v.on(b,function(g){x[b].apply(a,[g])})},x)c(G)}else v&&(y?(v.show(),v.animate({d:y})):(v.hide(),h&&(a.label=h=h.destroy())));p&&C(p.text)&&y&&y.length&&0<k.width&&0<k.height&&!y.flat?(p=n({align:e&&r&&"center",x:e?!r&&4:10,verticalAlign:!e&&r&&"middle",y:e?r?16:10:r?6:-4,rotation:e&&!r&&90},p),this.renderLabel(p,y,r,q)):h&&h.hide();return a},renderLabel:function(a,k,e,c){var p=
|
||||
this.label,l=this.axis.chart.renderer;p||(p={align:a.textAlign||a.align,rotation:a.rotation,"class":"highcharts-plot-"+(e?"band":"line")+"-label "+(a.className||"")},p.zIndex=c,this.label=p=l.text(a.text,0,0,a.useHTML).attr(p).add(),p.css(a.style));c=[k[1],k[4],e?k[6]:k[1]];k=[k[2],k[5],e?k[7]:k[2]];e=z(c);l=z(k);p.align(a,!1,{x:e,y:l,width:B(c)-e,height:B(k)-l});p.show()},destroy:function(){h(this.axis.plotLinesAndBands,this);delete this.axis;E(this)}};a.AxisPlotLineOrBandExtension={getPlotBandPath:function(a,
|
||||
k){k=this.getPlotLinePath(k,null,null,!0);(a=this.getPlotLinePath(a,null,null,!0))&&k?(a.flat=a.toString()===k.toString(),a.push(k[4],k[5],k[1],k[2],"z")):a=null;return a},addPlotBand:function(a){return this.addPlotBandOrLine(a,"plotBands")},addPlotLine:function(a){return this.addPlotBandOrLine(a,"plotLines")},addPlotBandOrLine:function(l,k){var e=(new a.PlotLineOrBand(this,l)).render(),c=this.userOptions;e&&(k&&(c[k]=c[k]||[],c[k].push(l)),this.plotLinesAndBands.push(e));return e},removePlotBandOrLine:function(a){for(var k=
|
||||
this.plotLinesAndBands,e=this.options,c=this.userOptions,p=k.length;p--;)k[p].id===a&&k[p].destroy();u([e.plotLines||[],c.plotLines||[],e.plotBands||[],c.plotBands||[]],function(c){for(p=c.length;p--;)c[p].id===a&&h(c,c[p])})}}})(I);(function(a){var B=a.correctFloat,z=a.defined,C=a.destroyObjectProperties,E=a.isNumber,u=a.merge,h=a.pick,n=a.deg2rad;a.Tick=function(a,l,k,e){this.axis=a;this.pos=l;this.type=k||"";this.isNew=!0;k||e||this.addLabel()};a.Tick.prototype={addLabel:function(){var a=this.axis,
|
||||
l=a.options,k=a.chart,e=a.categories,c=a.names,p=this.pos,n=l.labels,b=a.tickPositions,m=p===b[0],d=p===b[b.length-1],c=e?h(e[p],c[p],p):p,e=this.label,b=b.info,r;a.isDatetimeAxis&&b&&(r=l.dateTimeLabelFormats[b.higherRanks[p]||b.unitName]);this.isFirst=m;this.isLast=d;l=a.labelFormatter.call({axis:a,chart:k,isFirst:m,isLast:d,dateTimeLabelFormat:r,value:a.isLog?B(a.lin2log(c)):c});z(e)?e&&e.attr({text:l}):(this.labelLength=(this.label=e=z(l)&&n.enabled?k.renderer.text(l,0,0,n.useHTML).css(u(n.style)).add(a.labelGroup):
|
||||
null)&&e.getBBox().width,this.rotation=0)},getLabelSize:function(){return this.label?this.label.getBBox()[this.axis.horiz?"height":"width"]:0},handleOverflow:function(a){var l=this.axis,k=a.x,e=l.chart.chartWidth,c=l.chart.spacing,p=h(l.labelLeft,Math.min(l.pos,c[3])),c=h(l.labelRight,Math.max(l.pos+l.len,e-c[1])),t=this.label,b=this.rotation,m={left:0,center:.5,right:1}[l.labelAlign],d=t.getBBox().width,r=l.getSlotWidth(),A=r,v=1,f,y={};if(b)0>b&&k-m*d<p?f=Math.round(k/Math.cos(b*n)-p):0<b&&k+m*
|
||||
d>c&&(f=Math.round((e-k)/Math.cos(b*n)));else if(e=k+(1-m)*d,k-m*d<p?A=a.x+A*(1-m)-p:e>c&&(A=c-a.x+A*m,v=-1),A=Math.min(r,A),A<r&&"center"===l.labelAlign&&(a.x+=v*(r-A-m*(r-Math.min(d,A)))),d>A||l.autoRotation&&(t.styles||{}).width)f=A;f&&(y.width=f,(l.options.labels.style||{}).textOverflow||(y.textOverflow="ellipsis"),t.css(y))},getPosition:function(a,l,k,e){var c=this.axis,p=c.chart,h=e&&p.oldChartHeight||p.chartHeight;return{x:a?c.translate(l+k,null,null,e)+c.transB:c.left+c.offset+(c.opposite?
|
||||
(e&&p.oldChartWidth||p.chartWidth)-c.right-c.left:0),y:a?h-c.bottom+c.offset-(c.opposite?c.height:0):h-c.translate(l+k,null,null,e)-c.transB}},getLabelPosition:function(a,h,k,e,c,p,H,b){var m=this.axis,d=m.transA,r=m.reversed,l=m.staggerLines,v=m.tickRotCorr||{x:0,y:0},f=c.y;z(f)||(f=0===m.side?k.rotation?-8:-k.getBBox().height:2===m.side?v.y+8:Math.cos(k.rotation*n)*(v.y-k.getBBox(!1,0).height/2));a=a+c.x+v.x-(p&&e?p*d*(r?-1:1):0);h=h+f-(p&&!e?p*d*(r?1:-1):0);l&&(k=H/(b||1)%l,m.opposite&&(k=l-k-
|
||||
1),h+=m.labelOffset/l*k);return{x:a,y:Math.round(h)}},getMarkPath:function(a,h,k,e,c,p){return p.crispLine(["M",a,h,"L",a+(c?0:-k),h+(c?k:0)],e)},renderGridLine:function(a,h,k){var e=this.axis,c=e.options,p=this.gridLine,l={},b=this.pos,m=this.type,d=e.tickmarkOffset,r=e.chart.renderer,A=m?m+"Grid":"grid",v=c[A+"LineWidth"],f=c[A+"LineColor"],c=c[A+"LineDashStyle"];p||(l.stroke=f,l["stroke-width"]=v,c&&(l.dashstyle=c),m||(l.zIndex=1),a&&(l.opacity=0),this.gridLine=p=r.path().attr(l).addClass("highcharts-"+
|
||||
(m?m+"-":"")+"grid-line").add(e.gridGroup));if(!a&&p&&(a=e.getPlotLinePath(b+d,p.strokeWidth()*k,a,!0)))p[this.isNew?"attr":"animate"]({d:a,opacity:h})},renderMark:function(a,l,k){var e=this.axis,c=e.options,p=e.chart.renderer,n=this.type,b=n?n+"Tick":"tick",m=e.tickSize(b),d=this.mark,r=!d,A=a.x;a=a.y;var v=h(c[b+"Width"],!n&&e.isXAxis?1:0),c=c[b+"Color"];m&&(e.opposite&&(m[0]=-m[0]),r&&(this.mark=d=p.path().addClass("highcharts-"+(n?n+"-":"")+"tick").add(e.axisGroup),d.attr({stroke:c,"stroke-width":v})),
|
||||
d[r?"attr":"animate"]({d:this.getMarkPath(A,a,m[0],d.strokeWidth()*k,e.horiz,p),opacity:l}))},renderLabel:function(a,l,k,e){var c=this.axis,p=c.horiz,n=c.options,b=this.label,m=n.labels,d=m.step,r=c.tickmarkOffset,A=!0,v=a.x;a=a.y;b&&E(v)&&(b.xy=a=this.getLabelPosition(v,a,b,p,m,r,e,d),this.isFirst&&!this.isLast&&!h(n.showFirstLabel,1)||this.isLast&&!this.isFirst&&!h(n.showLastLabel,1)?A=!1:!p||c.isRadial||m.step||m.rotation||l||0===k||this.handleOverflow(a),d&&e%d&&(A=!1),A&&E(a.y)?(a.opacity=k,
|
||||
b[this.isNew?"attr":"animate"](a)):b.attr("y",-9999),this.isNew=!1)},render:function(a,l,k){var e=this.axis,c=e.horiz,p=this.getPosition(c,this.pos,e.tickmarkOffset,l),n=p.x,b=p.y,e=c&&n===e.pos+e.len||!c&&b===e.pos?-1:1;k=h(k,1);this.isActive=!0;this.renderGridLine(l,k,e);this.renderMark(p,k,e);this.renderLabel(p,l,k,a)},destroy:function(){C(this,this.axis)}}})(I);(function(a){var B=a.addEvent,z=a.animObject,C=a.arrayMax,E=a.arrayMin,u=a.AxisPlotLineOrBandExtension,h=a.color,n=a.correctFloat,t=a.defaultOptions,
|
||||
l=a.defined,k=a.deg2rad,e=a.destroyObjectProperties,c=a.each,p=a.extend,H=a.fireEvent,b=a.format,m=a.getMagnitude,d=a.grep,r=a.inArray,A=a.isArray,v=a.isNumber,f=a.isString,y=a.merge,G=a.normalizeTickInterval,F=a.pick,q=a.PlotLineOrBand,x=a.removeEvent,J=a.splat,K=a.syncTimeout,L=a.Tick;a.Axis=function(){this.init.apply(this,arguments)};a.Axis.prototype={defaultOptions:{dateTimeLabelFormats:{millisecond:"%H:%M:%S.%L",second:"%H:%M:%S",minute:"%H:%M",hour:"%H:%M",day:"%e. %b",week:"%e. %b",month:"%b '%y",
|
||||
year:"%Y"},endOnTick:!1,labels:{enabled:!0,style:{color:"#666666",cursor:"default",fontSize:"11px"},x:0},minPadding:.01,maxPadding:.01,minorTickLength:2,minorTickPosition:"outside",startOfWeek:1,startOnTick:!1,tickLength:10,tickmarkPlacement:"between",tickPixelInterval:100,tickPosition:"outside",title:{align:"middle",style:{color:"#666666"}},type:"linear",minorGridLineColor:"#f2f2f2",minorGridLineWidth:1,minorTickColor:"#999999",lineColor:"#ccd6eb",lineWidth:1,gridLineColor:"#e6e6e6",tickColor:"#ccd6eb"},
|
||||
defaultYAxisOptions:{endOnTick:!0,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8},maxPadding:.05,minPadding:.05,startOnTick:!0,title:{rotation:270,text:"Values"},stackLabels:{enabled:!1,formatter:function(){return a.numberFormat(this.total,-1)},style:{fontSize:"11px",fontWeight:"bold",color:"#000000",textOutline:"1px contrast"}},gridLineWidth:1,lineWidth:0},defaultLeftAxisOptions:{labels:{x:-15},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:15},title:{rotation:90}},defaultBottomAxisOptions:{labels:{autoRotation:[-45],
|
||||
x:0},title:{rotation:0}},defaultTopAxisOptions:{labels:{autoRotation:[-45],x:0},title:{rotation:0}},init:function(a,b){var g=b.isX;this.chart=a;this.horiz=a.inverted?!g:g;this.isXAxis=g;this.coll=this.coll||(g?"xAxis":"yAxis");this.opposite=b.opposite;this.side=b.side||(this.horiz?this.opposite?0:2:this.opposite?1:3);this.setOptions(b);var d=this.options,c=d.type;this.labelFormatter=d.labels.formatter||this.defaultLabelFormatter;this.userOptions=b;this.minPixelPadding=0;this.reversed=d.reversed;this.visible=
|
||||
!1!==d.visible;this.zoomEnabled=!1!==d.zoomEnabled;this.hasNames="category"===c||!0===d.categories;this.categories=d.categories||this.hasNames;this.names=this.names||[];this.isLog="logarithmic"===c;this.isDatetimeAxis="datetime"===c;this.positiveValuesOnly=this.isLog&&!this.allowNegativeLog;this.isLinked=l(d.linkedTo);this.ticks={};this.labelEdge=[];this.minorTicks={};this.plotLinesAndBands=[];this.alternateBands={};this.len=0;this.minRange=this.userMinRange=d.minRange||d.maxZoom;this.range=d.range;
|
||||
this.offset=d.offset||0;this.stacks={};this.oldStacks={};this.stacksTouched=0;this.min=this.max=null;this.crosshair=F(d.crosshair,J(a.options.tooltip.crosshairs)[g?0:1],!1);var f;b=this.options.events;-1===r(this,a.axes)&&(g?a.axes.splice(a.xAxis.length,0,this):a.axes.push(this),a[this.coll].push(this));this.series=this.series||[];a.inverted&&g&&void 0===this.reversed&&(this.reversed=!0);this.removePlotLine=this.removePlotBand=this.removePlotBandOrLine;for(f in b)B(this,f,b[f]);this.lin2log=d.linearToLogConverter||
|
||||
this.lin2log;this.isLog&&(this.val2lin=this.log2lin,this.lin2val=this.lin2log)},setOptions:function(a){this.options=y(this.defaultOptions,"yAxis"===this.coll&&this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],y(t[this.coll],a))},defaultLabelFormatter:function(){var g=this.axis,d=this.value,c=g.categories,f=this.dateTimeLabelFormat,q=t.lang,e=q.numericSymbols,q=q.numericSymbolMagnitude||1E3,w=e&&e.length,
|
||||
m,r=g.options.labels.format,g=g.isLog?Math.abs(d):g.tickInterval;if(r)m=b(r,this);else if(c)m=d;else if(f)m=a.dateFormat(f,d);else if(w&&1E3<=g)for(;w--&&void 0===m;)c=Math.pow(q,w+1),g>=c&&0===10*d%c&&null!==e[w]&&0!==d&&(m=a.numberFormat(d/c,-1)+e[w]);void 0===m&&(m=1E4<=Math.abs(d)?a.numberFormat(d,-1):a.numberFormat(d,-1,void 0,""));return m},getSeriesExtremes:function(){var a=this,b=a.chart;a.hasVisibleSeries=!1;a.dataMin=a.dataMax=a.threshold=null;a.softThreshold=!a.isXAxis;a.buildStacks&&a.buildStacks();
|
||||
c(a.series,function(g){if(g.visible||!b.options.chart.ignoreHiddenSeries){var c=g.options,f=c.threshold,q;a.hasVisibleSeries=!0;a.positiveValuesOnly&&0>=f&&(f=null);if(a.isXAxis)c=g.xData,c.length&&(g=E(c),v(g)||g instanceof Date||(c=d(c,function(a){return v(a)}),g=E(c)),a.dataMin=Math.min(F(a.dataMin,c[0]),g),a.dataMax=Math.max(F(a.dataMax,c[0]),C(c)));else if(g.getExtremes(),q=g.dataMax,g=g.dataMin,l(g)&&l(q)&&(a.dataMin=Math.min(F(a.dataMin,g),g),a.dataMax=Math.max(F(a.dataMax,q),q)),l(f)&&(a.threshold=
|
||||
f),!c.softThreshold||a.positiveValuesOnly)a.softThreshold=!1}})},translate:function(a,b,d,c,f,q){var g=this.linkedParent||this,D=1,e=0,m=c?g.oldTransA:g.transA;c=c?g.oldMin:g.min;var r=g.minPixelPadding;f=(g.isOrdinal||g.isBroken||g.isLog&&f)&&g.lin2val;m||(m=g.transA);d&&(D*=-1,e=g.len);g.reversed&&(D*=-1,e-=D*(g.sector||g.len));b?(a=(a*D+e-r)/m+c,f&&(a=g.lin2val(a))):(f&&(a=g.val2lin(a)),a=D*(a-c)*m+e+D*r+(v(q)?m*q:0));return a},toPixels:function(a,b){return this.translate(a,!1,!this.horiz,null,
|
||||
!0)+(b?0:this.pos)},toValue:function(a,b){return this.translate(a-(b?0:this.pos),!0,!this.horiz,null,!0)},getPlotLinePath:function(a,b,d,c,f){var g=this.chart,q=this.left,D=this.top,e,m,r=d&&g.oldChartHeight||g.chartHeight,p=d&&g.oldChartWidth||g.chartWidth,x;e=this.transB;var k=function(a,b,g){if(a<b||a>g)c?a=Math.min(Math.max(b,a),g):x=!0;return a};f=F(f,this.translate(a,null,null,d));a=d=Math.round(f+e);e=m=Math.round(r-f-e);v(f)?this.horiz?(e=D,m=r-this.bottom,a=d=k(a,q,q+this.width)):(a=q,d=
|
||||
p-this.right,e=m=k(e,D,D+this.height)):x=!0;return x&&!c?null:g.renderer.crispLine(["M",a,e,"L",d,m],b||1)},getLinearTickPositions:function(a,b,d){var g,c=n(Math.floor(b/a)*a);d=n(Math.ceil(d/a)*a);var f=[];if(this.single)return[b];for(b=c;b<=d;){f.push(b);b=n(b+a);if(b===g)break;g=b}return f},getMinorTickPositions:function(){var a=this,b=a.options,d=a.tickPositions,f=a.minorTickInterval,q=[],e=a.pointRangePadding||0,m=a.min-e,e=a.max+e,r=e-m;if(r&&r/f<a.len/3)if(a.isLog)c(this.paddedTicks,function(b,
|
||||
g,d){g&&q.push.apply(q,a.getLogTickPositions(f,d[g-1],d[g],!0))});else if(a.isDatetimeAxis&&"auto"===b.minorTickInterval)q=q.concat(a.getTimeTicks(a.normalizeTimeTickInterval(f),m,e,b.startOfWeek));else for(b=m+(d[0]-m)%f;b<=e&&b!==q[0];b+=f)q.push(b);0!==q.length&&a.trimTicks(q);return q},adjustForMinRange:function(){var a=this.options,b=this.min,d=this.max,f,q=this.dataMax-this.dataMin>=this.minRange,e,m,r,p,v,x;this.isXAxis&&void 0===this.minRange&&!this.isLog&&(l(a.min)||l(a.max)?this.minRange=
|
||||
null:(c(this.series,function(a){p=a.xData;for(m=v=a.xIncrement?1:p.length-1;0<m;m--)if(r=p[m]-p[m-1],void 0===e||r<e)e=r}),this.minRange=Math.min(5*e,this.dataMax-this.dataMin)));d-b<this.minRange&&(x=this.minRange,f=(x-d+b)/2,f=[b-f,F(a.min,b-f)],q&&(f[2]=this.isLog?this.log2lin(this.dataMin):this.dataMin),b=C(f),d=[b+x,F(a.max,b+x)],q&&(d[2]=this.isLog?this.log2lin(this.dataMax):this.dataMax),d=E(d),d-b<x&&(f[0]=d-x,f[1]=F(a.min,d-x),b=C(f)));this.min=b;this.max=d},getClosest:function(){var a;this.categories?
|
||||
a=1:c(this.series,function(b){var g=b.closestPointRange,d=b.visible||!b.chart.options.chart.ignoreHiddenSeries;!b.noSharedTooltip&&l(g)&&d&&(a=l(a)?Math.min(a,g):g)});return a},nameToX:function(a){var b=A(this.categories),g=b?this.categories:this.names,d=a.options.x,c;a.series.requireSorting=!1;l(d)||(d=!1===this.options.uniqueNames?a.series.autoIncrement():r(a.name,g));-1===d?b||(c=g.length):c=d;this.names[c]=a.name;return c},updateNames:function(){var a=this;0<this.names.length&&(this.names.length=
|
||||
0,this.minRange=void 0,c(this.series||[],function(b){b.xIncrement=null;if(!b.points||b.isDirtyData)b.processData(),b.generatePoints();c(b.points,function(g,d){var c;g.options&&(c=a.nameToX(g),c!==g.x&&(g.x=c,b.xData[d]=c))})}))},setAxisTranslation:function(a){var b=this,g=b.max-b.min,d=b.axisPointRange||0,q,e=0,m=0,r=b.linkedParent,p=!!b.categories,v=b.transA,x=b.isXAxis;if(x||p||d)q=b.getClosest(),r?(e=r.minPointOffset,m=r.pointRangePadding):c(b.series,function(a){var g=p?1:x?F(a.options.pointRange,
|
||||
q,0):b.axisPointRange||0;a=a.options.pointPlacement;d=Math.max(d,g);b.single||(e=Math.max(e,f(a)?0:g/2),m=Math.max(m,"on"===a?0:g))}),r=b.ordinalSlope&&q?b.ordinalSlope/q:1,b.minPointOffset=e*=r,b.pointRangePadding=m*=r,b.pointRange=Math.min(d,g),x&&(b.closestPointRange=q);a&&(b.oldTransA=v);b.translationSlope=b.transA=v=b.options.staticScale||b.len/(g+m||1);b.transB=b.horiz?b.left:b.bottom;b.minPixelPadding=v*e},minFromRange:function(){return this.max-this.range},setTickInterval:function(b){var g=
|
||||
this,d=g.chart,f=g.options,q=g.isLog,e=g.log2lin,r=g.isDatetimeAxis,p=g.isXAxis,x=g.isLinked,k=f.maxPadding,h=f.minPadding,y=f.tickInterval,A=f.tickPixelInterval,J=g.categories,t=g.threshold,u=g.softThreshold,L,K,z,B;r||J||x||this.getTickAmount();z=F(g.userMin,f.min);B=F(g.userMax,f.max);x?(g.linkedParent=d[g.coll][f.linkedTo],d=g.linkedParent.getExtremes(),g.min=F(d.min,d.dataMin),g.max=F(d.max,d.dataMax),f.type!==g.linkedParent.options.type&&a.error(11,1)):(!u&&l(t)&&(g.dataMin>=t?(L=t,h=0):g.dataMax<=
|
||||
t&&(K=t,k=0)),g.min=F(z,L,g.dataMin),g.max=F(B,K,g.dataMax));q&&(g.positiveValuesOnly&&!b&&0>=Math.min(g.min,F(g.dataMin,g.min))&&a.error(10,1),g.min=n(e(g.min),15),g.max=n(e(g.max),15));g.range&&l(g.max)&&(g.userMin=g.min=z=Math.max(g.min,g.minFromRange()),g.userMax=B=g.max,g.range=null);H(g,"foundExtremes");g.beforePadding&&g.beforePadding();g.adjustForMinRange();!(J||g.axisPointRange||g.usePercentage||x)&&l(g.min)&&l(g.max)&&(e=g.max-g.min)&&(!l(z)&&h&&(g.min-=e*h),!l(B)&&k&&(g.max+=e*k));v(f.floor)?
|
||||
g.min=Math.max(g.min,f.floor):v(f.softMin)&&(g.min=Math.min(g.min,f.softMin));v(f.ceiling)?g.max=Math.min(g.max,f.ceiling):v(f.softMax)&&(g.max=Math.max(g.max,f.softMax));u&&l(g.dataMin)&&(t=t||0,!l(z)&&g.min<t&&g.dataMin>=t?g.min=t:!l(B)&&g.max>t&&g.dataMax<=t&&(g.max=t));g.tickInterval=g.min===g.max||void 0===g.min||void 0===g.max?1:x&&!y&&A===g.linkedParent.options.tickPixelInterval?y=g.linkedParent.tickInterval:F(y,this.tickAmount?(g.max-g.min)/Math.max(this.tickAmount-1,1):void 0,J?1:(g.max-
|
||||
g.min)*A/Math.max(g.len,A));p&&!b&&c(g.series,function(a){a.processData(g.min!==g.oldMin||g.max!==g.oldMax)});g.setAxisTranslation(!0);g.beforeSetTickPositions&&g.beforeSetTickPositions();g.postProcessTickInterval&&(g.tickInterval=g.postProcessTickInterval(g.tickInterval));g.pointRange&&!y&&(g.tickInterval=Math.max(g.pointRange,g.tickInterval));b=F(f.minTickInterval,g.isDatetimeAxis&&g.closestPointRange);!y&&g.tickInterval<b&&(g.tickInterval=b);r||q||y||(g.tickInterval=G(g.tickInterval,null,m(g.tickInterval),
|
||||
F(f.allowDecimals,!(.5<g.tickInterval&&5>g.tickInterval&&1E3<g.max&&9999>g.max)),!!this.tickAmount));this.tickAmount||(g.tickInterval=g.unsquish());this.setTickPositions()},setTickPositions:function(){var a=this.options,b,d=a.tickPositions,c=a.tickPositioner,f=a.startOnTick,q=a.endOnTick;this.tickmarkOffset=this.categories&&"between"===a.tickmarkPlacement&&1===this.tickInterval?.5:0;this.minorTickInterval="auto"===a.minorTickInterval&&this.tickInterval?this.tickInterval/5:a.minorTickInterval;this.single=
|
||||
this.min===this.max&&l(this.min)&&!this.tickAmount&&!1!==a.allowDecimals;this.tickPositions=b=d&&d.slice();!b&&(b=this.isDatetimeAxis?this.getTimeTicks(this.normalizeTimeTickInterval(this.tickInterval,a.units),this.min,this.max,a.startOfWeek,this.ordinalPositions,this.closestPointRange,!0):this.isLog?this.getLogTickPositions(this.tickInterval,this.min,this.max):this.getLinearTickPositions(this.tickInterval,this.min,this.max),b.length>this.len&&(b=[b[0],b.pop()]),this.tickPositions=b,c&&(c=c.apply(this,
|
||||
[this.min,this.max])))&&(this.tickPositions=b=c);this.paddedTicks=b.slice(0);this.trimTicks(b,f,q);this.isLinked||(this.single&&(this.min-=.5,this.max+=.5),d||c||this.adjustTickAmount())},trimTicks:function(a,b,d){var g=a[0],c=a[a.length-1],f=this.minPointOffset||0;if(!this.isLinked){if(b)this.min=g;else for(;this.min-f>a[0];)a.shift();if(d)this.max=c;else for(;this.max+f<a[a.length-1];)a.pop();0===a.length&&l(g)&&a.push((c+g)/2)}},alignToOthers:function(){var a={},b,d=this.options;!1===this.chart.options.chart.alignTicks||
|
||||
!1===d.alignTicks||this.isLog||c(this.chart[this.coll],function(g){var d=g.options,d=[g.horiz?d.left:d.top,d.width,d.height,d.pane].join();g.series.length&&(a[d]?b=!0:a[d]=1)});return b},getTickAmount:function(){var a=this.options,b=a.tickAmount,d=a.tickPixelInterval;!l(a.tickInterval)&&this.len<d&&!this.isRadial&&!this.isLog&&a.startOnTick&&a.endOnTick&&(b=2);!b&&this.alignToOthers()&&(b=Math.ceil(this.len/d)+1);4>b&&(this.finalTickAmt=b,b=5);this.tickAmount=b},adjustTickAmount:function(){var a=
|
||||
this.tickInterval,b=this.tickPositions,d=this.tickAmount,c=this.finalTickAmt,f=b&&b.length;if(f<d){for(;b.length<d;)b.push(n(b[b.length-1]+a));this.transA*=(f-1)/(d-1);this.max=b[b.length-1]}else f>d&&(this.tickInterval*=2,this.setTickPositions());if(l(c)){for(a=d=b.length;a--;)(3===c&&1===a%2||2>=c&&0<a&&a<d-1)&&b.splice(a,1);this.finalTickAmt=void 0}},setScale:function(){var a,b;this.oldMin=this.min;this.oldMax=this.max;this.oldAxisLength=this.len;this.setAxisSize();b=this.len!==this.oldAxisLength;
|
||||
c(this.series,function(b){if(b.isDirtyData||b.isDirty||b.xAxis.isDirty)a=!0});b||a||this.isLinked||this.forceRedraw||this.userMin!==this.oldUserMin||this.userMax!==this.oldUserMax||this.alignToOthers()?(this.resetStacks&&this.resetStacks(),this.forceRedraw=!1,this.getSeriesExtremes(),this.setTickInterval(),this.oldUserMin=this.userMin,this.oldUserMax=this.userMax,this.isDirty||(this.isDirty=b||this.min!==this.oldMin||this.max!==this.oldMax)):this.cleanStacks&&this.cleanStacks()},setExtremes:function(a,
|
||||
b,d,f,q){var g=this,e=g.chart;d=F(d,!0);c(g.series,function(a){delete a.kdTree});q=p(q,{min:a,max:b});H(g,"setExtremes",q,function(){g.userMin=a;g.userMax=b;g.eventArgs=q;d&&e.redraw(f)})},zoom:function(a,b){var g=this.dataMin,d=this.dataMax,c=this.options,f=Math.min(g,F(c.min,g)),c=Math.max(d,F(c.max,d));if(a!==this.min||b!==this.max)this.allowZoomOutside||(l(g)&&(a<f&&(a=f),a>c&&(a=c)),l(d)&&(b<f&&(b=f),b>c&&(b=c))),this.displayBtn=void 0!==a||void 0!==b,this.setExtremes(a,b,!1,void 0,{trigger:"zoom"});
|
||||
return!0},setAxisSize:function(){var a=this.chart,b=this.options,d=b.offsets||[0,0,0,0],c=this.horiz,f=F(b.width,a.plotWidth-d[3]+d[1]),q=F(b.height,a.plotHeight-d[0]+d[2]),e=F(b.top,a.plotTop+d[0]),b=F(b.left,a.plotLeft+d[3]),d=/%$/;d.test(q)&&(q=Math.round(parseFloat(q)/100*a.plotHeight));d.test(e)&&(e=Math.round(parseFloat(e)/100*a.plotHeight+a.plotTop));this.left=b;this.top=e;this.width=f;this.height=q;this.bottom=a.chartHeight-q-e;this.right=a.chartWidth-f-b;this.len=Math.max(c?f:q,0);this.pos=
|
||||
c?b:e},getExtremes:function(){var a=this.isLog,b=this.lin2log;return{min:a?n(b(this.min)):this.min,max:a?n(b(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(a){var b=this.isLog,g=this.lin2log,d=b?g(this.min):this.min,b=b?g(this.max):this.max;null===a?a=d:d>a?a=d:b<a&&(a=b);return this.translate(a,0,1,0,1)},autoLabelAlign:function(a){a=(F(a,0)-90*this.side+720)%360;return 15<a&&165>a?"right":195<a&&345>a?"left":"center"},
|
||||
tickSize:function(a){var b=this.options,g=b[a+"Length"],d=F(b[a+"Width"],"tick"===a&&this.isXAxis?1:0);if(d&&g)return"inside"===b[a+"Position"]&&(g=-g),[g,d]},labelMetrics:function(){return this.chart.renderer.fontMetrics(this.options.labels.style&&this.options.labels.style.fontSize,this.ticks[0]&&this.ticks[0].label)},unsquish:function(){var a=this.options.labels,b=this.horiz,d=this.tickInterval,f=d,q=this.len/(((this.categories?1:0)+this.max-this.min)/d),e,m=a.rotation,r=this.labelMetrics(),p,x=
|
||||
Number.MAX_VALUE,v,h=function(a){a/=q||1;a=1<a?Math.ceil(a):1;return a*d};b?(v=!a.staggerLines&&!a.step&&(l(m)?[m]:q<F(a.autoRotationLimit,80)&&a.autoRotation))&&c(v,function(a){var b;if(a===m||a&&-90<=a&&90>=a)p=h(Math.abs(r.h/Math.sin(k*a))),b=p+Math.abs(a/360),b<x&&(x=b,e=a,f=p)}):a.step||(f=h(r.h));this.autoRotation=v;this.labelRotation=F(e,m);return f},getSlotWidth:function(){var a=this.chart,b=this.horiz,d=this.options.labels,c=Math.max(this.tickPositions.length-(this.categories?0:1),1),f=a.margin[3];
|
||||
return b&&2>(d.step||0)&&!d.rotation&&(this.staggerLines||1)*this.len/c||!b&&(f&&f-a.spacing[3]||.33*a.chartWidth)},renderUnsquish:function(){var a=this.chart,b=a.renderer,d=this.tickPositions,q=this.ticks,e=this.options.labels,m=this.horiz,r=this.getSlotWidth(),p=Math.max(1,Math.round(r-2*(e.padding||5))),x={},v=this.labelMetrics(),k=e.style&&e.style.textOverflow,h,l=0,A,n;f(e.rotation)||(x.rotation=e.rotation||0);c(d,function(a){(a=q[a])&&a.labelLength>l&&(l=a.labelLength)});this.maxLabelLength=
|
||||
l;if(this.autoRotation)l>p&&l>v.h?x.rotation=this.labelRotation:this.labelRotation=0;else if(r&&(h={width:p+"px"},!k))for(h.textOverflow="clip",A=d.length;!m&&A--;)if(n=d[A],p=q[n].label)p.styles&&"ellipsis"===p.styles.textOverflow?p.css({textOverflow:"clip"}):q[n].labelLength>r&&p.css({width:r+"px"}),p.getBBox().height>this.len/d.length-(v.h-v.f)&&(p.specCss={textOverflow:"ellipsis"});x.rotation&&(h={width:(l>.5*a.chartHeight?.33*a.chartHeight:a.chartHeight)+"px"},k||(h.textOverflow="ellipsis"));
|
||||
if(this.labelAlign=e.align||this.autoLabelAlign(this.labelRotation))x.align=this.labelAlign;c(d,function(a){var b=(a=q[a])&&a.label;b&&(b.attr(x),h&&b.css(y(h,b.specCss)),delete b.specCss,a.rotation=x.rotation)});this.tickRotCorr=b.rotCorr(v.b,this.labelRotation||0,0!==this.side)},hasData:function(){return this.hasVisibleSeries||l(this.min)&&l(this.max)&&!!this.tickPositions},addTitle:function(a){var b=this.chart.renderer,d=this.horiz,g=this.opposite,c=this.options.title,f;this.axisTitle||((f=c.textAlign)||
|
||||
(f=(d?{low:"left",middle:"center",high:"right"}:{low:g?"right":"left",middle:"center",high:g?"left":"right"})[c.align]),this.axisTitle=b.text(c.text,0,0,c.useHTML).attr({zIndex:7,rotation:c.rotation||0,align:f}).addClass("highcharts-axis-title").css(c.style).add(this.axisGroup),this.axisTitle.isNew=!0);this.axisTitle[a?"show":"hide"](!0)},generateTick:function(a){var b=this.ticks;b[a]?b[a].addLabel():b[a]=new L(this,a)},getOffset:function(){var a=this,b=a.chart,d=b.renderer,f=a.options,q=a.tickPositions,
|
||||
e=a.ticks,m=a.horiz,r=a.side,p=b.inverted?[1,0,3,2][r]:r,x,v,h=0,k,y=0,A=f.title,n=f.labels,G=0,J=b.axisOffset,b=b.clipOffset,t=[-1,1,1,-1][r],u,H=f.className,L=a.axisParent,K=this.tickSize("tick");x=a.hasData();a.showAxis=v=x||F(f.showEmpty,!0);a.staggerLines=a.horiz&&n.staggerLines;a.axisGroup||(a.gridGroup=d.g("grid").attr({zIndex:f.gridZIndex||1}).addClass("highcharts-"+this.coll.toLowerCase()+"-grid "+(H||"")).add(L),a.axisGroup=d.g("axis").attr({zIndex:f.zIndex||2}).addClass("highcharts-"+this.coll.toLowerCase()+
|
||||
" "+(H||"")).add(L),a.labelGroup=d.g("axis-labels").attr({zIndex:n.zIndex||7}).addClass("highcharts-"+a.coll.toLowerCase()+"-labels "+(H||"")).add(L));if(x||a.isLinked)c(q,function(b,d){a.generateTick(b,d)}),a.renderUnsquish(),!1===n.reserveSpace||0!==r&&2!==r&&{1:"left",3:"right"}[r]!==a.labelAlign&&"center"!==a.labelAlign||c(q,function(a){G=Math.max(e[a].getLabelSize(),G)}),a.staggerLines&&(G*=a.staggerLines,a.labelOffset=G*(a.opposite?-1:1));else for(u in e)e[u].destroy(),delete e[u];A&&A.text&&
|
||||
!1!==A.enabled&&(a.addTitle(v),v&&(h=a.axisTitle.getBBox()[m?"height":"width"],k=A.offset,y=l(k)?0:F(A.margin,m?5:10)));a.renderLine();a.offset=t*F(f.offset,J[r]);a.tickRotCorr=a.tickRotCorr||{x:0,y:0};d=0===r?-a.labelMetrics().h:2===r?a.tickRotCorr.y:0;y=Math.abs(G)+y;G&&(y=y-d+t*(m?F(n.y,a.tickRotCorr.y+8*t):n.x));a.axisTitleMargin=F(k,y);J[r]=Math.max(J[r],a.axisTitleMargin+h+t*a.offset,y,x&&q.length&&K?K[0]+t*a.offset:0);f=f.offset?0:2*Math.floor(a.axisLine.strokeWidth()/2);b[p]=Math.max(b[p],
|
||||
f)},getLinePath:function(a){var b=this.chart,d=this.opposite,g=this.offset,f=this.horiz,c=this.left+(d?this.width:0)+g,g=b.chartHeight-this.bottom-(d?this.height:0)+g;d&&(a*=-1);return b.renderer.crispLine(["M",f?this.left:c,f?g:this.top,"L",f?b.chartWidth-this.right:c,f?g:b.chartHeight-this.bottom],a)},renderLine:function(){this.axisLine||(this.axisLine=this.chart.renderer.path().addClass("highcharts-axis-line").add(this.axisGroup),this.axisLine.attr({stroke:this.options.lineColor,"stroke-width":this.options.lineWidth,
|
||||
zIndex:7}))},getTitlePosition:function(){var a=this.horiz,b=this.left,d=this.top,f=this.len,c=this.options.title,q=a?b:d,e=this.opposite,m=this.offset,r=c.x||0,p=c.y||0,x=this.chart.renderer.fontMetrics(c.style&&c.style.fontSize,this.axisTitle).f,f={low:q+(a?0:f),middle:q+f/2,high:q+(a?f:0)}[c.align],b=(a?d+this.height:b)+(a?1:-1)*(e?-1:1)*this.axisTitleMargin+(2===this.side?x:0);return{x:a?f+r:b+(e?this.width:0)+m+r,y:a?b+p-(e?this.height:0)+m:f+p}},renderMinorTick:function(a){var b=this.chart.hasRendered&&
|
||||
v(this.oldMin),d=this.minorTicks;d[a]||(d[a]=new L(this,a,"minor"));b&&d[a].isNew&&d[a].render(null,!0);d[a].render(null,!1,1)},renderTick:function(a,b){var d=this.isLinked,g=this.ticks,f=this.chart.hasRendered&&v(this.oldMin);if(!d||a>=this.min&&a<=this.max)g[a]||(g[a]=new L(this,a)),f&&g[a].isNew&&g[a].render(b,!0,.1),g[a].render(b)},render:function(){var a=this,b=a.chart,d=a.options,f=a.isLog,e=a.lin2log,m=a.isLinked,r=a.tickPositions,p=a.axisTitle,x=a.ticks,v=a.minorTicks,h=a.alternateBands,k=
|
||||
d.stackLabels,y=d.alternateGridColor,l=a.tickmarkOffset,A=a.axisLine,n=a.showAxis,G=z(b.renderer.globalAnimation),J,t;a.labelEdge.length=0;a.overlap=!1;c([x,v,h],function(a){for(var b in a)a[b].isActive=!1});if(a.hasData()||m)a.minorTickInterval&&!a.categories&&c(a.getMinorTickPositions(),function(b){a.renderMinorTick(b)}),r.length&&(c(r,function(b,d){a.renderTick(b,d)}),l&&(0===a.min||a.single)&&(x[-1]||(x[-1]=new L(a,-1,null,!0)),x[-1].render(-1))),y&&c(r,function(d,g){t=void 0!==r[g+1]?r[g+1]+
|
||||
l:a.max-l;0===g%2&&d<a.max&&t<=a.max+(b.polar?-l:l)&&(h[d]||(h[d]=new q(a)),J=d+l,h[d].options={from:f?e(J):J,to:f?e(t):t,color:y},h[d].render(),h[d].isActive=!0)}),a._addedPlotLB||(c((d.plotLines||[]).concat(d.plotBands||[]),function(b){a.addPlotBandOrLine(b)}),a._addedPlotLB=!0);c([x,v,h],function(a){var d,g,f=[],c=G.duration;for(d in a)a[d].isActive||(a[d].render(d,!1,0),a[d].isActive=!1,f.push(d));K(function(){for(g=f.length;g--;)a[f[g]]&&!a[f[g]].isActive&&(a[f[g]].destroy(),delete a[f[g]])},
|
||||
a!==h&&b.hasRendered&&c?c:0)});A&&(A[A.isPlaced?"animate":"attr"]({d:this.getLinePath(A.strokeWidth())}),A.isPlaced=!0,A[n?"show":"hide"](!0));p&&n&&(p[p.isNew?"attr":"animate"](a.getTitlePosition()),p.isNew=!1);k&&k.enabled&&a.renderStackTotals();a.isDirty=!1},redraw:function(){this.visible&&(this.render(),c(this.plotLinesAndBands,function(a){a.render()}));c(this.series,function(a){a.isDirty=!0})},keepProps:"extKey hcEvents names series userMax userMin".split(" "),destroy:function(a){var b=this,
|
||||
d=b.stacks,g,f=b.plotLinesAndBands,q;a||x(b);for(g in d)e(d[g]),d[g]=null;c([b.ticks,b.minorTicks,b.alternateBands],function(a){e(a)});if(f)for(a=f.length;a--;)f[a].destroy();c("stackTotalGroup axisLine axisTitle axisGroup gridGroup labelGroup cross".split(" "),function(a){b[a]&&(b[a]=b[a].destroy())});for(q in b)b.hasOwnProperty(q)&&-1===r(q,b.keepProps)&&delete b[q]},drawCrosshair:function(a,b){var d,f=this.crosshair,g=F(f.snap,!0),c,q=this.cross;a||(a=this.cross&&this.cross.e);this.crosshair&&
|
||||
!1!==(l(b)||!g)?(g?l(b)&&(c=this.isXAxis?b.plotX:this.len-b.plotY):c=a&&(this.horiz?a.chartX-this.pos:this.len-a.chartY+this.pos),l(c)&&(d=this.getPlotLinePath(b&&(this.isXAxis?b.x:F(b.stackY,b.y)),null,null,null,c)||null),l(d)?(b=this.categories&&!this.isRadial,q||(this.cross=q=this.chart.renderer.path().addClass("highcharts-crosshair highcharts-crosshair-"+(b?"category ":"thin ")+f.className).attr({zIndex:F(f.zIndex,2)}).add(),q.attr({stroke:f.color||(b?h("#ccd6eb").setOpacity(.25).get():"#cccccc"),
|
||||
"stroke-width":F(f.width,1)}),f.dashStyle&&q.attr({dashstyle:f.dashStyle})),q.show().attr({d:d}),b&&!f.width&&q.attr({"stroke-width":this.transA}),this.cross.e=a):this.hideCrosshair()):this.hideCrosshair()},hideCrosshair:function(){this.cross&&this.cross.hide()}};p(a.Axis.prototype,u)})(I);(function(a){var B=a.Axis,z=a.Date,C=a.dateFormat,E=a.defaultOptions,u=a.defined,h=a.each,n=a.extend,t=a.getMagnitude,l=a.getTZOffset,k=a.normalizeTickInterval,e=a.pick,c=a.timeUnits;B.prototype.getTimeTicks=function(a,
|
||||
k,b,m){var d=[],r={},p=E.global.useUTC,v,f=new z(k-Math.abs(l(k))),y=z.hcMakeTime,G=a.unitRange,t=a.count,q;if(u(k)){f[z.hcSetMilliseconds](G>=c.second?0:t*Math.floor(f.getMilliseconds()/t));if(G>=c.second)f[z.hcSetSeconds](G>=c.minute?0:t*Math.floor(f.getSeconds()/t));if(G>=c.minute)f[z.hcSetMinutes](G>=c.hour?0:t*Math.floor(f[z.hcGetMinutes]()/t));if(G>=c.hour)f[z.hcSetHours](G>=c.day?0:t*Math.floor(f[z.hcGetHours]()/t));if(G>=c.day)f[z.hcSetDate](G>=c.month?1:t*Math.floor(f[z.hcGetDate]()/t));
|
||||
G>=c.month&&(f[z.hcSetMonth](G>=c.year?0:t*Math.floor(f[z.hcGetMonth]()/t)),v=f[z.hcGetFullYear]());if(G>=c.year)f[z.hcSetFullYear](v-v%t);if(G===c.week)f[z.hcSetDate](f[z.hcGetDate]()-f[z.hcGetDay]()+e(m,1));v=f[z.hcGetFullYear]();m=f[z.hcGetMonth]();var x=f[z.hcGetDate](),J=f[z.hcGetHours]();if(z.hcTimezoneOffset||z.hcGetTimezoneOffset)q=(!p||!!z.hcGetTimezoneOffset)&&(b-k>4*c.month||l(k)!==l(b)),f=f.getTime(),f=new z(f+l(f));p=f.getTime();for(k=1;p<b;)d.push(p),p=G===c.year?y(v+k*t,0):G===c.month?
|
||||
y(v,m+k*t):!q||G!==c.day&&G!==c.week?q&&G===c.hour?y(v,m,x,J+k*t):p+G*t:y(v,m,x+k*t*(G===c.day?1:7)),k++;d.push(p);G<=c.hour&&1E4>d.length&&h(d,function(a){0===a%18E5&&"000000000"===C("%H%M%S%L",a)&&(r[a]="day")})}d.info=n(a,{higherRanks:r,totalRange:G*t});return d};B.prototype.normalizeTimeTickInterval=function(a,e){var b=e||[["millisecond",[1,2,5,10,20,25,50,100,200,500]],["second",[1,2,5,10,15,30]],["minute",[1,2,5,10,15,30]],["hour",[1,2,3,4,6,8,12]],["day",[1,2]],["week",[1,2]],["month",[1,2,
|
||||
3,4,6]],["year",null]];e=b[b.length-1];var m=c[e[0]],d=e[1],r;for(r=0;r<b.length&&!(e=b[r],m=c[e[0]],d=e[1],b[r+1]&&a<=(m*d[d.length-1]+c[b[r+1][0]])/2);r++);m===c.year&&a<5*m&&(d=[1,2,5]);a=k(a/m,d,"year"===e[0]?Math.max(t(a/m),1):1);return{unitRange:m,count:a,unitName:e[0]}}})(I);(function(a){var B=a.Axis,z=a.getMagnitude,C=a.map,E=a.normalizeTickInterval,u=a.pick;B.prototype.getLogTickPositions=function(a,n,t,l){var k=this.options,e=this.len,c=this.lin2log,p=this.log2lin,h=[];l||(this._minorAutoInterval=
|
||||
null);if(.5<=a)a=Math.round(a),h=this.getLinearTickPositions(a,n,t);else if(.08<=a)for(var e=Math.floor(n),b,m,d,r,A,k=.3<a?[1,2,4]:.15<a?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];e<t+1&&!A;e++)for(m=k.length,b=0;b<m&&!A;b++)d=p(c(e)*k[b]),d>n&&(!l||r<=t)&&void 0!==r&&h.push(r),r>t&&(A=!0),r=d;else n=c(n),t=c(t),a=k[l?"minorTickInterval":"tickInterval"],a=u("auto"===a?null:a,this._minorAutoInterval,k.tickPixelInterval/(l?5:1)*(t-n)/((l?e/this.tickPositions.length:e)||1)),a=E(a,null,z(a)),h=C(this.getLinearTickPositions(a,
|
||||
n,t),p),l||(this._minorAutoInterval=a/5);l||(this.tickInterval=a);return h};B.prototype.log2lin=function(a){return Math.log(a)/Math.LN10};B.prototype.lin2log=function(a){return Math.pow(10,a)}})(I);(function(a){var B=a.dateFormat,z=a.each,C=a.extend,E=a.format,u=a.isNumber,h=a.map,n=a.merge,t=a.pick,l=a.splat,k=a.syncTimeout,e=a.timeUnits;a.Tooltip=function(){this.init.apply(this,arguments)};a.Tooltip.prototype={init:function(a,e){this.chart=a;this.options=e;this.crosshairs=[];this.now={x:0,y:0};
|
||||
this.isHidden=!0;this.split=e.split&&!a.inverted;this.shared=e.shared||this.split},cleanSplit:function(a){z(this.chart.series,function(c){var e=c&&c.tt;e&&(!e.isActive||a?c.tt=e.destroy():e.isActive=!1)})},getLabel:function(){var a=this.chart.renderer,e=this.options;this.label||(this.split?this.label=a.g("tooltip"):(this.label=a.label("",0,0,e.shape||"callout",null,null,e.useHTML,null,"tooltip").attr({padding:e.padding,r:e.borderRadius}),this.label.attr({fill:e.backgroundColor,"stroke-width":e.borderWidth}).css(e.style).shadow(e.shadow)),
|
||||
this.label.attr({zIndex:8}).add());return this.label},update:function(a){this.destroy();this.init(this.chart,n(!0,this.options,a))},destroy:function(){this.label&&(this.label=this.label.destroy());this.split&&this.tt&&(this.cleanSplit(this.chart,!0),this.tt=this.tt.destroy());clearTimeout(this.hideTimer);clearTimeout(this.tooltipTimeout)},move:function(a,e,k,b){var c=this,d=c.now,r=!1!==c.options.animation&&!c.isHidden&&(1<Math.abs(a-d.x)||1<Math.abs(e-d.y)),p=c.followPointer||1<c.len;C(d,{x:r?(2*
|
||||
d.x+a)/3:a,y:r?(d.y+e)/2:e,anchorX:p?void 0:r?(2*d.anchorX+k)/3:k,anchorY:p?void 0:r?(d.anchorY+b)/2:b});c.getLabel().attr(d);r&&(clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){c&&c.move(a,e,k,b)},32))},hide:function(a){var c=this;clearTimeout(this.hideTimer);a=t(a,this.options.hideDelay,500);this.isHidden||(this.hideTimer=k(function(){c.getLabel()[a?"fadeOut":"hide"]();c.isHidden=!0},a))},getAnchor:function(a,e){var c,b=this.chart,m=b.inverted,d=b.plotTop,r=b.plotLeft,
|
||||
p=0,v=0,f,k;a=l(a);c=a[0].tooltipPos;this.followPointer&&e&&(void 0===e.chartX&&(e=b.pointer.normalize(e)),c=[e.chartX-b.plotLeft,e.chartY-d]);c||(z(a,function(a){f=a.series.yAxis;k=a.series.xAxis;p+=a.plotX+(!m&&k?k.left-r:0);v+=(a.plotLow?(a.plotLow+a.plotHigh)/2:a.plotY)+(!m&&f?f.top-d:0)}),p/=a.length,v/=a.length,c=[m?b.plotWidth-v:p,this.shared&&!m&&1<a.length&&e?e.chartY-d:m?b.plotHeight-p:v]);return h(c,Math.round)},getPosition:function(a,e,k){var b=this.chart,c=this.distance,d={},r=k.h||0,
|
||||
p,v=["y",b.chartHeight,e,k.plotY+b.plotTop,b.plotTop,b.plotTop+b.plotHeight],f=["x",b.chartWidth,a,k.plotX+b.plotLeft,b.plotLeft,b.plotLeft+b.plotWidth],h=!this.followPointer&&t(k.ttBelow,!b.inverted===!!k.negative),l=function(a,b,f,g,q,e){var m=f<g-c,x=g+c+f<b,v=g-c-f;g+=c;if(h&&x)d[a]=g;else if(!h&&m)d[a]=v;else if(m)d[a]=Math.min(e-f,0>v-r?v:v-r);else if(x)d[a]=Math.max(q,g+r+f>b?g:g+r);else return!1},n=function(a,b,f,g){var q;g<c||g>b-c?q=!1:d[a]=g<f/2?1:g>b-f/2?b-f-2:g-f/2;return q},q=function(a){var b=
|
||||
v;v=f;f=b;p=a},x=function(){!1!==l.apply(0,v)?!1!==n.apply(0,f)||p||(q(!0),x()):p?d.x=d.y=0:(q(!0),x())};(b.inverted||1<this.len)&&q();x();return d},defaultFormatter:function(a){var c=this.points||l(this),e;e=[a.tooltipFooterHeaderFormatter(c[0])];e=e.concat(a.bodyFormatter(c));e.push(a.tooltipFooterHeaderFormatter(c[0],!0));return e},refresh:function(a,e){var c,b=this.options,m,d=a,r,p={},v=[];c=b.formatter||this.defaultFormatter;var p=this.shared,f;clearTimeout(this.hideTimer);this.followPointer=
|
||||
l(d)[0].series.tooltipOptions.followPointer;r=this.getAnchor(d,e);e=r[0];m=r[1];!p||d.series&&d.series.noSharedTooltip?p=d.getLabelConfig():(z(d,function(a){a.setState("hover");v.push(a.getLabelConfig())}),p={x:d[0].category,y:d[0].y},p.points=v,d=d[0]);this.len=v.length;p=c.call(p,this);f=d.series;this.distance=t(f.tooltipOptions.distance,16);!1===p?this.hide():(c=this.getLabel(),this.isHidden&&c.attr({opacity:1}).show(),this.split?this.renderSplit(p,a):(c.attr({text:p&&p.join?p.join(""):p}),c.removeClass(/highcharts-color-[\d]+/g).addClass("highcharts-color-"+
|
||||
t(d.colorIndex,f.colorIndex)),c.attr({stroke:b.borderColor||d.color||f.color||"#666666"}),this.updatePosition({plotX:e,plotY:m,negative:d.negative,ttBelow:d.ttBelow,h:r[2]||0})),this.isHidden=!1)},renderSplit:function(c,e){var p=this,b=[],m=this.chart,d=m.renderer,r=!0,k=this.options,v,f=this.getLabel();z(c.slice(0,e.length+1),function(a,c){c=e[c-1]||{isHeader:!0,plotX:e[0].plotX};var h=c.series||p,q=h.tt,x=c.series||{},l="highcharts-color-"+t(c.colorIndex,x.colorIndex,"none");q||(h.tt=q=d.label(null,
|
||||
null,null,"callout").addClass("highcharts-tooltip-box "+l).attr({padding:k.padding,r:k.borderRadius,fill:k.backgroundColor,stroke:c.color||x.color||"#333333","stroke-width":k.borderWidth}).add(f));q.isActive=!0;q.attr({text:a});q.css(k.style);a=q.getBBox();x=a.width+q.strokeWidth();c.isHeader?(v=a.height,x=Math.max(0,Math.min(c.plotX+m.plotLeft-x/2,m.chartWidth-x))):x=c.plotX+m.plotLeft-t(k.distance,16)-x;0>x&&(r=!1);a=(c.series&&c.series.yAxis&&c.series.yAxis.pos)+(c.plotY||0);a-=m.plotTop;b.push({target:c.isHeader?
|
||||
m.plotHeight+v:a,rank:c.isHeader?1:0,size:h.tt.getBBox().height+1,point:c,x:x,tt:q})});this.cleanSplit();a.distribute(b,m.plotHeight+v);z(b,function(a){var b=a.point,d=b.series;a.tt.attr({visibility:void 0===a.pos?"hidden":"inherit",x:r||b.isHeader?a.x:b.plotX+m.plotLeft+t(k.distance,16),y:a.pos+m.plotTop,anchorX:b.isHeader?b.plotX+m.plotLeft:b.plotX+d.xAxis.pos,anchorY:b.isHeader?a.pos+m.plotTop-15:b.plotY+d.yAxis.pos})})},updatePosition:function(a){var c=this.chart,e=this.getLabel(),e=(this.options.positioner||
|
||||
this.getPosition).call(this,e.width,e.height,a);this.move(Math.round(e.x),Math.round(e.y||0),a.plotX+c.plotLeft,a.plotY+c.plotTop)},getDateFormat:function(a,p,k,b){var c=B("%m-%d %H:%M:%S.%L",p),d,r,h={millisecond:15,second:12,minute:9,hour:6,day:3},v="millisecond";for(r in e){if(a===e.week&&+B("%w",p)===k&&"00:00:00.000"===c.substr(6)){r="week";break}if(e[r]>a){r=v;break}if(h[r]&&c.substr(h[r])!=="01-01 00:00:00.000".substr(h[r]))break;"week"!==r&&(v=r)}r&&(d=b[r]);return d},getXDateFormat:function(a,
|
||||
e,k){e=e.dateTimeLabelFormats;var b=k&&k.closestPointRange;return(b?this.getDateFormat(b,a.x,k.options.startOfWeek,e):e.day)||e.year},tooltipFooterHeaderFormatter:function(a,e){var c=e?"footer":"header";e=a.series;var b=e.tooltipOptions,m=b.xDateFormat,d=e.xAxis,r=d&&"datetime"===d.options.type&&u(a.key),c=b[c+"Format"];r&&!m&&(m=this.getXDateFormat(a,b,d));r&&m&&(c=c.replace("{point.key}","{point.key:"+m+"}"));return E(c,{point:a,series:e})},bodyFormatter:function(a){return h(a,function(a){var c=
|
||||
a.series.tooltipOptions;return(c.pointFormatter||a.point.tooltipFormatter).call(a.point,c.pointFormat)})}}})(I);(function(a){var B=a.addEvent,z=a.attr,C=a.charts,E=a.color,u=a.css,h=a.defined,n=a.doc,t=a.each,l=a.extend,k=a.fireEvent,e=a.offset,c=a.pick,p=a.removeEvent,H=a.splat,b=a.Tooltip,m=a.win;a.Pointer=function(a,b){this.init(a,b)};a.Pointer.prototype={init:function(a,e){this.options=e;this.chart=a;this.runChartClick=e.chart.events&&!!e.chart.events.click;this.pinchDown=[];this.lastValidTouch=
|
||||
{};b&&e.tooltip.enabled&&(a.tooltip=new b(a,e.tooltip),this.followTouchMove=c(e.tooltip.followTouchMove,!0));this.setDOMEvents()},zoomOption:function(a){var b=this.chart,d=b.options.chart,e=d.zoomType||"",b=b.inverted;/touch/.test(a.type)&&(e=c(d.pinchType,e));this.zoomX=a=/x/.test(e);this.zoomY=e=/y/.test(e);this.zoomHor=a&&!b||e&&b;this.zoomVert=e&&!b||a&&b;this.hasZoom=a||e},normalize:function(a,b){var d,c;a=a||m.event;a.target||(a.target=a.srcElement);c=a.touches?a.touches.length?a.touches.item(0):
|
||||
a.changedTouches[0]:a;b||(this.chartPosition=b=e(this.chart.container));void 0===c.pageX?(d=Math.max(a.x,a.clientX-b.left),b=a.y):(d=c.pageX-b.left,b=c.pageY-b.top);return l(a,{chartX:Math.round(d),chartY:Math.round(b)})},getCoordinates:function(a){var b={xAxis:[],yAxis:[]};t(this.chart.axes,function(d){b[d.isXAxis?"xAxis":"yAxis"].push({axis:d,value:d.toValue(a[d.horiz?"chartX":"chartY"])})});return b},getKDPoints:function(a,b,e){var d=[],f,m,r;t(a,function(a){f=a.noSharedTooltip&&b;m=!b&&a.directTouch;
|
||||
a.visible&&!f&&!m&&c(a.options.enableMouseTracking,!0)&&(r=a.searchPoint(e,!f&&1===a.kdDimensions))&&r.series&&d.push(r)});d.sort(function(a,d){var f=a.distX-d.distX,c=a.dist-d.dist,e=(d.series.group&&d.series.group.zIndex)-(a.series.group&&a.series.group.zIndex);return 0!==f&&b?f:0!==c?c:0!==e?e:a.series.index>d.series.index?-1:1});if(b)for(a=d.length;a--;)(d[a].x!==d[0].x||d[a].series.noSharedTooltip)&&d.splice(a,1);return d},getPointFromEvent:function(a){a=a.target;for(var b;a&&!b;)b=a.point,a=
|
||||
a.parentNode;return b},getHoverData:function(a,b,e,m,f,k){var d=a;a=b;var r;if(m)f?(r=[],t(e,function(a){var b=a.noSharedTooltip&&f,e=!f&&a.directTouch;a.visible&&!b&&!e&&c(a.options.enableMouseTracking,!0)&&(a=a.searchKDTree({clientX:d.clientX,plotY:d.plotY},!b&&1===a.kdDimensions))&&a.series&&r.push(a)}),0===r.length&&(r=[d])):r=[d];else{if(a&&!a.options.stickyTracking)r=this.getKDPoints([a],f,k);else{if(!f)if(a)a.options.stickyTracking||(e=[a]);else for(m=0;m<e.length;m++)if(e[m].directTouch||
|
||||
!e[m].options.stickyTracking)e=[];r=this.getKDPoints(e,f,k)}a=(d=r[0])&&d.series}r.sort(function(a,b){return a.series.index-b.series.index});return{hoverPoint:d,hoverSeries:a,hoverPoints:r}},runPointActions:function(b,c){var d=this.chart,e=d.tooltip,f=e?e.shared:!1,m=c||d.hoverPoint,r=m&&m.series||d.hoverSeries;c=this.getHoverData(m,r,d.series,!!c||r&&r.directTouch,f,b);var k,q,m=c.hoverPoint;k=(r=c.hoverSeries)&&r.tooltipOptions.followPointer;q=(f=f&&m&&!m.series.noSharedTooltip)?c.hoverPoints:[m];
|
||||
if(m&&(m!==d.hoverPoint||e&&e.isHidden)){t(d.hoverPoints||[],function(b){-1===a.inArray(b,q)&&b.setState()});t(q||[],function(a){a.setState("hover")});if(d.hoverSeries!==r)r.onMouseOver();r&&!r.directTouch&&(d.hoverPoint&&d.hoverPoint.firePointEvent("mouseOut"),m.firePointEvent("mouseOver"));d.hoverPoints=q;d.hoverPoint=m;e&&e.refresh(f?q:m,b)}else k&&e&&!e.isHidden&&(m=e.getAnchor([{}],b),e.updatePosition({plotX:m[0],plotY:m[1]}));this.unDocMouseMove||(this.unDocMouseMove=B(n,"mousemove",function(b){var d=
|
||||
C[a.hoverChartIndex];if(d)d.pointer.onDocumentMouseMove(b)}));t(q,function(a){t(d.axes,function(d){(!a||a.series&&a.series[d.coll]===d)&&d.drawCrosshair(b,a)})})},reset:function(a,b){var d=this.chart,c=d.hoverSeries,f=d.hoverPoint,e=d.hoverPoints,m=d.tooltip,r=m&&m.shared?e:f;a&&r&&t(H(r),function(b){b.series.isCartesian&&void 0===b.plotX&&(a=!1)});if(a)m&&r&&(m.refresh(r),f&&(f.setState(f.state,!0),t(d.axes,function(a){a.crosshair&&a.drawCrosshair(null,f)})));else{if(f)f.onMouseOut();e&&t(e,function(a){a.setState()});
|
||||
if(c)c.onMouseOut();m&&m.hide(b);this.unDocMouseMove&&(this.unDocMouseMove=this.unDocMouseMove());t(d.axes,function(a){a.hideCrosshair()});this.hoverX=d.hoverPoints=d.hoverPoint=null}},scaleGroups:function(a,b){var d=this.chart,c;t(d.series,function(f){c=a||f.getPlotBox();f.xAxis&&f.xAxis.zoomEnabled&&f.group&&(f.group.attr(c),f.markerGroup&&(f.markerGroup.attr(c),f.markerGroup.clip(b?d.clipRect:null)),f.dataLabelsGroup&&f.dataLabelsGroup.attr(c))});d.clipRect.attr(b||d.clipBox)},dragStart:function(a){var b=
|
||||
this.chart;b.mouseIsDown=a.type;b.cancelClick=!1;b.mouseDownX=this.mouseDownX=a.chartX;b.mouseDownY=this.mouseDownY=a.chartY},drag:function(a){var b=this.chart,d=b.options.chart,c=a.chartX,f=a.chartY,e=this.zoomHor,m=this.zoomVert,k=b.plotLeft,q=b.plotTop,x=b.plotWidth,p=b.plotHeight,h,l=this.selectionMarker,g=this.mouseDownX,n=this.mouseDownY,t=d.panKey&&a[d.panKey+"Key"];l&&l.touch||(c<k?c=k:c>k+x&&(c=k+x),f<q?f=q:f>q+p&&(f=q+p),this.hasDragged=Math.sqrt(Math.pow(g-c,2)+Math.pow(n-f,2)),10<this.hasDragged&&
|
||||
(h=b.isInsidePlot(g-k,n-q),b.hasCartesianSeries&&(this.zoomX||this.zoomY)&&h&&!t&&!l&&(this.selectionMarker=l=b.renderer.rect(k,q,e?1:x,m?1:p,0).attr({fill:d.selectionMarkerFill||E("#335cad").setOpacity(.25).get(),"class":"highcharts-selection-marker",zIndex:7}).add()),l&&e&&(c-=g,l.attr({width:Math.abs(c),x:(0<c?0:c)+g})),l&&m&&(c=f-n,l.attr({height:Math.abs(c),y:(0<c?0:c)+n})),h&&!l&&d.panning&&b.pan(a,d.panning)))},drop:function(a){var b=this,d=this.chart,c=this.hasPinched;if(this.selectionMarker){var f=
|
||||
{originalEvent:a,xAxis:[],yAxis:[]},e=this.selectionMarker,m=e.attr?e.attr("x"):e.x,p=e.attr?e.attr("y"):e.y,q=e.attr?e.attr("width"):e.width,x=e.attr?e.attr("height"):e.height,n;if(this.hasDragged||c)t(d.axes,function(d){if(d.zoomEnabled&&h(d.min)&&(c||b[{xAxis:"zoomX",yAxis:"zoomY"}[d.coll]])){var e=d.horiz,g="touchend"===a.type?d.minPixelPadding:0,r=d.toValue((e?m:p)+g),e=d.toValue((e?m+q:p+x)-g);f[d.coll].push({axis:d,min:Math.min(r,e),max:Math.max(r,e)});n=!0}}),n&&k(d,"selection",f,function(a){d.zoom(l(a,
|
||||
c?{animation:!1}:null))});this.selectionMarker=this.selectionMarker.destroy();c&&this.scaleGroups()}d&&(u(d.container,{cursor:d._cursor}),d.cancelClick=10<this.hasDragged,d.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[])},onContainerMouseDown:function(a){a=this.normalize(a);this.zoomOption(a);a.preventDefault&&a.preventDefault();this.dragStart(a)},onDocumentMouseUp:function(b){C[a.hoverChartIndex]&&C[a.hoverChartIndex].pointer.drop(b)},onDocumentMouseMove:function(a){var b=this.chart,
|
||||
d=this.chartPosition;a=this.normalize(a,d);!d||this.inClass(a.target,"highcharts-tracker")||b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)||this.reset()},onContainerMouseLeave:function(b){var d=C[a.hoverChartIndex];d&&(b.relatedTarget||b.toElement)&&(d.pointer.reset(),d.pointer.chartPosition=null)},onContainerMouseMove:function(b){var d=this.chart;h(a.hoverChartIndex)&&C[a.hoverChartIndex]&&C[a.hoverChartIndex].mouseIsDown||(a.hoverChartIndex=d.index);b=this.normalize(b);b.returnValue=!1;
|
||||
"mousedown"===d.mouseIsDown&&this.drag(b);!this.inClass(b.target,"highcharts-tracker")&&!d.isInsidePlot(b.chartX-d.plotLeft,b.chartY-d.plotTop)||d.openMenu||this.runPointActions(b)},inClass:function(a,b){for(var d;a;){if(d=z(a,"class")){if(-1!==d.indexOf(b))return!0;if(-1!==d.indexOf("highcharts-container"))return!1}a=a.parentNode}},onTrackerMouseOut:function(a){var b=this.chart.hoverSeries;a=a.relatedTarget||a.toElement;if(!(!b||!a||b.options.stickyTracking||this.inClass(a,"highcharts-tooltip")||
|
||||
this.inClass(a,"highcharts-series-"+b.index)&&this.inClass(a,"highcharts-tracker")))b.onMouseOut()},onContainerClick:function(a){var b=this.chart,d=b.hoverPoint,c=b.plotLeft,f=b.plotTop;a=this.normalize(a);b.cancelClick||(d&&this.inClass(a.target,"highcharts-tracker")?(k(d.series,"click",l(a,{point:d})),b.hoverPoint&&d.firePointEvent("click",a)):(l(a,this.getCoordinates(a)),b.isInsidePlot(a.chartX-c,a.chartY-f)&&k(b,"click",a)))},setDOMEvents:function(){var b=this,c=b.chart.container;c.onmousedown=
|
||||
function(a){b.onContainerMouseDown(a)};c.onmousemove=function(a){b.onContainerMouseMove(a)};c.onclick=function(a){b.onContainerClick(a)};B(c,"mouseleave",b.onContainerMouseLeave);1===a.chartCount&&B(n,"mouseup",b.onDocumentMouseUp);a.hasTouch&&(c.ontouchstart=function(a){b.onContainerTouchStart(a)},c.ontouchmove=function(a){b.onContainerTouchMove(a)},1===a.chartCount&&B(n,"touchend",b.onDocumentTouchEnd))},destroy:function(){var b;p(this.chart.container,"mouseleave",this.onContainerMouseLeave);a.chartCount||
|
||||
(p(n,"mouseup",this.onDocumentMouseUp),p(n,"touchend",this.onDocumentTouchEnd));clearInterval(this.tooltipTimeout);for(b in this)this[b]=null}}})(I);(function(a){var B=a.charts,z=a.each,C=a.extend,E=a.map,u=a.noop,h=a.pick;C(a.Pointer.prototype,{pinchTranslate:function(a,h,l,k,e,c){this.zoomHor&&this.pinchTranslateDirection(!0,a,h,l,k,e,c);this.zoomVert&&this.pinchTranslateDirection(!1,a,h,l,k,e,c)},pinchTranslateDirection:function(a,h,l,k,e,c,p,u){var b=this.chart,m=a?"x":"y",d=a?"X":"Y",r="chart"+
|
||||
d,n=a?"width":"height",v=b["plot"+(a?"Left":"Top")],f,y,t=u||1,F=b.inverted,q=b.bounds[a?"h":"v"],x=1===h.length,J=h[0][r],K=l[0][r],L=!x&&h[1][r],g=!x&&l[1][r],D;l=function(){!x&&20<Math.abs(J-L)&&(t=u||Math.abs(K-g)/Math.abs(J-L));y=(v-K)/t+J;f=b["plot"+(a?"Width":"Height")]/t};l();h=y;h<q.min?(h=q.min,D=!0):h+f>q.max&&(h=q.max-f,D=!0);D?(K-=.8*(K-p[m][0]),x||(g-=.8*(g-p[m][1])),l()):p[m]=[K,g];F||(c[m]=y-v,c[n]=f);c=F?1/t:t;e[n]=f;e[m]=h;k[F?a?"scaleY":"scaleX":"scale"+d]=t;k["translate"+d]=c*
|
||||
v+(K-c*J)},pinch:function(a){var n=this,l=n.chart,k=n.pinchDown,e=a.touches,c=e.length,p=n.lastValidTouch,H=n.hasZoom,b=n.selectionMarker,m={},d=1===c&&(n.inClass(a.target,"highcharts-tracker")&&l.runTrackerClick||n.runChartClick),r={};1<c&&(n.initiated=!0);H&&n.initiated&&!d&&a.preventDefault();E(e,function(a){return n.normalize(a)});"touchstart"===a.type?(z(e,function(a,b){k[b]={chartX:a.chartX,chartY:a.chartY}}),p.x=[k[0].chartX,k[1]&&k[1].chartX],p.y=[k[0].chartY,k[1]&&k[1].chartY],z(l.axes,function(a){if(a.zoomEnabled){var b=
|
||||
l.bounds[a.horiz?"h":"v"],d=a.minPixelPadding,c=a.toPixels(h(a.options.min,a.dataMin)),e=a.toPixels(h(a.options.max,a.dataMax)),m=Math.max(c,e);b.min=Math.min(a.pos,Math.min(c,e)-d);b.max=Math.max(a.pos+a.len,m+d)}}),n.res=!0):n.followTouchMove&&1===c?this.runPointActions(n.normalize(a)):k.length&&(b||(n.selectionMarker=b=C({destroy:u,touch:!0},l.plotBox)),n.pinchTranslate(k,e,m,b,r,p),n.hasPinched=H,n.scaleGroups(m,r),n.res&&(n.res=!1,this.reset(!1,0)))},touch:function(n,t){var l=this.chart,k,e;
|
||||
if(l.index!==a.hoverChartIndex)this.onContainerMouseLeave({relatedTarget:!0});a.hoverChartIndex=l.index;1===n.touches.length?(n=this.normalize(n),(e=l.isInsidePlot(n.chartX-l.plotLeft,n.chartY-l.plotTop))&&!l.openMenu?(t&&this.runPointActions(n),"touchmove"===n.type&&(t=this.pinchDown,k=t[0]?4<=Math.sqrt(Math.pow(t[0].chartX-n.chartX,2)+Math.pow(t[0].chartY-n.chartY,2)):!1),h(k,!0)&&this.pinch(n)):t&&this.reset()):2===n.touches.length&&this.pinch(n)},onContainerTouchStart:function(a){this.zoomOption(a);
|
||||
this.touch(a,!0)},onContainerTouchMove:function(a){this.touch(a)},onDocumentTouchEnd:function(h){B[a.hoverChartIndex]&&B[a.hoverChartIndex].pointer.drop(h)}})})(I);(function(a){var B=a.addEvent,z=a.charts,C=a.css,E=a.doc,u=a.extend,h=a.noop,n=a.Pointer,t=a.removeEvent,l=a.win,k=a.wrap;if(l.PointerEvent||l.MSPointerEvent){var e={},c=!!l.PointerEvent,p=function(){var a,c=[];c.item=function(a){return this[a]};for(a in e)e.hasOwnProperty(a)&&c.push({pageX:e[a].pageX,pageY:e[a].pageY,target:e[a].target});
|
||||
return c},H=function(b,c,d,e){"touch"!==b.pointerType&&b.pointerType!==b.MSPOINTER_TYPE_TOUCH||!z[a.hoverChartIndex]||(e(b),e=z[a.hoverChartIndex].pointer,e[c]({type:d,target:b.currentTarget,preventDefault:h,touches:p()}))};u(n.prototype,{onContainerPointerDown:function(a){H(a,"onContainerTouchStart","touchstart",function(a){e[a.pointerId]={pageX:a.pageX,pageY:a.pageY,target:a.currentTarget}})},onContainerPointerMove:function(a){H(a,"onContainerTouchMove","touchmove",function(a){e[a.pointerId]={pageX:a.pageX,
|
||||
pageY:a.pageY};e[a.pointerId].target||(e[a.pointerId].target=a.currentTarget)})},onDocumentPointerUp:function(a){H(a,"onDocumentTouchEnd","touchend",function(a){delete e[a.pointerId]})},batchMSEvents:function(a){a(this.chart.container,c?"pointerdown":"MSPointerDown",this.onContainerPointerDown);a(this.chart.container,c?"pointermove":"MSPointerMove",this.onContainerPointerMove);a(E,c?"pointerup":"MSPointerUp",this.onDocumentPointerUp)}});k(n.prototype,"init",function(a,c,d){a.call(this,c,d);this.hasZoom&&
|
||||
C(c.container,{"-ms-touch-action":"none","touch-action":"none"})});k(n.prototype,"setDOMEvents",function(a){a.apply(this);(this.hasZoom||this.followTouchMove)&&this.batchMSEvents(B)});k(n.prototype,"destroy",function(a){this.batchMSEvents(t);a.call(this)})}})(I);(function(a){var B,z=a.addEvent,C=a.css,E=a.discardElement,u=a.defined,h=a.each,n=a.isFirefox,t=a.marginNames,l=a.merge,k=a.pick,e=a.setAnimation,c=a.stableSort,p=a.win,H=a.wrap;B=a.Legend=function(a,c){this.init(a,c)};B.prototype={init:function(a,
|
||||
c){this.chart=a;this.setOptions(c);c.enabled&&(this.render(),z(this.chart,"endResize",function(){this.legend.positionCheckboxes()}))},setOptions:function(a){var b=k(a.padding,8);this.options=a;this.itemStyle=a.itemStyle;this.itemHiddenStyle=l(this.itemStyle,a.itemHiddenStyle);this.itemMarginTop=a.itemMarginTop||0;this.initialItemX=this.padding=b;this.initialItemY=b-5;this.itemHeight=this.maxItemWidth=0;this.symbolWidth=k(a.symbolWidth,16);this.pages=[]},update:function(a,c){var b=this.chart;this.setOptions(l(!0,
|
||||
this.options,a));this.destroy();b.isDirtyLegend=b.isDirtyBox=!0;k(c,!0)&&b.redraw()},colorizeItem:function(a,c){a.legendGroup[c?"removeClass":"addClass"]("highcharts-legend-item-hidden");var b=this.options,e=a.legendItem,m=a.legendLine,k=a.legendSymbol,f=this.itemHiddenStyle.color,b=c?b.itemStyle.color:f,p=c?a.color||f:f,h=a.options&&a.options.marker,l={fill:p},q;e&&e.css({fill:b,color:b});m&&m.attr({stroke:p});if(k){if(h&&k.isMarker&&(l=a.pointAttribs(),!c))for(q in l)l[q]=f;k.attr(l)}},positionItem:function(a){var b=
|
||||
this.options,d=b.symbolPadding,b=!b.rtl,c=a._legendItemPos,e=c[0],c=c[1],k=a.checkbox;(a=a.legendGroup)&&a.element&&a.translate(b?e:this.legendWidth-e-2*d-4,c);k&&(k.x=e,k.y=c)},destroyItem:function(a){var b=a.checkbox;h(["legendItem","legendLine","legendSymbol","legendGroup"],function(b){a[b]&&(a[b]=a[b].destroy())});b&&E(a.checkbox)},destroy:function(){function a(a){this[a]&&(this[a]=this[a].destroy())}h(this.getAllItems(),function(b){h(["legendItem","legendGroup"],a,b)});h("clipRect up down pager nav box title group".split(" "),
|
||||
a,this);this.display=null},positionCheckboxes:function(a){var b=this.group&&this.group.alignAttr,d,c=this.clipHeight||this.legendHeight,e=this.titleHeight;b&&(d=b.translateY,h(this.allItems,function(m){var f=m.checkbox,k;f&&(k=d+e+f.y+(a||0)+3,C(f,{left:b.translateX+m.checkboxOffset+f.x-20+"px",top:k+"px",display:k>d-6&&k<d+c-6?"":"none"}))}))},renderTitle:function(){var a=this.padding,c=this.options.title,d=0;c.text&&(this.title||(this.title=this.chart.renderer.label(c.text,a-3,a-4,null,null,null,
|
||||
null,null,"legend-title").attr({zIndex:1}).css(c.style).add(this.group)),a=this.title.getBBox(),d=a.height,this.offsetWidth=a.width,this.contentGroup.attr({translateY:d}));this.titleHeight=d},setText:function(b){var c=this.options;b.legendItem.attr({text:c.labelFormat?a.format(c.labelFormat,b):c.labelFormatter.call(b)})},renderItem:function(a){var b=this.chart,d=b.renderer,c=this.options,e="horizontal"===c.layout,p=this.symbolWidth,f=c.symbolPadding,h=this.itemStyle,n=this.itemHiddenStyle,t=this.padding,
|
||||
q=e?k(c.itemDistance,20):0,x=!c.rtl,J=c.width,u=c.itemMarginBottom||0,L=this.itemMarginTop,g=this.initialItemX,D=a.legendItem,H=!a.series,z=!H&&a.series.drawLegendSymbol?a.series:a,B=z.options,B=this.createCheckboxForItem&&B&&B.showCheckbox,C=c.useHTML;D||(a.legendGroup=d.g("legend-item").addClass("highcharts-"+z.type+"-series highcharts-color-"+a.colorIndex+(a.options.className?" "+a.options.className:"")+(H?" highcharts-series-"+a.index:"")).attr({zIndex:1}).add(this.scrollGroup),a.legendItem=D=
|
||||
d.text("",x?p+f:-f,this.baseline||0,C).css(l(a.visible?h:n)).attr({align:x?"left":"right",zIndex:2}).add(a.legendGroup),this.baseline||(h=h.fontSize,this.fontMetrics=d.fontMetrics(h,D),this.baseline=this.fontMetrics.f+3+L,D.attr("y",this.baseline)),this.symbolHeight=c.symbolHeight||this.fontMetrics.f,z.drawLegendSymbol(this,a),this.setItemEvents&&this.setItemEvents(a,D,C),B&&this.createCheckboxForItem(a));this.colorizeItem(a,a.visible);this.setText(a);d=D.getBBox();p=a.checkboxOffset=c.itemWidth||
|
||||
a.legendItemWidth||p+f+d.width+q+(B?20:0);this.itemHeight=f=Math.round(a.legendItemHeight||d.height);e&&this.itemX-g+p>(J||b.chartWidth-2*t-g-c.x)&&(this.itemX=g,this.itemY+=L+this.lastLineHeight+u,this.lastLineHeight=0);this.maxItemWidth=Math.max(this.maxItemWidth,p);this.lastItemY=L+this.itemY+u;this.lastLineHeight=Math.max(f,this.lastLineHeight);a._legendItemPos=[this.itemX,this.itemY];e?this.itemX+=p:(this.itemY+=L+f+u,this.lastLineHeight=f);this.offsetWidth=J||Math.max((e?this.itemX-g-q:p)+t,
|
||||
this.offsetWidth)},getAllItems:function(){var a=[];h(this.chart.series,function(b){var d=b&&b.options;b&&k(d.showInLegend,u(d.linkedTo)?!1:void 0,!0)&&(a=a.concat(b.legendItems||("point"===d.legendType?b.data:b)))});return a},adjustMargins:function(a,c){var b=this.chart,e=this.options,m=e.align.charAt(0)+e.verticalAlign.charAt(0)+e.layout.charAt(0);e.floating||h([/(lth|ct|rth)/,/(rtv|rm|rbv)/,/(rbh|cb|lbh)/,/(lbv|lm|ltv)/],function(d,f){d.test(m)&&!u(a[f])&&(b[t[f]]=Math.max(b[t[f]],b.legend[(f+1)%
|
||||
2?"legendHeight":"legendWidth"]+[1,-1,-1,1][f]*e[f%2?"x":"y"]+k(e.margin,12)+c[f]))})},render:function(){var a=this,e=a.chart,d=e.renderer,k=a.group,p,n,f,y,t=a.box,u=a.options,q=a.padding;a.itemX=a.initialItemX;a.itemY=a.initialItemY;a.offsetWidth=0;a.lastItemY=0;k||(a.group=k=d.g("legend").attr({zIndex:7}).add(),a.contentGroup=d.g().attr({zIndex:1}).add(k),a.scrollGroup=d.g().add(a.contentGroup));a.renderTitle();p=a.getAllItems();c(p,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&
|
||||
b.options.legendIndex||0)});u.reversed&&p.reverse();a.allItems=p;a.display=n=!!p.length;a.lastLineHeight=0;h(p,function(b){a.renderItem(b)});f=(u.width||a.offsetWidth)+q;y=a.lastItemY+a.lastLineHeight+a.titleHeight;y=a.handleOverflow(y);y+=q;t||(a.box=t=d.rect().addClass("highcharts-legend-box").attr({r:u.borderRadius}).add(k),t.isNew=!0);t.attr({stroke:u.borderColor,"stroke-width":u.borderWidth||0,fill:u.backgroundColor||"none"}).shadow(u.shadow);0<f&&0<y&&(t[t.isNew?"attr":"animate"](t.crisp({x:0,
|
||||
y:0,width:f,height:y},t.strokeWidth())),t.isNew=!1);t[n?"show":"hide"]();a.legendWidth=f;a.legendHeight=y;h(p,function(b){a.positionItem(b)});n&&k.align(l(u,{width:f,height:y}),!0,"spacingBox");e.isResizing||this.positionCheckboxes()},handleOverflow:function(a){var b=this,d=this.chart,c=d.renderer,e=this.options,p=e.y,d=d.spacingBox.height+("top"===e.verticalAlign?-p:p)-this.padding,p=e.maxHeight,f,l=this.clipRect,n=e.navigation,t=k(n.animation,!0),q=n.arrowSize||12,x=this.nav,u=this.pages,K=this.padding,
|
||||
L,g=this.allItems,D=function(a){a?l.attr({height:a}):l&&(b.clipRect=l.destroy(),b.contentGroup.clip());b.contentGroup.div&&(b.contentGroup.div.style.clip=a?"rect("+K+"px,9999px,"+(K+a)+"px,0)":"auto")};"horizontal"!==e.layout||"middle"===e.verticalAlign||e.floating||(d/=2);p&&(d=Math.min(d,p));u.length=0;a>d&&!1!==n.enabled?(this.clipHeight=f=Math.max(d-20-this.titleHeight-K,0),this.currentPage=k(this.currentPage,1),this.fullHeight=a,h(g,function(a,b){var d=a._legendItemPos[1];a=Math.round(a.legendItem.getBBox().height);
|
||||
var c=u.length;if(!c||d-u[c-1]>f&&(L||d)!==u[c-1])u.push(L||d),c++;b===g.length-1&&d+a-u[c-1]>f&&u.push(d);d!==L&&(L=d)}),l||(l=b.clipRect=c.clipRect(0,K,9999,0),b.contentGroup.clip(l)),D(f),x||(this.nav=x=c.g().attr({zIndex:1}).add(this.group),this.up=c.symbol("triangle",0,0,q,q).on("click",function(){b.scroll(-1,t)}).add(x),this.pager=c.text("",15,10).addClass("highcharts-legend-navigation").css(n.style).add(x),this.down=c.symbol("triangle-down",0,0,q,q).on("click",function(){b.scroll(1,t)}).add(x)),
|
||||
b.scroll(0),a=d):x&&(D(),this.nav=x.destroy(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0);return a},scroll:function(a,c){var b=this.pages,m=b.length;a=this.currentPage+a;var k=this.clipHeight,p=this.options.navigation,f=this.pager,h=this.padding;a>m&&(a=m);0<a&&(void 0!==c&&e(c,this.chart),this.nav.attr({translateX:h,translateY:k+this.padding+7+this.titleHeight,visibility:"visible"}),this.up.attr({"class":1===a?"highcharts-legend-nav-inactive":"highcharts-legend-nav-active"}),f.attr({text:a+
|
||||
"/"+m}),this.down.attr({x:18+this.pager.getBBox().width,"class":a===m?"highcharts-legend-nav-inactive":"highcharts-legend-nav-active"}),this.up.attr({fill:1===a?p.inactiveColor:p.activeColor}).css({cursor:1===a?"default":"pointer"}),this.down.attr({fill:a===m?p.inactiveColor:p.activeColor}).css({cursor:a===m?"default":"pointer"}),c=-b[a-1]+this.initialItemY,this.scrollGroup.animate({translateY:c}),this.currentPage=a,this.positionCheckboxes(c))}};a.LegendSymbolMixin={drawRectangle:function(a,c){var b=
|
||||
a.symbolHeight,e=a.options.squareSymbol;c.legendSymbol=this.chart.renderer.rect(e?(a.symbolWidth-b)/2:0,a.baseline-b+1,e?b:a.symbolWidth,b,k(a.options.symbolRadius,b/2)).addClass("highcharts-point").attr({zIndex:3}).add(c.legendGroup)},drawLineMarker:function(a){var b=this.options,c=b.marker,e=a.symbolWidth,p=a.symbolHeight,h=p/2,f=this.chart.renderer,n=this.legendGroup;a=a.baseline-Math.round(.3*a.fontMetrics.b);var t;t={"stroke-width":b.lineWidth||0};b.dashStyle&&(t.dashstyle=b.dashStyle);this.legendLine=
|
||||
f.path(["M",0,a,"L",e,a]).addClass("highcharts-graph").attr(t).add(n);c&&!1!==c.enabled&&(b=Math.min(k(c.radius,h),h),0===this.symbol.indexOf("url")&&(c=l(c,{width:p,height:p}),b=0),this.legendSymbol=c=f.symbol(this.symbol,e/2-b,a-b,2*b,2*b,c).addClass("highcharts-point").add(n),c.isMarker=!0)}};(/Trident\/7\.0/.test(p.navigator.userAgent)||n)&&H(B.prototype,"positionItem",function(a,c){var b=this,e=function(){c._legendItemPos&&a.call(b,c)};e();setTimeout(e)})})(I);(function(a){var B=a.addEvent,z=
|
||||
a.animate,C=a.animObject,E=a.attr,u=a.doc,h=a.Axis,n=a.createElement,t=a.defaultOptions,l=a.discardElement,k=a.charts,e=a.css,c=a.defined,p=a.each,H=a.extend,b=a.find,m=a.fireEvent,d=a.getStyle,r=a.grep,A=a.isNumber,v=a.isObject,f=a.isString,y=a.Legend,G=a.marginNames,F=a.merge,q=a.Pointer,x=a.pick,J=a.pInt,K=a.removeEvent,L=a.seriesTypes,g=a.splat,D=a.svg,S=a.syncTimeout,M=a.win,R=a.Renderer,N=a.Chart=function(){this.getArgs.apply(this,arguments)};a.chart=function(a,b,c){return new N(a,b,c)};N.prototype=
|
||||
{callbacks:[],getArgs:function(){var a=[].slice.call(arguments);if(f(a[0])||a[0].nodeName)this.renderTo=a.shift();this.init(a[0],a[1])},init:function(b,c){var d,f=b.series;b.series=null;d=F(t,b);d.series=b.series=f;this.userOptions=b;b=d.chart;f=b.events;this.margin=[];this.spacing=[];this.bounds={h:{},v:{}};this.callback=c;this.isResizing=0;this.options=d;this.axes=[];this.series=[];this.hasCartesianSeries=b.showAxes;var g;this.index=k.length;k.push(this);a.chartCount++;if(f)for(g in f)B(this,g,
|
||||
f[g]);this.xAxis=[];this.yAxis=[];this.pointCount=this.colorCounter=this.symbolCounter=0;this.firstRender()},initSeries:function(b){var c=this.options.chart;(c=L[b.type||c.type||c.defaultSeriesType])||a.error(17,!0);c=new c;c.init(this,b);return c},orderSeries:function(a){var b=this.series;for(a=a||0;a<b.length;a++)b[a]&&(b[a].index=a,b[a].name=b[a].name||"Series "+(b[a].index+1))},isInsidePlot:function(a,b,c){var d=c?b:a;a=c?a:b;return 0<=d&&d<=this.plotWidth&&0<=a&&a<=this.plotHeight},redraw:function(b){var c=
|
||||
this.axes,d=this.series,f=this.pointer,g=this.legend,e=this.isDirtyLegend,q,k,h=this.hasCartesianSeries,x=this.isDirtyBox,l,w=this.renderer,r=w.isHidden(),n=[];this.setResponsive&&this.setResponsive(!1);a.setAnimation(b,this);r&&this.cloneRenderTo();this.layOutTitles();for(b=d.length;b--;)if(l=d[b],l.options.stacking&&(q=!0,l.isDirty)){k=!0;break}if(k)for(b=d.length;b--;)l=d[b],l.options.stacking&&(l.isDirty=!0);p(d,function(a){a.isDirty&&"point"===a.options.legendType&&(a.updateTotals&&a.updateTotals(),
|
||||
e=!0);a.isDirtyData&&m(a,"updatedData")});e&&g.options.enabled&&(g.render(),this.isDirtyLegend=!1);q&&this.getStacks();h&&p(c,function(a){a.updateNames();a.setScale()});this.getMargins();h&&(p(c,function(a){a.isDirty&&(x=!0)}),p(c,function(a){var b=a.min+","+a.max;a.extKey!==b&&(a.extKey=b,n.push(function(){m(a,"afterSetExtremes",H(a.eventArgs,a.getExtremes()));delete a.eventArgs}));(x||q)&&a.redraw()}));x&&this.drawChartBox();m(this,"predraw");p(d,function(a){(x||a.isDirty)&&a.visible&&a.redraw();
|
||||
a.isDirtyData=!1});f&&f.reset(!0);w.draw();m(this,"redraw");m(this,"render");r&&this.cloneRenderTo(!0);p(n,function(a){a.call()})},get:function(a){function c(b){return b.id===a||b.options&&b.options.id===a}var d,f=this.series,g;d=b(this.axes,c)||b(this.series,c);for(g=0;!d&&g<f.length;g++)d=b(f[g].points||[],c);return d},getAxes:function(){var a=this,b=this.options,c=b.xAxis=g(b.xAxis||{}),b=b.yAxis=g(b.yAxis||{});p(c,function(a,b){a.index=b;a.isX=!0});p(b,function(a,b){a.index=b});c=c.concat(b);
|
||||
p(c,function(b){new h(a,b)})},getSelectedPoints:function(){var a=[];p(this.series,function(b){a=a.concat(r(b.points||[],function(a){return a.selected}))});return a},getSelectedSeries:function(){return r(this.series,function(a){return a.selected})},setTitle:function(a,b,c){var d=this,f=d.options,g;g=f.title=F({style:{color:"#333333",fontSize:f.isStock?"16px":"18px"}},f.title,a);f=f.subtitle=F({style:{color:"#666666"}},f.subtitle,b);p([["title",a,g],["subtitle",b,f]],function(a,b){var c=a[0],f=d[c],
|
||||
g=a[1];a=a[2];f&&g&&(d[c]=f=f.destroy());a&&a.text&&!f&&(d[c]=d.renderer.text(a.text,0,0,a.useHTML).attr({align:a.align,"class":"highcharts-"+c,zIndex:a.zIndex||4}).add(),d[c].update=function(a){d.setTitle(!b&&a,b&&a)},d[c].css(a.style))});d.layOutTitles(c)},layOutTitles:function(a){var b=0,c,d=this.renderer,f=this.spacingBox;p(["title","subtitle"],function(a){var c=this[a],g=this.options[a],e;c&&(e=g.style.fontSize,e=d.fontMetrics(e,c).b,c.css({width:(g.width||f.width+g.widthAdjust)+"px"}).align(H({y:b+
|
||||
e+("title"===a?-3:2)},g),!1,"spacingBox"),g.floating||g.verticalAlign||(b=Math.ceil(b+c.getBBox().height)))},this);c=this.titleOffset!==b;this.titleOffset=b;!this.isDirtyBox&&c&&(this.isDirtyBox=c,this.hasRendered&&x(a,!0)&&this.isDirtyBox&&this.redraw())},getChartSize:function(){var b=this.options.chart,f=b.width,b=b.height,g=this.renderToClone||this.renderTo;c(f)||(this.containerWidth=d(g,"width"));c(b)||(this.containerHeight=d(g,"height"));this.chartWidth=Math.max(0,f||this.containerWidth||600);
|
||||
this.chartHeight=Math.max(0,a.relativeLength(b,this.chartWidth)||this.containerHeight||400)},cloneRenderTo:function(a){var b=this.renderToClone,c=this.container;if(a){if(b){for(;b.childNodes.length;)this.renderTo.appendChild(b.firstChild);l(b);delete this.renderToClone}}else c&&c.parentNode===this.renderTo&&this.renderTo.removeChild(c),this.renderToClone=b=this.renderTo.cloneNode(0),e(b,{position:"absolute",top:"-9999px",display:"block"}),b.style.setProperty&&b.style.setProperty("display","block",
|
||||
"important"),u.body.appendChild(b),c&&b.appendChild(c)},setClassName:function(a){this.container.className="highcharts-container "+(a||"")},getContainer:function(){var b,c=this.options,d=c.chart,g,e;b=this.renderTo;var q=a.uniqueKey(),m;b||(this.renderTo=b=d.renderTo);f(b)&&(this.renderTo=b=u.getElementById(b));b||a.error(13,!0);g=J(E(b,"data-highcharts-chart"));A(g)&&k[g]&&k[g].hasRendered&&k[g].destroy();E(b,"data-highcharts-chart",this.index);b.innerHTML="";d.skipClone||b.offsetWidth||this.cloneRenderTo();
|
||||
this.getChartSize();g=this.chartWidth;e=this.chartHeight;m=H({position:"relative",overflow:"hidden",width:g+"px",height:e+"px",textAlign:"left",lineHeight:"normal",zIndex:0,"-webkit-tap-highlight-color":"rgba(0,0,0,0)"},d.style);this.container=b=n("div",{id:q},m,this.renderToClone||b);this._cursor=b.style.cursor;this.renderer=new (a[d.renderer]||R)(b,g,e,null,d.forExport,c.exporting&&c.exporting.allowHTML);this.setClassName(d.className);this.renderer.setStyle(d.style);this.renderer.chartIndex=this.index},
|
||||
getMargins:function(a){var b=this.spacing,d=this.margin,f=this.titleOffset;this.resetMargins();f&&!c(d[0])&&(this.plotTop=Math.max(this.plotTop,f+this.options.title.margin+b[0]));this.legend.display&&this.legend.adjustMargins(d,b);this.extraMargin&&(this[this.extraMargin.type]=(this[this.extraMargin.type]||0)+this.extraMargin.value);this.extraTopMargin&&(this.plotTop+=this.extraTopMargin);a||this.getAxisMargins()},getAxisMargins:function(){var a=this,b=a.axisOffset=[0,0,0,0],d=a.margin;a.hasCartesianSeries&&
|
||||
p(a.axes,function(a){a.visible&&a.getOffset()});p(G,function(f,g){c(d[g])||(a[f]+=b[g])});a.setChartSize()},reflow:function(a){var b=this,f=b.options.chart,g=b.renderTo,e=c(f.width),q=f.width||d(g,"width"),f=f.height||d(g,"height"),g=a?a.target:M;if(!e&&!b.isPrinting&&q&&f&&(g===M||g===u)){if(q!==b.containerWidth||f!==b.containerHeight)clearTimeout(b.reflowTimeout),b.reflowTimeout=S(function(){b.container&&b.setSize(void 0,void 0,!1)},a?100:0);b.containerWidth=q;b.containerHeight=f}},initReflow:function(){var a=
|
||||
this,b;b=B(M,"resize",function(b){a.reflow(b)});B(a,"destroy",b)},setSize:function(b,c,d){var f=this,g=f.renderer;f.isResizing+=1;a.setAnimation(d,f);f.oldChartHeight=f.chartHeight;f.oldChartWidth=f.chartWidth;void 0!==b&&(f.options.chart.width=b);void 0!==c&&(f.options.chart.height=c);f.getChartSize();b=g.globalAnimation;(b?z:e)(f.container,{width:f.chartWidth+"px",height:f.chartHeight+"px"},b);f.setChartSize(!0);g.setSize(f.chartWidth,f.chartHeight,d);p(f.axes,function(a){a.isDirty=!0;a.setScale()});
|
||||
f.isDirtyLegend=!0;f.isDirtyBox=!0;f.layOutTitles();f.getMargins();f.redraw(d);f.oldChartHeight=null;m(f,"resize");S(function(){f&&m(f,"endResize",null,function(){--f.isResizing})},C(b).duration)},setChartSize:function(a){var b=this.inverted,c=this.renderer,d=this.chartWidth,f=this.chartHeight,g=this.options.chart,e=this.spacing,q=this.clipOffset,k,m,h,x;this.plotLeft=k=Math.round(this.plotLeft);this.plotTop=m=Math.round(this.plotTop);this.plotWidth=h=Math.max(0,Math.round(d-k-this.marginRight));
|
||||
this.plotHeight=x=Math.max(0,Math.round(f-m-this.marginBottom));this.plotSizeX=b?x:h;this.plotSizeY=b?h:x;this.plotBorderWidth=g.plotBorderWidth||0;this.spacingBox=c.spacingBox={x:e[3],y:e[0],width:d-e[3]-e[1],height:f-e[0]-e[2]};this.plotBox=c.plotBox={x:k,y:m,width:h,height:x};d=2*Math.floor(this.plotBorderWidth/2);b=Math.ceil(Math.max(d,q[3])/2);c=Math.ceil(Math.max(d,q[0])/2);this.clipBox={x:b,y:c,width:Math.floor(this.plotSizeX-Math.max(d,q[1])/2-b),height:Math.max(0,Math.floor(this.plotSizeY-
|
||||
Math.max(d,q[2])/2-c))};a||p(this.axes,function(a){a.setAxisSize();a.setAxisTranslation()})},resetMargins:function(){var a=this,b=a.options.chart;p(["margin","spacing"],function(c){var d=b[c],f=v(d)?d:[d,d,d,d];p(["Top","Right","Bottom","Left"],function(d,g){a[c][g]=x(b[c+d],f[g])})});p(G,function(b,c){a[b]=x(a.margin[c],a.spacing[c])});a.axisOffset=[0,0,0,0];a.clipOffset=[0,0,0,0]},drawChartBox:function(){var a=this.options.chart,b=this.renderer,c=this.chartWidth,d=this.chartHeight,f=this.chartBackground,
|
||||
g=this.plotBackground,e=this.plotBorder,q,k=this.plotBGImage,m=a.backgroundColor,p=a.plotBackgroundColor,h=a.plotBackgroundImage,x,l=this.plotLeft,r=this.plotTop,n=this.plotWidth,v=this.plotHeight,t=this.plotBox,y=this.clipRect,u=this.clipBox,J="animate";f||(this.chartBackground=f=b.rect().addClass("highcharts-background").add(),J="attr");q=a.borderWidth||0;x=q+(a.shadow?8:0);m={fill:m||"none"};if(q||f["stroke-width"])m.stroke=a.borderColor,m["stroke-width"]=q;f.attr(m).shadow(a.shadow);f[J]({x:x/
|
||||
2,y:x/2,width:c-x-q%2,height:d-x-q%2,r:a.borderRadius});J="animate";g||(J="attr",this.plotBackground=g=b.rect().addClass("highcharts-plot-background").add());g[J](t);g.attr({fill:p||"none"}).shadow(a.plotShadow);h&&(k?k.animate(t):this.plotBGImage=b.image(h,l,r,n,v).add());y?y.animate({width:u.width,height:u.height}):this.clipRect=b.clipRect(u);J="animate";e||(J="attr",this.plotBorder=e=b.rect().addClass("highcharts-plot-border").attr({zIndex:1}).add());e.attr({stroke:a.plotBorderColor,"stroke-width":a.plotBorderWidth||
|
||||
0,fill:"none"});e[J](e.crisp({x:l,y:r,width:n,height:v},-e.strokeWidth()));this.isDirtyBox=!1},propFromSeries:function(){var a=this,b=a.options.chart,c,d=a.options.series,f,g;p(["inverted","angular","polar"],function(e){c=L[b.type||b.defaultSeriesType];g=b[e]||c&&c.prototype[e];for(f=d&&d.length;!g&&f--;)(c=L[d[f].type])&&c.prototype[e]&&(g=!0);a[e]=g})},linkSeries:function(){var a=this,b=a.series;p(b,function(a){a.linkedSeries.length=0});p(b,function(b){var c=b.options.linkedTo;f(c)&&(c=":previous"===
|
||||
c?a.series[b.index-1]:a.get(c))&&c.linkedParent!==b&&(c.linkedSeries.push(b),b.linkedParent=c,b.visible=x(b.options.visible,c.options.visible,b.visible))})},renderSeries:function(){p(this.series,function(a){a.translate();a.render()})},renderLabels:function(){var a=this,b=a.options.labels;b.items&&p(b.items,function(c){var d=H(b.style,c.style),f=J(d.left)+a.plotLeft,g=J(d.top)+a.plotTop+12;delete d.left;delete d.top;a.renderer.text(c.html,f,g).attr({zIndex:2}).css(d).add()})},render:function(){var a=
|
||||
this.axes,b=this.renderer,c=this.options,d,f,g;this.setTitle();this.legend=new y(this,c.legend);this.getStacks&&this.getStacks();this.getMargins(!0);this.setChartSize();c=this.plotWidth;d=this.plotHeight-=21;p(a,function(a){a.setScale()});this.getAxisMargins();f=1.1<c/this.plotWidth;g=1.05<d/this.plotHeight;if(f||g)p(a,function(a){(a.horiz&&f||!a.horiz&&g)&&a.setTickInterval(!0)}),this.getMargins();this.drawChartBox();this.hasCartesianSeries&&p(a,function(a){a.visible&&a.render()});this.seriesGroup||
|
||||
(this.seriesGroup=b.g("series-group").attr({zIndex:3}).add());this.renderSeries();this.renderLabels();this.addCredits();this.setResponsive&&this.setResponsive();this.hasRendered=!0},addCredits:function(a){var b=this;a=F(!0,this.options.credits,a);a.enabled&&!this.credits&&(this.credits=this.renderer.text(a.text+(this.mapCredits||""),0,0).addClass("highcharts-credits").on("click",function(){a.href&&(M.location.href=a.href)}).attr({align:a.position.align,zIndex:8}).css(a.style).add().align(a.position),
|
||||
this.credits.update=function(a){b.credits=b.credits.destroy();b.addCredits(a)})},destroy:function(){var b=this,c=b.axes,d=b.series,f=b.container,g,e=f&&f.parentNode;m(b,"destroy");k[b.index]=void 0;a.chartCount--;b.renderTo.removeAttribute("data-highcharts-chart");K(b);for(g=c.length;g--;)c[g]=c[g].destroy();this.scroller&&this.scroller.destroy&&this.scroller.destroy();for(g=d.length;g--;)d[g]=d[g].destroy();p("title subtitle chartBackground plotBackground plotBGImage plotBorder seriesGroup clipRect credits pointer rangeSelector legend resetZoomButton tooltip renderer".split(" "),
|
||||
function(a){var c=b[a];c&&c.destroy&&(b[a]=c.destroy())});f&&(f.innerHTML="",K(f),e&&l(f));for(g in b)delete b[g]},isReadyToRender:function(){var a=this;return D||M!=M.top||"complete"===u.readyState?!0:(u.attachEvent("onreadystatechange",function(){u.detachEvent("onreadystatechange",a.firstRender);"complete"===u.readyState&&a.firstRender()}),!1)},firstRender:function(){var a=this,b=a.options;if(a.isReadyToRender()){a.getContainer();m(a,"init");a.resetMargins();a.setChartSize();a.propFromSeries();
|
||||
a.getAxes();p(b.series||[],function(b){a.initSeries(b)});a.linkSeries();m(a,"beforeRender");q&&(a.pointer=new q(a,b));a.render();if(!a.renderer.imgCount&&a.onload)a.onload();a.cloneRenderTo(!0)}},onload:function(){p([this.callback].concat(this.callbacks),function(a){a&&void 0!==this.index&&a.apply(this,[this])},this);m(this,"load");m(this,"render");c(this.index)&&!1!==this.options.chart.reflow&&this.initReflow();this.onload=null}}})(I);(function(a){var B,z=a.each,C=a.extend,E=a.erase,u=a.fireEvent,
|
||||
h=a.format,n=a.isArray,t=a.isNumber,l=a.pick,k=a.removeEvent;B=a.Point=function(){};B.prototype={init:function(a,c,k){this.series=a;this.color=a.color;this.applyOptions(c,k);a.options.colorByPoint?(c=a.options.colors||a.chart.options.colors,this.color=this.color||c[a.colorCounter],c=c.length,k=a.colorCounter,a.colorCounter++,a.colorCounter===c&&(a.colorCounter=0)):k=a.colorIndex;this.colorIndex=l(this.colorIndex,k);a.chart.pointCount++;return this},applyOptions:function(a,c){var e=this.series,k=e.options.pointValKey||
|
||||
e.pointValKey;a=B.prototype.optionsToObject.call(this,a);C(this,a);this.options=this.options?C(this.options,a):a;a.group&&delete this.group;k&&(this.y=this[k]);this.isNull=l(this.isValid&&!this.isValid(),null===this.x||!t(this.y,!0));this.selected&&(this.state="select");"name"in this&&void 0===c&&e.xAxis&&e.xAxis.hasNames&&(this.x=e.xAxis.nameToX(this));void 0===this.x&&e&&(this.x=void 0===c?e.autoIncrement(this):c);return this},optionsToObject:function(a){var c={},e=this.series,k=e.options.keys,
|
||||
b=k||e.pointArrayMap||["y"],m=b.length,d=0,h=0;if(t(a)||null===a)c[b[0]]=a;else if(n(a))for(!k&&a.length>m&&(e=typeof a[0],"string"===e?c.name=a[0]:"number"===e&&(c.x=a[0]),d++);h<m;)k&&void 0===a[d]||(c[b[h]]=a[d]),d++,h++;else"object"===typeof a&&(c=a,a.dataLabels&&(e._hasPointLabels=!0),a.marker&&(e._hasPointMarkers=!0));return c},getClassName:function(){return"highcharts-point"+(this.selected?" highcharts-point-select":"")+(this.negative?" highcharts-negative":"")+(this.isNull?" highcharts-null-point":
|
||||
"")+(void 0!==this.colorIndex?" highcharts-color-"+this.colorIndex:"")+(this.options.className?" "+this.options.className:"")+(this.zone&&this.zone.className?" "+this.zone.className.replace("highcharts-negative",""):"")},getZone:function(){var a=this.series,c=a.zones,a=a.zoneAxis||"y",k=0,h;for(h=c[k];this[a]>=h.value;)h=c[++k];h&&h.color&&!this.options.color&&(this.color=h.color);return h},destroy:function(){var a=this.series.chart,c=a.hoverPoints,h;a.pointCount--;c&&(this.setState(),E(c,this),c.length||
|
||||
(a.hoverPoints=null));if(this===a.hoverPoint)this.onMouseOut();if(this.graphic||this.dataLabel)k(this),this.destroyElements();this.legendItem&&a.legend.destroyItem(this);for(h in this)this[h]=null},destroyElements:function(){for(var a=["graphic","dataLabel","dataLabelUpper","connector","shadowGroup"],c,k=6;k--;)c=a[k],this[c]&&(this[c]=this[c].destroy())},getLabelConfig:function(){return{x:this.category,y:this.y,color:this.color,colorIndex:this.colorIndex,key:this.name||this.category,series:this.series,
|
||||
point:this,percentage:this.percentage,total:this.total||this.stackTotal}},tooltipFormatter:function(a){var c=this.series,e=c.tooltipOptions,k=l(e.valueDecimals,""),b=e.valuePrefix||"",m=e.valueSuffix||"";z(c.pointArrayMap||["y"],function(c){c="{point."+c;if(b||m)a=a.replace(c+"}",b+c+"}"+m);a=a.replace(c+"}",c+":,."+k+"f}")});return h(a,{point:this,series:this.series})},firePointEvent:function(a,c,k){var e=this,b=this.series.options;(b.point.events[a]||e.options&&e.options.events&&e.options.events[a])&&
|
||||
this.importEvents();"click"===a&&b.allowPointSelect&&(k=function(a){e.select&&e.select(null,a.ctrlKey||a.metaKey||a.shiftKey)});u(this,a,c,k)},visible:!0}})(I);(function(a){var B=a.addEvent,z=a.animObject,C=a.arrayMax,E=a.arrayMin,u=a.correctFloat,h=a.Date,n=a.defaultOptions,t=a.defaultPlotOptions,l=a.defined,k=a.each,e=a.erase,c=a.extend,p=a.fireEvent,H=a.grep,b=a.isArray,m=a.isNumber,d=a.isString,r=a.merge,A=a.pick,v=a.removeEvent,f=a.splat,y=a.SVGElement,G=a.syncTimeout,F=a.win;a.Series=a.seriesType("line",
|
||||
null,{lineWidth:2,allowPointSelect:!1,showCheckbox:!1,animation:{duration:1E3},events:{},marker:{lineWidth:0,lineColor:"#ffffff",radius:4,states:{hover:{animation:{duration:50},enabled:!0,radiusPlus:2,lineWidthPlus:1},select:{fillColor:"#cccccc",lineColor:"#000000",lineWidth:2}}},point:{events:{}},dataLabels:{align:"center",formatter:function(){return null===this.y?"":a.numberFormat(this.y,-1)},style:{fontSize:"11px",fontWeight:"bold",color:"contrast",textOutline:"1px contrast"},verticalAlign:"bottom",
|
||||
x:0,y:0,padding:5},cropThreshold:300,pointRange:0,softThreshold:!0,states:{hover:{animation:{duration:50},lineWidthPlus:1,marker:{},halo:{size:10,opacity:.25}},select:{marker:{}}},stickyTracking:!0,turboThreshold:1E3},{isCartesian:!0,pointClass:a.Point,sorted:!0,requireSorting:!0,directTouch:!1,axisTypes:["xAxis","yAxis"],colorCounter:0,parallelArrays:["x","y"],coll:"series",init:function(a,b){var d=this,f,e,g=a.series,q;d.chart=a;d.options=b=d.setOptions(b);d.linkedSeries=[];d.bindAxes();c(d,{name:b.name,
|
||||
state:"",visible:!1!==b.visible,selected:!0===b.selected});e=b.events;for(f in e)B(d,f,e[f]);if(e&&e.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick=!0;d.getColor();d.getSymbol();k(d.parallelArrays,function(a){d[a+"Data"]=[]});d.setData(b.data,!1);d.isCartesian&&(a.hasCartesianSeries=!0);g.length&&(q=g[g.length-1]);d._i=A(q&&q._i,-1)+1;a.orderSeries(this.insert(g))},insert:function(a){var b=this.options.index,c;if(m(b)){for(c=a.length;c--;)if(b>=A(a[c].options.index,
|
||||
a[c]._i)){a.splice(c+1,0,this);break}-1===c&&a.unshift(this);c+=1}else a.push(this);return A(c,a.length-1)},bindAxes:function(){var b=this,c=b.options,d=b.chart,f;k(b.axisTypes||[],function(e){k(d[e],function(a){f=a.options;if(c[e]===f.index||void 0!==c[e]&&c[e]===f.id||void 0===c[e]&&0===f.index)b.insert(a.series),b[e]=a,a.isDirty=!0});b[e]||b.optionalAxis===e||a.error(18,!0)})},updateParallelArrays:function(a,b){var c=a.series,d=arguments,f=m(b)?function(d){var f="y"===d&&c.toYData?c.toYData(a):
|
||||
a[d];c[d+"Data"][b]=f}:function(a){Array.prototype[b].apply(c[a+"Data"],Array.prototype.slice.call(d,2))};k(c.parallelArrays,f)},autoIncrement:function(){var a=this.options,b=this.xIncrement,c,d=a.pointIntervalUnit,b=A(b,a.pointStart,0);this.pointInterval=c=A(this.pointInterval,a.pointInterval,1);d&&(a=new h(b),"day"===d?a=+a[h.hcSetDate](a[h.hcGetDate]()+c):"month"===d?a=+a[h.hcSetMonth](a[h.hcGetMonth]()+c):"year"===d&&(a=+a[h.hcSetFullYear](a[h.hcGetFullYear]()+c)),c=a-b);this.xIncrement=b+c;return b},
|
||||
setOptions:function(a){var b=this.chart,c=b.options.plotOptions,b=b.userOptions||{},d=b.plotOptions||{},f=c[this.type];this.userOptions=a;c=r(f,c.series,a);this.tooltipOptions=r(n.tooltip,n.plotOptions[this.type].tooltip,b.tooltip,d.series&&d.series.tooltip,d[this.type]&&d[this.type].tooltip,a.tooltip);null===f.marker&&delete c.marker;this.zoneAxis=c.zoneAxis;a=this.zones=(c.zones||[]).slice();!c.negativeColor&&!c.negativeFillColor||c.zones||a.push({value:c[this.zoneAxis+"Threshold"]||c.threshold||
|
||||
0,className:"highcharts-negative",color:c.negativeColor,fillColor:c.negativeFillColor});a.length&&l(a[a.length-1].value)&&a.push({color:this.color,fillColor:this.fillColor});return c},getCyclic:function(a,b,c){var d,f=this.chart,g=this.userOptions,e=a+"Index",q=a+"Counter",k=c?c.length:A(f.options.chart[a+"Count"],f[a+"Count"]);b||(d=A(g[e],g["_"+e]),l(d)||(f.series.length||(f[q]=0),g["_"+e]=d=f[q]%k,f[q]+=1),c&&(b=c[d]));void 0!==d&&(this[e]=d);this[a]=b},getColor:function(){this.options.colorByPoint?
|
||||
this.options.color=null:this.getCyclic("color",this.options.color||t[this.type].color,this.chart.options.colors)},getSymbol:function(){this.getCyclic("symbol",this.options.marker.symbol,this.chart.options.symbols)},drawLegendSymbol:a.LegendSymbolMixin.drawLineMarker,setData:function(c,f,e,h){var q=this,g=q.points,p=g&&g.length||0,l,x=q.options,r=q.chart,n=null,v=q.xAxis,t=x.turboThreshold,y=this.xData,u=this.yData,G=(l=q.pointArrayMap)&&l.length;c=c||[];l=c.length;f=A(f,!0);if(!1!==h&&l&&p===l&&!q.cropped&&
|
||||
!q.hasGroupedData&&q.visible)k(c,function(a,b){g[b].update&&a!==x.data[b]&&g[b].update(a,!1,null,!1)});else{q.xIncrement=null;q.colorCounter=0;k(this.parallelArrays,function(a){q[a+"Data"].length=0});if(t&&l>t){for(e=0;null===n&&e<l;)n=c[e],e++;if(m(n))for(e=0;e<l;e++)y[e]=this.autoIncrement(),u[e]=c[e];else if(b(n))if(G)for(e=0;e<l;e++)n=c[e],y[e]=n[0],u[e]=n.slice(1,G+1);else for(e=0;e<l;e++)n=c[e],y[e]=n[0],u[e]=n[1];else a.error(12)}else for(e=0;e<l;e++)void 0!==c[e]&&(n={series:q},q.pointClass.prototype.applyOptions.apply(n,
|
||||
[c[e]]),q.updateParallelArrays(n,e));d(u[0])&&a.error(14,!0);q.data=[];q.options.data=q.userOptions.data=c;for(e=p;e--;)g[e]&&g[e].destroy&&g[e].destroy();v&&(v.minRange=v.userMinRange);q.isDirty=r.isDirtyBox=!0;q.isDirtyData=!!g;e=!1}"point"===x.legendType&&(this.processData(),this.generatePoints());f&&r.redraw(e)},processData:function(b){var c=this.xData,d=this.yData,f=c.length,e;e=0;var g,q,k=this.xAxis,m,h=this.options;m=h.cropThreshold;var l=this.getExtremesFromAll||h.getExtremesFromAll,p=this.isCartesian,
|
||||
h=k&&k.val2lin,n=k&&k.isLog,r,v;if(p&&!this.isDirty&&!k.isDirty&&!this.yAxis.isDirty&&!b)return!1;k&&(b=k.getExtremes(),r=b.min,v=b.max);if(p&&this.sorted&&!l&&(!m||f>m||this.forceCrop))if(c[f-1]<r||c[0]>v)c=[],d=[];else if(c[0]<r||c[f-1]>v)e=this.cropData(this.xData,this.yData,r,v),c=e.xData,d=e.yData,e=e.start,g=!0;for(m=c.length||1;--m;)f=n?h(c[m])-h(c[m-1]):c[m]-c[m-1],0<f&&(void 0===q||f<q)?q=f:0>f&&this.requireSorting&&a.error(15);this.cropped=g;this.cropStart=e;this.processedXData=c;this.processedYData=
|
||||
d;this.closestPointRange=q},cropData:function(a,b,c,d){var f=a.length,g=0,e=f,q=A(this.cropShoulder,1),k;for(k=0;k<f;k++)if(a[k]>=c){g=Math.max(0,k-q);break}for(c=k;c<f;c++)if(a[c]>d){e=c+q;break}return{xData:a.slice(g,e),yData:b.slice(g,e),start:g,end:e}},generatePoints:function(){var a=this.options.data,b=this.data,c,d=this.processedXData,e=this.processedYData,g=this.pointClass,k=d.length,m=this.cropStart||0,h,l=this.hasGroupedData,p,n=[],r;b||l||(b=[],b.length=a.length,b=this.data=b);for(r=0;r<
|
||||
k;r++)h=m+r,l?(p=(new g).init(this,[d[r]].concat(f(e[r]))),p.dataGroup=this.groupMap[r]):(p=b[h])||void 0===a[h]||(b[h]=p=(new g).init(this,a[h],d[r])),p.index=h,n[r]=p;if(b&&(k!==(c=b.length)||l))for(r=0;r<c;r++)r!==m||l||(r+=k),b[r]&&(b[r].destroyElements(),b[r].plotX=void 0);this.data=b;this.points=n},getExtremes:function(a){var c=this.yAxis,d=this.processedXData,f,e=[],g=0;f=this.xAxis.getExtremes();var q=f.min,k=f.max,h,l,p,r;a=a||this.stackedYData||this.processedYData||[];f=a.length;for(r=0;r<
|
||||
f;r++)if(l=d[r],p=a[r],h=(m(p,!0)||b(p))&&(!c.positiveValuesOnly||p.length||0<p),l=this.getExtremesFromAll||this.options.getExtremesFromAll||this.cropped||(d[r+1]||l)>=q&&(d[r-1]||l)<=k,h&&l)if(h=p.length)for(;h--;)null!==p[h]&&(e[g++]=p[h]);else e[g++]=p;this.dataMin=E(e);this.dataMax=C(e)},translate:function(){this.processedXData||this.processData();this.generatePoints();var a=this.options,b=a.stacking,c=this.xAxis,d=c.categories,f=this.yAxis,e=this.points,k=e.length,h=!!this.modifyValue,p=a.pointPlacement,
|
||||
r="between"===p||m(p),n=a.threshold,v=a.startFromThreshold?n:0,t,y,G,F,H=Number.MAX_VALUE;"between"===p&&(p=.5);m(p)&&(p*=A(a.pointRange||c.pointRange));for(a=0;a<k;a++){var z=e[a],B=z.x,C=z.y;y=z.low;var E=b&&f.stacks[(this.negStacks&&C<(v?0:n)?"-":"")+this.stackKey],I;f.positiveValuesOnly&&null!==C&&0>=C&&(z.isNull=!0);z.plotX=t=u(Math.min(Math.max(-1E5,c.translate(B,0,0,0,1,p,"flags"===this.type)),1E5));b&&this.visible&&!z.isNull&&E&&E[B]&&(F=this.getStackIndicator(F,B,this.index),I=E[B],C=I.points[F.key],
|
||||
y=C[0],C=C[1],y===v&&F.key===E[B].base&&(y=A(n,f.min)),f.positiveValuesOnly&&0>=y&&(y=null),z.total=z.stackTotal=I.total,z.percentage=I.total&&z.y/I.total*100,z.stackY=C,I.setOffset(this.pointXOffset||0,this.barW||0));z.yBottom=l(y)?f.translate(y,0,1,0,1):null;h&&(C=this.modifyValue(C,z));z.plotY=y="number"===typeof C&&Infinity!==C?Math.min(Math.max(-1E5,f.translate(C,0,1,0,1)),1E5):void 0;z.isInside=void 0!==y&&0<=y&&y<=f.len&&0<=t&&t<=c.len;z.clientX=r?u(c.translate(B,0,0,0,1,p)):t;z.negative=z.y<
|
||||
(n||0);z.category=d&&void 0!==d[z.x]?d[z.x]:z.x;z.isNull||(void 0!==G&&(H=Math.min(H,Math.abs(t-G))),G=t);z.zone=this.zones.length&&z.getZone()}this.closestPointRangePx=H},getValidPoints:function(a,b){var c=this.chart;return H(a||this.points||[],function(a){return b&&!c.isInsidePlot(a.plotX,a.plotY,c.inverted)?!1:!a.isNull})},setClip:function(a){var b=this.chart,c=this.options,d=b.renderer,f=b.inverted,e=this.clipBox,q=e||b.clipBox,k=this.sharedClipKey||["_sharedClip",a&&a.duration,a&&a.easing,q.height,
|
||||
c.xAxis,c.yAxis].join(),m=b[k],h=b[k+"m"];m||(a&&(q.width=0,b[k+"m"]=h=d.clipRect(-99,f?-b.plotLeft:-b.plotTop,99,f?b.chartWidth:b.chartHeight)),b[k]=m=d.clipRect(q),m.count={length:0});a&&!m.count[this.index]&&(m.count[this.index]=!0,m.count.length+=1);!1!==c.clip&&(this.group.clip(a||e?m:b.clipRect),this.markerGroup.clip(h),this.sharedClipKey=k);a||(m.count[this.index]&&(delete m.count[this.index],--m.count.length),0===m.count.length&&k&&b[k]&&(e||(b[k]=b[k].destroy()),b[k+"m"]&&(this.markerGroup.clip(),
|
||||
b[k+"m"]=b[k+"m"].destroy())))},animate:function(a){var b=this.chart,c=z(this.options.animation),d;a?this.setClip(c):(d=this.sharedClipKey,(a=b[d])&&a.animate({width:b.plotSizeX},c),b[d+"m"]&&b[d+"m"].animate({width:b.plotSizeX+99},c),this.animate=null)},afterAnimate:function(){this.setClip();p(this,"afterAnimate")},drawPoints:function(){var a=this.points,b=this.chart,c,d,f,e,k=this.options.marker,h,p,l,r,n=this.markerGroup,v=A(k.enabled,this.xAxis.isRadial?!0:null,this.closestPointRangePx>=2*k.radius);
|
||||
if(!1!==k.enabled||this._hasPointMarkers)for(d=0;d<a.length;d++)f=a[d],c=f.plotY,e=f.graphic,h=f.marker||{},p=!!f.marker,l=v&&void 0===h.enabled||h.enabled,r=f.isInside,l&&m(c)&&null!==f.y?(c=A(h.symbol,this.symbol),f.hasImage=0===c.indexOf("url"),l=this.markerAttribs(f,f.selected&&"select"),e?e[r?"show":"hide"](!0).animate(l):r&&(0<l.width||f.hasImage)&&(f.graphic=e=b.renderer.symbol(c,l.x,l.y,l.width,l.height,p?h:k).add(n)),e&&e.attr(this.pointAttribs(f,f.selected&&"select")),e&&e.addClass(f.getClassName(),
|
||||
!0)):e&&(f.graphic=e.destroy())},markerAttribs:function(a,b){var c=this.options.marker,d=a.marker||{},f=A(d.radius,c.radius);b&&(c=c.states[b],b=d.states&&d.states[b],f=A(b&&b.radius,c&&c.radius,f+(c&&c.radiusPlus||0)));a.hasImage&&(f=0);a={x:Math.floor(a.plotX)-f,y:a.plotY-f};f&&(a.width=a.height=2*f);return a},pointAttribs:function(a,b){var c=this.options.marker,d=a&&a.options,f=d&&d.marker||{},e=this.color,q=d&&d.color,k=a&&a.color,d=A(f.lineWidth,c.lineWidth);a=a&&a.zone&&a.zone.color;e=q||a||
|
||||
k||e;a=f.fillColor||c.fillColor||e;e=f.lineColor||c.lineColor||e;b&&(c=c.states[b],b=f.states&&f.states[b]||{},d=A(b.lineWidth,c.lineWidth,d+A(b.lineWidthPlus,c.lineWidthPlus,0)),a=b.fillColor||c.fillColor||a,e=b.lineColor||c.lineColor||e);return{stroke:e,"stroke-width":d,fill:a}},destroy:function(){var a=this,b=a.chart,c=/AppleWebKit\/533/.test(F.navigator.userAgent),d,f=a.data||[],g,m,h;p(a,"destroy");v(a);k(a.axisTypes||[],function(b){(h=a[b])&&h.series&&(e(h.series,a),h.isDirty=h.forceRedraw=
|
||||
!0)});a.legendItem&&a.chart.legend.destroyItem(a);for(d=f.length;d--;)(g=f[d])&&g.destroy&&g.destroy();a.points=null;clearTimeout(a.animationTimeout);for(m in a)a[m]instanceof y&&!a[m].survive&&(d=c&&"group"===m?"hide":"destroy",a[m][d]());b.hoverSeries===a&&(b.hoverSeries=null);e(b.series,a);b.orderSeries();for(m in a)delete a[m]},getGraphPath:function(a,b,c){var d=this,f=d.options,e=f.step,q,m=[],h=[],p;a=a||d.points;(q=a.reversed)&&a.reverse();(e={right:1,center:2}[e]||e&&3)&&q&&(e=4-e);!f.connectNulls||
|
||||
b||c||(a=this.getValidPoints(a));k(a,function(g,k){var q=g.plotX,r=g.plotY,n=a[k-1];(g.leftCliff||n&&n.rightCliff)&&!c&&(p=!0);g.isNull&&!l(b)&&0<k?p=!f.connectNulls:g.isNull&&!b?p=!0:(0===k||p?k=["M",g.plotX,g.plotY]:d.getPointSpline?k=d.getPointSpline(a,g,k):e?(k=1===e?["L",n.plotX,r]:2===e?["L",(n.plotX+q)/2,n.plotY,"L",(n.plotX+q)/2,r]:["L",q,n.plotY],k.push("L",q,r)):k=["L",q,r],h.push(g.x),e&&h.push(g.x),m.push.apply(m,k),p=!1)});m.xMap=h;return d.graphPath=m},drawGraph:function(){var a=this,
|
||||
b=this.options,c=(this.gappedPath||this.getGraphPath).call(this),d=[["graph","highcharts-graph",b.lineColor||this.color,b.dashStyle]];k(this.zones,function(c,f){d.push(["zone-graph-"+f,"highcharts-graph highcharts-zone-graph-"+f+" "+(c.className||""),c.color||a.color,c.dashStyle||b.dashStyle])});k(d,function(d,f){var e=d[0],g=a[e];g?(g.endX=c.xMap,g.animate({d:c})):c.length&&(a[e]=a.chart.renderer.path(c).addClass(d[1]).attr({zIndex:1}).add(a.group),g={stroke:d[2],"stroke-width":b.lineWidth,fill:a.fillGraph&&
|
||||
a.color||"none"},d[3]?g.dashstyle=d[3]:"square"!==b.linecap&&(g["stroke-linecap"]=g["stroke-linejoin"]="round"),g=a[e].attr(g).shadow(2>f&&b.shadow));g&&(g.startX=c.xMap,g.isArea=c.isArea)})},applyZones:function(){var a=this,b=this.chart,c=b.renderer,d=this.zones,f,e,m=this.clips||[],h,p=this.graph,l=this.area,r=Math.max(b.chartWidth,b.chartHeight),n=this[(this.zoneAxis||"y")+"Axis"],v,t,y=b.inverted,u,G,F,H,z=!1;d.length&&(p||l)&&n&&void 0!==n.min&&(t=n.reversed,u=n.horiz,p&&p.hide(),l&&l.hide(),
|
||||
v=n.getExtremes(),k(d,function(d,g){f=t?u?b.plotWidth:0:u?0:n.toPixels(v.min);f=Math.min(Math.max(A(e,f),0),r);e=Math.min(Math.max(Math.round(n.toPixels(A(d.value,v.max),!0)),0),r);z&&(f=e=n.toPixels(v.max));G=Math.abs(f-e);F=Math.min(f,e);H=Math.max(f,e);n.isXAxis?(h={x:y?H:F,y:0,width:G,height:r},u||(h.x=b.plotHeight-h.x)):(h={x:0,y:y?H:F,width:r,height:G},u&&(h.y=b.plotWidth-h.y));y&&c.isVML&&(h=n.isXAxis?{x:0,y:t?F:H,height:h.width,width:b.chartWidth}:{x:h.y-b.plotLeft-b.spacingBox.x,y:0,width:h.height,
|
||||
height:b.chartHeight});m[g]?m[g].animate(h):(m[g]=c.clipRect(h),p&&a["zone-graph-"+g].clip(m[g]),l&&a["zone-area-"+g].clip(m[g]));z=d.value>v.max}),this.clips=m)},invertGroups:function(a){function b(){k(["group","markerGroup"],function(b){c[b]&&(d.renderer.isVML&&c[b].attr({width:c.yAxis.len,height:c.xAxis.len}),c[b].width=c.yAxis.len,c[b].height=c.xAxis.len,c[b].invert(a))})}var c=this,d=c.chart,f;c.xAxis&&(f=B(d,"resize",b),B(c,"destroy",f),b(a),c.invertGroups=b)},plotGroup:function(a,b,c,d,f){var e=
|
||||
this[a],k=!e;k&&(this[a]=e=this.chart.renderer.g(b).attr({zIndex:d||.1}).add(f),e.addClass("highcharts-series-"+this.index+" highcharts-"+this.type+"-series highcharts-color-"+this.colorIndex+" "+(this.options.className||"")));e.attr({visibility:c})[k?"attr":"animate"](this.getPlotBox());return e},getPlotBox:function(){var a=this.chart,b=this.xAxis,c=this.yAxis;a.inverted&&(b=c,c=this.xAxis);return{translateX:b?b.left:a.plotLeft,translateY:c?c.top:a.plotTop,scaleX:1,scaleY:1}},render:function(){var a=
|
||||
this,b=a.chart,c,d=a.options,f=!!a.animate&&b.renderer.isSVG&&z(d.animation).duration,e=a.visible?"inherit":"hidden",k=d.zIndex,m=a.hasRendered,h=b.seriesGroup,p=b.inverted;c=a.plotGroup("group","series",e,k,h);a.markerGroup=a.plotGroup("markerGroup","markers",e,k,h);f&&a.animate(!0);c.inverted=a.isCartesian?p:!1;a.drawGraph&&(a.drawGraph(),a.applyZones());a.drawDataLabels&&a.drawDataLabels();a.visible&&a.drawPoints();a.drawTracker&&!1!==a.options.enableMouseTracking&&a.drawTracker();a.invertGroups(p);
|
||||
!1===d.clip||a.sharedClipKey||m||c.clip(b.clipRect);f&&a.animate();m||(a.animationTimeout=G(function(){a.afterAnimate()},f));a.isDirty=!1;a.hasRendered=!0},redraw:function(){var a=this.chart,b=this.isDirty||this.isDirtyData,c=this.group,d=this.xAxis,f=this.yAxis;c&&(a.inverted&&c.attr({width:a.plotWidth,height:a.plotHeight}),c.animate({translateX:A(d&&d.left,a.plotLeft),translateY:A(f&&f.top,a.plotTop)}));this.translate();this.render();b&&delete this.kdTree},kdDimensions:1,kdAxisArray:["clientX",
|
||||
"plotY"],searchPoint:function(a,b){var c=this.xAxis,d=this.yAxis,f=this.chart.inverted;return this.searchKDTree({clientX:f?c.len-a.chartY+c.pos:a.chartX-c.pos,plotY:f?d.len-a.chartX+d.pos:a.chartY-d.pos},b)},buildKDTree:function(){function a(c,d,f){var e,g;if(g=c&&c.length)return e=b.kdAxisArray[d%f],c.sort(function(a,b){return a[e]-b[e]}),g=Math.floor(g/2),{point:c[g],left:a(c.slice(0,g),d+1,f),right:a(c.slice(g+1),d+1,f)}}this.buildingKdTree=!0;var b=this,c=b.kdDimensions;delete b.kdTree;G(function(){b.kdTree=
|
||||
a(b.getValidPoints(null,!b.directTouch),c,c);b.buildingKdTree=!1},b.options.kdNow?0:1)},searchKDTree:function(a,b){function c(a,b,g,m){var h=b.point,p=d.kdAxisArray[g%m],q,r,n=h;r=l(a[f])&&l(h[f])?Math.pow(a[f]-h[f],2):null;q=l(a[e])&&l(h[e])?Math.pow(a[e]-h[e],2):null;q=(r||0)+(q||0);h.dist=l(q)?Math.sqrt(q):Number.MAX_VALUE;h.distX=l(r)?Math.sqrt(r):Number.MAX_VALUE;p=a[p]-h[p];q=0>p?"left":"right";r=0>p?"right":"left";b[q]&&(q=c(a,b[q],g+1,m),n=q[k]<n[k]?q:h);b[r]&&Math.sqrt(p*p)<n[k]&&(a=c(a,
|
||||
b[r],g+1,m),n=a[k]<n[k]?a:n);return n}var d=this,f=this.kdAxisArray[0],e=this.kdAxisArray[1],k=b?"distX":"dist";this.kdTree||this.buildingKdTree||this.buildKDTree();if(this.kdTree)return c(a,this.kdTree,this.kdDimensions,this.kdDimensions)}})})(I);(function(a){function B(a,e,c,h,n){var b=a.chart.inverted;this.axis=a;this.isNegative=c;this.options=e;this.x=h;this.total=null;this.points={};this.stack=n;this.rightCliff=this.leftCliff=0;this.alignOptions={align:e.align||(b?c?"left":"right":"center"),
|
||||
verticalAlign:e.verticalAlign||(b?"middle":c?"bottom":"top"),y:l(e.y,b?4:c?14:-6),x:l(e.x,b?c?-6:6:0)};this.textAlign=e.textAlign||(b?c?"right":"left":"center")}var z=a.Axis,C=a.Chart,E=a.correctFloat,u=a.defined,h=a.destroyObjectProperties,n=a.each,t=a.format,l=a.pick;a=a.Series;B.prototype={destroy:function(){h(this,this.axis)},render:function(a){var e=this.options,c=e.format,c=c?t(c,this):e.formatter.call(this);this.label?this.label.attr({text:c,visibility:"hidden"}):this.label=this.axis.chart.renderer.text(c,
|
||||
null,null,e.useHTML).css(e.style).attr({align:this.textAlign,rotation:e.rotation,visibility:"hidden"}).add(a)},setOffset:function(a,e){var c=this.axis,k=c.chart,h=k.inverted,b=c.reversed,b=this.isNegative&&!b||!this.isNegative&&b,m=c.translate(c.usePercentage?100:this.total,0,0,0,1),c=c.translate(0),c=Math.abs(m-c);a=k.xAxis[0].translate(this.x)+a;var d=k.plotHeight,h={x:h?b?m:m-c:a,y:h?d-a-e:b?d-m-c:d-m,width:h?c:e,height:h?e:c};if(e=this.label)e.align(this.alignOptions,null,h),h=e.alignAttr,e[!1===
|
||||
this.options.crop||k.isInsidePlot(h.x,h.y)?"show":"hide"](!0)}};C.prototype.getStacks=function(){var a=this;n(a.yAxis,function(a){a.stacks&&a.hasVisibleSeries&&(a.oldStacks=a.stacks)});n(a.series,function(e){!e.options.stacking||!0!==e.visible&&!1!==a.options.chart.ignoreHiddenSeries||(e.stackKey=e.type+l(e.options.stack,""))})};z.prototype.buildStacks=function(){var a=this.series,e,c=l(this.options.reversedStacks,!0),h=a.length,n;if(!this.isXAxis){this.usePercentage=!1;for(n=h;n--;)a[c?n:h-n-1].setStackedPoints();
|
||||
for(n=h;n--;)e=a[c?n:h-n-1],e.setStackCliffs&&e.setStackCliffs();if(this.usePercentage)for(n=0;n<h;n++)a[n].setPercentStacks()}};z.prototype.renderStackTotals=function(){var a=this.chart,e=a.renderer,c=this.stacks,h,l,b=this.stackTotalGroup;b||(this.stackTotalGroup=b=e.g("stack-labels").attr({visibility:"visible",zIndex:6}).add());b.translate(a.plotLeft,a.plotTop);for(h in c)for(l in a=c[h],a)a[l].render(b)};z.prototype.resetStacks=function(){var a=this.stacks,e,c;if(!this.isXAxis)for(e in a)for(c in a[e])a[e][c].touched<
|
||||
this.stacksTouched?(a[e][c].destroy(),delete a[e][c]):(a[e][c].total=null,a[e][c].cum=null)};z.prototype.cleanStacks=function(){var a,e,c;if(!this.isXAxis)for(e in this.oldStacks&&(a=this.stacks=this.oldStacks),a)for(c in a[e])a[e][c].cum=a[e][c].total};a.prototype.setStackedPoints=function(){if(this.options.stacking&&(!0===this.visible||!1===this.chart.options.chart.ignoreHiddenSeries)){var a=this.processedXData,e=this.processedYData,c=[],h=e.length,n=this.options,b=n.threshold,m=n.startFromThreshold?
|
||||
b:0,d=n.stack,n=n.stacking,r=this.stackKey,t="-"+r,v=this.negStacks,f=this.yAxis,y=f.stacks,G=f.oldStacks,F,q,x,z,K,C,g;f.stacksTouched+=1;for(K=0;K<h;K++)C=a[K],g=e[K],F=this.getStackIndicator(F,C,this.index),z=F.key,x=(q=v&&g<(m?0:b))?t:r,y[x]||(y[x]={}),y[x][C]||(G[x]&&G[x][C]?(y[x][C]=G[x][C],y[x][C].total=null):y[x][C]=new B(f,f.options.stackLabels,q,C,d)),x=y[x][C],null!==g&&(x.points[z]=x.points[this.index]=[l(x.cum,m)],u(x.cum)||(x.base=z),x.touched=f.stacksTouched,0<F.index&&!1===this.singleStacks&&
|
||||
(x.points[z][0]=x.points[this.index+","+C+",0"][0])),"percent"===n?(q=q?r:t,v&&y[q]&&y[q][C]?(q=y[q][C],x.total=q.total=Math.max(q.total,x.total)+Math.abs(g)||0):x.total=E(x.total+(Math.abs(g)||0))):x.total=E(x.total+(g||0)),x.cum=l(x.cum,m)+(g||0),null!==g&&(x.points[z].push(x.cum),c[K]=x.cum);"percent"===n&&(f.usePercentage=!0);this.stackedYData=c;f.oldStacks={}}};a.prototype.setPercentStacks=function(){var a=this,e=a.stackKey,c=a.yAxis.stacks,h=a.processedXData,l;n([e,"-"+e],function(b){for(var e=
|
||||
h.length,d,k;e--;)if(d=h[e],l=a.getStackIndicator(l,d,a.index,b),d=(k=c[b]&&c[b][d])&&k.points[l.key])k=k.total?100/k.total:0,d[0]=E(d[0]*k),d[1]=E(d[1]*k),a.stackedYData[e]=d[1]})};a.prototype.getStackIndicator=function(a,e,c,h){!u(a)||a.x!==e||h&&a.key!==h?a={x:e,index:0,key:h}:a.index++;a.key=[c,e,a.index].join();return a}})(I);(function(a){var B=a.addEvent,z=a.animate,C=a.Axis,E=a.createElement,u=a.css,h=a.defined,n=a.each,t=a.erase,l=a.extend,k=a.fireEvent,e=a.inArray,c=a.isNumber,p=a.isObject,
|
||||
H=a.merge,b=a.pick,m=a.Point,d=a.Series,r=a.seriesTypes,A=a.setAnimation,v=a.splat;l(a.Chart.prototype,{addSeries:function(a,c,d){var f,e=this;a&&(c=b(c,!0),k(e,"addSeries",{options:a},function(){f=e.initSeries(a);e.isDirtyLegend=!0;e.linkSeries();c&&e.redraw(d)}));return f},addAxis:function(a,c,d,e){var f=c?"xAxis":"yAxis",h=this.options;a=H(a,{index:this[f].length,isX:c});new C(this,a);h[f]=v(h[f]||{});h[f].push(a);b(d,!0)&&this.redraw(e)},showLoading:function(a){var b=this,c=b.options,d=b.loadingDiv,
|
||||
f=c.loading,e=function(){d&&u(d,{left:b.plotLeft+"px",top:b.plotTop+"px",width:b.plotWidth+"px",height:b.plotHeight+"px"})};d||(b.loadingDiv=d=E("div",{className:"highcharts-loading highcharts-loading-hidden"},null,b.container),b.loadingSpan=E("span",{className:"highcharts-loading-inner"},null,d),B(b,"redraw",e));d.className="highcharts-loading";b.loadingSpan.innerHTML=a||c.lang.loading;u(d,l(f.style,{zIndex:10}));u(b.loadingSpan,f.labelStyle);b.loadingShown||(u(d,{opacity:0,display:""}),z(d,{opacity:f.style.opacity||
|
||||
.5},{duration:f.showDuration||0}));b.loadingShown=!0;e()},hideLoading:function(){var a=this.options,b=this.loadingDiv;b&&(b.className="highcharts-loading highcharts-loading-hidden",z(b,{opacity:0},{duration:a.loading.hideDuration||100,complete:function(){u(b,{display:"none"})}}));this.loadingShown=!1},propsRequireDirtyBox:"backgroundColor borderColor borderWidth margin marginTop marginRight marginBottom marginLeft spacing spacingTop spacingRight spacingBottom spacingLeft borderRadius plotBackgroundColor plotBackgroundImage plotBorderColor plotBorderWidth plotShadow shadow".split(" "),
|
||||
propsRequireUpdateSeries:"chart.inverted chart.polar chart.ignoreHiddenSeries chart.type colors plotOptions".split(" "),update:function(a,d){var f,k={credits:"addCredits",title:"setTitle",subtitle:"setSubtitle"},m=a.chart,l,p;if(m){H(!0,this.options.chart,m);"className"in m&&this.setClassName(m.className);if("inverted"in m||"polar"in m)this.propFromSeries(),l=!0;for(f in m)m.hasOwnProperty(f)&&(-1!==e("chart."+f,this.propsRequireUpdateSeries)&&(p=!0),-1!==e(f,this.propsRequireDirtyBox)&&(this.isDirtyBox=
|
||||
!0));"style"in m&&this.renderer.setStyle(m.style)}for(f in a){if(this[f]&&"function"===typeof this[f].update)this[f].update(a[f],!1);else if("function"===typeof this[k[f]])this[k[f]](a[f]);"chart"!==f&&-1!==e(f,this.propsRequireUpdateSeries)&&(p=!0)}a.colors&&(this.options.colors=a.colors);a.plotOptions&&H(!0,this.options.plotOptions,a.plotOptions);n(["xAxis","yAxis","series"],function(b){a[b]&&n(v(a[b]),function(a,c){(c=h(a.id)&&this.get(a.id)||this[b][c])&&c.coll===b&&c.update(a,!1)},this)},this);
|
||||
l&&n(this.axes,function(a){a.update({},!1)});p&&n(this.series,function(a){a.update({},!1)});a.loading&&H(!0,this.options.loading,a.loading);f=m&&m.width;m=m&&m.height;c(f)&&f!==this.chartWidth||c(m)&&m!==this.chartHeight?this.setSize(f,m):b(d,!0)&&this.redraw()},setSubtitle:function(a){this.setTitle(void 0,a)}});l(m.prototype,{update:function(a,c,d,e){function f(){h.applyOptions(a);null===h.y&&k&&(h.graphic=k.destroy());p(a,!0)&&(k&&k.element&&a&&a.marker&&a.marker.symbol&&(h.graphic=k.destroy()),
|
||||
a&&a.dataLabels&&h.dataLabel&&(h.dataLabel=h.dataLabel.destroy()));l=h.index;m.updateParallelArrays(h,l);n.data[l]=p(n.data[l],!0)||p(a,!0)?h.options:a;m.isDirty=m.isDirtyData=!0;!m.fixedBox&&m.hasCartesianSeries&&(g.isDirtyBox=!0);"point"===n.legendType&&(g.isDirtyLegend=!0);c&&g.redraw(d)}var h=this,m=h.series,k=h.graphic,l,g=m.chart,n=m.options;c=b(c,!0);!1===e?f():h.firePointEvent("update",{options:a},f)},remove:function(a,b){this.series.removePoint(e(this,this.series.data),a,b)}});l(d.prototype,
|
||||
{addPoint:function(a,c,d,e){var f=this.options,h=this.data,m=this.chart,k=this.xAxis,k=k&&k.hasNames&&k.names,l=f.data,g,p,n=this.xData,r,v;c=b(c,!0);g={series:this};this.pointClass.prototype.applyOptions.apply(g,[a]);v=g.x;r=n.length;if(this.requireSorting&&v<n[r-1])for(p=!0;r&&n[r-1]>v;)r--;this.updateParallelArrays(g,"splice",r,0,0);this.updateParallelArrays(g,r);k&&g.name&&(k[v]=g.name);l.splice(r,0,a);p&&(this.data.splice(r,0,null),this.processData());"point"===f.legendType&&this.generatePoints();
|
||||
d&&(h[0]&&h[0].remove?h[0].remove(!1):(h.shift(),this.updateParallelArrays(g,"shift"),l.shift()));this.isDirtyData=this.isDirty=!0;c&&m.redraw(e)},removePoint:function(a,c,d){var f=this,e=f.data,h=e[a],m=f.points,k=f.chart,l=function(){m&&m.length===e.length&&m.splice(a,1);e.splice(a,1);f.options.data.splice(a,1);f.updateParallelArrays(h||{series:f},"splice",a,1);h&&h.destroy();f.isDirty=!0;f.isDirtyData=!0;c&&k.redraw()};A(d,k);c=b(c,!0);h?h.firePointEvent("remove",null,l):l()},remove:function(a,
|
||||
c,d){function f(){e.destroy();h.isDirtyLegend=h.isDirtyBox=!0;h.linkSeries();b(a,!0)&&h.redraw(c)}var e=this,h=e.chart;!1!==d?k(e,"remove",null,f):f()},update:function(a,c){var d=this,f=this.chart,e=this.userOptions,h=this.oldType||this.type,m=a.type||e.type||f.options.chart.type,k=r[h].prototype,p=["group","markerGroup","dataLabelsGroup"],g;if(m&&m!==h||void 0!==a.zIndex)p.length=0;n(p,function(a){p[a]=d[a];delete d[a]});a=H(e,{animation:!1,index:this.index,pointStart:this.xData[0]},{data:this.options.data},
|
||||
a);this.remove(!1,null,!1);for(g in k)this[g]=void 0;l(this,r[m||h].prototype);n(p,function(a){d[a]=p[a]});this.init(f,a);this.oldType=h;f.linkSeries();b(c,!0)&&f.redraw(!1)}});l(C.prototype,{update:function(a,c){var d=this.chart;a=d.options[this.coll][this.options.index]=H(this.userOptions,a);this.destroy(!0);this.init(d,l(a,{events:void 0}));d.isDirtyBox=!0;b(c,!0)&&d.redraw()},remove:function(a){for(var c=this.chart,d=this.coll,f=this.series,e=f.length;e--;)f[e]&&f[e].remove(!1);t(c.axes,this);
|
||||
t(c[d],this);c.options[d].splice(this.options.index,1);n(c[d],function(a,b){a.options.index=b});this.destroy();c.isDirtyBox=!0;b(a,!0)&&c.redraw()},setTitle:function(a,b){this.update({title:a},b)},setCategories:function(a,b){this.update({categories:a},b)}})})(I);(function(a){var B=a.color,z=a.each,C=a.map,E=a.pick,u=a.Series,h=a.seriesType;h("area","line",{softThreshold:!1,threshold:0},{singleStacks:!1,getStackPoints:function(){var a=[],h=[],l=this.xAxis,k=this.yAxis,e=k.stacks[this.stackKey],c={},
|
||||
p=this.points,u=this.index,b=k.series,m=b.length,d,r=E(k.options.reversedStacks,!0)?1:-1,A,v;if(this.options.stacking){for(A=0;A<p.length;A++)c[p[A].x]=p[A];for(v in e)null!==e[v].total&&h.push(v);h.sort(function(a,b){return a-b});d=C(b,function(){return this.visible});z(h,function(b,p){var f=0,n,q;if(c[b]&&!c[b].isNull)a.push(c[b]),z([-1,1],function(a){var f=1===a?"rightNull":"leftNull",k=0,l=e[h[p+a]];if(l)for(A=u;0<=A&&A<m;)n=l.points[A],n||(A===u?c[b][f]=!0:d[A]&&(q=e[b].points[A])&&(k-=q[1]-
|
||||
q[0])),A+=r;c[b][1===a?"rightCliff":"leftCliff"]=k});else{for(A=u;0<=A&&A<m;){if(n=e[b].points[A]){f=n[1];break}A+=r}f=k.translate(f,0,1,0,1);a.push({isNull:!0,plotX:l.translate(b,0,0,0,1),x:b,plotY:f,yBottom:f})}})}return a},getGraphPath:function(a){var h=u.prototype.getGraphPath,l=this.options,k=l.stacking,e=this.yAxis,c,p,n=[],b=[],m=this.index,d,r=e.stacks[this.stackKey],A=l.threshold,v=e.getThreshold(l.threshold),f,l=l.connectNulls||"percent"===k,y=function(c,f,h){var l=a[c];c=k&&r[l.x].points[m];
|
||||
var p=l[h+"Null"]||0;h=l[h+"Cliff"]||0;var q,t,l=!0;h||p?(q=(p?c[0]:c[1])+h,t=c[0]+h,l=!!p):!k&&a[f]&&a[f].isNull&&(q=t=A);void 0!==q&&(b.push({plotX:d,plotY:null===q?v:e.getThreshold(q),isNull:l,isCliff:!0}),n.push({plotX:d,plotY:null===t?v:e.getThreshold(t),doCurve:!1}))};a=a||this.points;k&&(a=this.getStackPoints());for(c=0;c<a.length;c++)if(p=a[c].isNull,d=E(a[c].rectPlotX,a[c].plotX),f=E(a[c].yBottom,v),!p||l)l||y(c,c-1,"left"),p&&!k&&l||(b.push(a[c]),n.push({x:c,plotX:d,plotY:f})),l||y(c,c+
|
||||
1,"right");c=h.call(this,b,!0,!0);n.reversed=!0;p=h.call(this,n,!0,!0);p.length&&(p[0]="L");p=c.concat(p);h=h.call(this,b,!1,l);p.xMap=c.xMap;this.areaPath=p;return h},drawGraph:function(){this.areaPath=[];u.prototype.drawGraph.apply(this);var a=this,h=this.areaPath,l=this.options,k=[["area","highcharts-area",this.color,l.fillColor]];z(this.zones,function(e,c){k.push(["zone-area-"+c,"highcharts-area highcharts-zone-area-"+c+" "+e.className,e.color||a.color,e.fillColor||l.fillColor])});z(k,function(e){var c=
|
||||
e[0],k=a[c];k?(k.endX=h.xMap,k.animate({d:h})):(k=a[c]=a.chart.renderer.path(h).addClass(e[1]).attr({fill:E(e[3],B(e[2]).setOpacity(E(l.fillOpacity,.75)).get()),zIndex:0}).add(a.group),k.isArea=!0);k.startX=h.xMap;k.shiftUnit=l.step?2:1})},drawLegendSymbol:a.LegendSymbolMixin.drawRectangle})})(I);(function(a){var B=a.pick;a=a.seriesType;a("spline","line",{},{getPointSpline:function(a,C,E){var u=C.plotX,h=C.plotY,n=a[E-1];E=a[E+1];var t,l,k,e;if(n&&!n.isNull&&!1!==n.doCurve&&!C.isCliff&&E&&!E.isNull&&
|
||||
!1!==E.doCurve&&!C.isCliff){a=n.plotY;k=E.plotX;E=E.plotY;var c=0;t=(1.5*u+n.plotX)/2.5;l=(1.5*h+a)/2.5;k=(1.5*u+k)/2.5;e=(1.5*h+E)/2.5;k!==t&&(c=(e-l)*(k-u)/(k-t)+h-e);l+=c;e+=c;l>a&&l>h?(l=Math.max(a,h),e=2*h-l):l<a&&l<h&&(l=Math.min(a,h),e=2*h-l);e>E&&e>h?(e=Math.max(E,h),l=2*h-e):e<E&&e<h&&(e=Math.min(E,h),l=2*h-e);C.rightContX=k;C.rightContY=e}C=["C",B(n.rightContX,n.plotX),B(n.rightContY,n.plotY),B(t,u),B(l,h),u,h];n.rightContX=n.rightContY=null;return C}})})(I);(function(a){var B=a.seriesTypes.area.prototype,
|
||||
z=a.seriesType;z("areaspline","spline",a.defaultPlotOptions.area,{getStackPoints:B.getStackPoints,getGraphPath:B.getGraphPath,setStackCliffs:B.setStackCliffs,drawGraph:B.drawGraph,drawLegendSymbol:a.LegendSymbolMixin.drawRectangle})})(I);(function(a){var B=a.animObject,z=a.color,C=a.each,E=a.extend,u=a.isNumber,h=a.merge,n=a.pick,t=a.Series,l=a.seriesType,k=a.svg;l("column","line",{borderRadius:0,groupPadding:.2,marker:null,pointPadding:.1,minPointLength:0,cropThreshold:50,pointRange:null,states:{hover:{halo:!1,
|
||||
brightness:.1,shadow:!1},select:{color:"#cccccc",borderColor:"#000000",shadow:!1}},dataLabels:{align:null,verticalAlign:null,y:null},softThreshold:!1,startFromThreshold:!0,stickyTracking:!1,tooltip:{distance:6},threshold:0,borderColor:"#ffffff"},{cropShoulder:0,directTouch:!0,trackerGroups:["group","dataLabelsGroup"],negStacks:!0,init:function(){t.prototype.init.apply(this,arguments);var a=this,c=a.chart;c.hasRendered&&C(c.series,function(c){c.type===a.type&&(c.isDirty=!0)})},getColumnMetrics:function(){var a=
|
||||
this,c=a.options,h=a.xAxis,k=a.yAxis,b=h.reversed,m,d={},l=0;!1===c.grouping?l=1:C(a.chart.series,function(b){var c=b.options,f=b.yAxis,e;b.type===a.type&&b.visible&&k.len===f.len&&k.pos===f.pos&&(c.stacking?(m=b.stackKey,void 0===d[m]&&(d[m]=l++),e=d[m]):!1!==c.grouping&&(e=l++),b.columnIndex=e)});var t=Math.min(Math.abs(h.transA)*(h.ordinalSlope||c.pointRange||h.closestPointRange||h.tickInterval||1),h.len),v=t*c.groupPadding,f=(t-2*v)/(l||1),c=Math.min(c.maxPointWidth||h.len,n(c.pointWidth,f*(1-
|
||||
2*c.pointPadding)));a.columnMetrics={width:c,offset:(f-c)/2+(v+((a.columnIndex||0)+(b?1:0))*f-t/2)*(b?-1:1)};return a.columnMetrics},crispCol:function(a,c,h,k){var b=this.chart,e=this.borderWidth,d=-(e%2?.5:0),e=e%2?.5:1;b.inverted&&b.renderer.isVML&&(e+=1);h=Math.round(a+h)+d;a=Math.round(a)+d;k=Math.round(c+k)+e;d=.5>=Math.abs(c)&&.5<k;c=Math.round(c)+e;k-=c;d&&k&&(--c,k+=1);return{x:a,y:c,width:h-a,height:k}},translate:function(){var a=this,c=a.chart,h=a.options,k=a.dense=2>a.closestPointRange*
|
||||
a.xAxis.transA,k=a.borderWidth=n(h.borderWidth,k?0:1),b=a.yAxis,m=a.translatedThreshold=b.getThreshold(h.threshold),d=n(h.minPointLength,5),l=a.getColumnMetrics(),u=l.width,v=a.barW=Math.max(u,1+2*k),f=a.pointXOffset=l.offset;c.inverted&&(m-=.5);h.pointPadding&&(v=Math.ceil(v));t.prototype.translate.apply(a);C(a.points,function(e){var h=n(e.yBottom,m),k=999+Math.abs(h),k=Math.min(Math.max(-k,e.plotY),b.len+k),l=e.plotX+f,p=v,r=Math.min(k,h),t,y=Math.max(k,h)-r;Math.abs(y)<d&&d&&(y=d,t=!b.reversed&&
|
||||
!e.negative||b.reversed&&e.negative,r=Math.abs(r-m)>d?h-d:m-(t?d:0));e.barX=l;e.pointWidth=u;e.tooltipPos=c.inverted?[b.len+b.pos-c.plotLeft-k,a.xAxis.len-l-p/2,y]:[l+p/2,k+b.pos-c.plotTop,y];e.shapeType="rect";e.shapeArgs=a.crispCol.apply(a,e.isNull?[e.plotX,b.len/2,0,0]:[l,r,p,y])})},getSymbol:a.noop,drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,drawGraph:function(){this.group[this.dense?"addClass":"removeClass"]("highcharts-dense-data")},pointAttribs:function(a,c){var e=this.options,k,b=this.pointAttrToOptions||
|
||||
{};k=b.stroke||"borderColor";var m=b["stroke-width"]||"borderWidth",d=a&&a.color||this.color,l=a[k]||e[k]||this.color||d,n=a[m]||e[m]||this[m]||0,b=e.dashStyle;a&&this.zones.length&&(d=(d=a.getZone())&&d.color||a.options.color||this.color);c&&(a=h(e.states[c],a.options.states&&a.options.states[c]||{}),c=a.brightness,d=a.color||void 0!==c&&z(d).brighten(a.brightness).get()||d,l=a[k]||l,n=a[m]||n,b=a.dashStyle||b);k={fill:d,stroke:l,"stroke-width":n};e.borderRadius&&(k.r=e.borderRadius);b&&(k.dashstyle=
|
||||
b);return k},drawPoints:function(){var a=this,c=this.chart,k=a.options,l=c.renderer,b=k.animationLimit||250,m;C(a.points,function(d){var e=d.graphic;if(u(d.plotY)&&null!==d.y){m=d.shapeArgs;if(e)e[c.pointCount<b?"animate":"attr"](h(m));else d.graphic=e=l[d.shapeType](m).add(d.group||a.group);e.attr(a.pointAttribs(d,d.selected&&"select")).shadow(k.shadow,null,k.stacking&&!k.borderRadius);e.addClass(d.getClassName(),!0)}else e&&(d.graphic=e.destroy())})},animate:function(a){var c=this,e=this.yAxis,
|
||||
h=c.options,b=this.chart.inverted,m={};k&&(a?(m.scaleY=.001,a=Math.min(e.pos+e.len,Math.max(e.pos,e.toPixels(h.threshold))),b?m.translateX=a-e.len:m.translateY=a,c.group.attr(m)):(m[b?"translateX":"translateY"]=e.pos,c.group.animate(m,E(B(c.options.animation),{step:function(a,b){c.group.attr({scaleY:Math.max(.001,b.pos)})}})),c.animate=null))},remove:function(){var a=this,c=a.chart;c.hasRendered&&C(c.series,function(c){c.type===a.type&&(c.isDirty=!0)});t.prototype.remove.apply(a,arguments)}})})(I);
|
||||
(function(a){a=a.seriesType;a("bar","column",null,{inverted:!0})})(I);(function(a){var B=a.Series;a=a.seriesType;a("scatter","line",{lineWidth:0,marker:{enabled:!0},tooltip:{headerFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cspan style\x3d"font-size: 0.85em"\x3e {series.name}\x3c/span\x3e\x3cbr/\x3e',pointFormat:"x: \x3cb\x3e{point.x}\x3c/b\x3e\x3cbr/\x3ey: \x3cb\x3e{point.y}\x3c/b\x3e\x3cbr/\x3e"}},{sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:["group",
|
||||
"markerGroup","dataLabelsGroup"],takeOrdinalPosition:!1,kdDimensions:2,drawGraph:function(){this.options.lineWidth&&B.prototype.drawGraph.call(this)}})})(I);(function(a){var B=a.pick,z=a.relativeLength;a.CenteredSeriesMixin={getCenter:function(){var a=this.options,E=this.chart,u=2*(a.slicedOffset||0),h=E.plotWidth-2*u,E=E.plotHeight-2*u,n=a.center,n=[B(n[0],"50%"),B(n[1],"50%"),a.size||"100%",a.innerSize||0],t=Math.min(h,E),l,k;for(l=0;4>l;++l)k=n[l],a=2>l||2===l&&/%$/.test(k),n[l]=z(k,[h,E,t,n[2]][l])+
|
||||
(a?u:0);n[3]>n[2]&&(n[3]=n[2]);return n}}})(I);(function(a){var B=a.addEvent,z=a.defined,C=a.each,E=a.extend,u=a.inArray,h=a.noop,n=a.pick,t=a.Point,l=a.Series,k=a.seriesType,e=a.setAnimation;k("pie","line",{center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return null===this.y?void 0:this.point.name},x:0},ignoreHiddenPoint:!0,legendType:"point",marker:null,size:null,showInLegend:!1,slicedOffset:10,stickyTracking:!1,tooltip:{followPointer:!0},borderColor:"#ffffff",
|
||||
borderWidth:1,states:{hover:{brightness:.1,shadow:!1}}},{isCartesian:!1,requireSorting:!1,directTouch:!0,noSharedTooltip:!0,trackerGroups:["group","dataLabelsGroup"],axisTypes:[],pointAttribs:a.seriesTypes.column.prototype.pointAttribs,animate:function(a){var c=this,e=c.points,b=c.startAngleRad;a||(C(e,function(a){var d=a.graphic,e=a.shapeArgs;d&&(d.attr({r:a.startR||c.center[3]/2,start:b,end:b}),d.animate({r:e.r,start:e.start,end:e.end},c.options.animation))}),c.animate=null)},updateTotals:function(){var a,
|
||||
e=0,h=this.points,b=h.length,k,d=this.options.ignoreHiddenPoint;for(a=0;a<b;a++)k=h[a],0>k.y&&(k.y=null),e+=d&&!k.visible?0:k.y;this.total=e;for(a=0;a<b;a++)k=h[a],k.percentage=0<e&&(k.visible||!d)?k.y/e*100:0,k.total=e},generatePoints:function(){l.prototype.generatePoints.call(this);this.updateTotals()},translate:function(a){this.generatePoints();var c=0,e=this.options,b=e.slicedOffset,h=b+(e.borderWidth||0),d,k,l,v=e.startAngle||0,f=this.startAngleRad=Math.PI/180*(v-90),v=(this.endAngleRad=Math.PI/
|
||||
180*(n(e.endAngle,v+360)-90))-f,t=this.points,u=e.dataLabels.distance,e=e.ignoreHiddenPoint,F,q=t.length,x;a||(this.center=a=this.getCenter());this.getX=function(b,c){l=Math.asin(Math.min((b-a[1])/(a[2]/2+u),1));return a[0]+(c?-1:1)*Math.cos(l)*(a[2]/2+u)};for(F=0;F<q;F++){x=t[F];d=f+c*v;if(!e||x.visible)c+=x.percentage/100;k=f+c*v;x.shapeType="arc";x.shapeArgs={x:a[0],y:a[1],r:a[2]/2,innerR:a[3]/2,start:Math.round(1E3*d)/1E3,end:Math.round(1E3*k)/1E3};l=(k+d)/2;l>1.5*Math.PI?l-=2*Math.PI:l<-Math.PI/
|
||||
2&&(l+=2*Math.PI);x.slicedTranslation={translateX:Math.round(Math.cos(l)*b),translateY:Math.round(Math.sin(l)*b)};d=Math.cos(l)*a[2]/2;k=Math.sin(l)*a[2]/2;x.tooltipPos=[a[0]+.7*d,a[1]+.7*k];x.half=l<-Math.PI/2||l>Math.PI/2?1:0;x.angle=l;h=Math.min(h,u/5);x.labelPos=[a[0]+d+Math.cos(l)*u,a[1]+k+Math.sin(l)*u,a[0]+d+Math.cos(l)*h,a[1]+k+Math.sin(l)*h,a[0]+d,a[1]+k,0>u?"center":x.half?"right":"left",l]}},drawGraph:null,drawPoints:function(){var a=this,e=a.chart.renderer,h,b,k,d,l=a.options.shadow;l&&
|
||||
!a.shadowGroup&&(a.shadowGroup=e.g("shadow").add(a.group));C(a.points,function(c){if(null!==c.y){b=c.graphic;d=c.shapeArgs;h=c.getTranslate();var m=c.shadowGroup;l&&!m&&(m=c.shadowGroup=e.g("shadow").add(a.shadowGroup));m&&m.attr(h);k=a.pointAttribs(c,c.selected&&"select");b?b.setRadialReference(a.center).attr(k).animate(E(d,h)):(c.graphic=b=e[c.shapeType](d).setRadialReference(a.center).attr(h).add(a.group),c.visible||b.attr({visibility:"hidden"}),b.attr(k).attr({"stroke-linejoin":"round"}).shadow(l,
|
||||
m));b.addClass(c.getClassName())}})},searchPoint:h,sortByAngle:function(a,e){a.sort(function(a,b){return void 0!==a.angle&&(b.angle-a.angle)*e})},drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,getCenter:a.CenteredSeriesMixin.getCenter,getSymbol:h},{init:function(){t.prototype.init.apply(this,arguments);var a=this,e;a.name=n(a.name,"Slice");e=function(c){a.slice("select"===c.type)};B(a,"select",e);B(a,"unselect",e);return a},setVisible:function(a,e){var c=this,b=c.series,h=b.chart,d=b.options.ignoreHiddenPoint;
|
||||
e=n(e,d);a!==c.visible&&(c.visible=c.options.visible=a=void 0===a?!c.visible:a,b.options.data[u(c,b.data)]=c.options,C(["graphic","dataLabel","connector","shadowGroup"],function(b){if(c[b])c[b][a?"show":"hide"](!0)}),c.legendItem&&h.legend.colorizeItem(c,a),a||"hover"!==c.state||c.setState(""),d&&(b.isDirty=!0),e&&h.redraw())},slice:function(a,h,k){var b=this.series;e(k,b.chart);n(h,!0);this.sliced=this.options.sliced=z(a)?a:!this.sliced;b.options.data[u(this,b.data)]=this.options;this.graphic.animate(this.getTranslate());
|
||||
this.shadowGroup&&this.shadowGroup.animate(this.getTranslate())},getTranslate:function(){return this.sliced?this.slicedTranslation:{translateX:0,translateY:0}},haloPath:function(a){var c=this.shapeArgs;return this.sliced||!this.visible?[]:this.series.chart.renderer.symbols.arc(c.x,c.y,c.r+a,c.r+a,{innerR:this.shapeArgs.r,start:c.start,end:c.end})}})})(I);(function(a){var B=a.addEvent,z=a.arrayMax,C=a.defined,E=a.each,u=a.extend,h=a.format,n=a.map,t=a.merge,l=a.noop,k=a.pick,e=a.relativeLength,c=a.Series,
|
||||
p=a.seriesTypes,H=a.stableSort;a.distribute=function(a,c){function b(a,b){return a.target-b.target}var e,h=!0,k=a,f=[],l;l=0;for(e=a.length;e--;)l+=a[e].size;if(l>c){H(a,function(a,b){return(b.rank||0)-(a.rank||0)});for(l=e=0;l<=c;)l+=a[e].size,e++;f=a.splice(e-1,a.length)}H(a,b);for(a=n(a,function(a){return{size:a.size,targets:[a.target]}});h;){for(e=a.length;e--;)h=a[e],l=(Math.min.apply(0,h.targets)+Math.max.apply(0,h.targets))/2,h.pos=Math.min(Math.max(0,l-h.size/2),c-h.size);e=a.length;for(h=
|
||||
!1;e--;)0<e&&a[e-1].pos+a[e-1].size>a[e].pos&&(a[e-1].size+=a[e].size,a[e-1].targets=a[e-1].targets.concat(a[e].targets),a[e-1].pos+a[e-1].size>c&&(a[e-1].pos=c-a[e-1].size),a.splice(e,1),h=!0)}e=0;E(a,function(a){var b=0;E(a.targets,function(){k[e].pos=a.pos+b;b+=k[e].size;e++})});k.push.apply(k,f);H(k,b)};c.prototype.drawDataLabels=function(){var a=this,c=a.options,d=c.dataLabels,e=a.points,l,n,f=a.hasRendered||0,p,u,F=k(d.defer,!0),q=a.chart.renderer;if(d.enabled||a._hasPointLabels)a.dlProcessOptions&&
|
||||
a.dlProcessOptions(d),u=a.plotGroup("dataLabelsGroup","data-labels",F&&!f?"hidden":"visible",d.zIndex||6),F&&(u.attr({opacity:+f}),f||B(a,"afterAnimate",function(){a.visible&&u.show(!0);u[c.animation?"animate":"attr"]({opacity:1},{duration:200})})),n=d,E(e,function(b){var f,e=b.dataLabel,m,g,r,v=b.connector,y=!e,x;l=b.dlOptions||b.options&&b.options.dataLabels;if(f=k(l&&l.enabled,n.enabled)&&null!==b.y)for(g in d=t(n,l),m=b.getLabelConfig(),p=d.format?h(d.format,m):d.formatter.call(m,d),x=d.style,
|
||||
r=d.rotation,x.color=k(d.color,x.color,a.color,"#000000"),"contrast"===x.color&&(x.color=d.inside||0>d.distance||c.stacking?q.getContrast(b.color||a.color):"#000000"),c.cursor&&(x.cursor=c.cursor),m={fill:d.backgroundColor,stroke:d.borderColor,"stroke-width":d.borderWidth,r:d.borderRadius||0,rotation:r,padding:d.padding,zIndex:1},m)void 0===m[g]&&delete m[g];!e||f&&C(p)?f&&C(p)&&(e?m.text=p:(e=b.dataLabel=q[r?"text":"label"](p,0,-9999,d.shape,null,null,d.useHTML,null,"data-label"),e.addClass("highcharts-data-label-color-"+
|
||||
b.colorIndex+" "+(d.className||"")+(d.useHTML?"highcharts-tracker":""))),e.attr(m),e.css(x).shadow(d.shadow),e.added||e.add(u),a.alignDataLabel(b,e,d,null,y)):(b.dataLabel=e.destroy(),v&&(b.connector=v.destroy()))})};c.prototype.alignDataLabel=function(a,c,d,e,h){var b=this.chart,f=b.inverted,l=k(a.plotX,-9999),m=k(a.plotY,-9999),n=c.getBBox(),q,p=d.rotation,r=d.align,t=this.visible&&(a.series.forceDL||b.isInsidePlot(l,Math.round(m),f)||e&&b.isInsidePlot(l,f?e.x+1:e.y+e.height-1,f)),A="justify"===
|
||||
k(d.overflow,"justify");t&&(q=d.style.fontSize,q=b.renderer.fontMetrics(q,c).b,e=u({x:f?b.plotWidth-m:l,y:Math.round(f?b.plotHeight-l:m),width:0,height:0},e),u(d,{width:n.width,height:n.height}),p?(A=!1,f=b.renderer.rotCorr(q,p),f={x:e.x+d.x+e.width/2+f.x,y:e.y+d.y+{top:0,middle:.5,bottom:1}[d.verticalAlign]*e.height},c[h?"attr":"animate"](f).attr({align:r}),l=(p+720)%360,l=180<l&&360>l,"left"===r?f.y-=l?n.height:0:"center"===r?(f.x-=n.width/2,f.y-=n.height/2):"right"===r&&(f.x-=n.width,f.y-=l?0:
|
||||
n.height)):(c.align(d,null,e),f=c.alignAttr),A?this.justifyDataLabel(c,d,f,n,e,h):k(d.crop,!0)&&(t=b.isInsidePlot(f.x,f.y)&&b.isInsidePlot(f.x+n.width,f.y+n.height)),d.shape&&!p&&c.attr({anchorX:a.plotX,anchorY:a.plotY}));t||(c.attr({y:-9999}),c.placed=!1)};c.prototype.justifyDataLabel=function(a,c,d,e,h,k){var b=this.chart,l=c.align,m=c.verticalAlign,n,q,p=a.box?0:a.padding||0;n=d.x+p;0>n&&("right"===l?c.align="left":c.x=-n,q=!0);n=d.x+e.width-p;n>b.plotWidth&&("left"===l?c.align="right":c.x=b.plotWidth-
|
||||
n,q=!0);n=d.y+p;0>n&&("bottom"===m?c.verticalAlign="top":c.y=-n,q=!0);n=d.y+e.height-p;n>b.plotHeight&&("top"===m?c.verticalAlign="bottom":c.y=b.plotHeight-n,q=!0);q&&(a.placed=!k,a.align(c,null,h))};p.pie&&(p.pie.prototype.drawDataLabels=function(){var b=this,e=b.data,d,h=b.chart,l=b.options.dataLabels,p=k(l.connectorPadding,10),f=k(l.connectorWidth,1),t=h.plotWidth,u=h.plotHeight,F,q=l.distance,x=b.center,B=x[2]/2,C=x[1],H=0<q,g,D,I,M,R=[[],[]],N,w,O,Q,P=[0,0,0,0];b.visible&&(l.enabled||b._hasPointLabels)&&
|
||||
(E(e,function(a){a.dataLabel&&a.visible&&a.dataLabel.shortened&&(a.dataLabel.attr({width:"auto"}).css({width:"auto",textOverflow:"clip"}),a.dataLabel.shortened=!1)}),c.prototype.drawDataLabels.apply(b),E(e,function(a){a.dataLabel&&a.visible&&(R[a.half].push(a),a.dataLabel._pos=null)}),E(R,function(c,f){var e,k,m=c.length,r,v,y;if(m)for(b.sortByAngle(c,f-.5),0<q&&(e=Math.max(0,C-B-q),k=Math.min(C+B+q,h.plotHeight),r=n(c,function(a){if(a.dataLabel)return y=a.dataLabel.getBBox().height||21,{target:a.labelPos[1]-
|
||||
e+y/2,size:y,rank:a.y}}),a.distribute(r,k+y-e)),Q=0;Q<m;Q++)d=c[Q],I=d.labelPos,g=d.dataLabel,O=!1===d.visible?"hidden":"inherit",v=I[1],r?void 0===r[Q].pos?O="hidden":(M=r[Q].size,w=e+r[Q].pos):w=v,N=l.justify?x[0]+(f?-1:1)*(B+q):b.getX(w<e+2||w>k-2?v:w,f),g._attr={visibility:O,align:I[6]},g._pos={x:N+l.x+({left:p,right:-p}[I[6]]||0),y:w+l.y-10},I.x=N,I.y=w,null===b.options.size&&(D=g.getBBox().width,v=null,N-D<p?(v=Math.round(D-N+p),P[3]=Math.max(v,P[3])):N+D>t-p&&(v=Math.round(N+D-t+p),P[1]=Math.max(v,
|
||||
P[1])),0>w-M/2?P[0]=Math.max(Math.round(-w+M/2),P[0]):w+M/2>u&&(P[2]=Math.max(Math.round(w+M/2-u),P[2])),g.sideOverflow=v)}),0===z(P)||this.verifyDataLabelOverflow(P))&&(this.placeDataLabels(),H&&f&&E(this.points,function(a){var c;F=a.connector;if((g=a.dataLabel)&&g._pos&&a.visible){O=g._attr.visibility;if(c=!F)a.connector=F=h.renderer.path().addClass("highcharts-data-label-connector highcharts-color-"+a.colorIndex).add(b.dataLabelsGroup),F.attr({"stroke-width":f,stroke:l.connectorColor||a.color||
|
||||
"#666666"});F[c?"attr":"animate"]({d:b.connectorPath(a.labelPos)});F.attr("visibility",O)}else F&&(a.connector=F.destroy())}))},p.pie.prototype.connectorPath=function(a){var b=a.x,c=a.y;return k(this.options.dataLabels.softConnector,!0)?["M",b+("left"===a[6]?5:-5),c,"C",b,c,2*a[2]-a[4],2*a[3]-a[5],a[2],a[3],"L",a[4],a[5]]:["M",b+("left"===a[6]?5:-5),c,"L",a[2],a[3],"L",a[4],a[5]]},p.pie.prototype.placeDataLabels=function(){E(this.points,function(a){var b=a.dataLabel;b&&a.visible&&((a=b._pos)?(b.sideOverflow&&
|
||||
(b._attr.width=b.getBBox().width-b.sideOverflow,b.css({width:b._attr.width+"px",textOverflow:"ellipsis"}),b.shortened=!0),b.attr(b._attr),b[b.moved?"animate":"attr"](a),b.moved=!0):b&&b.attr({y:-9999}))},this)},p.pie.prototype.alignDataLabel=l,p.pie.prototype.verifyDataLabelOverflow=function(a){var b=this.center,c=this.options,h=c.center,k=c.minSize||80,l,f;null!==h[0]?l=Math.max(b[2]-Math.max(a[1],a[3]),k):(l=Math.max(b[2]-a[1]-a[3],k),b[0]+=(a[3]-a[1])/2);null!==h[1]?l=Math.max(Math.min(l,b[2]-
|
||||
Math.max(a[0],a[2])),k):(l=Math.max(Math.min(l,b[2]-a[0]-a[2]),k),b[1]+=(a[0]-a[2])/2);l<b[2]?(b[2]=l,b[3]=Math.min(e(c.innerSize||0,l),l),this.translate(b),this.drawDataLabels&&this.drawDataLabels()):f=!0;return f});p.column&&(p.column.prototype.alignDataLabel=function(a,e,d,h,l){var b=this.chart.inverted,f=a.series,m=a.dlBox||a.shapeArgs,n=k(a.below,a.plotY>k(this.translatedThreshold,f.yAxis.len)),p=k(d.inside,!!this.options.stacking);m&&(h=t(m),0>h.y&&(h.height+=h.y,h.y=0),m=h.y+h.height-f.yAxis.len,
|
||||
0<m&&(h.height-=m),b&&(h={x:f.yAxis.len-h.y-h.height,y:f.xAxis.len-h.x-h.width,width:h.height,height:h.width}),p||(b?(h.x+=n?0:h.width,h.width=0):(h.y+=n?h.height:0,h.height=0)));d.align=k(d.align,!b||p?"center":n?"right":"left");d.verticalAlign=k(d.verticalAlign,b||p?"middle":n?"top":"bottom");c.prototype.alignDataLabel.call(this,a,e,d,h,l)})})(I);(function(a){var B=a.Chart,z=a.each,C=a.pick,E=a.addEvent;B.prototype.callbacks.push(function(a){function h(){var h=[];z(a.series||[],function(a){var l=
|
||||
a.options.dataLabels,k=a.dataLabelCollections||["dataLabel"];(l.enabled||a._hasPointLabels)&&!l.allowOverlap&&a.visible&&z(k,function(e){z(a.points,function(a){a[e]&&(a[e].labelrank=C(a.labelrank,a.shapeArgs&&a.shapeArgs.height),h.push(a[e]))})})});a.hideOverlappingLabels(h)}h();E(a,"redraw",h)});B.prototype.hideOverlappingLabels=function(a){var h=a.length,n,t,l,k,e,c,p,u,b,m=function(a,b,c,e,f,h,k,l){return!(f>a+c||f+k<a||h>b+e||h+l<b)};for(t=0;t<h;t++)if(n=a[t])n.oldOpacity=n.opacity,n.newOpacity=
|
||||
1;a.sort(function(a,b){return(b.labelrank||0)-(a.labelrank||0)});for(t=0;t<h;t++)for(l=a[t],n=t+1;n<h;++n)if(k=a[n],l&&k&&l.placed&&k.placed&&0!==l.newOpacity&&0!==k.newOpacity&&(e=l.alignAttr,c=k.alignAttr,p=l.parentGroup,u=k.parentGroup,b=2*(l.box?0:l.padding),e=m(e.x+p.translateX,e.y+p.translateY,l.width-b,l.height-b,c.x+u.translateX,c.y+u.translateY,k.width-b,k.height-b)))(l.labelrank<k.labelrank?l:k).newOpacity=0;z(a,function(a){var b,c;a&&(c=a.newOpacity,a.oldOpacity!==c&&a.placed&&(c?a.show(!0):
|
||||
b=function(){a.hide()},a.alignAttr.opacity=c,a[a.isOld?"animate":"attr"](a.alignAttr,null,b)),a.isOld=!0)})}})(I);(function(a){var B=a.addEvent,z=a.Chart,C=a.createElement,E=a.css,u=a.defaultOptions,h=a.defaultPlotOptions,n=a.each,t=a.extend,l=a.fireEvent,k=a.hasTouch,e=a.inArray,c=a.isObject,p=a.Legend,H=a.merge,b=a.pick,m=a.Point,d=a.Series,r=a.seriesTypes,A=a.svg;a=a.TrackerMixin={drawTrackerPoint:function(){var a=this,b=a.chart.pointer,c=function(a){var c=b.getPointFromEvent(a);if(void 0!==c)c.onMouseOver(a)};
|
||||
n(a.points,function(a){a.graphic&&(a.graphic.element.point=a);a.dataLabel&&(a.dataLabel.div?a.dataLabel.div.point=a:a.dataLabel.element.point=a)});a._hasTracking||(n(a.trackerGroups,function(d){if(a[d]){a[d].addClass("highcharts-tracker").on("mouseover",c).on("mouseout",function(a){b.onTrackerMouseOut(a)});if(k)a[d].on("touchstart",c);a.options.cursor&&a[d].css(E).css({cursor:a.options.cursor})}}),a._hasTracking=!0)},drawTrackerGraph:function(){var a=this,b=a.options,c=b.trackByArea,d=[].concat(c?
|
||||
a.areaPath:a.graphPath),e=d.length,h=a.chart,l=h.pointer,m=h.renderer,p=h.options.tooltip.snap,t=a.tracker,g,r=function(){if(h.hoverSeries!==a)a.onMouseOver()},u="rgba(192,192,192,"+(A?.0001:.002)+")";if(e&&!c)for(g=e+1;g--;)"M"===d[g]&&d.splice(g+1,0,d[g+1]-p,d[g+2],"L"),(g&&"M"===d[g]||g===e)&&d.splice(g,0,"L",d[g-2]+p,d[g-1]);t?t.attr({d:d}):a.graph&&(a.tracker=m.path(d).attr({"stroke-linejoin":"round",visibility:a.visible?"visible":"hidden",stroke:u,fill:c?u:"none","stroke-width":a.graph.strokeWidth()+
|
||||
(c?0:2*p),zIndex:2}).add(a.group),n([a.tracker,a.markerGroup],function(a){a.addClass("highcharts-tracker").on("mouseover",r).on("mouseout",function(a){l.onTrackerMouseOut(a)});b.cursor&&a.css({cursor:b.cursor});if(k)a.on("touchstart",r)}))}};r.column&&(r.column.prototype.drawTracker=a.drawTrackerPoint);r.pie&&(r.pie.prototype.drawTracker=a.drawTrackerPoint);r.scatter&&(r.scatter.prototype.drawTracker=a.drawTrackerPoint);t(p.prototype,{setItemEvents:function(a,b,c){var d=this,e=d.chart.renderer.boxWrapper,
|
||||
f="highcharts-legend-"+(a.series?"point":"series")+"-active";(c?b:a.legendGroup).on("mouseover",function(){a.setState("hover");e.addClass(f);b.css(d.options.itemHoverStyle)}).on("mouseout",function(){b.css(a.visible?d.itemStyle:d.itemHiddenStyle);e.removeClass(f);a.setState()}).on("click",function(b){var c=function(){a.setVisible&&a.setVisible()};b={browserEvent:b};a.firePointEvent?a.firePointEvent("legendItemClick",b,c):l(a,"legendItemClick",b,c)})},createCheckboxForItem:function(a){a.checkbox=C("input",
|
||||
{type:"checkbox",checked:a.selected,defaultChecked:a.selected},this.options.itemCheckboxStyle,this.chart.container);B(a.checkbox,"click",function(b){l(a.series||a,"checkboxClick",{checked:b.target.checked,item:a},function(){a.select()})})}});u.legend.itemStyle.cursor="pointer";t(z.prototype,{showResetZoom:function(){var a=this,b=u.lang,c=a.options.chart.resetZoomButton,d=c.theme,e=d.states,h="chart"===c.relativeTo?null:"plotBox";this.resetZoomButton=a.renderer.button(b.resetZoom,null,null,function(){a.zoomOut()},
|
||||
d,e&&e.hover).attr({align:c.position.align,title:b.resetZoomTitle}).addClass("highcharts-reset-zoom").add().align(c.position,!1,h)},zoomOut:function(){var a=this;l(a,"selection",{resetSelection:!0},function(){a.zoom()})},zoom:function(a){var d,e=this.pointer,h=!1,k;!a||a.resetSelection?n(this.axes,function(a){d=a.zoom()}):n(a.xAxis.concat(a.yAxis),function(a){var b=a.axis;e[b.isXAxis?"zoomX":"zoomY"]&&(d=b.zoom(a.min,a.max),b.displayBtn&&(h=!0))});k=this.resetZoomButton;h&&!k?this.showResetZoom():
|
||||
!h&&c(k)&&(this.resetZoomButton=k.destroy());d&&this.redraw(b(this.options.chart.animation,a&&a.animation,100>this.pointCount))},pan:function(a,b){var c=this,d=c.hoverPoints,e;d&&n(d,function(a){a.setState()});n("xy"===b?[1,0]:[1],function(b){b=c[b?"xAxis":"yAxis"][0];var d=b.horiz,f=a[d?"chartX":"chartY"],d=d?"mouseDownX":"mouseDownY",h=c[d],k=(b.pointRange||0)/2,g=b.getExtremes(),l=b.toValue(h-f,!0)+k,k=b.toValue(h+b.len-f,!0)-k,m=k<l,h=m?k:l,l=m?l:k,m=b.toValue(b.toPixels(g.min)-b.minPixelPadding),
|
||||
k=b.toValue(b.toPixels(g.max)+b.minPixelPadding),m=Math.min(g.dataMin,m)-h,g=l-Math.max(g.dataMax,k);b.series.length&&0>m&&0>g&&(b.setExtremes(h,l,!1,!1,{trigger:"pan"}),e=!0);c[d]=f});e&&c.redraw(!1);E(c.container,{cursor:"move"})}});t(m.prototype,{select:function(a,c){var d=this,f=d.series,h=f.chart;a=b(a,!d.selected);d.firePointEvent(a?"select":"unselect",{accumulate:c},function(){d.selected=d.options.selected=a;f.options.data[e(d,f.data)]=d.options;d.setState(a&&"select");c||n(h.getSelectedPoints(),
|
||||
function(a){a.selected&&a!==d&&(a.selected=a.options.selected=!1,f.options.data[e(a,f.data)]=a.options,a.setState(""),a.firePointEvent("unselect"))})})},onMouseOver:function(a){var b=this.series.chart.pointer;this.firePointEvent("mouseOver");b.runPointActions(a,this)},onMouseOut:function(){var a=this.series.chart;this.firePointEvent("mouseOut");n(a.hoverPoints||[],function(a){a.setState()});a.hoverPoints=a.hoverPoint=null},importEvents:function(){if(!this.hasImportedEvents){var a=H(this.series.options.point,
|
||||
this.options).events,b;this.events=a;for(b in a)B(this,b,a[b]);this.hasImportedEvents=!0}},setState:function(a,c){var d=Math.floor(this.plotX),e=this.plotY,f=this.series,k=f.options.states[a]||{},l=h[f.type].marker&&f.options.marker,m=l&&!1===l.enabled,n=l&&l.states&&l.states[a]||{},p=!1===n.enabled,g=f.stateMarkerGraphic,r=this.marker||{},u=f.chart,v=f.halo,z,A=l&&f.markerAttribs;a=a||"";if(!(a===this.state&&!c||this.selected&&"select"!==a||!1===k.enabled||a&&(p||m&&!1===n.enabled)||a&&r.states&&
|
||||
r.states[a]&&!1===r.states[a].enabled)){A&&(z=f.markerAttribs(this,a));if(this.graphic)this.state&&this.graphic.removeClass("highcharts-point-"+this.state),a&&this.graphic.addClass("highcharts-point-"+a),this.graphic.attr(f.pointAttribs(this,a)),z&&this.graphic.animate(z,b(u.options.chart.animation,n.animation,l.animation)),g&&g.hide();else{if(a&&n){l=r.symbol||f.symbol;g&&g.currentSymbol!==l&&(g=g.destroy());if(g)g[c?"animate":"attr"]({x:z.x,y:z.y});else l&&(f.stateMarkerGraphic=g=u.renderer.symbol(l,
|
||||
z.x,z.y,z.width,z.height).add(f.markerGroup),g.currentSymbol=l);g&&g.attr(f.pointAttribs(this,a))}g&&(g[a&&u.isInsidePlot(d,e,u.inverted)?"show":"hide"](),g.element.point=this)}(d=k.halo)&&d.size?(v||(f.halo=v=u.renderer.path().add(A?f.markerGroup:f.group)),v[c?"animate":"attr"]({d:this.haloPath(d.size)}),v.attr({"class":"highcharts-halo highcharts-color-"+b(this.colorIndex,f.colorIndex)}),v.point=this,v.attr(t({fill:this.color||f.color,"fill-opacity":d.opacity,zIndex:-1},d.attributes))):v&&v.point&&
|
||||
v.point.haloPath&&v.animate({d:v.point.haloPath(0)});this.state=a}},haloPath:function(a){return this.series.chart.renderer.symbols.circle(Math.floor(this.plotX)-a,this.plotY-a,2*a,2*a)}});t(d.prototype,{onMouseOver:function(){var a=this.chart,b=a.hoverSeries;if(b&&b!==this)b.onMouseOut();this.options.events.mouseOver&&l(this,"mouseOver");this.setState("hover");a.hoverSeries=this},onMouseOut:function(){var a=this.options,b=this.chart,c=b.tooltip,d=b.hoverPoint;b.hoverSeries=null;if(d)d.onMouseOut();
|
||||
this&&a.events.mouseOut&&l(this,"mouseOut");!c||a.stickyTracking||c.shared&&!this.noSharedTooltip||c.hide();this.setState()},setState:function(a){var c=this,d=c.options,e=c.graph,h=d.states,k=d.lineWidth,d=0;a=a||"";if(c.state!==a&&(n([c.group,c.markerGroup,c.dataLabelsGroup],function(b){b&&(c.state&&b.removeClass("highcharts-series-"+c.state),a&&b.addClass("highcharts-series-"+a))}),c.state=a,!h[a]||!1!==h[a].enabled)&&(a&&(k=h[a].lineWidth||k+(h[a].lineWidthPlus||0)),e&&!e.dashstyle))for(k={"stroke-width":k},
|
||||
e.animate(k,b(c.chart.options.chart.animation,h[a]&&h[a].animation));c["zone-graph-"+d];)c["zone-graph-"+d].attr(k),d+=1},setVisible:function(a,b){var c=this,d=c.chart,e=c.legendItem,f,h=d.options.chart.ignoreHiddenSeries,k=c.visible;f=(c.visible=a=c.options.visible=c.userOptions.visible=void 0===a?!k:a)?"show":"hide";n(["group","dataLabelsGroup","markerGroup","tracker","tt"],function(a){if(c[a])c[a][f]()});if(d.hoverSeries===c||(d.hoverPoint&&d.hoverPoint.series)===c)c.onMouseOut();e&&d.legend.colorizeItem(c,
|
||||
a);c.isDirty=!0;c.options.stacking&&n(d.series,function(a){a.options.stacking&&a.visible&&(a.isDirty=!0)});n(c.linkedSeries,function(b){b.setVisible(a,!1)});h&&(d.isDirtyBox=!0);!1!==b&&d.redraw();l(c,f)},show:function(){this.setVisible(!0)},hide:function(){this.setVisible(!1)},select:function(a){this.selected=a=void 0===a?!this.selected:a;this.checkbox&&(this.checkbox.checked=a);l(this,a?"select":"unselect")},drawTracker:a.drawTrackerGraph})})(I);(function(a){var B=a.Chart,z=a.each,C=a.inArray,E=
|
||||
a.isArray,u=a.isObject,h=a.pick,n=a.splat;B.prototype.setResponsive=function(h){var l=this.options.responsive,k=[],e=this.currentResponsive;l&&l.rules&&z(l.rules,function(c){void 0===c._id&&(c._id=a.uniqueKey());this.matchResponsiveRule(c,k,h)},this);var c=a.merge.apply(0,a.map(k,function(c){return a.find(l.rules,function(a){return a._id===c}).chartOptions})),k=k.toString()||void 0;k!==(e&&e.ruleIds)&&(e&&this.update(e.undoOptions,h),k?(this.currentResponsive={ruleIds:k,mergedOptions:c,undoOptions:this.currentOptions(c)},
|
||||
this.update(c,h)):this.currentResponsive=void 0)};B.prototype.matchResponsiveRule=function(a,l){var k=a.condition;(k.callback||function(){return this.chartWidth<=h(k.maxWidth,Number.MAX_VALUE)&&this.chartHeight<=h(k.maxHeight,Number.MAX_VALUE)&&this.chartWidth>=h(k.minWidth,0)&&this.chartHeight>=h(k.minHeight,0)}).call(this)&&l.push(a._id)};B.prototype.currentOptions=function(a){function h(a,c,k,l){var b,e;for(b in a)if(!l&&-1<C(b,["series","xAxis","yAxis"]))for(a[b]=n(a[b]),k[b]=[],e=0;e<a[b].length;e++)c[b][e]&&
|
||||
(k[b][e]={},h(a[b][e],c[b][e],k[b][e],l+1));else u(a[b])?(k[b]=E(a[b])?[]:{},h(a[b],c[b]||{},k[b],l+1)):k[b]=c[b]||null}var k={};h(a,this.options,k,0);return k}})(I);return I});
|
@ -0,0 +1,17 @@
|
||||
/*
|
||||
Highcharts JS v3.0.5 (2013-08-23)
|
||||
|
||||
Standalone Highcharts Framework
|
||||
|
||||
License: MIT License
|
||||
*/
|
||||
var HighchartsAdapter=function(){function n(c){function a(a,b,d){a.removeEventListener(b,d,!1)}function d(a,b,d){d=a.HCProxiedMethods[d.toString()];a.detachEvent("on"+b,d)}function b(b,c){var g=b.HCEvents,i,h,l,f;if(b.removeEventListener)i=a;else if(b.attachEvent)i=d;else return;c?(h={},h[c]=!0):h=g;for(f in h)if(g[f])for(l=g[f].length;l--;)i(b,f,g[f][l])}c.HCExtended||Highcharts.extend(c,{HCExtended:!0,HCEvents:{},bind:function(b,a){var d=this,c=this.HCEvents,h;if(d.addEventListener)d.addEventListener(b,
|
||||
a,!1);else if(d.attachEvent){h=function(b){a.call(d,b)};if(!d.HCProxiedMethods)d.HCProxiedMethods={};d.HCProxiedMethods[a.toString()]=h;d.attachEvent("on"+b,h)}c[b]===q&&(c[b]=[]);c[b].push(a)},unbind:function(c,k){var g,i;c?(g=this.HCEvents[c]||[],k?(i=HighchartsAdapter.inArray(k,g),i>-1&&(g.splice(i,1),this.HCEvents[c]=g),this.removeEventListener?a(this,c,k):this.attachEvent&&d(this,c,k)):(b(this,c),this.HCEvents[c]=[])):(b(this),this.HCEvents={})},trigger:function(b,a){var d=this.HCEvents[b]||
|
||||
[],c=d.length,h,f;for(h=function(){a.defaultPrevented=!0};c--;){f=d[c];if(a.stopped)break;a.preventDefault=h;a.target=this;f.call(this,a)===!1&&a.preventDefault()}}});return c}var q,f=document,o=[],j=[],p,m;Math.easeInOutSine=function(c,a,d,b){return-d/2*(Math.cos(Math.PI*c/b)-1)+a};return{init:function(c){if(!f.defaultView)this._getStyle=function(a,d){var b;return a.style[d]?a.style[d]:(d==="opacity"&&(d="filter"),b=a.currentStyle[d.replace(/\-(\w)/g,function(a,b){return b.toUpperCase()})],d==="filter"&&
|
||||
(b=b.replace(/alpha\(opacity=([0-9]+)\)/,function(b,a){return a/100})),b===""?1:b)},this.adapterRun=function(a,d){var b={width:"clientWidth",height:"clientHeight"}[d];if(b)return a.style.zoom=1,a[b]-2*parseInt(HighchartsAdapter._getStyle(a,"padding"),10)};if(!Array.prototype.forEach)this.each=function(a,d){for(var b=0,c=a.length;b<c;b++)if(d.call(a[b],a[b],b,a)===!1)return b};if(!Array.prototype.indexOf)this.inArray=function(a,d){var b,c=0;if(d)for(b=d.length;c<b;c++)if(d[c]===a)return c;return-1};
|
||||
if(!Array.prototype.filter)this.grep=function(a,d){for(var b=[],c=0,f=a.length;c<f;c++)d(a[c],c)&&b.push(a[c]);return b};m=function(a,c,b){this.options=c;this.elem=a;this.prop=b};m.prototype={update:function(){var a;a=this.paths;var d=this.elem,b=d.element;a&&b?d.attr("d",c.step(a[0],a[1],this.now,this.toD)):d.attr?b&&d.attr(this.prop,this.now):(a={},a[d]=this.now+this.unit,Highcharts.css(d,a));this.options.step&&this.options.step.call(this.elem,this.now,this)},custom:function(a,c,b){var e=this,f=
|
||||
function(a){return e.step(a)},g;this.startTime=+new Date;this.start=a;this.end=c;this.unit=b;this.now=this.start;this.pos=this.state=0;f.elem=this.elem;f()&&j.push(f)===1&&(p=setInterval(function(){for(g=0;g<j.length;g++)j[g]()||j.splice(g--,1);j.length||clearInterval(p)},13))},step:function(a){var c=+new Date,b;b=this.options;var e;if(this.elem.stopAnimation)b=!1;else if(a||c>=b.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();a=this.options.curAnim[this.prop]=!0;for(e in b.curAnim)b.curAnim[e]!==
|
||||
!0&&(a=!1);a&&b.complete&&b.complete.call(this.elem);b=!1}else e=c-this.startTime,this.state=e/b.duration,this.pos=b.easing(e,0,1,b.duration),this.now=this.start+(this.end-this.start)*this.pos,this.update(),b=!0;return b}};this.animate=function(a,d,b){var e,f="",g,i,h;a.stopAnimation=!1;if(typeof b!=="object"||b===null)e=arguments,b={duration:e[2],easing:e[3],complete:e[4]};if(typeof b.duration!=="number")b.duration=400;b.easing=Math[b.easing]||Math.easeInOutSine;b.curAnim=Highcharts.extend({},d);
|
||||
for(h in d)i=new m(a,b,h),g=null,h==="d"?(i.paths=c.init(a,a.d,d.d),i.toD=d.d,e=0,g=1):a.attr?e=a.attr(h):(e=parseFloat(this._getStyle(a,h))||0,h!=="opacity"&&(f="px")),g||(g=parseFloat(d[h])),i.custom(e,g,f)}},_getStyle:function(c,a){return window.getComputedStyle(c).getPropertyValue(a)},getScript:function(c,a){var d=f.getElementsByTagName("head")[0],b=f.createElement("script");b.type="text/javascript";b.src=c;b.onload=a;d.appendChild(b)},inArray:function(c,a){return a.indexOf?a.indexOf(c):o.indexOf.call(a,
|
||||
c)},adapterRun:function(c,a){return parseInt(HighchartsAdapter._getStyle(c,a),10)},grep:function(c,a){return o.filter.call(c,a)},map:function(c,a){for(var d=[],b=0,e=c.length;b<e;b++)d[b]=a.call(c[b],c[b],b,c);return d},offset:function(c){for(var a=0,d=0;c;)a+=c.offsetLeft,d+=c.offsetTop,c=c.offsetParent;return{left:a,top:d}},addEvent:function(c,a,d){n(c).bind(a,d)},removeEvent:function(c,a,d){n(c).unbind(a,d)},fireEvent:function(c,a,d,b){var e;f.createEvent&&(c.dispatchEvent||c.fireEvent)?(e=f.createEvent("Events"),
|
||||
e.initEvent(a,!0,!0),e.target=c,Highcharts.extend(e,d),c.dispatchEvent?c.dispatchEvent(e):c.fireEvent(a,e)):c.HCExtended===!0&&(d=d||{},c.trigger(a,d));d&&d.defaultPrevented&&(b=null);b&&b(d)},washMouseEvent:function(c){return c},stop:function(c){c.stopAnimation=!0},each:function(c,a){return Array.prototype.forEach.call(c,a)}}}();
|
299
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Public/Scripts/script.js
vendored
Normal file
@ -0,0 +1,299 @@
|
||||
Highcharts.setOptions({
|
||||
chart: {
|
||||
style: {
|
||||
fontFamily: 'Verdana'
|
||||
}
|
||||
},
|
||||
global: {
|
||||
useUTC: false
|
||||
}
|
||||
});
|
||||
|
||||
function changeServer(obj) {
|
||||
if (obj.options[obj.selectedIndex].value != '') {
|
||||
window.location = 'index.php?server='
|
||||
+ obj.options[obj.selectedIndex].value;
|
||||
} else {
|
||||
window.location = 'index.php';
|
||||
}
|
||||
}
|
||||
function changeCluster(obj) {
|
||||
if (obj.options[obj.selectedIndex].value != '') {
|
||||
window.location = 'stats.php?cluster='
|
||||
+ obj.options[obj.selectedIndex].value;
|
||||
} else {
|
||||
window.location = 'stats.php';
|
||||
}
|
||||
}
|
||||
function show(target)
|
||||
{
|
||||
var objects = document.getElementsByClassName(target);
|
||||
for(i = 0 ; i < objects.length ; i++){
|
||||
objects[i].style.display = '';
|
||||
}
|
||||
}
|
||||
function hide(target)
|
||||
{
|
||||
var objects = document.getElementsByClassName(target);
|
||||
for(i = 0 ; i < objects.length ; i++){
|
||||
objects[i].style.display = 'none';
|
||||
}
|
||||
}
|
||||
|
||||
function changeCommand(obj) {
|
||||
document.getElementById('request_key').value = '';
|
||||
document.getElementById('request_duration').value = '';
|
||||
document.getElementById('request_data').value = '';
|
||||
document.getElementById('request_delay').value = '';
|
||||
document.getElementById('request_value').value = '';
|
||||
var command = obj.options[obj.selectedIndex].value;
|
||||
var div_key = document.getElementById('div_key');
|
||||
var div_duration = document.getElementById('div_duration');
|
||||
var div_data = document.getElementById('div_data');
|
||||
var div_delay = document.getElementById('div_delay');
|
||||
var div_value = document.getElementById('div_value');
|
||||
if (command == 'get' || command == 'delete') {
|
||||
div_key.style.display = '';
|
||||
div_duration.style.display = 'none';
|
||||
div_data.style.display = 'none';
|
||||
div_delay.style.display = 'none';
|
||||
div_value.style.display = 'none';
|
||||
} else if (command == 'set') {
|
||||
div_key.style.display = '';
|
||||
div_duration.style.display = '';
|
||||
div_data.style.display = '';
|
||||
div_delay.style.display = 'none';
|
||||
div_value.style.display = 'none';
|
||||
} else if (command == 'flush_all') {
|
||||
div_key.style.display = 'none';
|
||||
div_duration.style.display = 'none';
|
||||
div_data.style.display = 'none';
|
||||
div_delay.style.display = '';
|
||||
div_value.style.display = 'none';
|
||||
} else if (command == 'increment' || command == 'decrement') {
|
||||
div_key.style.display = '';
|
||||
div_duration.style.display = 'none';
|
||||
div_data.style.display = 'none';
|
||||
div_delay.style.display = 'none';
|
||||
div_value.style.display = '';
|
||||
} else {
|
||||
div_key.style.display = 'none';
|
||||
div_duration.style.display = 'none';
|
||||
div_data.style.display = 'none';
|
||||
div_delay.style.display = 'none';
|
||||
div_value.style.display = 'none';
|
||||
}
|
||||
}
|
||||
function executeHideShow(target, input, force) {
|
||||
var object = document.getElementById(target);
|
||||
var input = document.getElementById(input);
|
||||
if ((object.style.display == "block") && (force != true)) {
|
||||
input.value = "Show Console";
|
||||
object.style.visibility = "hidden";
|
||||
object.style.display = "none";
|
||||
} else {
|
||||
object.style.visibility = "visible";
|
||||
object.style.display = "block";
|
||||
input.value = "Hide Console";
|
||||
}
|
||||
}
|
||||
function executeClear(target) {
|
||||
var object = document.getElementById(target);
|
||||
object.innerHTML = '';
|
||||
}
|
||||
function executeCommand(target, params) {
|
||||
if (params != null) {
|
||||
var request_url = 'commands.php?' + params;
|
||||
execute(request_url, target, true);
|
||||
return;
|
||||
}
|
||||
if (document.getElementById('request_command').value != '') {
|
||||
var request_url = 'commands.php?request_command='
|
||||
+ document.getElementById('request_command').value
|
||||
+ '&request_key='
|
||||
+ document.getElementById('request_key').value
|
||||
+ '&request_duration='
|
||||
+ document.getElementById('request_duration').value
|
||||
+ '&request_data='
|
||||
+ document.getElementById('request_data').value
|
||||
+ '&request_delay='
|
||||
+ document.getElementById('request_delay').value
|
||||
+ '&request_value='
|
||||
+ document.getElementById('request_value').value
|
||||
+ '&request_server='
|
||||
+ document.getElementById('request_server').value
|
||||
+ '&request_api='
|
||||
+ document.getElementById('request_api').value;
|
||||
execute(request_url, target, true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
function searchKey(target) {
|
||||
if (document.getElementById('search_key').value != '') {
|
||||
var request_url = 'commands.php?request_command=search'
|
||||
+ '&request_key=' + document.getElementById('search_key').value
|
||||
+ '&request_level=' + document.getElementById('search_level').value
|
||||
+ '&request_more=' + document.getElementById('search_more').value
|
||||
+ '&request_server='
|
||||
+ document.getElementById('search_server').value;
|
||||
execute(request_url, target, true);
|
||||
}
|
||||
}
|
||||
function executeTelnet(target) {
|
||||
if (document.getElementById('request_telnet').value != '') {
|
||||
var request_url = 'commands.php?request_command=telnet'
|
||||
+ '&request_telnet='
|
||||
+ document.getElementById('request_telnet').value
|
||||
+ '&request_server='
|
||||
+ document.getElementById('request_telnet_server').value;
|
||||
execute(request_url, target, true);
|
||||
}
|
||||
}
|
||||
function execute(url, target, append) {
|
||||
if (window.XMLHttpRequest) {
|
||||
req = new XMLHttpRequest();
|
||||
req.onreadystatechange = function() {
|
||||
onExecute(target, append);
|
||||
};
|
||||
req.open('GET', url, true);
|
||||
req.send(null);
|
||||
} else if (window.ActiveXObject) {
|
||||
req = new ActiveXObject('Microsoft.XMLHTTP');
|
||||
if (req) {
|
||||
req.onreadystatechange = function() {
|
||||
onExecute(target, append);
|
||||
};
|
||||
req.open('GET', url, true);
|
||||
req.send();
|
||||
}
|
||||
}
|
||||
}
|
||||
function onExecute(target, append) {
|
||||
if (req.readyState == 1) {
|
||||
document.getElementById('loading').style.visibility = "visible";
|
||||
} else if (req.readyState == 4) {
|
||||
document.getElementById('loading').style.visibility = "hidden";
|
||||
if (req.status == 200 || req.status == 304) {
|
||||
if (append == true) {
|
||||
var object = document.getElementById(target);
|
||||
object.innerHTML += req.responseText;
|
||||
object.scrollTop = object.scrollHeight;
|
||||
} else {
|
||||
var object = document.getElementById(target);
|
||||
object.innerHTML = req.responseText;
|
||||
object.scrollTop = object.scrollHeight;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
document.getElementById('loading').style.visibility = "hidden";
|
||||
}
|
||||
}
|
||||
var server_id = 1;
|
||||
var cluster_id = 1;
|
||||
function addCluster() {
|
||||
var clusterDiv = document.createElement('div');
|
||||
cluster_id++;
|
||||
clusterDiv.innerHTML = '<hr/><strong>Cluster <input type="text" style="width:200px;" name="cluster[' + cluster_id + ']" value=""/></strong>'
|
||||
+ '<div style="margin-left:30px;margin-top:3px;">'
|
||||
+ '<div style="width:150px;float:left;">Name (Optionnal)</div>'
|
||||
+ '<div style="width:150px;float:left;margin-left:7px;">IP/Hostname</div>'
|
||||
+ '<div style="width:50px;float:left;margin-left:7px;">Port</div></div>'
|
||||
+ '<div style="margin-left:40px;margin-top:6px;" id="cluster_' + cluster_id + '_commands">'
|
||||
+ '<a class="list button" href="javascript:addServer(' + cluster_id + ')">'
|
||||
+ 'Add New Server to Cluster</a> <a class="list" style="padding:1px 2px;-moz-border-radius:3px;-webkit-border-radius:3px;" '
|
||||
+ 'href="#" onclick="deleteServerOrCluster(\'cluster_' + cluster_id + '\')">Delete Cluster</a></div><br/>';
|
||||
clusterDiv.setAttribute('id', 'cluster_' + cluster_id);
|
||||
document.getElementById('server_form').appendChild(clusterDiv);
|
||||
addServer(cluster_id);
|
||||
}
|
||||
function addServer(current_cluster_id) {
|
||||
var serverDiv = document.createElement('div');
|
||||
server_id++;
|
||||
serverDiv.innerHTML = '<div style="margin-left:30px;margin-top:3px;">'
|
||||
+ '<input type="text" style="width:150px;" name="server[' + current_cluster_id + '][' + server_id + '][name]"'
|
||||
+ ' value="" id="name_' + server_id + '" onchange="nameOnChange(' + server_id + ') onKeyUp="hostOrPortOnChange(' + server_id + ')""/> '
|
||||
+ '<input type="text" style="width:150px;" name="server[' + current_cluster_id + '][' + server_id + '][hostname]"'
|
||||
+ ' value="hostname" id="host_' + server_id + '" onfocus="hostOnFocus(this)" onblur="hostOnBlur(this)" onchange="hostOrPortOnChange(' + server_id + ')"'
|
||||
+ ' onchange="hostOrPortOnChange(' + server_id + ')" onKeyUp="hostOrPortOnChange(' + server_id + ')" /> '
|
||||
+ '<input type="text" style="width:50px;" name="server[' + current_cluster_id + '][' + server_id + '][port]"'
|
||||
+ ' value="port" id="port_' + server_id + '" onfocus="portOnFocus(this)" onblur="portOnBlur(this) onchange="hostOrPortOnChange(' + server_id + ')"/> '
|
||||
+ '<a class="list button" style="padding:1px 2px;" href="#" onclick="deleteServerOrCluster(\'server_' + server_id + '\')">Delete</a>' + '</div>';
|
||||
serverDiv.setAttribute('id', 'server_' + server_id);
|
||||
document.getElementById('cluster_' + current_cluster_id).insertBefore(serverDiv, document.getElementById('cluster_' + current_cluster_id + '_commands'));
|
||||
}
|
||||
function deleteServerOrCluster(divID) {
|
||||
var div = document.getElementById(divID);
|
||||
div.parentNode.removeChild(div);
|
||||
}
|
||||
function nameOnChange(target) {
|
||||
portObject = document.getElementById('port_' + target);
|
||||
portObject.setAttribute("onchange", "return false;");
|
||||
hostObject = document.getElementById('host_' + target);
|
||||
hostObject.setAttribute("onchange", "return false;");
|
||||
}
|
||||
function hostOnFocus(object) {
|
||||
if (object.value == 'hostname') {
|
||||
object.value = '';
|
||||
}
|
||||
}
|
||||
function hostOnBlur(object) {
|
||||
if (object.value == '') {
|
||||
object.value = 'hostname';
|
||||
}
|
||||
}
|
||||
function hostOnChange(target) {
|
||||
document.getElementById(target);
|
||||
if (object.value == '') {
|
||||
object.value = 'port';
|
||||
}
|
||||
}
|
||||
function portOnFocus(object) {
|
||||
if (object.value == 'port') {
|
||||
object.value = '';
|
||||
}
|
||||
}
|
||||
function portOnBlur(object) {
|
||||
if (object.value == '') {
|
||||
object.value = 'port';
|
||||
}
|
||||
}
|
||||
function hostOrPortOnChange(target) {
|
||||
|
||||
nameObject = document.getElementById('name_' + target);
|
||||
hostObject = document.getElementById('host_' + target);
|
||||
portObject = document.getElementById('port_' + target);
|
||||
if ((nameObject.value == '') || ((nameObject.value != hostObject.value + ':' + portObject.value))) {
|
||||
nameObject.value = hostObject.value + ':' + portObject.value;
|
||||
}
|
||||
}
|
||||
function ajax(url, target) {
|
||||
if (window.XMLHttpRequest) {
|
||||
req = new XMLHttpRequest();
|
||||
req.onreadystatechange = function() {
|
||||
ajaxDone(target);
|
||||
};
|
||||
req.open("GET", url, true);
|
||||
req.send(null);
|
||||
} else if (window.ActiveXObject) {
|
||||
req = new ActiveXObject('Microsoft.XMLHTTP');
|
||||
if (req) {
|
||||
req.onreadystatechange = function() {
|
||||
ajaxDone(target);
|
||||
};
|
||||
req.open("GET", url, true);
|
||||
req.send();
|
||||
}
|
||||
}
|
||||
setTimeout("ajax(page, 'stats')", timeout);
|
||||
}
|
||||
function ajaxDone(target) {
|
||||
if (req.readyState == 4) {
|
||||
if (req.status == 200 || req.status == 304) {
|
||||
results = req.responseText;
|
||||
document.getElementById(target).innerHTML = results;
|
||||
} else {
|
||||
document.getElementById(target).innerHTML = "Loading stats error : "
|
||||
+ req.statusText;
|
||||
}
|
||||
}
|
||||
}
|
238
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/Public/Styles/Style.css
vendored
Normal file
@ -0,0 +1,238 @@
|
||||
body {
|
||||
background-color: #FEFEFE;
|
||||
font-family: Verdana,Tahoma,"Segoe UI", Arial;
|
||||
font-size: 0.8em;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #EEE;
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: #A00
|
||||
}
|
||||
|
||||
input,select,textarea {
|
||||
-moz-border-radius: 2px;
|
||||
-webkit-border-radius: 2px;
|
||||
border-radius: 2px;
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-color: #AAA;
|
||||
width: 298px;
|
||||
font-family: Tahoma;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
textarea {
|
||||
width: 494px;
|
||||
resize: none;
|
||||
}
|
||||
|
||||
select {
|
||||
width: 300px;
|
||||
}
|
||||
|
||||
input:focus,textarea:focus {
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-color: #EEE;
|
||||
}
|
||||
|
||||
input:hover {
|
||||
color: #A00;
|
||||
}
|
||||
input[type=submit] {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
img {
|
||||
border: none;
|
||||
} /** hr */
|
||||
hr {
|
||||
height: 0;
|
||||
border: none;
|
||||
border-bottom-width: 1px;
|
||||
border-bottom-style: solid;
|
||||
border-bottom-color: #EEE;
|
||||
}
|
||||
|
||||
.menu {
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-color: #a0312a;
|
||||
color: #eee;
|
||||
width: 198px;
|
||||
}
|
||||
|
||||
.item {
|
||||
font-family: "Bitstream Vera Sans Mono",
|
||||
"Lucida Sans Typewriter",
|
||||
"DejaVu Sans Mono",
|
||||
Consolas,
|
||||
"Andale Mono",
|
||||
"Lucida Console",
|
||||
"Liberation Mono",
|
||||
"Nimbus Mono L",
|
||||
Monaco,
|
||||
"Courier New",
|
||||
Courier,
|
||||
monospace;
|
||||
cursor: hand;
|
||||
}
|
||||
|
||||
.loading {
|
||||
text-decoration: blink;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.full-size {
|
||||
width: 980px;
|
||||
}
|
||||
|
||||
.size-0 {
|
||||
width: 494px;
|
||||
}
|
||||
|
||||
.size-1 {
|
||||
width: 696px;
|
||||
}
|
||||
|
||||
.size-2 {
|
||||
width: 398px;
|
||||
}
|
||||
|
||||
.size-4 {
|
||||
width: 290px;
|
||||
}
|
||||
|
||||
.size-5 {
|
||||
width: 226px;
|
||||
}
|
||||
|
||||
.padding {
|
||||
padding: 3px 7px 3px 7px;
|
||||
}
|
||||
|
||||
.corner {
|
||||
-moz-border-radius: 2px;
|
||||
-webkit-border-radius: 2px;
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
.header {
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-color: #9c3c36;
|
||||
background: #B5463F;
|
||||
font-weight: bold;
|
||||
color: #fff;
|
||||
clear: both
|
||||
}
|
||||
|
||||
.sub-header {
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-color: #514845;
|
||||
background: #635855;
|
||||
font-weight: bold;
|
||||
color: #fff;
|
||||
clear: both;
|
||||
margin-top: 10px
|
||||
}
|
||||
|
||||
.container {
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-color: #d0d0d0;
|
||||
background: #ebebeb;
|
||||
font-weight: none;
|
||||
color: #000;
|
||||
margin-top: 1px;
|
||||
clear: both
|
||||
}
|
||||
|
||||
.list {
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-color: #9c3c36;
|
||||
background: #B5463F;
|
||||
font-weight: bold;
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.button {
|
||||
padding: 1px 20px;
|
||||
-moz-border-radius: 2px;
|
||||
-webkit-border-radius: 2px;
|
||||
border-radius: 2px
|
||||
}
|
||||
|
||||
.live {
|
||||
font-family: "Bitstream Vera Sans Mono",
|
||||
"Lucida Sans Typewriter",
|
||||
"DejaVu Sans Mono",
|
||||
Consolas,
|
||||
"Andale Mono",
|
||||
"Lucida Console",
|
||||
"Liberation Mono",
|
||||
"Nimbus Mono L",
|
||||
Monaco,
|
||||
"Courier New",
|
||||
Courier,
|
||||
monospace;
|
||||
font-size: 12px;
|
||||
overflow: visible;
|
||||
white-space: pre-wrap
|
||||
}
|
||||
|
||||
.line {
|
||||
min-height: 18px;
|
||||
padding-top: 3px;
|
||||
padding-bottom: 2px;
|
||||
clear: both
|
||||
}
|
||||
|
||||
.left {
|
||||
float: left;
|
||||
min-width: 126px;
|
||||
font-weight: bold
|
||||
}
|
||||
.right {
|
||||
float: right
|
||||
}
|
||||
.setting {
|
||||
min-width: 180px
|
||||
}
|
||||
|
||||
.slabs {
|
||||
min-width: 104px
|
||||
}
|
||||
.help {
|
||||
cursor:help;
|
||||
}
|
||||
|
||||
.container hr {
|
||||
height: 0;
|
||||
border: none;
|
||||
border-bottom-width: 1px;
|
||||
border-bottom-style: solid;
|
||||
border-bottom-color: #fff;
|
||||
}
|
||||
|
||||
.grey {
|
||||
color: #EEE
|
||||
}
|
||||
|
||||
.green {
|
||||
color: #40aaba
|
||||
}
|
||||
|
||||
.red {
|
||||
background: #b5463f;
|
||||
color: #fff;
|
||||
font-weight: bold
|
||||
}
|
197
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/Commands/Commands.phtml
vendored
Normal file
@ -0,0 +1,197 @@
|
||||
<div style="float:left;">
|
||||
<div class="sub-header corner full-size padding">Console</div>
|
||||
<div class="container corner full-size padding" id="console" style="visibility:visible;display:block;">
|
||||
<pre id="container" style="font-size:11px;overflow:auto;min-height:180px;max-height:500px;" class="full-size live"></pre>
|
||||
</div>
|
||||
<div class="container corner full-size padding" style="text-align:right;">
|
||||
<span style="float:left;">
|
||||
<input class="header loading" type="submit" id="loading" value="Waiting for server response ..."/>
|
||||
</span>
|
||||
<input class="header" type="submit" onclick="javascript:executeClear('container')" value="Clear Console"/>
|
||||
<input class="header" id="hide" type="submit" onclick="javascript:executeHideShow('console', 'hide');javascript:this.blur();" value="Hide Console">
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner full-size padding">Execute predefined <span class="green">Command</span></div>
|
||||
<div class="container corner full-size padding">
|
||||
<table>
|
||||
<tr valign="top">
|
||||
<td class="size-0 padding" style="padding-right:14px;">
|
||||
<form action="commands.php" onsubmit="return false">
|
||||
<div class="line" style="text-align:center;">
|
||||
Execute command on one or all memcached servers<br/>
|
||||
<hr/>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Command</span>
|
||||
<span class="right">
|
||||
<select id="request_command" onchange="javascript:changeCommand(this);">
|
||||
<option value="">Choose a Command</option>
|
||||
<option value="get">get</option>
|
||||
<option value="set">set</option>
|
||||
<option value="delete">delete</option>
|
||||
<option value="increment">increment</option>
|
||||
<option value="decrement">decrement</option>
|
||||
<option value="flush_all">flush all</option>
|
||||
</select>
|
||||
</span>
|
||||
</div>
|
||||
<div id="div_key" class="line" style="display:none;">
|
||||
<span class="left">Key</span>
|
||||
<span class="right">
|
||||
<input id="request_key"/>
|
||||
</span>
|
||||
</div>
|
||||
<div id="div_duration" class="line" style="display:none;">
|
||||
<span class="left">Duration</span>
|
||||
<span class="right">
|
||||
<input id="request_duration"/>
|
||||
</span>
|
||||
</div>
|
||||
<div id="div_value" class="line" style="display:none;">
|
||||
<span class="left">Value</span>
|
||||
<span class="right">
|
||||
<input id="request_value"/>
|
||||
</span>
|
||||
</div>
|
||||
<div id="div_data" class="line" style="display:none;">
|
||||
<span class="left">Data</span>
|
||||
<span class="right">
|
||||
<textarea id="request_data" rows="2" cols="2"></textarea>
|
||||
</span>
|
||||
</div>
|
||||
<div id="div_delay" class="line" style="display:none;">
|
||||
<span class="left">Delay</span>
|
||||
<span class="right">
|
||||
<input id="request_delay"/>
|
||||
</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Server</span>
|
||||
<span class="right">
|
||||
<?php echo Library_HTML_Components::serverSelect('request_server'); ?>
|
||||
</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">API</span>
|
||||
<span class="right">
|
||||
<?php echo Library_HTML_Components::apiList($_ini->get('get_api'), 'request_api'); ?>
|
||||
</span>
|
||||
</div>
|
||||
<div class="line" style="text-align:center;">
|
||||
<hr/>
|
||||
<input class="header" type="submit"
|
||||
onclick="javascript:executeCommand('container');javascript:this.blur();" value="Execute Command"/>
|
||||
</div>
|
||||
</form>
|
||||
</td>
|
||||
<td class="padding" style="border-left:1px solid #ffffff;padding-left:14px;">
|
||||
Available commands :
|
||||
<ul>
|
||||
<li>get : retreive a key value</li>
|
||||
<li>set : set a key/value pair</li>
|
||||
<li>delete : delete a specific key</li>
|
||||
<li>increment : increment a numeric key value</li>
|
||||
<li>decrement : decrement a numeric key value</li>
|
||||
<li>flush all : flush a Memcached server</li>
|
||||
</ul>
|
||||
<br/>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner full-size padding">Execute Telnet <span class="green">Commands</span></div>
|
||||
<div class="container corner full-size padding">
|
||||
<table>
|
||||
<tr valign="top">
|
||||
<td class="size-0 padding" style="padding-right:14px;">
|
||||
<div class="line" style="text-align:center;">
|
||||
Execute telnet command on one or all memcached servers<br/>
|
||||
<hr/>
|
||||
</div>
|
||||
<div class="line" style="text-align:center;">
|
||||
<textarea id="request_telnet" rows="2" cols="2"></textarea>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Server</span>
|
||||
<span class="right">
|
||||
<?php echo Library_HTML_Components::serverSelect('request_telnet_server'); ?>
|
||||
</span>
|
||||
</div>
|
||||
<div class="line" style="text-align:center;">
|
||||
<hr/>
|
||||
<input class="header" type="submit"
|
||||
onclick="javascript:executeTelnet('container');javascript:this.blur();" value="Execute Telnet Command"/>
|
||||
</div>
|
||||
</td>
|
||||
<td class="padding" style="border-left:1px solid #ffffff;padding-left:14px;">
|
||||
You can use this thing to execute any telnet command to any memcached server
|
||||
<br/>
|
||||
It will connect to the server, execute the command and return it in the console
|
||||
<br/>
|
||||
<br/>
|
||||
<br/>
|
||||
<br/>
|
||||
For more informations about memcached commands, see memcached protocol
|
||||
<a href="http://github.com/memcached/memcached/blob/master/doc/protocol.txt" target="_blank"><span class="green">here</span></a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner full-size padding">Search <span class="green">Key</span></div>
|
||||
<div class="container corner full-size padding">
|
||||
<table>
|
||||
<tr valign="top">
|
||||
<td class="size-0 padding" style="padding-right:14px;">
|
||||
<div class="line" style="text-align:center;">
|
||||
Search for a key on one or all memcached servers<br/>
|
||||
<hr/>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Key</span>
|
||||
<span class="right">
|
||||
<input id="search_key" name="search_key"/>
|
||||
</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Server</span>
|
||||
<span class="right">
|
||||
<?php echo Library_HTML_Components::serverSelect('search_server'); ?>
|
||||
</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Detail Level</span>
|
||||
<span class="right">
|
||||
<select id="search_level">
|
||||
<option value="full">Show Keys, Expiration & Size</option>
|
||||
<option value="keys">Show Keys</option>
|
||||
</select>
|
||||
</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Action</span>
|
||||
<span class="right">
|
||||
<select id="search_more">
|
||||
<option value="show">Search & Show Keys</option>
|
||||
<option value="delete">Search & Delete Keys</option>
|
||||
</select>
|
||||
</span>
|
||||
</div>
|
||||
<div class="line" style="text-align:center;">
|
||||
<hr/>
|
||||
<input class="header" type="submit"
|
||||
onclick="javascript:searchKey('container');javascript:this.blur();" value="Search Key"/>
|
||||
</div>
|
||||
</td>
|
||||
<td class="padding" style="border-left:1px solid #ffffff;padding-left:14px;">
|
||||
<span class="red">Warning !</span><br/>This thing is only for debuging issue, do not use it in a production environment as it can lock
|
||||
or impact your memcached servers performances.
|
||||
<br/>Also keep in mind that it does not list all keys. It lists keys up to a certain buffer size (1 or 2MB), and it list key that are expired.
|
||||
<br/>
|
||||
<br/>You can also use a PCRE regular expression
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
151
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/Configure/Configure.phtml
vendored
Normal file
@ -0,0 +1,151 @@
|
||||
<div style="float:left;">
|
||||
<div class="size-0" style="float:left;">
|
||||
|
||||
<div class="sub-header corner padding">Live Stats <span class="green">Configuration</span></div>
|
||||
<div class="container corner padding" style="padding-right:14px;">
|
||||
<form method="post" action="configure.php?request_write=live_stats">
|
||||
<div class="line">
|
||||
Alert & refresh rate for Live Stats<br/>
|
||||
<hr/>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Refresh Rate in sec</span>
|
||||
<span class="right"><input type="text" name="refresh_rate" value="<?php echo $_ini->get('refresh_rate'); ?>"/></span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Memory Alert</span>
|
||||
<span class="right"><input type="text" name="memory_alert" value="<?php echo $_ini->get('memory_alert'); ?>"/></span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Hit Rate Alert</span>
|
||||
<span class="right"><input type="text" name="hit_rate_alert" value="<?php echo $_ini->get('hit_rate_alert'); ?>"/></span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Eviction Alert</span>
|
||||
<span class="right"><input type="text" name="eviction_alert" value="<?php echo $_ini->get('eviction_alert'); ?>"/></span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Temp Path</span>
|
||||
<span class="right"><input type="text" name="file_path" value="<?php echo $_ini->get('file_path'); ?>"/></span>
|
||||
</div>
|
||||
<div class="line" style="text-align:center;">
|
||||
<hr/>
|
||||
<input class="list" type="submit" value="Save Live Configuration"/>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner padding">Miscellaneous <span class="green">Configuration</span></div>
|
||||
<div class="container corner padding" style="padding-right:14px;">
|
||||
<form method="post" action="configure.php?request_write=miscellaneous">
|
||||
<div class="line">
|
||||
Server connection timeout & miscellaneous<br/>
|
||||
<hr/>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Timeout in sec</span>
|
||||
<span class="right"><input type="text" name="connection_timeout" value="<?php echo $_ini->get('connection_timeout'); ?>"/></span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Max Items</span>
|
||||
<span class="right"><input type="text" name="max_item_dump" value="<?php echo $_ini->get('max_item_dump'); ?>"/></span>
|
||||
</div>
|
||||
<div class="line" style="text-align:center;">
|
||||
<hr/>
|
||||
<input class="list" type="submit" value="Save API Configuration"/>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="size-0" style="float:left;padding-left:9px;">
|
||||
<div class="sub-header corner padding">Server <span class="green">List</span></div>
|
||||
<div class="container corner padding" style="padding-right:14px;">
|
||||
<form method="post" action="configure.php?request_write=servers">
|
||||
<div class="line">
|
||||
Servers list used by phpMemcacheAdmin<br/><br/>
|
||||
The server name will be filled by default with hostname:port
|
||||
</div>
|
||||
<div id="server_form">
|
||||
<?php
|
||||
# Initializing variables
|
||||
$server_id = 0;
|
||||
$cluster_id = 0;
|
||||
|
||||
# Looking into each cluster
|
||||
foreach($_ini->get('servers') as $cluster => $servers)
|
||||
{
|
||||
$cluster_id++; ?>
|
||||
<div id="cluster_<?php echo $cluster_id; ?>">
|
||||
<hr/>
|
||||
<strong>Cluster <input type="text" style="width:200px;" name="cluster[<?php echo $cluster_id; ?>]" value="<?php echo $cluster; ?>"/></strong>
|
||||
<div style="margin-left:30px;margin-top:3px;">
|
||||
<div style="width:150px;float:left;">Name (Optionnal)</div>
|
||||
<div style="width:150px;float:left;margin-left:7px;">IP/Hostname</div>
|
||||
<div style="width:50px;float:left;margin-left:7px;">Port</div>
|
||||
</div>
|
||||
<?php # Adding input for each server
|
||||
foreach($servers as $name => $server)
|
||||
{
|
||||
$server_id++; ?>
|
||||
<div id="server_<?php echo $server_id; ?>">
|
||||
<div style="margin-left:30px;margin-top:3px;">
|
||||
<input type="text" style="width:150px;" name="server[<?php echo $cluster_id; ?>][<?php echo $server_id; ?>][name]"
|
||||
value="<?php echo $name; ?>"
|
||||
id="name_<?php echo $server_id; ?>"
|
||||
onchange="nameOnChange(<?php echo $server_id; ?>)"/>
|
||||
<input type="text" style="width:150px;" name="server[<?php echo $cluster_id; ?>][<?php echo $server_id; ?>][hostname]"
|
||||
value="<?php echo $server['hostname']; ?>"
|
||||
id="host_<?php echo $server_id; ?>"
|
||||
<?php # Custom name
|
||||
if ($name == $server['hostname'] . ':' . $server['port']) { ?>
|
||||
onchange="hostOrPortOnChange(<?php echo $server_id; ?>)"
|
||||
onKeyUp="hostOrPortOnChange(<?php echo $server_id; ?>)"
|
||||
<?php
|
||||
} ?>
|
||||
onfocus="hostOnFocus(this)"
|
||||
onblur="hostOnBlur(this)"/>
|
||||
<input type="text" style="width:50px;" name="server[<?php echo $cluster_id; ?>][<?php echo $server_id; ?>][port]"
|
||||
value="<?php echo $server['port']; ?>"
|
||||
id="port_<?php echo $server_id; ?>"
|
||||
<?php # Custom name
|
||||
if ($name == $server['hostname'] . ':' . $server['port']) { ?>
|
||||
onchange="hostOrPortOnChange(<?php echo $server_id; ?>)"
|
||||
onKeyUp="hostOrPortOnChange(<?php echo $server_id; ?>)"
|
||||
<?php
|
||||
} ?>
|
||||
onfocus="portOnFocus(this)"
|
||||
onblur="portOnBlur(this)"/>
|
||||
<a class="list button" style="padding:1px 2px;" href="#" onclick="deleteServerOrCluster('server_<?php echo $server_id; ?>')">Delete</a>
|
||||
</div>
|
||||
</div>
|
||||
<?php } ?>
|
||||
<div id="cluster_<?php echo $cluster_id; ?>_commands" style="margin-left:40px;margin-top:6px;">
|
||||
<a class="list button" href="javascript:addServer(<?php echo $cluster_id; ?>)">Add New Server to Cluster</a>
|
||||
<a class="list" style="padding:1px 2px;-moz-border-radius:3px;-webkit-border-radius:3px;" href="#"
|
||||
onclick="deleteServerOrCluster('cluster_<?php echo $cluster_id; ?>')">Delete Cluster</a>
|
||||
</div>
|
||||
<br/>
|
||||
</div>
|
||||
<?php } ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<hr/>
|
||||
<a class="list button" href="javascript:addCluster()">Add New Cluster</a>
|
||||
<input class="list" type="submit" value="Save Servers Configuration"/>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
server_id = <?php echo $server_id; ?>;
|
||||
cluster_id = <?php echo $cluster_id; ?>;
|
||||
</script>
|
||||
|
||||
<div class="container corner padding" style="margin-top:10px;">
|
||||
<div class="line">
|
||||
For more information about configuring phpMemcachedAdmin, see installation guide
|
||||
<a href="https://blog.elijaa.org/phpmemcachedadmin-installation-guide/" target="_blank"><span class="green">here</span></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
18
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/Footer.phtml
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
# Check for newer version
|
||||
if(Library_Data_Version::check())
|
||||
{ ?>
|
||||
<div class="header corner full-size padding" style="float:left; text-align:center; margin-top:10px;">
|
||||
A newer version of phpMemcachedAdmin may be available, visit <a href="https://blog.elijaa.org/phpmemcachedadmin-download/" target="_blank">PHPMemcachedAdmin Blog</a> to know more.
|
||||
<?php
|
||||
} else { ?>
|
||||
<div class="sub-header corner full-size padding" style="float:left; text-align:center; margin-top:10px;">
|
||||
<a href="https://github.com/elijaa/phpmemcachedadmin" target="_blank">PHPMemcachedAdmin on GitHub</a> -
|
||||
<a href="https://blog.elijaa.org" target="_blank">PHPMemcachedAdmin Blog</a> -
|
||||
<a href="http://memcached.org" target="_blank">Memcached.org</a>
|
||||
<?php
|
||||
} ?>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
62
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/Header.phtml
vendored
Normal file
@ -0,0 +1,62 @@
|
||||
<?php echo '<?xml version="1.0" encoding="UTF-8"?>'; ?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||
<head>
|
||||
<title>PHPMemcachedAdmin <?php echo CURRENT_VERSION; ?></title>
|
||||
<link rel="stylesheet" type="text/css" href="Public/Styles/Style.css"/>
|
||||
<script type="text/javascript" src="Public/Scripts/Highcharts/highcharts.js"></script>
|
||||
<script type="text/javascript" src="Public/Scripts/script.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div style="margin:0pt auto; width:1000px; clear:both;">
|
||||
<div style="font-weight:bold;font-size:1.2em;">PHPMemcachedAdmin <sup><?php echo CURRENT_VERSION; ?></sup>
|
||||
</div>
|
||||
<div class="header corner full-size padding" style="text-align:center;margin-top:5px;">
|
||||
<?php
|
||||
# Live Stats view
|
||||
if(basename($_SERVER['PHP_SELF']) == 'stats.php')
|
||||
{ ?>
|
||||
Live Stats |
|
||||
<?php
|
||||
} else { ?>
|
||||
<a href="stats.php">See Live Stats </a> |
|
||||
<?php
|
||||
}
|
||||
# Stats view
|
||||
if(basename($_SERVER['PHP_SELF']) == 'index.php')
|
||||
{ ?>
|
||||
Actually seeing
|
||||
<?php
|
||||
} else { ?>
|
||||
<a href="index.php">See Stats for </a>
|
||||
<?php
|
||||
}
|
||||
# Server HTML select
|
||||
echo Library_HTML_Components::serverSelect('server_select', (isset($_REQUEST['server'])) ? $_REQUEST['server'] : '', 'list', 'onchange="changeServer(this)"'); ?>
|
||||
|
|
||||
<?php
|
||||
# Commands view
|
||||
if(basename($_SERVER['PHP_SELF']) == 'commands.php')
|
||||
{ ?>
|
||||
Executing Commands on Servers
|
||||
<?php
|
||||
} else { ?>
|
||||
<a href="commands.php">Execute Commands on Servers</a>
|
||||
<?php
|
||||
}?>
|
||||
</div>
|
||||
<?php
|
||||
if (is_writable($_ini->get('file_path')) === false) {
|
||||
?>
|
||||
<div class="header corner full-size padding" style="margin-top:10px;">
|
||||
Warning : Temporary directory '<em><?php echo $_ini->get('file_path') ?></em>' is not writable, please fix this error and try again.
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
|
||||
<!--[if IE]>
|
||||
<div class="header corner full-size padding" style="text-align:center;margin-top:10px;">
|
||||
Support browsers that contribute to open source, try <a href="http://www.firefox.com" target="_blank">Firefox</a> or <a href="http://www.google.com/chrome" target="_blank">Google Chrome</a>.
|
||||
</div>
|
||||
<![endif]-->
|
70
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/LiveStats/Frame.phtml
vendored
Normal file
@ -0,0 +1,70 @@
|
||||
<script type="text/javascript">
|
||||
var timeout = <?php echo $refresh_rate * 1000; ?>;
|
||||
var page = 'stats.php?request_command=live_stats&cluster=<?php echo $cluster; ?>';
|
||||
setTimeout("ajax(page,'stats')", <?php echo (5 + $refresh_rate - $_ini->get('refresh_rate')) * 1000; ?>);
|
||||
</script>
|
||||
|
||||
<div style="float:left;">
|
||||
<div class="sub-header corner full-size padding">Live <span class="green">Stats</span></div>
|
||||
<?php
|
||||
# Refresh rate increased
|
||||
if($refresh_rate > $_ini->get('refresh_rate'))
|
||||
{ ?>
|
||||
<div class="container corner" style="padding:9px;">
|
||||
Connections errors were discovered, to prevent any problem, refresh rate was increased by
|
||||
<?php echo sprintf('%.1f', $refresh_rate - $_ini->get('refresh_rate')); ?> seconds.
|
||||
</div>
|
||||
<?php
|
||||
} ?>
|
||||
<div class="full-size padding">
|
||||
<br/>
|
||||
<span class="live">Actually looking at <?php echo Library_HTML_Components::clusterSelect('cluster_select', (isset($_REQUEST['cluster'])) ? $_REQUEST['cluster'] : '', 'live', 'onchange="changeCluster(this);"'); ?> stats</span>
|
||||
|
||||
<pre id="stats" class="live">
|
||||
|
||||
Loading live stats, please wait ~<?php echo sprintf('%.0f', 5 + $refresh_rate - $_ini->get('refresh_rate')); ?> seconds ...
|
||||
</pre>
|
||||
</div>
|
||||
<div class="container corner full-size padding">
|
||||
<div class="line">
|
||||
<span class="left setting">SIZE</span>
|
||||
Total cache size on this server
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting">%MEM</span>
|
||||
Percentage of total cache size used on this server
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting">%HIT</span>
|
||||
Global hit percent on this server : get_hits / (get_hits + get_misses)
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting">TIME</span>
|
||||
Time taken to connect to the server and proceed the request, high value can indicate a latency or server problem
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting">REQ/s</span>
|
||||
Total request per second (get, set, delete, incr, ...) issued to this server
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting">CONN</span>
|
||||
Current connections, monitor that this number doesn't come too close to the server max connection setting
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting">GET/s, SET/s, DEL/s</span>
|
||||
Get, set or delete commands per second issued to this server
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting">EVI/s</span>
|
||||
Number of times an item which had an explicit expire time set had to be evicted before it expired
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting">READ/s</span>
|
||||
Total number of bytes read by this server from network
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting">WRITE/s</span>
|
||||
Total number of bytes sent by this server to network
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
87
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/LiveStats/Stats.phtml
vendored
Normal file
@ -0,0 +1,87 @@
|
||||
<?php
|
||||
# CRLF/EOL
|
||||
define('EOL', "\r\n");
|
||||
|
||||
# Header
|
||||
echo 'Last update : ' . date('r', time()) . ' (refresh rate : ' . $_ini->get('refresh_rate') . ' sec)' . EOL . EOL;
|
||||
|
||||
# Table header
|
||||
echo '<strong>' . sprintf('%-36s', 'NAME') . sprintf('%10s', 'SIZE') . sprintf('%7s', '%MEM') . sprintf('%8s', 'TIME') .
|
||||
sprintf('%6s', 'CONN') . sprintf('%7s', '%HIT') . sprintf('%8s', 'REQ/s') . sprintf('%8s', 'GET/s') . sprintf('%8s', 'SET/s') .
|
||||
sprintf('%8s', 'DEL/s') . sprintf('%8s', 'EVI/s') . sprintf('%11s', 'READ/s') . sprintf('%10s', 'WRITE/s') . '</strong>' . EOL . '<hr>';
|
||||
|
||||
# Showing stats for every server
|
||||
foreach($stats as $server => $data)
|
||||
{
|
||||
# Server name
|
||||
echo sprintf('%-36.36s', $server);
|
||||
|
||||
# Checking for stats validity
|
||||
if((isset($data['time'], $data['bytes_percent'], $data['get_hits_percent'], $data['query_time'], $data['request_rate'], $data['curr_connections'],
|
||||
$data['get_rate'], $data['set_rate'], $data['delete_rate'], $data['eviction_rate'], $data['bytes_read'], $data['bytes_written'])) && ($data['time'] > 0))
|
||||
{
|
||||
# Total Memory
|
||||
echo sprintf('%10s', Library_Data_Analysis::byteResize($data['limit_maxbytes']) . 'b');
|
||||
|
||||
# Memory Occupation / Alert State
|
||||
if($data['bytes_percent'] > $_ini->get('memory_alert'))
|
||||
{
|
||||
echo str_pad('', 7 - strlen($data['bytes_percent']), ' ') . '<span class="red">' . sprintf('%.1f', $data['bytes_percent']) . '</span>';
|
||||
}
|
||||
else
|
||||
{
|
||||
echo sprintf('%7.1f', $data['bytes_percent']);
|
||||
}
|
||||
|
||||
# Query Time
|
||||
echo sprintf('%5.0f', Library_Data_Analysis::valueResize($data['query_time'])) . ' ms';
|
||||
|
||||
# Current connection
|
||||
echo sprintf('%6s', $data['curr_connections']);
|
||||
|
||||
# Hit percent (get)
|
||||
if($data['get_hits_percent'] < $_ini->get('hit_rate_alert'))
|
||||
{
|
||||
echo str_pad('', 7 - strlen($data['get_hits_percent']), ' ') . '<span class="red">' . sprintf('%.1f', $data['get_hits_percent']) . '</span>';
|
||||
}
|
||||
else
|
||||
{
|
||||
echo sprintf('%7.1f', $data['get_hits_percent']);
|
||||
}
|
||||
|
||||
# Request rate
|
||||
echo sprintf('%8s', Library_Data_Analysis::valueResize($data['request_rate']));
|
||||
|
||||
# Get rate
|
||||
echo sprintf('%8s', Library_Data_Analysis::valueResize($data['get_rate']));
|
||||
|
||||
# Set rate
|
||||
echo sprintf('%8s', Library_Data_Analysis::valueResize($data['set_rate']));
|
||||
|
||||
# Delete rate
|
||||
echo sprintf('%8s', Library_Data_Analysis::valueResize($data['delete_rate']));
|
||||
|
||||
# Eviction rate
|
||||
if($data['eviction_rate'] > $_ini->get('eviction_alert'))
|
||||
{
|
||||
echo str_pad('', 8 - strlen(Library_Data_Analysis::valueResize($data['eviction_rate'])), ' ') . '<span class="red">' . Library_Data_Analysis::valueResize($data['eviction_rate']) . '</span>';
|
||||
}
|
||||
else
|
||||
{
|
||||
echo sprintf('%8s', Library_Data_Analysis::valueResize($data['eviction_rate']));
|
||||
}
|
||||
|
||||
# Bytes read
|
||||
echo sprintf('%11s', Library_Data_Analysis::byteResize($data['bytes_read'] / $data['time']) . 'b');
|
||||
|
||||
# Bytes written
|
||||
echo sprintf('%10s', Library_Data_Analysis::byteResize($data['bytes_written'] / $data['time']) . 'b');
|
||||
}
|
||||
else
|
||||
{
|
||||
echo str_pad('', 20, ' ') . '<span class="alert">An error has occured when retreiving or calculating stats</span>';
|
||||
}
|
||||
|
||||
# End of Line
|
||||
echo EOL . '<hr>';
|
||||
}
|
58
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/Stats/Error.phtml
vendored
Normal file
@ -0,0 +1,58 @@
|
||||
<?php
|
||||
# Server seems down
|
||||
if((isset($stats)) && (($stats === false) || ($stats == array())))
|
||||
{ ?>
|
||||
<div class="header corner full-size padding" style="margin-top:10px;text-align:center;">
|
||||
<?php
|
||||
# Asking server of cluster stats
|
||||
if(isset($_REQUEST['server']))
|
||||
{
|
||||
echo ($_ini->cluster($_REQUEST['server'])) ? 'All servers from Cluster ' . $_REQUEST['server'] : 'Server ' . $_REQUEST['server'], ' did not respond !';
|
||||
}
|
||||
# All servers stats
|
||||
else
|
||||
{
|
||||
echo 'Servers did not respond !';
|
||||
} ?>
|
||||
</div>
|
||||
<div class="container corner full-size padding">
|
||||
<span class="left">Error message</span>
|
||||
<br/>
|
||||
<?php echo Library_Data_Error::last(); ?>
|
||||
<br/>
|
||||
<br/>
|
||||
Please check above error message, your <a href="configure.php" class="green">configuration</a> or your server status and retry
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
# No slabs used
|
||||
elseif((isset($slabs)) && ($slabs === false))
|
||||
{
|
||||
?>
|
||||
<div class="header corner full-size padding" style="margin-top:10px;text-align:center;">
|
||||
No slabs used in this server !
|
||||
</div>
|
||||
<div class="container corner full-size padding">
|
||||
<span class="left">Error message</span>
|
||||
<br/>
|
||||
Maybe this server is not used, check your <a href="configure.php" class="green">configuration</a> or your server status and retry
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
# No Items in slab
|
||||
elseif((isset($items)) && ($items === false))
|
||||
{
|
||||
?>
|
||||
<div class="header corner full-size padding" style="margin-top:10px;text-align:center;">
|
||||
No item in this slab !
|
||||
</div>
|
||||
<div class="container corner full-size padding">
|
||||
<span class="left">Error message</span>
|
||||
<br/>
|
||||
This slab is allocated, but is empty
|
||||
<br/>
|
||||
<br/>
|
||||
Go back to <a href="?server=<?php echo $_REQUEST['server']; ?>&show=slabs" class="green">Server Slabs</a>
|
||||
</div>
|
||||
<?php
|
||||
}
|
56
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/Stats/Items.phtml
vendored
Normal file
@ -0,0 +1,56 @@
|
||||
<div class="sub-header corner full-size padding">Console</div>
|
||||
<div class="container corner full-size padding" id="console" style="visibility:visible;display:block;">
|
||||
<pre id="container" style="font-size:11px;overflow:auto;min-height:80px;max-height:196px;" class="full-size">
|
||||
|
||||
|
||||
Click on an item's key below to see it's content here
|
||||
|
||||
</pre>
|
||||
</div>
|
||||
<div class="container corner full-size padding" style="text-align:right;">
|
||||
<span style="float:left;">
|
||||
<input style="witdh:200px;" class="header loading" type="submit" id="loading" value="Waiting for server response ..."/>
|
||||
</span>
|
||||
<input class="header" type="submit" onclick="javascript:executeClear('container')" value="Clear Console"/>
|
||||
<input class="header" id="hide" type="submit" onclick="javascript:executeHideShow('console', 'hide');javascript:this.blur();" value="Hide Console"/>
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner full-size padding">
|
||||
Items in Slab <?php echo $_REQUEST['slab']; ?>, only showing first <?php echo $_ini->get('max_item_dump'); ?> items
|
||||
<span style="float:right;">
|
||||
<a href="?server=<?php echo $_REQUEST['server']; ?>&show=slabs">Back to Server Slabs</a>
|
||||
</span>
|
||||
</div>
|
||||
<div class="container corner full-size padding">
|
||||
<?php
|
||||
$notFirst = false;
|
||||
|
||||
# Items
|
||||
foreach($items as $key => $data)
|
||||
{
|
||||
# Checking if first item
|
||||
if($notFirst) { echo '<hr/>'; }
|
||||
?>
|
||||
<a class="green item" style=""
|
||||
onclick="javascript:executeHideShow('console', 'hide', true);javascript:executeCommand('container', 'request_key=<?php echo urlencode($key); ?>&request_api=<?php echo $_ini->get('get_api'); ?>&request_command=get&request_server=<?php echo $_REQUEST['server']; ?>');"><?php echo ((strlen($key) > 70) ? substr($key, 0, 70) . '[..]' : $key); ?></a>
|
||||
|
||||
<span class="right" style="clear:right;">
|
||||
<strong>Size</strong> : <?php echo Library_Data_Analysis::byteResize($data[0]); ?>Bytes,
|
||||
<strong>Expiration</strong> :
|
||||
<?php
|
||||
# Infinite expiration
|
||||
if($data[1] == $infinite)
|
||||
{
|
||||
echo '∞';
|
||||
}
|
||||
# Timestamp expiration
|
||||
else
|
||||
{
|
||||
echo Library_Data_Analysis::uptime($data[1] - time());
|
||||
} ?>
|
||||
</span>
|
||||
<?php
|
||||
# First item done
|
||||
$notFirst = true;
|
||||
} ?>
|
||||
</div>
|
126
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/Stats/Slabs.phtml
vendored
Normal file
@ -0,0 +1,126 @@
|
||||
<div class="size-4" style="float:left;">
|
||||
<div class="sub-header corner padding">Slabs <span class="green">Stats</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left">Slabs Used</span>
|
||||
<?php echo $slabs['active_slabs']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Memory Used</span>
|
||||
<?php echo Library_Data_Analysis::byteResize($slabs['total_malloced']); ?>Bytes
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Wasted</span>
|
||||
<?php echo Library_Data_Analysis::byteResize($slabs['total_wasted']); ?>Bytes
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="size-2" style="float:left;padding-left:9px;margin-top:10px;">
|
||||
<div class="header corner padding size-3cols" style="text-align:center;">
|
||||
<a href="?server=<?php echo $_REQUEST['server']; ?>">See this Server Stats</a>
|
||||
</div>
|
||||
<br/>
|
||||
</div>
|
||||
|
||||
<div class="size-1" style="float:left;padding-left:9px;">
|
||||
<div class="container corner" style="padding:9px;">
|
||||
For more informations about memcached slabs stats, see memcached protocol
|
||||
<a href="http://github.com/memcached/memcached/blob/master/doc/protocol.txt#L470" target="_blank"><span class="green">here</span></a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<table class="full-size" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<?php
|
||||
$actualSlab = 0;
|
||||
|
||||
# Slabs parsing
|
||||
foreach($slabs as $id => $slab)
|
||||
{
|
||||
# If Slab is Used
|
||||
if(is_numeric($id))
|
||||
{
|
||||
# Making a new line
|
||||
if($actualSlab >= 4)
|
||||
{
|
||||
?>
|
||||
</tr>
|
||||
<tr>
|
||||
<?php
|
||||
$actualSlab = 0;
|
||||
}
|
||||
?>
|
||||
<td <?php if($actualSlab > 0) { echo 'style="padding-left:9px;"'; } ?> valign="top">
|
||||
<div class="sub-header corner padding size-5">Slab <?php echo $id; ?> <span class="green">Stats</span>
|
||||
<span style="float:right;"><a href="?server=<?php echo $_REQUEST['server']; ?>&show=items&slab=<?php echo $id; ?>">See Slab Items</a></span>
|
||||
</div>
|
||||
<div class="container corner padding size-5">
|
||||
<div class="line">
|
||||
<span class="left slabs">Chunk Size</span>
|
||||
<?php echo Library_Data_Analysis::byteResize($slab['chunk_size']); ?>Bytes
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left slabs">Used Chunk</span>
|
||||
<?php echo Library_Data_Analysis::hitResize($slab['used_chunks']); ?>
|
||||
<span class="right">[<?php echo Library_Data_Analysis::valueResize($slab['used_chunks'] / $slab['total_chunks'] * 100); ?> %]</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left slabs">Total Chunk</span>
|
||||
<?php echo Library_Data_Analysis::hitResize($slab['total_chunks']); ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left slabs">Total Page</span>
|
||||
<?php echo $slab['total_pages']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left slabs">Wasted</span>
|
||||
<?php echo Library_Data_Analysis::byteResize($slab['mem_wasted']); ?>Bytes
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left slabs">Hits</span>
|
||||
<?php echo ($slab['request_rate'] > 999) ? Library_Data_Analysis::hitResize($slab['request_rate']) : $slab['request_rate']; ?> Request/sec
|
||||
</div>
|
||||
<?php
|
||||
if($slab['used_chunks'] > 0)
|
||||
{ ?>
|
||||
<div class="line">
|
||||
<span class="left slabs">Evicted</span>
|
||||
<?php echo (isset($slab['items:evicted'])) ? $slab['items:evicted'] : 'N/A'; ?>
|
||||
</div>
|
||||
<!--
|
||||
<div class="line">
|
||||
<span class="left slabs">Evicted Last</span>
|
||||
<?php echo Library_Data_Analysis::uptime($slab['items:evicted_time']); ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left slabs">Out of Memory</span>
|
||||
<?php echo $slab['items:outofmemory']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left slabs">Tail Repairs</span>
|
||||
<?php echo $slab['items:tailrepairs']; ?>
|
||||
</div>
|
||||
-->
|
||||
<?php }
|
||||
else
|
||||
{?>
|
||||
<div class="line">
|
||||
<span class="left slabs">Slab is allocated but empty</span>
|
||||
</div>
|
||||
<?php } ?>
|
||||
</div>
|
||||
</td>
|
||||
<?php
|
||||
$actualSlab++;
|
||||
}
|
||||
?>
|
||||
<?php
|
||||
}
|
||||
for(true; $actualSlab < 4 ; $actualSlab++)
|
||||
{
|
||||
echo '<td style="width:100%;"></td>';
|
||||
}
|
||||
?>
|
||||
</tr>
|
||||
</table>
|
551
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/View/Stats/Stats.phtml
vendored
Normal file
@ -0,0 +1,551 @@
|
||||
<div class="size-4" style="float:left;">
|
||||
<div class="sub-header corner padding">Get <span class="green">Stats</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left">Hits</span>
|
||||
<?php echo Library_Data_Analysis::hitResize($stats['get_hits']); ?>
|
||||
<span class="right">[<?php echo $stats['get_hits_percent']; ?>%]</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Miss</span>
|
||||
<?php echo Library_Data_Analysis::hitResize($stats['get_misses']); ?>
|
||||
<span class="right">[<?php echo $stats['get_misses_percent']; ?>%]</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Rate</span>
|
||||
<?php echo $stats['get_rate']; ?> Request/sec
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner padding">Set <span class="green">Stats</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left">Total</span>
|
||||
<?php echo Library_Data_Analysis::hitResize($stats['cmd_set']); ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Rate</span>
|
||||
<?php echo $stats['set_rate']; ?> Request/sec
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner padding">Delete <span class="green">Stats</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left">Hits</span>
|
||||
<?php echo (isset($stats['delete_hits'])) ? Library_Data_Analysis::hitResize($stats['delete_hits']) : 'N/A on ' . $stats['version']; ?>
|
||||
<span class="right">[<?php echo $stats['delete_hits_percent']; ?>%]</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Miss</span>
|
||||
<?php echo (isset($stats['delete_misses'])) ? Library_Data_Analysis::hitResize($stats['delete_misses']) : 'N/A on ' . $stats['version']; ?>
|
||||
<span class="right">[<?php echo $stats['delete_misses_percent']; ?>%]</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Rate</span>
|
||||
<?php echo (isset($stats['delete_hits'])) ? $stats['delete_rate'] . ' Request/sec' : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner padding">Cas <span class="green">Stats</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left">Hits</span>
|
||||
<?php echo (isset($stats['cas_hits'])) ? Library_Data_Analysis::hitResize($stats['cas_hits']) : 'N/A on ' . $stats['version']; ?>
|
||||
<span class="right">[<?php echo $stats['cas_hits_percent']; ?>%]</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Miss</span>
|
||||
<?php echo (isset($stats['cas_misses'])) ? Library_Data_Analysis::hitResize($stats['cas_misses']) : 'N/A on ' . $stats['version']; ?>
|
||||
<span class="right">[<?php echo $stats['cas_misses_percent']; ?>%]</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Bad Value</span>
|
||||
<?php echo (isset($stats['cas_badval'])) ? Library_Data_Analysis::hitResize($stats['cas_badval']) : 'N/A on ' . $stats['version']; ?>
|
||||
<span class="right">[<?php echo $stats['cas_badval_percent']; ?>%]</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Rate</span>
|
||||
<?php echo (isset($stats['cas_hits'])) ? $stats['cas_rate'] . ' Request/sec' : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner padding">Increment <span class="green">Stats</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left">Hits</span>
|
||||
<?php echo (isset($stats['incr_hits'])) ? Library_Data_Analysis::hitResize($stats['incr_hits']) : 'N/A on ' . $stats['version']; ?>
|
||||
<span class="right">[<?php echo $stats['incr_hits_percent']; ?>%]</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Miss</span>
|
||||
<?php echo (isset($stats['incr_misses'])) ? Library_Data_Analysis::hitResize($stats['incr_misses']) : 'N/A on ' . $stats['version']; ?>
|
||||
<span class="right">[<?php echo $stats['incr_misses_percent']; ?>%]</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Rate</span>
|
||||
<?php echo (isset($stats['incr_hits'])) ? $stats['incr_rate'] . ' Request/sec' : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner padding">Decrement <span class="green">Stats</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left">Hits</span>
|
||||
<?php echo (isset($stats['decr_hits'])) ? Library_Data_Analysis::hitResize($stats['decr_hits']) : 'N/A on ' . $stats['version']; ?>
|
||||
<span class="right">[<?php echo $stats['decr_hits_percent']; ?>%]</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Miss</span>
|
||||
<?php echo (isset($stats['decr_misses'])) ? Library_Data_Analysis::hitResize($stats['decr_misses']) : 'N/A on ' . $stats['version']; ?>
|
||||
<span class="right">[<?php echo $stats['decr_misses_percent']; ?>%]</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Rate</span>
|
||||
<?php echo (isset($stats['decr_hits'])) ? $stats['decr_rate'] . ' Request/sec' : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner padding">Touch <span class="green">Stats</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left">Hits</span>
|
||||
<?php echo (isset($stats['touch_hits'])) ? Library_Data_Analysis::hitResize($stats['touch_hits']) : 'N/A on ' . $stats['version']; ?>
|
||||
<span class="right">[<?php echo $stats['touch_hits_percent']; ?>%]</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Miss</span>
|
||||
<?php echo (isset($stats['touch_misses'])) ? Library_Data_Analysis::hitResize($stats['touch_misses']) : 'N/A on ' . $stats['version']; ?>
|
||||
<span class="right">[<?php echo $stats['touch_misses_percent']; ?>%]</span>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Rate</span>
|
||||
<?php echo (isset($stats['touch_hits'])) ? $stats['touch_rate'] . ' Request/sec' : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner padding">Flush <span class="green">Stats</span></div>
|
||||
<div class="container corner padding" style="height:48px;">
|
||||
<div class="line">
|
||||
<span class="left">Total</span>
|
||||
<?php echo (isset($stats['cmd_flush'])) ? Library_Data_Analysis::hitResize($stats['cmd_flush']) : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Rate</span>
|
||||
<?php echo (isset($stats['cmd_flush'])) ? $stats['flush_rate'] . ' Request/sec' : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="size-2" style="float:left;padding-left:9px;">
|
||||
<?php
|
||||
# Viewing a single server
|
||||
if((isset($_REQUEST['server'])) && ($_ini->server($_REQUEST['server'])))
|
||||
{ ?>
|
||||
<div class="header corner padding size-3cols" style="text-align:center;margin-top:10px;">
|
||||
<a href="?server=<?php echo $_REQUEST['server']; ?>&show=slabs">See this Server Slabs Stats</a>
|
||||
</div>
|
||||
<?php
|
||||
} ?>
|
||||
<div class="sub-header corner padding"><?php echo (isset($_REQUEST['server'])) && ($_ini->server($_REQUEST['server'])) ? 'Server' : 'Cluster'; ?> <span class="green">Stats</span></div>
|
||||
<div class="container corner padding size-3cols">
|
||||
<?php
|
||||
# Viewing a single server
|
||||
if((isset($_REQUEST['server'])) && ($_ini->server($_REQUEST['server'])))
|
||||
{ ?>
|
||||
<div class="line">
|
||||
<span class="left setting">Uptime</span>
|
||||
<?php echo Library_Data_Analysis::uptime($stats['uptime']); ?>
|
||||
</div>
|
||||
<div class="line" style="margin-bottom:4px;">
|
||||
<span class="left setting">Memcached</span>
|
||||
Version <?php echo $stats['version']; ?>
|
||||
</div>
|
||||
<?php
|
||||
} ?>
|
||||
<div class="line">
|
||||
<span class="left setting">Curr Connections</span>
|
||||
<?php echo $stats['curr_connections']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting">Total Connections</span>
|
||||
<?php echo Library_Data_Analysis::hitResize($stats['total_connections']); ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting">Max Connections Errors</span>
|
||||
<?php echo (isset($stats['listen_disabled_num'])) ? Library_Data_Analysis::hitResize($stats['listen_disabled_num']) : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line" style="margin-top:4px;">
|
||||
<span class="left setting">Current Items</span>
|
||||
<?php echo Library_Data_Analysis::hitResize($stats['curr_items']); ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting">Total Items</span>
|
||||
<?php echo Library_Data_Analysis::hitResize($stats['total_items']); ?>
|
||||
</div>
|
||||
<?php
|
||||
# Viewing a single server
|
||||
if((isset($_REQUEST['server'])) && ($_ini->server($_REQUEST['server'])))
|
||||
{ ?>
|
||||
<div class="line">
|
||||
<span class="left setting">Oldest Item</span>
|
||||
<?php echo (isset($settings['oldest'])) ? Library_Data_Analysis::uptime($settings['oldest']) : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<?php
|
||||
} ?>
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner padding">Eviction & Reclaimed <span class="green">Stats</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left setting">Items Eviction</span>
|
||||
<?php echo Library_Data_Analysis::hitResize($stats['evictions']); ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting">Rate</span>
|
||||
<?php echo $stats['eviction_rate']; ?> Eviction/sec
|
||||
</div>
|
||||
<div class="line" style="margin-top:4px;">
|
||||
<span class="left setting">Reclaimed</span>
|
||||
<?php echo (isset($stats['reclaimed'])) ? Library_Data_Analysis::hitResize($stats['reclaimed']) : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting">Rate</span>
|
||||
<?php echo (isset($stats['reclaimed'])) ? $stats['reclaimed_rate'] . ' Reclaimed/sec' : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
|
||||
<div class="line" style="margin-top:4px;">
|
||||
<span class="left setting help" title="Internal name : expired_unfetched
Items pulled from LRU that were never touched by get/incr/append/etc before expiring">Expired unfetched</span>
|
||||
<?php echo (isset($stats['expired_unfetched'])) ? Library_Data_Analysis::hitResize($stats['expired_unfetched']) : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : evicted_unfetched
Items evicted from LRU that were never touched by get/incr/append/etc">Evicted unfetched</span>
|
||||
<?php echo (isset($stats['evicted_unfetched'])) ? Library_Data_Analysis::hitResize($stats['evicted_unfetched']) : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
# Viewing a server
|
||||
if((isset($_REQUEST['server'])) && ($_ini->server($_REQUEST['server'])))
|
||||
{ ?>
|
||||
<div class="sub-header corner padding">Server <span class="green">Configuration</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : accepting_conns
Whether the server is accepting connection or not">Accepting Connections</span>
|
||||
<?php
|
||||
# Northscale/Membase server specific
|
||||
if(isset($stats['accepting_conns']))
|
||||
{
|
||||
if($stats['accepting_conns']) { echo 'Yes'; } else { echo 'No'; }
|
||||
}
|
||||
else
|
||||
{
|
||||
echo 'N/A on ' . $stats['version'];
|
||||
}?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : maxbytes
Maximum number of bytes allowed in this cache">Max Bytes</span>
|
||||
<?php echo (isset($settings['maxbytes'])) ? Library_Data_Analysis::byteResize($settings['maxbytes']) . 'Bytes' : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : maxconns
Maximum number of clients allowed">Max Connection</span>
|
||||
<?php echo (isset($settings['maxconns'])) ? $settings['maxconns'] : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : tcpport & udpport
TCP & UDP listen port">TCP/UDP Port</span>
|
||||
<?php echo (isset($settings['tcpport'], $settings['udpport'])) ? 'TCP : ' . $settings['tcpport'] . ', UDP : ' . $settings['udpport'] : 'N/A on ' . $stats['version'] ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : inter
Listen interface">Listen Interface</span>
|
||||
<?php echo (isset($settings['inter'])) ? $settings['inter'] : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : evictions
When Off, LRU evictions are disabled">Evictions</span>
|
||||
<?php echo (isset($settings['evictions'])) ? ucfirst($settings['evictions']) : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : domain_socket
Path to the domain socket (if any)">Path to Domain Socket</span>
|
||||
<?php echo (isset($settings['domain_socket'])) ? $settings['domain_socket'] : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : umask
Umask for the creation of the domain socket">Domain Socket Umask</span>
|
||||
<?php echo (isset($settings['umask'])) ? $settings['umask'] : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : chunk_size
Minimum space allocated for key + value + flags">Chunk Size</span>
|
||||
<?php echo (isset($settings['chunk_size'])) ? $settings['chunk_size'] : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : growth_factor
Chunk size growth factor">Chunk Growth Factor</span>
|
||||
<?php echo (isset($settings['growth_factor'])) ? $settings['growth_factor'] : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : num_threads
Number of threads (including dispatch)">Max Threads</span>
|
||||
<?php echo (isset($settings['num_threads'])) ? $settings['num_threads'] : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : detail_enabled
If yes, stats detail is enabled">Detail Enabled</span>
|
||||
<?php echo (isset($settings['detail_enabled'])) ? ucfirst($settings['detail_enabled']) : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : reqs_per_event
Max num IO ops processed within an event">Max IO Ops/Event</span>
|
||||
<?php echo (isset($settings['reqs_per_event'])) ? $settings['reqs_per_event'] : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : cas_enabled
When no, CAS is not enabled for this server">CAS Enabled</span>
|
||||
<?php echo (isset($settings['cas_enabled'])) ? ucfirst($settings['cas_enabled']) : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : tcp_backlog
TCP listen backlog">TCP Listen Backlog</span>
|
||||
<?php echo (isset($settings['tcp_backlog'])) ? $settings['tcp_backlog'] : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left setting help" title="Internal name : auth_enabled_sasl
SASL auth requested and enabled">SASL Auth</span>
|
||||
<?php echo (isset($settings['auth_enabled_sasl'])) ? ucfirst($settings['auth_enabled_sasl']) : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
# Viewing a cluster
|
||||
elseif((isset($_REQUEST['server'])) && ($cluster = $_ini->cluster($_REQUEST['server'])))
|
||||
{ ?>
|
||||
<div class="sub-header corner padding">Cluster <?php echo $_REQUEST['server']; ?> <span class="green">Servers List</span></div>
|
||||
<div class="container corner padding">
|
||||
<?php
|
||||
# Displaying first 8 servers
|
||||
$displayed = 0;
|
||||
foreach($cluster as $name => $server)
|
||||
{ ?>
|
||||
<div class="line server" style="<?php if($displayed > 8) { echo 'display:none;'; } else { $displayed++; } ?>">
|
||||
<span class="left setting"><?php echo (strlen($name) > 27) ? substr($name, 0, 27) . ' [...]' : $name; ?></span>
|
||||
<span class="right" style="font-weight:bold;"><a href="index.php?server=<?php echo $name; ?>" class="green">See Server Stats</a></span>
|
||||
<div class="line" style="margin-left:5px;">
|
||||
<?php echo ($status[$name] != '') ? 'Version ' . $status[$name] . ', Uptime : ' . Library_Data_Analysis::uptime($uptime[$name]) : 'Server did not respond'; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
# Displaying remaining X server line
|
||||
$remaining = (count($cluster) - $displayed);
|
||||
if(($displayed > 8) && ($remaining >= 0))
|
||||
{ ?>
|
||||
<div class="line more">
|
||||
<span class="left" style="font-weight:bold;">
|
||||
<?php echo $remaining; ?> Server<?php echo ($remaining > 1) ? 's are' : ' is'; ?> not displayed</span>
|
||||
<span class="right" style="font-weight:bold;"><a href="#" onclick="javascript:show('server');javascript:hide('more');" class="green">See all <?php echo count($cluster); ?> Servers</a></span>
|
||||
</div>
|
||||
<?php
|
||||
} ?>
|
||||
</div>
|
||||
<?php
|
||||
} ?>
|
||||
</div>
|
||||
<?php
|
||||
# Fixing issue 163, some results from stats slabs mem_requested are buggy @FIXME
|
||||
if($slabs['total_malloced'] > $stats['limit_maxbytes'])
|
||||
{
|
||||
$slabs['total_wasted'] = $stats['limit_maxbytes'] - ($slabs['total_malloced'] - $slabs['total_wasted']);
|
||||
$slabs['total_malloced'] = $stats['limit_maxbytes'];
|
||||
}
|
||||
|
||||
# Making cache size stats
|
||||
$wasted_percent = sprintf('%.1f', $slabs['total_wasted'] / $stats['limit_maxbytes'] * 100);
|
||||
$used_percent = sprintf('%.1f', ($slabs['total_malloced'] - $slabs['total_wasted']) / $stats['limit_maxbytes'] * 100);
|
||||
$free_percent = sprintf('%.1f', ($stats['limit_maxbytes'] - $slabs['total_malloced']) / $stats['limit_maxbytes'] * 100);
|
||||
?>
|
||||
<div class="size-4" style="float:left; padding-left:9px;clear:right;">
|
||||
<div class="sub-header corner padding">Cache Size <span class="green">Stats</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left">Used</span>
|
||||
<?php echo Library_Data_Analysis::byteResize($slabs['total_malloced']); ?>Bytes
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Total</span>
|
||||
<?php echo Library_Data_Analysis::byteResize($stats['limit_maxbytes']); ?>Bytes
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Wasted</span>
|
||||
<?php echo Library_Data_Analysis::byteResize($slabs['total_wasted']); ?>Bytes
|
||||
</div>
|
||||
<!--
|
||||
<div class="line">
|
||||
<span class="left">Percent</span>
|
||||
<?php echo sprintf('%.1f', $stats['bytes'] / $stats['limit_maxbytes'] * 100, 1); ?>%
|
||||
</div>-->
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner padding">Cache Size <span class="green">Graphic</span></div>
|
||||
<div class="container corner padding">
|
||||
<div id="cacheUsageContainer"></div>
|
||||
<script>
|
||||
new Highcharts.Chart({
|
||||
chart: {
|
||||
backgroundColor: '#EBEBEB',
|
||||
plotBorderWidth: null,
|
||||
plotShadow: false,
|
||||
width: 274,
|
||||
height: 234,
|
||||
marginLeft: 0,
|
||||
marginRight: 0,
|
||||
marginTop: 0,
|
||||
marginBottom: 0,
|
||||
renderTo: 'cacheUsageContainer'
|
||||
},
|
||||
title: {
|
||||
text: '<b><?php echo Library_Data_Analysis::byteResize($stats['limit_maxbytes']); ?>Bytes</b>',
|
||||
y: 110,
|
||||
style: {
|
||||
fontSize: '12px'
|
||||
}
|
||||
},
|
||||
tooltip: {
|
||||
enabled: false
|
||||
},
|
||||
plotOptions: {
|
||||
pie: {
|
||||
borderWidth: 0,
|
||||
allowPointSelect: false,
|
||||
dataLabels: {
|
||||
enabled: true,
|
||||
color: '#000000',
|
||||
distance: 15,
|
||||
connectorWidth: 1.5,
|
||||
format: '<b>{point.name}</b><br/>{point.percentage:.1f} %'
|
||||
},
|
||||
center: ['50%', '50%']
|
||||
}
|
||||
},
|
||||
credits: {
|
||||
enabled: false
|
||||
},
|
||||
series: [{
|
||||
type: 'pie',
|
||||
name: 'Cache Size',
|
||||
size: '70%',
|
||||
innerSize: '55%',
|
||||
data: [{name: 'Wasted',
|
||||
y: <?php echo $wasted_percent; ?>,
|
||||
color: '#B5463F'},
|
||||
{name: 'Used',
|
||||
y: <?php echo $used_percent; ?>,
|
||||
color: '#2A707B'},
|
||||
{name: 'Free',
|
||||
y: <?php echo $free_percent; ?>,
|
||||
color: '#FFFFFF'}]
|
||||
}]
|
||||
});
|
||||
</script>
|
||||
</div>
|
||||
<?php
|
||||
# Viewing a single server
|
||||
if((isset($_REQUEST['server'])) && ($_ini->server($_REQUEST['server'])))
|
||||
{ ?>
|
||||
<div class="sub-header corner padding">Hash Table <span class="green">Stats</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left help" title="Internal name : hash_power_level
Current size multiplier for hash table">Power Level</span>
|
||||
<?php echo (isset($stats['hash_power_level'])) ? Library_Data_Analysis::byteResize($stats['hash_power_level']) . 'Bytes' : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Size</span>
|
||||
<?php echo (isset($stats['hash_bytes'])) ? Library_Data_Analysis::byteResize($stats['hash_bytes']) . 'Bytes' : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left help" title="Internal name : hash_is_expanding
Indicates if the hash table is being grown to a new size">Expanding</span>
|
||||
<?php if(isset($stats['hash_is_expanding'])) { if($stats['hash_is_expanding']) { echo 'Yes'; } else { echo 'No'; } } else { echo 'N/A on ' . $stats['version']; } ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
# Viewing a cluster
|
||||
elseif((isset($_REQUEST['server'])) && ($cluster = $_ini->cluster($_REQUEST['server'])))
|
||||
{ ?>
|
||||
<div class="sub-header corner padding">Hash Table <span class="green">Stats</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left">Size</span>
|
||||
<?php echo (isset($stats['hash_bytes'])) ? Library_Data_Analysis::byteResize($stats['hash_bytes']) . 'Bytes' : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
} ?>
|
||||
<div class="sub-header corner padding">Slab <span class="green">Reassign & Automove</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left help" title="Internal name : slabs_moved
Indicates how many pages have been successfully moved">Slabs Moved</span>
|
||||
<?php echo (isset($stats['slabs_moved'])) ? Library_Data_Analysis::hitResize($stats['slabs_moved']) : 'N/A on ' . $stats['version']; ?>
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left help" title="Internal name : slab_reassign_running
Indicates if the slab thread is attempting to move a page.
It may need to wait for some memory to free up, so it could take several seconds.">Reassigning</span>
|
||||
<?php if(isset($stats['slab_reassign_running'])) { if($stats['slab_reassign_running']) { echo 'Yes'; } else { echo 'No'; } } else { echo 'N/A on ' . $stats['version']; } ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner padding">Hit & Miss Rate <span class="green">Graphic</span></div>
|
||||
<div class="container corner padding">
|
||||
<div id="hitsContainer"></div>
|
||||
<script>
|
||||
new Highcharts.Chart({
|
||||
chart: {
|
||||
backgroundColor: '#EBEBEB',
|
||||
width: 274,
|
||||
height: 147,
|
||||
marginLeft: 0,
|
||||
marginRight: 0,
|
||||
marginTop: 0,
|
||||
marginBottom: 20,
|
||||
renderTo: 'hitsContainer'
|
||||
},
|
||||
title: {
|
||||
text: null
|
||||
},
|
||||
tooltip: {
|
||||
enabled: false
|
||||
},
|
||||
plotOptions: {
|
||||
column: {
|
||||
dataLabels: {
|
||||
enabled: true,
|
||||
format: '<b>{y} %</b>'
|
||||
}
|
||||
}
|
||||
},
|
||||
credits: {
|
||||
enabled: false
|
||||
},
|
||||
legend: {
|
||||
enabled: false
|
||||
},
|
||||
xAxis: {
|
||||
categories: ['Hits', 'Misses']
|
||||
},
|
||||
yAxis: {
|
||||
gridLineWidth: 0
|
||||
},
|
||||
series: [{
|
||||
type: 'column',
|
||||
name: 'Cache Size',
|
||||
data: [{name: 'Hits',
|
||||
y: <?php echo $stats['get_hits_percent']; ?>,
|
||||
color: '#2A707B'},
|
||||
{name: 'Misses',
|
||||
y: <?php echo $stats['get_misses_percent']; ?>,
|
||||
color: '#B5463F'}]
|
||||
}]
|
||||
});
|
||||
</script>
|
||||
</div>
|
||||
|
||||
<div class="sub-header corner padding">Network <span class="green">Stats</span></div>
|
||||
<div class="container corner padding">
|
||||
<div class="line">
|
||||
<span class="left">Bytes Read</span>
|
||||
<?php echo Library_Data_Analysis::byteResize($stats['bytes_read']); ?>Bytes
|
||||
</div>
|
||||
<div class="line">
|
||||
<span class="left">Bytes Written</span>
|
||||
<?php echo Library_Data_Analysis::byteResize($stats['bytes_written']); ?>Bytes
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
255
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/commands.php
vendored
Normal file
@ -0,0 +1,255 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright 2010 Cyrille Mahieux
|
||||
* 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.
|
||||
*
|
||||
* ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°>
|
||||
*
|
||||
* Executing commands
|
||||
*
|
||||
* @author elijaa@free.fr
|
||||
* @since 06/04/2010
|
||||
*/
|
||||
# Require
|
||||
require_once 'Library/Bootstrap.php';
|
||||
|
||||
# Initializing requests & response
|
||||
$request = (isset($_REQUEST['request_command'])) ? $_REQUEST['request_command'] : null;
|
||||
|
||||
# Starting
|
||||
ob_start();
|
||||
|
||||
# Display by request rype
|
||||
switch ($request) {
|
||||
# Memcache::get command
|
||||
case 'get' :
|
||||
# Ask for get on a cluster
|
||||
if (isset($_REQUEST['request_server']) && ($cluster = $_ini->cluster($_REQUEST['request_server']))) {
|
||||
foreach ($cluster as $server) {
|
||||
# Dumping server get command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->get($server['hostname'], $server['port'], $_REQUEST['request_key']));
|
||||
}
|
||||
} # Ask for get on one server
|
||||
elseif (isset($_REQUEST['request_server']) && ($server = $_ini->server($_REQUEST['request_server']))) {
|
||||
# Dumping server get command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->get($server['hostname'], $server['port'], $_REQUEST['request_key']));
|
||||
} # Ask for get on all servers
|
||||
else {
|
||||
foreach ($_ini->get('servers') as $cluster => $servers) {
|
||||
# Asking for each server stats
|
||||
foreach ($servers as $server) {
|
||||
# Dumping server get command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->get($server['hostname'], $server['port'], $_REQUEST['request_key']));
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
# Memcache::set command
|
||||
case 'set' :
|
||||
# Ask for set on a cluster
|
||||
if (isset($_REQUEST['request_server']) && ($cluster = $_ini->cluster($_REQUEST['request_server']))) {
|
||||
foreach ($cluster as $server) {
|
||||
# Dumping server get command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->set($server['hostname'], $server['port'], $_REQUEST['request_key'], $_REQUEST['request_data'], $_REQUEST['request_duration']));
|
||||
}
|
||||
} # Ask for set on one server
|
||||
elseif (isset($_REQUEST['request_server']) && ($server = $_ini->server($_REQUEST['request_server']))) {
|
||||
# Dumping server set command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->set($server['hostname'], $server['port'], $_REQUEST['request_key'], $_REQUEST['request_data'], $_REQUEST['request_duration']));
|
||||
} # Ask for set on all servers
|
||||
else {
|
||||
foreach ($_ini->get('servers') as $cluster => $servers) {
|
||||
# Asking for each server stats
|
||||
foreach ($servers as $server) {
|
||||
# Dumping server set command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->set($server['hostname'], $server['port'], $_REQUEST['request_key'], $_REQUEST['request_data'], $_REQUEST['request_duration']));
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
# Memcache::delete command
|
||||
case 'delete' :
|
||||
# Ask for delete on a cluster
|
||||
if (isset($_REQUEST['request_server']) && ($cluster = $_ini->cluster($_REQUEST['request_server']))) {
|
||||
foreach ($cluster as $server) {
|
||||
# Dumping server get command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->delete($server['hostname'], $server['port'], $_REQUEST['request_key']));
|
||||
}
|
||||
} # Ask for delete on one server
|
||||
elseif (isset($_REQUEST['request_server']) && ($server = $_ini->server($_REQUEST['request_server']))) {
|
||||
# Dumping server delete command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->delete($server['hostname'], $server['port'], $_REQUEST['request_key']));
|
||||
} # Ask for delete on all servers
|
||||
else {
|
||||
foreach ($_ini->get('servers') as $cluster => $servers) {
|
||||
# Asking for each server stats
|
||||
foreach ($servers as $server) {
|
||||
# Dumping server delete command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->delete($server['hostname'], $server['port'], $_REQUEST['request_key']));
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
# Memcache::increment command
|
||||
case 'increment' :
|
||||
# Checking value
|
||||
if (! isset($_REQUEST['request_value']) || ! is_numeric($_REQUEST['request_value'])) {
|
||||
$_REQUEST['request_value'] = 1;
|
||||
}
|
||||
|
||||
# Ask for increment on a cluster
|
||||
if (isset($_REQUEST['request_server']) && ($cluster = $_ini->cluster($_REQUEST['request_server']))) {
|
||||
foreach ($cluster as $server) {
|
||||
# Dumping server increment command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->increment($server['hostname'], $server['port'], $_REQUEST['request_key'], $_REQUEST['request_value']));
|
||||
}
|
||||
} # Ask for increment on one server
|
||||
elseif (isset($_REQUEST['request_server']) && ($server = $_ini->server($_REQUEST['request_server']))) {
|
||||
# Dumping server increment command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->increment($server['hostname'], $server['port'], $_REQUEST['request_key'], $_REQUEST['request_value']));
|
||||
} # Ask for increment on all servers
|
||||
else {
|
||||
foreach ($_ini->get('servers') as $cluster => $servers) {
|
||||
# Asking for each server stats
|
||||
foreach ($servers as $server) {
|
||||
# Dumping server increment command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->increment($server['hostname'], $server['port'], $_REQUEST['request_key'], $_REQUEST['request_value']));
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
# Memcache::decrement command
|
||||
case 'decrement' :
|
||||
# Checking value
|
||||
if (! isset($_REQUEST['request_value']) || ! is_numeric($_REQUEST['request_value'])) {
|
||||
$_REQUEST['request_value'] = 1;
|
||||
}
|
||||
|
||||
# Ask for decrement on a cluster
|
||||
if (isset($_REQUEST['request_server']) && ($cluster = $_ini->cluster($_REQUEST['request_server']))) {
|
||||
foreach ($cluster as $server) {
|
||||
# Dumping server decrement command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->decrement($server['hostname'], $server['port'], $_REQUEST['request_key'], $_REQUEST['request_value']));
|
||||
}
|
||||
} # Ask for decrement on one server
|
||||
elseif (isset($_REQUEST['request_server']) && ($server = $_ini->server($_REQUEST['request_server']))) {
|
||||
# Dumping server decrement command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->decrement($server['hostname'], $server['port'], $_REQUEST['request_key'], $_REQUEST['request_value']));
|
||||
} # Ask for decrement on all servers
|
||||
else {
|
||||
foreach ($_ini->get('servers') as $cluster => $servers) {
|
||||
# Asking for each server stats
|
||||
foreach ($servers as $server) {
|
||||
# Dumping server decrement command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->decrement($server['hostname'], $server['port'], $_REQUEST['request_key'], $_REQUEST['request_value']));
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
# Memcache::flush_all command
|
||||
case 'flush_all' :
|
||||
# Checking delay
|
||||
if (! isset($_REQUEST['request_delay']) || ! is_numeric($_REQUEST['request_delay'])) {
|
||||
$_REQUEST['request_delay'] = 0;
|
||||
}
|
||||
|
||||
# Ask for flush_all on a cluster
|
||||
if (isset($_REQUEST['request_server']) && ($cluster = $_ini->cluster($_REQUEST['request_server']))) {
|
||||
foreach ($cluster as $server) {
|
||||
# Dumping server get command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->flush_all($server['hostname'], $server['port'], $_REQUEST['request_delay']));
|
||||
}
|
||||
} # Ask for flush_all on one server
|
||||
elseif (isset($_REQUEST['request_server']) && ($server = $_ini->server($_REQUEST['request_server']))) {
|
||||
# Dumping server flush_all command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->flush_all($server['hostname'], $server['port'], $_REQUEST['request_delay']));
|
||||
} # Ask for flush_all on all servers
|
||||
else {
|
||||
foreach ($_ini->get('servers') as $cluster => $servers) {
|
||||
# Asking for each server stats
|
||||
foreach ($servers as $server) {
|
||||
# Dumping server flush_all command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api($_REQUEST['request_api'])->flush_all($server['hostname'], $server['port'], $_REQUEST['request_delay']));
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
# Memcache::search command
|
||||
case 'search' :
|
||||
# Ask for search on a cluster
|
||||
if (isset($_REQUEST['request_server']) && ($cluster = $_ini->cluster($_REQUEST['request_server']))) {
|
||||
foreach ($cluster as $server) {
|
||||
# Dumping server get command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api('Server')->search($server['hostname'], $server['port'], $_REQUEST['request_key'], $_REQUEST['request_level'], $_REQUEST['request_more']));
|
||||
}
|
||||
} # Ask for search on one server
|
||||
elseif (isset($_REQUEST['request_server']) && ($server = $_ini->server($_REQUEST['request_server']))) {
|
||||
# Dumping server search command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api('Server')->search($server['hostname'], $server['port'], $_REQUEST['request_key'], $_REQUEST['request_level'], $_REQUEST['request_more']));
|
||||
} # Ask for search on all servers
|
||||
else {
|
||||
# Looking into each cluster
|
||||
foreach ($_ini->get('servers') as $cluster => $servers) {
|
||||
# Asking for each server stats
|
||||
foreach ($servers as $server) {
|
||||
# Dumping server search command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api('Server')->search($server['hostname'], $server['port'], $_REQUEST['request_key'], $_REQUEST['request_level'], $_REQUEST['request_more']));
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
# Memcache::telnet command
|
||||
case 'telnet' :
|
||||
# Ask for a telnet command on a cluster
|
||||
if (isset($_REQUEST['request_server']) && ($cluster = $_ini->cluster($_REQUEST['request_server']))) {
|
||||
foreach ($cluster as $server) {
|
||||
# Dumping server telnet command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api('Server')->telnet($server['hostname'], $server['port'], $_REQUEST['request_telnet']));
|
||||
}
|
||||
} # Ask for a telnet command on one server
|
||||
elseif (isset($_REQUEST['request_server']) && ($server = $_ini->server($_REQUEST['request_server']))) {
|
||||
# Dumping server telnet command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api('Server')->telnet($server['hostname'], $server['port'], $_REQUEST['request_telnet']));
|
||||
} # Ask for a telnet command on all servers
|
||||
else {
|
||||
# Looking into each cluster
|
||||
foreach ($_ini->get('servers') as $cluster => $servers) {
|
||||
# Asking for each server stats
|
||||
foreach ($servers as $server) {
|
||||
# Dumping server telnet command response
|
||||
echo Library_HTML_Components::serverResponse($server['hostname'], $server['port'], Library_Command_Factory::api('Server')->telnet($server['hostname'], $server['port'], $_REQUEST['request_telnet']));
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
# Default : No command
|
||||
default :
|
||||
# Showing header
|
||||
include 'View/Header.phtml';
|
||||
|
||||
# Showing formulary
|
||||
include 'View/Commands/Commands.phtml';
|
||||
|
||||
# Showing footer
|
||||
include 'View/Footer.phtml';
|
||||
break;
|
||||
}
|
||||
|
||||
ob_end_flush();
|
141
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/index.php
vendored
Normal file
@ -0,0 +1,141 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright 2010 Cyrille Mahieux
|
||||
* 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.
|
||||
*
|
||||
* ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°>
|
||||
*
|
||||
* Stats viewing
|
||||
*
|
||||
* @author elijaa@free.fr
|
||||
* @since 20/03/2010
|
||||
*/
|
||||
# Require
|
||||
require_once 'Library/Bootstrap.php';
|
||||
|
||||
# Initializing requests
|
||||
$request = (isset($_REQUEST['show'])) ? $_REQUEST['show'] : null;
|
||||
|
||||
# Getting default cluster
|
||||
if (! isset($_REQUEST['server'])) {
|
||||
$clusters = array_keys($_ini->get('servers'));
|
||||
$cluster = isset($clusters[0]) ? $clusters[0] : null;
|
||||
$_REQUEST['server'] = $cluster;
|
||||
}
|
||||
|
||||
# Showing header
|
||||
include 'View/Header.phtml';
|
||||
|
||||
# Display by request type
|
||||
switch ($request) {
|
||||
# Items : Display of all items for a single slab for a single server
|
||||
case 'items' :
|
||||
# Initializing items array
|
||||
$server = null;
|
||||
$items = false;
|
||||
|
||||
# Ask for one server and one slabs items
|
||||
if (isset($_REQUEST['server']) && ($server = $_ini->server($_REQUEST['server']))) {
|
||||
$items = Library_Command_Factory::instance('items_api')->items($server['hostname'], $server['port'], $_REQUEST['slab']);
|
||||
}
|
||||
|
||||
# Getting stats to calculate server boot time
|
||||
$stats = Library_Command_Factory::instance('stats_api')->stats($server['hostname'], $server['port']);
|
||||
$infinite = (isset($stats['time'], $stats['uptime'])) ? ($stats['time'] - $stats['uptime']) : 0;
|
||||
|
||||
# Items are well formed
|
||||
if ($items !== false) {
|
||||
# Showing items
|
||||
include 'View/Stats/Items.phtml';
|
||||
} # Items are not well formed
|
||||
else {
|
||||
include 'View/Stats/Error.phtml';
|
||||
}
|
||||
unset($items);
|
||||
break;
|
||||
|
||||
# Slabs : Display of all slabs for a single server
|
||||
case 'slabs' :
|
||||
# Initializing slabs array
|
||||
$slabs = false;
|
||||
|
||||
# Ask for one server slabs
|
||||
if (isset($_REQUEST['server']) && ($server = $_ini->server($_REQUEST['server']))) {
|
||||
# Spliting server in hostname:port
|
||||
$slabs = Library_Command_Factory::instance('slabs_api')->slabs($server['hostname'], $server['port']);
|
||||
}
|
||||
|
||||
# Slabs are well formed
|
||||
if ($slabs !== false) {
|
||||
# Analysis
|
||||
$slabs = Library_Data_Analysis::slabs($slabs);
|
||||
include 'View/Stats/Slabs.phtml';
|
||||
} # Slabs are not well formed
|
||||
else {
|
||||
include 'View/Stats/Error.phtml';
|
||||
}
|
||||
unset($slabs);
|
||||
break;
|
||||
|
||||
# Default : Stats for all or specific single server
|
||||
default :
|
||||
# Initializing stats & settings array
|
||||
$stats = array();
|
||||
$slabs = array();
|
||||
$slabs['total_malloced'] = 0;
|
||||
$slabs['total_wasted'] = 0;
|
||||
$settings = array();
|
||||
$status = array();
|
||||
|
||||
$cluster = null;
|
||||
$server = null;
|
||||
|
||||
# Ask for a particular cluster stats
|
||||
if (isset($_REQUEST['server']) && ($cluster = $_ini->cluster($_REQUEST['server']))) {
|
||||
foreach ($cluster as $name => $server) {
|
||||
# Getting Stats & Slabs stats
|
||||
$data = array();
|
||||
$data['stats'] = Library_Command_Factory::instance('stats_api')->stats($server['hostname'], $server['port']);
|
||||
$data['slabs'] = Library_Data_Analysis::slabs(Library_Command_Factory::instance('slabs_api')->slabs($server['hostname'], $server['port']));
|
||||
$stats = Library_Data_Analysis::merge($stats, $data['stats']);
|
||||
|
||||
# Computing stats
|
||||
if (isset($data['slabs']['total_malloced'], $data['slabs']['total_wasted'])) {
|
||||
$slabs['total_malloced'] += $data['slabs']['total_malloced'];
|
||||
$slabs['total_wasted'] += $data['slabs']['total_wasted'];
|
||||
}
|
||||
$status[$name] = ($data['stats'] != array()) ? $data['stats']['version'] : '';
|
||||
$uptime[$name] = ($data['stats'] != array()) ? $data['stats']['uptime'] : '';
|
||||
}
|
||||
} # Asking for a server stats
|
||||
elseif (isset($_REQUEST['server']) && ($server = $_ini->server($_REQUEST['server']))) {
|
||||
# Getting Stats & Slabs stats
|
||||
$stats = Library_Command_Factory::instance('stats_api')->stats($server['hostname'], $server['port']);
|
||||
$slabs = Library_Data_Analysis::slabs(Library_Command_Factory::instance('slabs_api')->slabs($server['hostname'], $server['port']));
|
||||
$settings = Library_Command_Factory::instance('stats_api')->settings($server['hostname'], $server['port']);
|
||||
}
|
||||
|
||||
# Stats are well formed
|
||||
if (($stats !== false) && ($stats != array())) {
|
||||
# Analysis
|
||||
$stats = Library_Data_Analysis::stats($stats);
|
||||
include 'View/Stats/Stats.phtml';
|
||||
} # Stats are not well formed
|
||||
else {
|
||||
include 'View/Stats/Error.phtml';
|
||||
}
|
||||
unset($stats);
|
||||
break;
|
||||
}
|
||||
# Showing footer
|
||||
include 'View/Footer.phtml';
|
13
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/spam.php
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
<?php
|
||||
while(true)
|
||||
{
|
||||
$handle = fsockopen('127.0.0.1', 11211, $errno, $errstr, 2);
|
||||
for($i = rand(0, 200) ; $i < 300 ; $i++)
|
||||
{
|
||||
fwrite($handle, 'set ' . md5(microtime(true) . rand(0, 250000000)) . ' 0 18000 10' . "\r\n");
|
||||
fwrite($handle, 'aaaaaaaaaa' . "\r\n");
|
||||
}
|
||||
usleep(rand(0, 10000));
|
||||
set_time_limit(5);
|
||||
//sleep(rand(0,10));
|
||||
}
|
155
.devilbox/www/htdocs/vendor/phpmemcachedadmin-1.3.0/stats.php
vendored
Normal file
@ -0,0 +1,155 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright 2010 Cyrille Mahieux
|
||||
* 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.
|
||||
*
|
||||
* ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°> ><)))°>
|
||||
*
|
||||
* Live Stats top style
|
||||
*
|
||||
* @author Cyrille Mahieux : elijaa(at)free.fr
|
||||
* @since 12/04/2010
|
||||
*/
|
||||
# Require
|
||||
require_once 'Library/Bootstrap.php';
|
||||
|
||||
# Initializing requests
|
||||
$request = (isset($_REQUEST['request_command'])) ? $_REQUEST['request_command'] : null;
|
||||
|
||||
# Stat of a particular cluster
|
||||
if (isset($_REQUEST['cluster']) && ($_REQUEST['cluster'] != null)) {
|
||||
$cluster = $_REQUEST['cluster'];
|
||||
} else {
|
||||
# Getting default cluster
|
||||
$clusters = array_keys($_ini->get('servers'));
|
||||
$cluster = isset($clusters[0]) ? $clusters[0] : null;
|
||||
$_REQUEST['cluster'] = $cluster;
|
||||
}
|
||||
|
||||
# Checking writing status in temporary folder
|
||||
if (is_writable($_ini->get('file_path')) === false) {
|
||||
# Trying to change permissions
|
||||
chmod($_ini->get('file_path'), 0775);
|
||||
}
|
||||
|
||||
# Hashing cluster
|
||||
$hash = md5($_REQUEST['cluster']);
|
||||
|
||||
# Cookie @FIXME not a perfect method
|
||||
if (! isset($_COOKIE['live_stats_id' . $hash])) {
|
||||
# Cleaning temporary directory
|
||||
$files = glob($_ini->get('file_path') . '*', GLOB_NOSORT);
|
||||
foreach ($files as $path) {
|
||||
# Getting file last modification time
|
||||
$stats = @stat($path);
|
||||
|
||||
# Deleting file older than 24 hours
|
||||
if (isset($stats['mtime']) && ($stats['mtime'] < (time() - 60 * 60 * 24))) {
|
||||
@unlink($path);
|
||||
}
|
||||
}
|
||||
|
||||
# Generating unique id
|
||||
$live_stats_id = rand() . $hash;
|
||||
|
||||
# Cookie
|
||||
setcookie('live_stats_id' . $hash, $live_stats_id, time() + 60 * 60 * 24);
|
||||
} else {
|
||||
# Backup from a previous request
|
||||
$live_stats_id = $_COOKIE['live_stats_id' . $hash];
|
||||
}
|
||||
|
||||
# Live stats dump file
|
||||
$file_path = rtrim($_ini->get('file_path'), '/') . DIRECTORY_SEPARATOR . 'live_stats.' . $live_stats_id;
|
||||
|
||||
# Display by request type
|
||||
switch ($request) {
|
||||
# Ajax ask : stats
|
||||
case 'live_stats' :
|
||||
# Opening old stats dump
|
||||
$previous = @unserialize(file_get_contents($file_path));
|
||||
|
||||
# Initializing variables
|
||||
$actual = array();
|
||||
$stats = array();
|
||||
$time = 0;
|
||||
|
||||
# Requesting stats for each server
|
||||
foreach ($_ini->cluster($cluster) as $name => $server) {
|
||||
# Start query time calculation
|
||||
$time = microtime(true);
|
||||
|
||||
# Asking server for stats
|
||||
$actual[$name] = Library_Command_Factory::instance('stats_api')->stats($server['hostname'], $server['port']);
|
||||
|
||||
# Calculating query time length
|
||||
$actual[$name]['query_time'] = max((microtime(true) - $time) * 1000, 1);
|
||||
}
|
||||
|
||||
# Analysing stats
|
||||
foreach ($_ini->cluster($cluster) as $name => $server) {
|
||||
# Making an alias @FIXME Used ?
|
||||
$server = $name;
|
||||
|
||||
# Diff between old and new dump
|
||||
$stats[$server] = Library_Data_Analysis::diff($previous[$server], $actual[$server]);
|
||||
}
|
||||
|
||||
# Making stats for each server
|
||||
foreach ($stats as $server => $array) {
|
||||
# Analysing request
|
||||
if ((isset($stats[$server]['uptime'])) && ($stats[$server]['uptime'] > 0)) {
|
||||
# Computing stats
|
||||
$stats[$server] = Library_Data_Analysis::stats($stats[$server]);
|
||||
|
||||
# Because we make a diff on every key, we must reasign some values
|
||||
$stats[$server]['bytes_percent'] = sprintf('%.1f', $actual[$server]['bytes'] / $actual[$server]['limit_maxbytes'] * 100);
|
||||
$stats[$server]['bytes'] = $actual[$server]['bytes'];
|
||||
$stats[$server]['limit_maxbytes'] = $actual[$server]['limit_maxbytes'];
|
||||
$stats[$server]['curr_connections'] = $actual[$server]['curr_connections'];
|
||||
$stats[$server]['query_time'] = $actual[$server]['query_time'];
|
||||
}
|
||||
}
|
||||
|
||||
# Saving new stats dump
|
||||
file_put_contents($file_path, serialize($actual));
|
||||
|
||||
# Showing stats
|
||||
include 'View/LiveStats/Stats.phtml';
|
||||
break;
|
||||
|
||||
# Default : No command
|
||||
default :
|
||||
# Initializing : making stats dump
|
||||
$stats = array();
|
||||
foreach ($_ini->cluster($cluster) as $name => $server) {
|
||||
$stats[$name] = Library_Command_Factory::instance('stats_api')->stats($server['hostname'], $server['port']);
|
||||
}
|
||||
|
||||
# Saving first stats dump
|
||||
file_put_contents($file_path, serialize($stats));
|
||||
|
||||
# Searching for connection error, adding some time to refresh rate to prevent error
|
||||
$refresh_rate = max($_ini->get('refresh_rate'), count($_ini->cluster($cluster)) * 0.25 + (Library_Data_Error::count() * (0.5 + $_ini->get('connection_timeout'))));
|
||||
|
||||
# Showing header
|
||||
include 'View/Header.phtml';
|
||||
|
||||
# Showing live stats frame
|
||||
include 'View/LiveStats/Frame.phtml';
|
||||
|
||||
# Showing footer
|
||||
include 'View/Footer.phtml';
|
||||
|
||||
break;
|
||||
}
|
@ -10,11 +10,11 @@
|
||||
* @package PhpMyAdmin
|
||||
*/
|
||||
|
||||
/**
|
||||
* This is needed for cookie based authentication to encrypt password in
|
||||
* cookie. Needs to be 32 chars long.
|
||||
*/
|
||||
$cfg['blowfish_secret'] = 'GObO60^(04#^5637%fdUGo(*6$%6#dy4'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
|
||||
error_reporting(-1);
|
||||
$cfg['TempDir'] = '/tmp';
|
||||
$cfg['CheckConfigurationPermissions'] = false;
|
||||
$cfg['blowfish_secret'] = 'GObO60^(04#^5637%fdUGo(*6$%6#dy4';
|
||||
|
||||
|
||||
/**
|
||||
* Servers configuration
|
||||
@ -25,13 +25,20 @@ $i = 0;
|
||||
* First server
|
||||
*/
|
||||
$i++;
|
||||
|
||||
/* Authentication type */
|
||||
$cfg['Servers'][$i]['auth_type'] = 'cookie';
|
||||
if (getenv('DEVILBOX_VENDOR_PHPMYADMIN_AUTOLOGIN') == 1) {
|
||||
$cfg['Servers'][$i]['auth_type'] = 'config';
|
||||
$cfg['Servers'][$i]['user'] = 'root';
|
||||
$cfg['Servers'][$i]['password'] = getenv('MYSQL_ROOT_PASSWORD');
|
||||
} else {
|
||||
$cfg['Servers'][$i]['auth_type'] = 'cookie';
|
||||
}
|
||||
/* Server parameters */
|
||||
$cfg['Servers'][$i]['host'] = 'mysql';
|
||||
$cfg['Servers'][$i]['connect_type'] = 'tcp';
|
||||
$cfg['Servers'][$i]['compress'] = false;
|
||||
$cfg['Servers'][$i]['AllowNoPassword'] = TRUE;
|
||||
$cfg['Servers'][$i]['AllowNoPassword'] = true;
|
||||
/* Select mysql if your server does not have mysqli */
|
||||
$cfg['Servers'][$i]['extension'] = 'mysqli';
|
||||
|
||||
@ -132,7 +139,17 @@ $cfg['SaveDir'] = '';
|
||||
*/
|
||||
//$cfg['QueryHistoryMax'] = 100;
|
||||
|
||||
/*
|
||||
/**
|
||||
* Whether or not to query the user before sending the error report to
|
||||
* the phpMyAdmin team when a JavaScript error occurs
|
||||
*
|
||||
* Available options
|
||||
* ('ask' | 'always' | 'never')
|
||||
* default = 'ask'
|
||||
*/
|
||||
$cfg['SendErrorReports'] = 'never';
|
||||
|
||||
/**
|
||||
* You can find more configuration options in the documentation
|
||||
* in the doc/ folder or at <https://docs.phpmyadmin.net/>.
|
||||
*/
|
||||
|
@ -1,35 +0,0 @@
|
||||
# Contributing to phpMyAdmin
|
||||
|
||||
As an open source project, phpMyAdmin welcomes contributions of many forms.
|
||||
|
||||
## Bug reporting
|
||||
|
||||
We appreciate your effort to improve phpMyAdmin by submitting a bug report. Before doing so, please check the following things:
|
||||
|
||||
1. Check whether the bug you face **hasn't been already reported**. Duplicate reports takes us time, that we could be used to fix other bugs or make improvements.
|
||||
2. Specify the phpMyAdmin, server, PHP, MySQL and browser information that may be helpful to fix the problem, especially exact **version numbers**.
|
||||
3. If you got some error, please **describe what happened** and add error message. Reports like "I get error when I clicked on some link." are useless.
|
||||
4. Provide easy steps to reproduce and if possible include your table structure (``SHOW CREATE TABLE `tbl_name```); if your problem implies specific data, attach a small export file for sample rows.
|
||||
5. **Security problems** should not be reported here. See [our security page](https://www.phpmyadmin.net/security/).
|
||||
Thanks for your help!
|
||||
|
||||
Please report [bugs on GitHub][1].
|
||||
|
||||
[1]: https://github.com/phpmyadmin/phpmyadmin/issues/new
|
||||
|
||||
## Patches submission
|
||||
|
||||
Patches are welcome as [pull requests on GitHub][2]. Please include a
|
||||
Signed-off-by tag in the commit message (you can do this by passing `--signoff`
|
||||
parameter to Git). Note that by submitting patches with the Signed-off-by tag,
|
||||
you are giving permission to license the patch as GPLv2-or-later. See [the DCO
|
||||
file][3] for details.
|
||||
|
||||
[2]: https://github.com/phpmyadmin/phpmyadmin/pulls
|
||||
[3]: https://github.com/phpmyadmin/phpmyadmin/blob/master/DCO
|
||||
|
||||
## More information
|
||||
|
||||
You can find more information on our website:
|
||||
|
||||
https://www.phpmyadmin.net/contribute/
|
166
.devilbox/www/htdocs/vendor/phpmyadmin-4.7/ChangeLog
vendored
@ -1,166 +0,0 @@
|
||||
phpMyAdmin - ChangeLog
|
||||
======================
|
||||
|
||||
4.7.0 (2017-03-28)
|
||||
- patch #12233 [Display] Improve message when renaming database to same name
|
||||
- issue #6146 Log authentication attempts to syslog
|
||||
- issue #11981 Remove support for Swekey authentication
|
||||
- issue #11987 Remove code for no longer supported MSIE versions
|
||||
+ issue #11962 Remove embedded PHP libraries, use composer to install them
|
||||
+ issue #12017 Cannot easily select multiple tables when exporting
|
||||
+ issue #12047 Add javascript filtering for databases
|
||||
- issue #12166 More compact rendering of navigation tree
|
||||
+ issue #12129 Improve performance with SkipLockedTables
|
||||
- issue #12173 Do not hide indexes under a slider
|
||||
- issue Improve performance of zip file import
|
||||
- issue #12196 Removed $cfg['ThemePath']
|
||||
- issue #6274 Add support for export user settings as config.inc.php snippet
|
||||
- issue #5555 Better report query errors while generating SQL exports
|
||||
- issue #12307 Produce valid JSON on export
|
||||
- issue #12325 Setup script icons broken
|
||||
- issue #12378 Support IPv6 proxies
|
||||
- issue Removed MySQL connection retry without password
|
||||
- issue #12218 Allow to specify further parameters for control connection
|
||||
- issue #12162 Show charset for each table on Database structure page
|
||||
- issue #12463 Incorrect link in the href of icon at Hide/Show unhide links
|
||||
- issue #12330 Shortcut for closing console
|
||||
- issue #12465 Improved handling of http requests
|
||||
- issue #12474 Broken links in Setup forms Navigation
|
||||
- issue #12494 Can't add a new User
|
||||
- issue #12523 Add 'token' Parameter in all POST requests (Fix 'Token mismatch' errors)
|
||||
- issue #12302 Improved usage of number_format
|
||||
- issue #12656 Server selection not working
|
||||
- issue #12543 NULL results in dataset are colored grey
|
||||
- issue #12664 Create Bookmark broken
|
||||
- issue #12688 Use unsigned int for storing bookmark ID
|
||||
- issue #12352 Added password strength indicator
|
||||
- issue #12713 Correctly handle HTTP status when doing requests
|
||||
- issue #12247 Add option to delete settings from browser storage
|
||||
- issue #12783 Remove unused PMA_addJSCode function
|
||||
- issue #12069 Add table filtering to database structure
|
||||
- issue #12799 Allow to configure signon session parameters
|
||||
- issue #12854 Drop database is broken
|
||||
- issue #12863 Can't toggle Event Scheduler on
|
||||
- issue #12742 Finish removing dead code references to xls/xlsx import and export, which was removed some time ago.
|
||||
- issue #12536 Rename "Relations" to "Relationships" in many places as it's the more proper term
|
||||
- issue #12834 Fixed margins in central columns feature
|
||||
- issue #12903 Document more export configuration options
|
||||
- issue #12897 Use consistent numeric format for table overhead
|
||||
- issue #12901 Use server returned table name on renaming table
|
||||
- issue #12918 Always use \r\n as newline when editing fields
|
||||
- issue #12923 Fixed server side search in navigation panel
|
||||
- issue #12929 Undefined index warning with ssl_ca_paths
|
||||
- issue #12924 Do not show errors from OpenSSL cookie encryption/decryption
|
||||
- issue #12945 Fixed hint rendering on adding new user
|
||||
- issue #12941 Fixed sorting of tables in relation view
|
||||
- issue #12936 Fixed tables pagination in navigation panel
|
||||
- issue #12904 Do not collapse add form for central columns if there are none
|
||||
- issue #12955 Fixed database renaming
|
||||
- issue #12954 Fixed export of tracking data
|
||||
- issue #12960 Enclose exports in transaction by default
|
||||
- issue #12966 After adding a column ADD INDEX option won't be displayed when enabling AI
|
||||
- issue #12972 Better error message when Composer has not been run
|
||||
- issue #12988 Do not show language selector without choices
|
||||
- issue #12993 Fixed external links to php documentation
|
||||
- issue #12990 Fixed error when loading favorite tables to console
|
||||
- issue #12981 Improved rendering of new version information
|
||||
- issue #12922 Fixed bookmarks ordering
|
||||
- issue #12964 Fixed table search in navigation
|
||||
- issue #12985 Fixed rendering of foreign key browsing
|
||||
- issue #12957 Fixed manipulation with GIS data having zero coordinates
|
||||
- issue #12804 Fixed various designer javascript errors
|
||||
- issue #12934 Fixed possible javascript error on server status page
|
||||
- issue #12927 Fixed javascript error on 3NF normalization
|
||||
- issue #12996 List all databses in navigation panel database dropdown
|
||||
- issue #12980 Better defaults when creating multi field foreign key
|
||||
- issue #12976 Improved foreign key editor behavior
|
||||
- issue #12958 Always show error reporting dialog on top
|
||||
- issue #12693 Improved support for TokuDB
|
||||
- issue #11231 Try harder to honor LoginCookieValidity setting
|
||||
- issue #13016 and #13017 Slight improvements to the table layout of Relation view
|
||||
- issue #12345 Correctly show affected rows for LOAD DATA queries
|
||||
- issue #13010 Copy database: SQL error for copying PMADB metadata
|
||||
- issue #13002 Fixed OpenDocument exports
|
||||
- issue #13000 Align NULL values according to the column alignment
|
||||
- issue #13021 Show phpMyAdmin errors even with error_reporting set to 0
|
||||
- issue #13020 Removed warning about client and server versions mismatch
|
||||
- issue Hide comments on table Structure tab when no comment is set
|
||||
- issue Fixed submission of error reports
|
||||
- issue #13033 Use Referrer-Policy header to specify referrer policy
|
||||
- issue Fixed javascript confirmation of dangerous queries
|
||||
- issue #13040 Compatibility with hhvm 3.18
|
||||
- issue #13031 Fixed displaying of all rows
|
||||
- issue #12967 Fixed related field selection for native relations
|
||||
- issue #13045 Properly escape MIME transformatoin names
|
||||
- issue #13028 Always show 100% in font selector
|
||||
- issue #13047 Fix query simulating for more servers
|
||||
- issue #12846 Fix new version check for sites with wrongly configured curl
|
||||
- issue #12951 When exporting to Excel, the default is now to include column names in the first row
|
||||
- issue #13059 Removed debugging code
|
||||
- issue #13029 Fixed table tracking for nested table groups
|
||||
- issue #13053 Fixed broken links in setup
|
||||
- issue #12708 Removed phpMyAdmin version from User-Agent header
|
||||
- issue #13084 Do not point users to setup when it is disabled
|
||||
- issue #12660 Delete only phpMyAdmin cookies on upgrade
|
||||
- issue #13088 Fixed editing of rows with text primary key
|
||||
- issue #13092 Do not try to sync favorite tables if configuration storage is not enabled
|
||||
- issue #13105 Fixed changing attribute for virtual field
|
||||
- issue #12757 Fixed setting password on recent MariaDB with non working plugins
|
||||
- issue #12349 Fixed undefined variable on import from some formats
|
||||
- issue #13103 Do not offer default names for copying/renaming databases
|
||||
- issue [security] Possible to bypass $cfg['Servers'][$i]['AllowNoPassword'], see PMASA-2017-08
|
||||
|
||||
4.6.6 (2017-01-23)
|
||||
- issue #12759 Fix Notice regarding 'Undefined index: old_usergroup'
|
||||
- issue #12760 Fix Notice regarding 'Undefined index: users'
|
||||
- issue #12762 Fixed parsing of SQL with BINARY function
|
||||
- issue #12588 ReCaptcha now works without allow_url_fopen
|
||||
- issue #12699 Show no local storage warning only on settings tab
|
||||
- issue #12778 Syntax Error in Adding/Changing TIMESTAMP columns with default value as NULL
|
||||
- issue #12769 Edit/Export links are not clickable under Routines tab
|
||||
- issue #12757 Fixed creating new user with older MariaDB
|
||||
- issue #12784 Remove ctype installation suggestion
|
||||
- issue #12780 Format button replaces all text with blank spaces
|
||||
- issue #12786 Fixed database searching
|
||||
- issue #12792 Fixed javascript error on new version link
|
||||
- issue #12785 Add information about required and suggested extensions to composer.json
|
||||
- issue #12801 Custom header shown twice with cookie login form
|
||||
- issue #12802 Custom footer not shown with auth_type http login failure
|
||||
- issue #12434 Improve documentation for servers running with Suhosin
|
||||
- issue #12800 Updated embedded phpSecLib to 2.0.4
|
||||
- issue #12800 Fixed various issues with PHP 7.1
|
||||
- issue #11816 Fixed operation with lower_case_table_names=2
|
||||
- issue #12813 Fixed stored procedure execution
|
||||
- issue #12826 Honor user configured connection collation
|
||||
- issue #12293 Correctly report OpenSSL errors from cookie encryption
|
||||
- issue #12814 DateTime won't allow to input length in Routine editor
|
||||
- issue #12840 Fix Notice regarding 'Undefined index: row_format' when altering table options
|
||||
- issue #12841 Fixed moving of columns with whitespace in name
|
||||
- issue #12847 Fixed editing of virtual columns
|
||||
- issue #12859 Changed WHERE condition to 0 instead of 1 for SQL query window to avoid accidents
|
||||
- issue #12872 Use same query for display and execution when dropping index
|
||||
- issue #12868 Fix check for user groups freatures being enabled
|
||||
- issue #12876 Fix notices and warning related to dbs_to_test global
|
||||
- issue #12831 Fix table formatting on Insert tab, which mostly affected row highlighting
|
||||
- issue #12495 Reintroduced phpinfo page with limited capabilities
|
||||
- issue #12861 Fix renaming tables with lower_case_table_names=2
|
||||
- issue #12876 Fix possible PHP error in navigation
|
||||
- issue #12881 Fix database search with newer php-gettext
|
||||
- issue #12894 Fix linter error on unterminated variable name
|
||||
- issue #12732 Fixed filtering for active processes
|
||||
- issue [security] Multiple vulnerabilities in setup script, see PMASA-2016-44.
|
||||
- issue [security] Open redirect, see PMASA-2017-1.
|
||||
- issue [security] php-gettext code execution, see PMASA-2017-2.
|
||||
- issue [security] DOS vulnerabiltiy in table editing, see PMASA-2017-3.
|
||||
- issue [security] CSS injection in themes, see PMASA-2017-4.
|
||||
- issue [security] Cookie attribute injection attack, see PMASA-2017-5.
|
||||
- issue [security] SSRF in replication, see PMASA-2017-6.
|
||||
- issue [security] DOS in replication status, see PMASA-2017-7.
|
||||
|
||||
--- Older ChangeLogs can be found on our project website ---
|
||||
https://www.phpmyadmin.net/old-stuff/ChangeLogs/
|
||||
|
||||
# vim: et ts=4 sw=4 sts=4
|
||||
# vim: ft=changelog fenc=utf-8
|
||||
# vim: fde=getline(v\:lnum-1)=~'^\\s*$'&&getline(v\:lnum)=~'\\S'?'>1'\:1&&v\:lnum>4&&getline(v\:lnum)!~'^#'
|
||||
# vim: fdn=1 fdm=expr
|
@ -1,52 +0,0 @@
|
||||
phpMyAdmin - Readme
|
||||
===================
|
||||
|
||||
Version 4.7.0
|
||||
|
||||
A web interface for MySQL and MariaDB.
|
||||
|
||||
https://www.phpmyadmin.net/
|
||||
|
||||
Summary
|
||||
-------
|
||||
|
||||
phpMyAdmin is intended to handle the administration of MySQL over the web.
|
||||
For a summary of features, list of requirements, and installation instructions,
|
||||
please see the documentation in the ./doc/ folder or at https://docs.phpmyadmin.net/
|
||||
|
||||
Copyright
|
||||
---------
|
||||
|
||||
Copyright © 1998 onwards -- the phpMyAdmin team
|
||||
|
||||
Certain libraries are copyrighted by their respective authors;
|
||||
see the full copyright list for details.
|
||||
|
||||
For full copyright information, please see ./doc/copyright.rst
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License version 2, as published by the
|
||||
Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||
details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Licensing of current contributions
|
||||
----------------------------------
|
||||
|
||||
Beginning on 2013-12-01, new contributions to this codebase are all licensed
|
||||
under terms compatible with GPLv2-or-later. phpMyAdmin is currently
|
||||
transitioning older code to GPLv2-or-later, but work is not yet complete.
|
||||
|
||||
Enjoy!
|
||||
------
|
||||
|
||||
The phpMyAdmin team
|
@ -1 +0,0 @@
|
||||
Wed Mar 29 12:13:14 UTC 2017
|
@ -1,61 +0,0 @@
|
||||
<?php
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* display selection for relational field values
|
||||
*
|
||||
* @package PhpMyAdmin
|
||||
*/
|
||||
use PMA\libraries\Response;
|
||||
|
||||
require_once 'libraries/common.inc.php';
|
||||
require_once 'libraries/transformations.lib.php';
|
||||
require_once 'libraries/browse_foreigners.lib.php';
|
||||
|
||||
/**
|
||||
* Sets globals from $_REQUEST
|
||||
*/
|
||||
$request_params = array(
|
||||
'data',
|
||||
'field'
|
||||
);
|
||||
|
||||
foreach ($request_params as $one_request_param) {
|
||||
if (isset($_REQUEST[$one_request_param])) {
|
||||
$GLOBALS[$one_request_param] = $_REQUEST[$one_request_param];
|
||||
}
|
||||
}
|
||||
|
||||
PMA\libraries\Util::checkParameters(array('db', 'table', 'field'));
|
||||
|
||||
$response = Response::getInstance();
|
||||
$response->getFooter()->setMinimal();
|
||||
$header = $response->getHeader();
|
||||
$header->disableMenuAndConsole();
|
||||
$header->setBodyId('body_browse_foreigners');
|
||||
|
||||
/**
|
||||
* Displays the frame
|
||||
*/
|
||||
|
||||
$foreigners = PMA_getForeigners($db, $table);
|
||||
$foreign_limit = PMA_getForeignLimit(
|
||||
isset($_REQUEST['foreign_showAll']) ? $_REQUEST['foreign_showAll'] : null
|
||||
);
|
||||
|
||||
$foreignData = PMA_getForeignData(
|
||||
$foreigners, $_REQUEST['field'], true,
|
||||
isset($_REQUEST['foreign_filter'])
|
||||
? $_REQUEST['foreign_filter']
|
||||
: '',
|
||||
isset($foreign_limit) ? $foreign_limit : null,
|
||||
true // for getting value in $foreignData['the_total']
|
||||
);
|
||||
|
||||
// HTML output
|
||||
$html = PMA_getHtmlForRelationalFieldSelection(
|
||||
$db, $table, $_REQUEST['field'], $foreignData,
|
||||
isset($fieldkey) ? $fieldkey : null,
|
||||
isset($data) ? $data : null
|
||||
);
|
||||
|
||||
$response->addHtml($html);
|
@ -1,160 +0,0 @@
|
||||
<?php
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* Simple script to set correct charset for changelog
|
||||
*
|
||||
* @package PhpMyAdmin
|
||||
*/
|
||||
use PMA\libraries\Response;
|
||||
|
||||
/**
|
||||
* Gets core libraries and defines some variables
|
||||
*/
|
||||
require 'libraries/common.inc.php';
|
||||
|
||||
$response = Response::getInstance();
|
||||
$response->disable();
|
||||
$response->getHeader()->sendHttpHeaders();
|
||||
|
||||
$filename = CHANGELOG_FILE;
|
||||
|
||||
/**
|
||||
* Read changelog.
|
||||
*/
|
||||
// Check if the file is available, some distributions remove these.
|
||||
if (@is_readable($filename)) {
|
||||
|
||||
// Test if the if is in a compressed format
|
||||
if (substr($filename, -3) == '.gz') {
|
||||
ob_start();
|
||||
readgzfile($filename);
|
||||
$changelog = ob_get_contents();
|
||||
ob_end_clean();
|
||||
} else {
|
||||
$changelog = file_get_contents($filename);
|
||||
}
|
||||
} else {
|
||||
printf(
|
||||
__(
|
||||
'The %s file is not available on this system, please visit ' .
|
||||
'%s for more information.'
|
||||
),
|
||||
$filename,
|
||||
'<a href="https://www.phpmyadmin.net/">phpmyadmin.net</a>'
|
||||
);
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Whole changelog in variable.
|
||||
*/
|
||||
$changelog = htmlspecialchars($changelog);
|
||||
|
||||
$tracker_url = 'https://sourceforge.net/support/tracker.php?aid=\\1';
|
||||
$tracker_url_bug = 'https://sourceforge.net/p/phpmyadmin/bugs/\\1/';
|
||||
$tracker_url_rfe = 'https://sourceforge.net/p/phpmyadmin/feature-requests/\\1/';
|
||||
$tracker_url_patch = 'https://sourceforge.net/p/phpmyadmin/patches/\\1/';
|
||||
$github_url = 'https://github.com/phpmyadmin/phpmyadmin/';
|
||||
$faq_url = 'https://docs.phpmyadmin.net/en/latest/faq.html';
|
||||
|
||||
$replaces = array(
|
||||
'@(https?://[./a-zA-Z0-9.-_-]*[/a-zA-Z0-9_])@'
|
||||
=> '<a href="url.php?url=\\1">\\1</a>',
|
||||
|
||||
// sourceforge users
|
||||
'/([0-9]{4}-[0-9]{2}-[0-9]{2}) (.+[^ ]) +<(.*)@users.sourceforge.net>/i'
|
||||
=> '\\1 <a href="url.php?url=https://sourceforge.net/users/\\3/">\\2</a>',
|
||||
'/thanks to ([^\(\r\n]+) \(([-\w]+)\)/i'
|
||||
=> 'thanks to <a href="url.php?url=https://sourceforge.net/users/\\2/">\\1</a>',
|
||||
'/thanks to ([^\(\r\n]+) -\s+([-\w]+)/i'
|
||||
=> 'thanks to <a href="url.php?url=https://sourceforge.net/users/\\2/">\\1</a>',
|
||||
|
||||
// mail address
|
||||
'/([0-9]{4}-[0-9]{2}-[0-9]{2}) (.+[^ ]) +<(.*@.*)>/i'
|
||||
=> '\\1 <a href="mailto:\\3">\\2</a>',
|
||||
|
||||
// linking patches
|
||||
'/patch\s*#?([0-9]{6,})/i'
|
||||
=> '<a href="url.php?url=' . $tracker_url . '">patch #\\1</a>',
|
||||
|
||||
// linking RFE
|
||||
'/(?:rfe|feature)\s*#?([0-9]{6,})/i'
|
||||
=> '<a href="url.php?url=https://sourceforge.net/support/tracker.php?aid=\\1">RFE #\\1</a>',
|
||||
|
||||
// linking files
|
||||
'/(\s+)([\\/a-z_0-9\.]+\.(?:php3?|html|pl|js|sh))/i'
|
||||
=> '\\1<a href="url.php?url=' . $github_url . 'commits/HEAD/\\2">\\2</a>',
|
||||
|
||||
// FAQ entries
|
||||
'/FAQ ([0-9]+)\.([0-9a-z]+)/i'
|
||||
=> '<a href="url.php?url=' . $faq_url . '#faq\\1-\\2">FAQ \\1.\\2</a>',
|
||||
|
||||
// linking bugs
|
||||
'/bug\s*#?([0-9]{6,})/i'
|
||||
=> '<a href="url.php?url=https://sourceforge.net/support/tracker.php?aid=\\1">bug #\\1</a>',
|
||||
|
||||
// all other 6+ digit numbers are treated as bugs
|
||||
'/(?<!bug|RFE|patch) #?([0-9]{6,})/i'
|
||||
=> '<a href="url.php?url=' . $tracker_url . '">bug #\\1</a>',
|
||||
|
||||
// GitHub issues
|
||||
'/issue\s*#?([0-9]{4,5}) /i'
|
||||
=> '<a href="url.php?url=' . $github_url . 'issues/\\1">issue #\\1</a> ',
|
||||
|
||||
// transitioned SF.net project bug/rfe/patch links
|
||||
// by the time we reach 6-digit numbers, we can probably retire the above links
|
||||
'/patch\s*#?([0-9]{4,5}) /i'
|
||||
=> '<a href="url.php?url=' . $tracker_url_patch . '">patch #\\1</a> ',
|
||||
'/(?:rfe|feature)\s*#?([0-9]{4,5}) /i'
|
||||
=> '<a href="url.php?url=' . $tracker_url_rfe . '">RFE #\\1</a> ',
|
||||
'/bug\s*#?([0-9]{4,5}) /i'
|
||||
=> '<a href="url.php?url=' . $tracker_url_bug . '">bug #\\1</a> ',
|
||||
'/(?<!bug|RFE|patch) #?([0-9]{4,5}) /i'
|
||||
=> '<a href="url.php?url=' . $tracker_url_bug . '">bug #\\1</a> ',
|
||||
|
||||
// CVE/CAN entries
|
||||
'/((CAN|CVE)-[0-9]+-[0-9]+)/'
|
||||
=> '<a href="url.php?url=https://cve.mitre.org/cgi-bin/cvename.cgi?name=\\1">\\1</a>',
|
||||
|
||||
// PMASAentries
|
||||
'/(PMASA-[0-9]+-[0-9]+)/'
|
||||
=> '<a href="url.php?url=https://www.phpmyadmin.net/security/\\1/">\\1</a>',
|
||||
|
||||
// Highlight releases (with links)
|
||||
'/([0-9]+)\.([0-9]+)\.([0-9]+)\.0 (\([0-9-]+\))/'
|
||||
=> '<a name="\\1_\\2_\\3"></a>'
|
||||
. '<a href="url.php?url=' . $github_url . 'commits/RELEASE_\\1_\\2_\\3">'
|
||||
. '\\1.\\2.\\3.0 \\4</a>',
|
||||
'/([0-9]+)\.([0-9]+)\.([0-9]+)\.([1-9][0-9]*) (\([0-9-]+\))/'
|
||||
=> '<a name="\\1_\\2_\\3_\\4"></a>'
|
||||
. '<a href="url.php?url=' . $github_url . 'commits/RELEASE_\\1_\\2_\\3_\\4">'
|
||||
. '\\1.\\2.\\3.\\4 \\5</a>',
|
||||
|
||||
// Highlight releases (not linkable)
|
||||
'/( ### )(.*)/'
|
||||
=> '\\1<b>\\2</b>',
|
||||
|
||||
// Links target and rel
|
||||
'/a href="/' => 'a target="_blank" rel="noopener noreferrer" href="/'
|
||||
|
||||
);
|
||||
|
||||
header('Content-type: text/html; charset=utf-8');
|
||||
?>
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="en" dir="ltr">
|
||||
<head>
|
||||
<link rel="icon" href="favicon.ico" type="image/x-icon" />
|
||||
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />
|
||||
<title>phpMyAdmin - ChangeLog</title>
|
||||
<meta charset="utf-8" />
|
||||
</head>
|
||||
<body>
|
||||
<h1>phpMyAdmin - ChangeLog</h1>
|
||||
<?php
|
||||
echo '<pre>';
|
||||
echo preg_replace(array_keys($replaces), $replaces, $changelog);
|
||||
echo '</pre>';
|
||||
?>
|
||||
</body>
|
||||
</html>
|
@ -1,33 +0,0 @@
|
||||
<?php
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* Displays status of phpMyAdmin configuration storage
|
||||
*
|
||||
* @package PhpMyAdmin
|
||||
*/
|
||||
use PMA\libraries\Response;
|
||||
|
||||
require_once 'libraries/common.inc.php';
|
||||
|
||||
// If request for creating the pmadb
|
||||
if (isset($_REQUEST['create_pmadb'])) {
|
||||
if (PMA_createPMADatabase()) {
|
||||
PMA_fixPMATables('phpmyadmin');
|
||||
}
|
||||
}
|
||||
|
||||
// If request for creating all PMA tables.
|
||||
if (isset($_REQUEST['fixall_pmadb'])) {
|
||||
PMA_fixPMATables($GLOBALS['db']);
|
||||
}
|
||||
|
||||
$cfgRelation = PMA_getRelationsParam();
|
||||
// If request for creating missing PMA tables.
|
||||
if (isset($_REQUEST['fix_pmadb'])) {
|
||||
PMA_fixPMATables($cfgRelation['db']);
|
||||
}
|
||||
|
||||
$response = Response::getInstance();
|
||||
$response->addHTML(
|
||||
PMA_getRelationsParamDiagnostic($cfgRelation)
|
||||
);
|
@ -1,66 +0,0 @@
|
||||
{
|
||||
"name": "phpmyadmin/phpmyadmin",
|
||||
"type": "application",
|
||||
"description": "MySQL web administration tool",
|
||||
"keywords": ["phpmyadmin","mysql","web"],
|
||||
"homepage": "https://www.phpmyadmin.net/",
|
||||
"license": "GPL-2.0+",
|
||||
"authors": [
|
||||
{
|
||||
"name": "The phpMyAdmin Team",
|
||||
"email": "developers@phpmyadmin.net",
|
||||
"homepage": "https://www.phpmyadmin.net/team/"
|
||||
}
|
||||
],
|
||||
"support": {
|
||||
"forum": "https://www.phpmyadmin.net/support/",
|
||||
"issues": "https://github.com/phpmyadmin/phpmyadmin/issues",
|
||||
"wiki": "https://wiki.phpmyadmin.net/",
|
||||
"docs": "https://docs.phpmyadmin.net/",
|
||||
"source": "https://github.com/phpmyadmin/phpmyadmin"
|
||||
},
|
||||
"non-feature-branches": ["RELEASE_.*"],
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"PMA\\": "./"
|
||||
}
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.5.0",
|
||||
"ext-mbstring": "*",
|
||||
"ext-mysqli": "*",
|
||||
"ext-xml": "*",
|
||||
"ext-pcre": "*",
|
||||
"ext-json": "*",
|
||||
"phpmyadmin/sql-parser": "^4.1.2",
|
||||
"phpmyadmin/motranslator": "^3.0",
|
||||
"phpmyadmin/shapefile": "^2.0",
|
||||
"tecnickcom/tcpdf": "^6.2",
|
||||
"phpseclib/phpseclib": "^2.0",
|
||||
"google/recaptcha": "^1.1"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-openssl": "Cookie encryption",
|
||||
"ext-curl": "Updates checking",
|
||||
"ext-opcache": "Better performance",
|
||||
"ext-zlib": "For gz import and export",
|
||||
"ext-bz2": "For bzip2 import and export",
|
||||
"ext-zip": "For zip import and export",
|
||||
"ext-gd2": "For image transformations",
|
||||
"tecnickcom/tcpdf": "For PDF support"
|
||||
},
|
||||
"require-dev": {
|
||||
"satooshi/php-coveralls": "^1.0",
|
||||
"phpunit/phpunit": "~4.1",
|
||||
"codacy/coverage": "dev-master",
|
||||
"phpunit/phpunit-selenium": "~1.2",
|
||||
"squizlabs/php_codesniffer": "2.*",
|
||||
"phpmyadmin/coding-standard": ">=0.1.0"
|
||||
},
|
||||
"repositories": [
|
||||
{
|
||||
"type": "composer",
|
||||
"url": "https://www.phpmyadmin.net"
|
||||
}
|
||||
]
|
||||
}
|
2580
.devilbox/www/htdocs/vendor/phpmyadmin-4.7/composer.lock
generated
vendored
@ -1,154 +0,0 @@
|
||||
<?php
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* phpMyAdmin sample configuration, you can use it as base for
|
||||
* manual configuration. For easier setup you can use setup/
|
||||
*
|
||||
* All directives are explained in documentation in the doc/ folder
|
||||
* or at <https://docs.phpmyadmin.net/>.
|
||||
*
|
||||
* @package PhpMyAdmin
|
||||
*/
|
||||
|
||||
/**
|
||||
* This is needed for cookie based authentication to encrypt password in
|
||||
* cookie. Needs to be 32 chars long.
|
||||
*/
|
||||
$cfg['blowfish_secret'] = 'GObO60^(04#^5637%fdUGo(*6$%6#dy40)_hgD>mbX6$%got69FCjkfuDU%^8p_h'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
|
||||
|
||||
/**
|
||||
* Servers configuration
|
||||
*/
|
||||
$i = 0;
|
||||
|
||||
/**
|
||||
* First server
|
||||
*/
|
||||
$i++;
|
||||
/* Authentication type */
|
||||
$cfg['Servers'][$i]['auth_type'] = 'cookie';
|
||||
/* Server parameters */
|
||||
$cfg['Servers'][$i]['host'] = 'mysql';
|
||||
$cfg['Servers'][$i]['compress'] = false;
|
||||
$cfg['Servers'][$i]['AllowNoPassword'] = true;
|
||||
|
||||
/**
|
||||
* phpMyAdmin configuration storage settings.
|
||||
*/
|
||||
|
||||
/* User used to manipulate with storage */
|
||||
// $cfg['Servers'][$i]['controlhost'] = '';
|
||||
// $cfg['Servers'][$i]['controlport'] = '';
|
||||
// $cfg['Servers'][$i]['controluser'] = 'pma';
|
||||
// $cfg['Servers'][$i]['controlpass'] = 'pmapass';
|
||||
|
||||
/* Storage database and tables */
|
||||
// $cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
|
||||
// $cfg['Servers'][$i]['bookmarktable'] = 'pma__bookmark';
|
||||
// $cfg['Servers'][$i]['relation'] = 'pma__relation';
|
||||
// $cfg['Servers'][$i]['table_info'] = 'pma__table_info';
|
||||
// $cfg['Servers'][$i]['table_coords'] = 'pma__table_coords';
|
||||
// $cfg['Servers'][$i]['pdf_pages'] = 'pma__pdf_pages';
|
||||
// $cfg['Servers'][$i]['column_info'] = 'pma__column_info';
|
||||
// $cfg['Servers'][$i]['history'] = 'pma__history';
|
||||
// $cfg['Servers'][$i]['table_uiprefs'] = 'pma__table_uiprefs';
|
||||
// $cfg['Servers'][$i]['tracking'] = 'pma__tracking';
|
||||
// $cfg['Servers'][$i]['userconfig'] = 'pma__userconfig';
|
||||
// $cfg['Servers'][$i]['recent'] = 'pma__recent';
|
||||
// $cfg['Servers'][$i]['favorite'] = 'pma__favorite';
|
||||
// $cfg['Servers'][$i]['users'] = 'pma__users';
|
||||
// $cfg['Servers'][$i]['usergroups'] = 'pma__usergroups';
|
||||
// $cfg['Servers'][$i]['navigationhiding'] = 'pma__navigationhiding';
|
||||
// $cfg['Servers'][$i]['savedsearches'] = 'pma__savedsearches';
|
||||
// $cfg['Servers'][$i]['central_columns'] = 'pma__central_columns';
|
||||
// $cfg['Servers'][$i]['designer_settings'] = 'pma__designer_settings';
|
||||
// $cfg['Servers'][$i]['export_templates'] = 'pma__export_templates';
|
||||
|
||||
/**
|
||||
* End of servers configuration
|
||||
*/
|
||||
|
||||
/**
|
||||
* Directories for saving/loading files from server
|
||||
*/
|
||||
$cfg['UploadDir'] = '';
|
||||
$cfg['SaveDir'] = '';
|
||||
|
||||
/**
|
||||
* Whether to display icons or text or both icons and text in table row
|
||||
* action segment. Value can be either of 'icons', 'text' or 'both'.
|
||||
* default = 'both'
|
||||
*/
|
||||
//$cfg['RowActionType'] = 'icons';
|
||||
|
||||
/**
|
||||
* Defines whether a user should be displayed a "show all (records)"
|
||||
* button in browse mode or not.
|
||||
* default = false
|
||||
*/
|
||||
//$cfg['ShowAll'] = true;
|
||||
|
||||
/**
|
||||
* Number of rows displayed when browsing a result set. If the result
|
||||
* set contains more rows, "Previous" and "Next".
|
||||
* Possible values: 25, 50, 100, 250, 500
|
||||
* default = 25
|
||||
*/
|
||||
//$cfg['MaxRows'] = 50;
|
||||
|
||||
/**
|
||||
* Disallow editing of binary fields
|
||||
* valid values are:
|
||||
* false allow editing
|
||||
* 'blob' allow editing except for BLOB fields
|
||||
* 'noblob' disallow editing except for BLOB fields
|
||||
* 'all' disallow editing
|
||||
* default = 'blob'
|
||||
*/
|
||||
//$cfg['ProtectBinary'] = false;
|
||||
|
||||
/**
|
||||
* Default language to use, if not browser-defined or user-defined
|
||||
* (you find all languages in the locale folder)
|
||||
* uncomment the desired line:
|
||||
* default = 'en'
|
||||
*/
|
||||
//$cfg['DefaultLang'] = 'en';
|
||||
//$cfg['DefaultLang'] = 'de';
|
||||
|
||||
/**
|
||||
* How many columns should be used for table display of a database?
|
||||
* (a value larger than 1 results in some information being hidden)
|
||||
* default = 1
|
||||
*/
|
||||
//$cfg['PropertiesNumColumns'] = 2;
|
||||
|
||||
/**
|
||||
* Set to true if you want DB-based query history.If false, this utilizes
|
||||
* JS-routines to display query history (lost by window close)
|
||||
*
|
||||
* This requires configuration storage enabled, see above.
|
||||
* default = false
|
||||
*/
|
||||
//$cfg['QueryHistoryDB'] = true;
|
||||
|
||||
/**
|
||||
* When using DB-based query history, how many entries should be kept?
|
||||
* default = 25
|
||||
*/
|
||||
//$cfg['QueryHistoryMax'] = 100;
|
||||
|
||||
/**
|
||||
* Whether or not to query the user before sending the error report to
|
||||
* the phpMyAdmin team when a JavaScript error occurs
|
||||
*
|
||||
* Available options
|
||||
* ('ask' | 'always' | 'never')
|
||||
* default = 'ask'
|
||||
*/
|
||||
//$cfg['SendErrorReports'] = 'always';
|
||||
|
||||
/**
|
||||
* You can find more configuration options in the documentation
|
||||
* in the doc/ folder or at <https://docs.phpmyadmin.net/>.
|
||||
*/
|
@ -1,154 +0,0 @@
|
||||
<?php
|
||||
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* Central Columns view/edit
|
||||
*
|
||||
* @package PhpMyAdmin
|
||||
*/
|
||||
use PMA\libraries\URL;
|
||||
use PMA\libraries\Response;
|
||||
|
||||
/**
|
||||
* Gets some core libraries
|
||||
*/
|
||||
require_once 'libraries/common.inc.php';
|
||||
require_once 'libraries/central_columns.lib.php';
|
||||
|
||||
if (isset($_POST['edit_save']) || isset($_POST['add_new_column'])) {
|
||||
$col_name = $_POST['col_name'];
|
||||
if (isset($_POST['edit_save'])) {
|
||||
$orig_col_name = $_POST['orig_col_name'];
|
||||
}
|
||||
$col_default = $_POST['col_default'];
|
||||
if ($col_default == 'NONE' && $_POST['col_default_sel'] != 'USER_DEFINED') {
|
||||
$col_default = "";
|
||||
}
|
||||
$col_extra = isset($_POST['col_extra']) ? $_POST['col_extra'] : '';
|
||||
$col_isNull = isset($_POST['col_isNull'])?1:0;
|
||||
$col_length = $_POST['col_length'];
|
||||
$col_attribute = $_POST['col_attribute'];
|
||||
$col_type = $_POST['col_type'];
|
||||
$collation = $_POST['collation'];
|
||||
if (isset($orig_col_name) && $orig_col_name) {
|
||||
echo PMA_updateOneColumn(
|
||||
$db, $orig_col_name, $col_name, $col_type, $col_attribute,
|
||||
$col_length, $col_isNull, $collation, $col_extra, $col_default
|
||||
);
|
||||
exit;
|
||||
} else {
|
||||
$tmp_msg = PMA_updateOneColumn(
|
||||
$db, "", $col_name, $col_type, $col_attribute,
|
||||
$col_length, $col_isNull, $collation, $col_extra, $col_default
|
||||
);
|
||||
}
|
||||
}
|
||||
if (isset($_POST['populateColumns'])) {
|
||||
$selected_tbl = $_POST['selectedTable'];
|
||||
echo PMA_getHTMLforColumnDropdown($db, $selected_tbl);
|
||||
exit;
|
||||
}
|
||||
if (isset($_POST['getColumnList'])) {
|
||||
echo PMA_getCentralColumnsListRaw($db, $_POST['cur_table']);
|
||||
exit;
|
||||
}
|
||||
if (isset($_POST['add_column'])) {
|
||||
$selected_col = array();
|
||||
$selected_tbl = $_POST['table-select'];
|
||||
$selected_col[] = $_POST['column-select'];
|
||||
$tmp_msg = PMA_syncUniqueColumns($selected_col, false, $selected_tbl);
|
||||
}
|
||||
$response = Response::getInstance();
|
||||
$header = $response->getHeader();
|
||||
$scripts = $header->getScripts();
|
||||
$scripts->addFile('jquery/jquery.uitablefilter.js');
|
||||
$scripts->addFile('jquery/jquery.tablesorter.js');
|
||||
$scripts->addFile('db_central_columns.js');
|
||||
$cfgCentralColumns = PMA_centralColumnsGetParams();
|
||||
$pmadb = $cfgCentralColumns['db'];
|
||||
$pmatable = $cfgCentralColumns['table'];
|
||||
$max_rows = intval($GLOBALS['cfg']['MaxRows']);
|
||||
|
||||
if (isset($_REQUEST['edit_central_columns_page'])) {
|
||||
$selected_fld = $_REQUEST['selected_fld'];
|
||||
$selected_db = $_REQUEST['db'];
|
||||
$edit_central_column_page = PMA_getHTMLforEditingPage(
|
||||
$selected_fld, $selected_db
|
||||
);
|
||||
$response->addHTML($edit_central_column_page);
|
||||
exit;
|
||||
}
|
||||
if (isset($_POST['multi_edit_central_column_save'])) {
|
||||
$message = PMA_updateMultipleColumn();
|
||||
if (!is_bool($message)) {
|
||||
$response->setRequestStatus(false);
|
||||
$response->addJSON('message', $message);
|
||||
}
|
||||
}
|
||||
if (isset($_POST['delete_save'])) {
|
||||
$col_name = array();
|
||||
parse_str($_POST['col_name'], $col_name);
|
||||
$tmp_msg = PMA_deleteColumnsFromList($col_name['selected_fld'], false);
|
||||
}
|
||||
if (isset($_REQUEST['total_rows']) && $_REQUEST['total_rows']) {
|
||||
$total_rows = $_REQUEST['total_rows'];
|
||||
} else {
|
||||
$total_rows = PMA_getCentralColumnsCount($db);
|
||||
}
|
||||
if (PMA_isValid($_REQUEST['pos'], 'integer')) {
|
||||
$pos = intval($_REQUEST['pos']);
|
||||
} else {
|
||||
$pos = 0;
|
||||
}
|
||||
$addNewColumn = PMA_getHTMLforAddNewColumn($db, $total_rows);
|
||||
$response->addHTML($addNewColumn);
|
||||
if ($total_rows <= 0) {
|
||||
$response->addHTML(
|
||||
'<fieldset>' . __(
|
||||
'The central list of columns for the current database is empty.'
|
||||
) . '</fieldset>'
|
||||
);
|
||||
$columnAdd = PMA_getHTMLforAddCentralColumn($total_rows, $pos, $db);
|
||||
$response->addHTML($columnAdd);
|
||||
exit;
|
||||
}
|
||||
$table_navigation_html = PMA_getHTMLforTableNavigation($total_rows, $pos, $db);
|
||||
$response->addHTML($table_navigation_html);
|
||||
$columnAdd = PMA_getHTMLforAddCentralColumn($total_rows, $pos, $db);
|
||||
$response->addHTML($columnAdd);
|
||||
$deleteRowForm = '<form method="post" id="del_form" action="db_central_columns.php">'
|
||||
. URL::getHiddenInputs(
|
||||
$db
|
||||
)
|
||||
. '<input id="del_col_name" type="hidden" name="col_name" value="">'
|
||||
. '<input type="hidden" name="pos" value="' . $pos . '">'
|
||||
. '<input type="hidden" name="delete_save" value="delete"></form>';
|
||||
$response->addHTML($deleteRowForm);
|
||||
$table_struct = '<div id="tableslistcontainer">'
|
||||
. '<form name="tableslistcontainer">'
|
||||
. '<table id="table_columns" class="tablesorter" '
|
||||
. 'style="min-width:100%" class="data">';
|
||||
$response->addHTML($table_struct);
|
||||
$tableheader = PMA_getCentralColumnsTableHeader(
|
||||
'column_heading', __('Click to sort.'), 2
|
||||
);
|
||||
$response->addHTML($tableheader);
|
||||
$result = PMA_getColumnsList($db, $pos, $max_rows);
|
||||
$row_num = 0;
|
||||
foreach ($result as $row) {
|
||||
$tableHtmlRow = PMA_getHTMLforCentralColumnsTableRow(
|
||||
$row, $row_num, $db
|
||||
);
|
||||
$response->addHTML($tableHtmlRow);
|
||||
$row_num++;
|
||||
}
|
||||
$response->addHTML('</table>');
|
||||
$tablefooter = PMA_getCentralColumnsTableFooter($pmaThemeImage, $text_dir);
|
||||
$response->addHTML($tablefooter);
|
||||
$response->addHTML('</form></div>');
|
||||
$message = PMA\libraries\Message::success(
|
||||
sprintf(__('Showing rows %1$s - %2$s.'), ($pos + 1), ($pos + count($result)))
|
||||
);
|
||||
if (isset($tmp_msg) && $tmp_msg !== true) {
|
||||
$message = $tmp_msg;
|
||||
}
|
@ -1,191 +0,0 @@
|
||||
<?php
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* phpMyAdmin designer general code
|
||||
*
|
||||
* @package PhpMyAdmin-Designer
|
||||
*/
|
||||
use PMA\libraries\Response;
|
||||
|
||||
require_once 'libraries/common.inc.php';
|
||||
require_once 'libraries/pmd_common.php';
|
||||
require_once 'libraries/db_designer.lib.php';
|
||||
|
||||
$response = Response::getInstance();
|
||||
|
||||
if (isset($_REQUEST['dialog'])) {
|
||||
|
||||
if ($_REQUEST['dialog'] == 'edit') {
|
||||
$html = PMA_getHtmlForEditOrDeletePages($GLOBALS['db'], 'editPage');
|
||||
} else if ($_REQUEST['dialog'] == 'delete') {
|
||||
$html = PMA_getHtmlForEditOrDeletePages($GLOBALS['db'], 'deletePage');
|
||||
} else if ($_REQUEST['dialog'] == 'save_as') {
|
||||
$html = PMA_getHtmlForPageSaveAs($GLOBALS['db']);
|
||||
} else if ($_REQUEST['dialog'] == 'export') {
|
||||
include_once 'libraries/plugin_interface.lib.php';
|
||||
$html = PMA_getHtmlForSchemaExport(
|
||||
$GLOBALS['db'], $_REQUEST['selected_page']
|
||||
);
|
||||
}
|
||||
|
||||
if (! empty($html)) {
|
||||
$response->addHTML($html);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (isset($_REQUEST['operation'])) {
|
||||
|
||||
if ($_REQUEST['operation'] == 'deletePage') {
|
||||
$success = PMA_deletePage($_REQUEST['selected_page']);
|
||||
$response->setRequestStatus($success);
|
||||
} elseif ($_REQUEST['operation'] == 'savePage') {
|
||||
if ($_REQUEST['save_page'] == 'same') {
|
||||
$page = $_REQUEST['selected_page'];
|
||||
} else { // new
|
||||
$page = PMA_createNewPage($_REQUEST['selected_value'], $GLOBALS['db']);
|
||||
$response->addJSON('id', $page);
|
||||
}
|
||||
$success = PMA_saveTablePositions($page);
|
||||
$response->setRequestStatus($success);
|
||||
} elseif ($_REQUEST['operation'] == 'setDisplayField') {
|
||||
PMA_saveDisplayField(
|
||||
$_REQUEST['db'], $_REQUEST['table'], $_REQUEST['field']
|
||||
);
|
||||
$response->setRequestStatus(true);
|
||||
} elseif ($_REQUEST['operation'] == 'addNewRelation') {
|
||||
list($success, $message) = PMA_addNewRelation(
|
||||
$_REQUEST['db'],
|
||||
$_REQUEST['T1'],
|
||||
$_REQUEST['F1'],
|
||||
$_REQUEST['T2'],
|
||||
$_REQUEST['F2'],
|
||||
$_REQUEST['on_delete'],
|
||||
$_REQUEST['on_update']
|
||||
);
|
||||
$response->setRequestStatus($success);
|
||||
$response->addJSON('message', $message);
|
||||
} elseif ($_REQUEST['operation'] == 'removeRelation') {
|
||||
list($success, $message) = PMA_removeRelation(
|
||||
$_REQUEST['T1'],
|
||||
$_REQUEST['F1'],
|
||||
$_REQUEST['T2'],
|
||||
$_REQUEST['F2']
|
||||
);
|
||||
$response->setRequestStatus($success);
|
||||
$response->addJSON('message', $message);
|
||||
} elseif ($_REQUEST['operation'] == 'save_setting_value') {
|
||||
$success = PMA_saveDesignerSetting($_REQUEST['index'], $_REQUEST['value']);
|
||||
$response->setRequestStatus($success);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
require 'libraries/db_common.inc.php';
|
||||
|
||||
$script_display_field = PMA_getTablesInfo();
|
||||
$tab_column = PMA_getColumnsInfo();
|
||||
$script_tables = PMA_getScriptTabs();
|
||||
$tables_pk_or_unique_keys = PMA_getPKOrUniqueKeys();
|
||||
$tables_all_keys = PMA_getAllKeys();
|
||||
$classes_side_menu = PMA_returnClassNamesFromMenuButtons();
|
||||
|
||||
$display_page = -1;
|
||||
$selected_page = null;
|
||||
|
||||
if (isset($_REQUEST['query'])) {
|
||||
$display_page = PMA_getDefaultPage($_REQUEST['db']);
|
||||
} else {
|
||||
if (! empty($_REQUEST['page'])) {
|
||||
$display_page = $_REQUEST['page'];
|
||||
} else {
|
||||
$display_page = PMA_getLoadingPage($_REQUEST['db']);
|
||||
}
|
||||
}
|
||||
if ($display_page != -1) {
|
||||
$selected_page = PMA_getPageName($display_page);
|
||||
}
|
||||
$tab_pos = PMA_getTablePositions($display_page);
|
||||
$script_contr = PMA_getScriptContr();
|
||||
|
||||
$params = array('lang' => $GLOBALS['lang']);
|
||||
if (isset($_GET['db'])) {
|
||||
$params['db'] = $_GET['db'];
|
||||
}
|
||||
|
||||
$response = Response::getInstance();
|
||||
$response->getFooter()->setMinimal();
|
||||
$header = $response->getHeader();
|
||||
$header->setBodyId('pmd_body');
|
||||
|
||||
$scripts = $header->getScripts();
|
||||
$scripts->addFile('jquery/jquery.fullscreen.js');
|
||||
$scripts->addFile('pmd/designer_db.js');
|
||||
$scripts->addFile('pmd/designer_objects.js');
|
||||
$scripts->addFile('pmd/designer_page.js');
|
||||
$scripts->addFile('pmd/history.js');
|
||||
$scripts->addFile('pmd/move.js');
|
||||
$scripts->addFile('pmd/init.js');
|
||||
|
||||
list(
|
||||
$tables,
|
||||
$num_tables,
|
||||
$total_num_tables,
|
||||
$sub_part,
|
||||
$is_show_stats,
|
||||
$db_is_system_schema,
|
||||
$tooltip_truename,
|
||||
$tooltip_aliasname,
|
||||
$pos
|
||||
) = PMA\libraries\Util::getDbInfo($db, isset($sub_part) ? $sub_part : '');
|
||||
|
||||
// Embed some data into HTML, later it will be read
|
||||
// by pmd/init.js and converted to JS variables.
|
||||
$response->addHTML(
|
||||
PMA_getHtmlForJSFields(
|
||||
$script_tables, $script_contr, $script_display_field, $display_page
|
||||
)
|
||||
);
|
||||
$response->addHTML(
|
||||
PMA_getDesignerPageMenu(
|
||||
isset($_REQUEST['query']),
|
||||
$selected_page,
|
||||
$classes_side_menu
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
|
||||
$response->addHTML('<div id="canvas_outer">');
|
||||
$response->addHTML(
|
||||
'<form action="" id="container-form" method="post" name="form1">'
|
||||
);
|
||||
|
||||
$response->addHTML(PMA_getHTMLCanvas());
|
||||
$response->addHTML(PMA_getHTMLTableList($tab_pos, $display_page));
|
||||
|
||||
$response->addHTML(
|
||||
PMA_getDatabaseTables(
|
||||
$tab_pos, $display_page, $tab_column,
|
||||
$tables_all_keys, $tables_pk_or_unique_keys
|
||||
)
|
||||
);
|
||||
$response->addHTML('</form>');
|
||||
$response->addHTML('</div>'); // end canvas_outer
|
||||
|
||||
$response->addHTML('<div id="pmd_hint"></div>');
|
||||
|
||||
$response->addHTML(PMA_getNewRelationPanel());
|
||||
$response->addHTML(PMA_getDeleteRelationPanel());
|
||||
|
||||
if (isset($_REQUEST['query'])) {
|
||||
$response->addHTML(PMA_getOptionsPanel());
|
||||
$response->addHTML(PMA_getRenameToPanel());
|
||||
$response->addHTML(PMA_getHavingQueryPanel());
|
||||
$response->addHTML(PMA_getAggregateQueryPanel());
|
||||
$response->addHTML(PMA_getWhereQueryPanel());
|
||||
$response->addHTML(PMA_getQueryDetails());
|
||||
}
|
||||
|
||||
$response->addHTML('<div id="PMA_disable_floating_menubar"></div>');
|
@ -1,156 +0,0 @@
|
||||
<?php
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* dumps a database
|
||||
*
|
||||
* @package PhpMyAdmin
|
||||
*/
|
||||
use PMA\libraries\config\PageSettings;
|
||||
use PMA\libraries\Response;
|
||||
|
||||
/**
|
||||
* Gets some core libraries
|
||||
*/
|
||||
require_once 'libraries/common.inc.php';
|
||||
require_once 'libraries/config/user_preferences.forms.php';
|
||||
require_once 'libraries/config/page_settings.forms.php';
|
||||
require_once 'libraries/export.lib.php';
|
||||
|
||||
PageSettings::showGroup('Export');
|
||||
|
||||
$response = Response::getInstance();
|
||||
$header = $response->getHeader();
|
||||
$scripts = $header->getScripts();
|
||||
$scripts->addFile('export.js');
|
||||
|
||||
// $sub_part is used in PMA\libraries\Util::getDbInfo() to see if we are coming from
|
||||
// db_export.php, in which case we don't obey $cfg['MaxTableList']
|
||||
$sub_part = '_export';
|
||||
require_once 'libraries/db_common.inc.php';
|
||||
$url_query .= '&goto=db_export.php';
|
||||
|
||||
list(
|
||||
$tables,
|
||||
$num_tables,
|
||||
$total_num_tables,
|
||||
$sub_part,
|
||||
$is_show_stats,
|
||||
$db_is_system_schema,
|
||||
$tooltip_truename,
|
||||
$tooltip_aliasname,
|
||||
$pos
|
||||
) = PMA\libraries\Util::getDbInfo($db, isset($sub_part) ? $sub_part : '');
|
||||
|
||||
/**
|
||||
* Displays the form
|
||||
*/
|
||||
$export_page_title = __('View dump (schema) of database');
|
||||
|
||||
// exit if no tables in db found
|
||||
if ($num_tables < 1) {
|
||||
PMA\libraries\Message::error(__('No tables found in database.'))->display();
|
||||
exit;
|
||||
} // end if
|
||||
|
||||
$multi_values = '<div class="export_table_list_container">';
|
||||
if (isset($_GET['structure_or_data_forced'])) {
|
||||
$force_val = htmlspecialchars($_GET['structure_or_data_forced']);
|
||||
} else {
|
||||
$force_val = 0;
|
||||
}
|
||||
$multi_values .= '<input type="hidden" name="structure_or_data_forced" value="'
|
||||
. $force_val . '">';
|
||||
$multi_values .= '<table class="export_table_select">'
|
||||
. '<thead><tr><th></th>'
|
||||
. '<th>' . __('Tables') . '</th>'
|
||||
. '<th class="export_structure">' . __('Structure') . '</th>'
|
||||
. '<th class="export_data">' . __('Data') . '</th>'
|
||||
. '</tr><tr>'
|
||||
. '<td></td>'
|
||||
. '<td class="export_table_name all">' . __('Select all') . '</td>'
|
||||
. '<td class="export_structure all">'
|
||||
. '<input type="checkbox" id="table_structure_all" /></td>'
|
||||
. '<td class="export_data all"><input type="checkbox" id="table_data_all" />'
|
||||
. '</td>'
|
||||
. '</tr></thead>'
|
||||
. '<tbody>';
|
||||
$multi_values .= "\n";
|
||||
|
||||
// when called by libraries/mult_submits.inc.php
|
||||
if (!empty($_POST['selected_tbl']) && empty($table_select)) {
|
||||
$table_select = $_POST['selected_tbl'];
|
||||
}
|
||||
|
||||
// Check if the selected tables are defined in $_GET
|
||||
// (from clicking Back button on export.php)
|
||||
foreach (array('table_select', 'table_structure', 'table_data') as $one_key) {
|
||||
if (isset($_GET[$one_key])) {
|
||||
$_GET[$one_key] = urldecode($_GET[$one_key]);
|
||||
$_GET[$one_key] = explode(",", $_GET[$one_key]);
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($tables as $each_table) {
|
||||
if (isset($_GET['table_select']) && is_array($_GET['table_select'])) {
|
||||
$is_checked = PMA_getCheckedClause(
|
||||
$each_table['Name'], $_GET['table_select']
|
||||
);
|
||||
} elseif (isset($table_select)) {
|
||||
$is_checked = PMA_getCheckedClause(
|
||||
$each_table['Name'], $table_select
|
||||
);
|
||||
} else {
|
||||
$is_checked = ' checked="checked"';
|
||||
}
|
||||
if (isset($_GET['table_structure']) && is_array($_GET['table_structure'])) {
|
||||
$structure_checked = PMA_getCheckedClause(
|
||||
$each_table['Name'], $_GET['table_structure']
|
||||
);
|
||||
} else {
|
||||
$structure_checked = $is_checked;
|
||||
}
|
||||
if (isset($_GET['table_data']) && is_array($_GET['table_data'])) {
|
||||
$data_checked = PMA_getCheckedClause(
|
||||
$each_table['Name'], $_GET['table_data']
|
||||
);
|
||||
} else {
|
||||
$data_checked = $is_checked;
|
||||
}
|
||||
$table_html = htmlspecialchars($each_table['Name']);
|
||||
$multi_values .= '<tr class="marked">';
|
||||
$multi_values .= '<td><input type="checkbox" name="table_select[]"'
|
||||
. ' value="' . $table_html . '"' . $is_checked . ' class="checkall"/></td>';
|
||||
$multi_values .= '<td class="export_table_name">'
|
||||
. str_replace(' ', ' ', $table_html) . '</td>';
|
||||
$multi_values .= '<td class="export_structure">'
|
||||
. '<input type="checkbox" name="table_structure[]"'
|
||||
. ' value="' . $table_html . '"' . $structure_checked . ' /></td>';
|
||||
$multi_values .= '<td class="export_data">'
|
||||
. '<input type="checkbox" name="table_data[]"'
|
||||
. ' value="' . $table_html . '"' . $data_checked . ' /></td>';
|
||||
$multi_values .= '</tr>';
|
||||
} // end for
|
||||
|
||||
$multi_values .= "\n";
|
||||
$multi_values .= '</tbody></table></div>';
|
||||
|
||||
require_once 'libraries/display_export.lib.php';
|
||||
if (! isset($sql_query)) {
|
||||
$sql_query = '';
|
||||
}
|
||||
if (! isset($num_tables)) {
|
||||
$num_tables = 0;
|
||||
}
|
||||
if (! isset($unlim_num_rows)) {
|
||||
$unlim_num_rows = 0;
|
||||
}
|
||||
if (! isset($multi_values)) {
|
||||
$multi_values = '';
|
||||
}
|
||||
$response = Response::getInstance();
|
||||
$response->addHTML(
|
||||
PMA_getExportDisplay(
|
||||
'database', $db, $table, $sql_query, $num_tables,
|
||||
$unlim_num_rows, $multi_values
|
||||
)
|
||||
);
|
@ -1,46 +0,0 @@
|
||||
<?php
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* Database import page
|
||||
*
|
||||
* @package PhpMyAdmin
|
||||
*/
|
||||
|
||||
use PMA\libraries\Response;
|
||||
use PMA\libraries\config\PageSettings;
|
||||
|
||||
require_once 'libraries/common.inc.php';
|
||||
require_once 'libraries/config/user_preferences.forms.php';
|
||||
require_once 'libraries/config/page_settings.forms.php';
|
||||
|
||||
PageSettings::showGroup('Import');
|
||||
|
||||
$response = Response::getInstance();
|
||||
$header = $response->getHeader();
|
||||
$scripts = $header->getScripts();
|
||||
$scripts->addFile('import.js');
|
||||
|
||||
/**
|
||||
* Gets tables information and displays top links
|
||||
*/
|
||||
require 'libraries/db_common.inc.php';
|
||||
|
||||
list(
|
||||
$tables,
|
||||
$num_tables,
|
||||
$total_num_tables,
|
||||
$sub_part,
|
||||
$is_show_stats,
|
||||
$db_is_system_schema,
|
||||
$tooltip_truename,
|
||||
$tooltip_aliasname,
|
||||
$pos
|
||||
) = PMA\libraries\Util::getDbInfo($db, isset($sub_part) ? $sub_part : '');
|
||||
|
||||
require 'libraries/display_import.lib.php';
|
||||
$response = Response::getInstance();
|
||||
$response->addHTML(
|
||||
PMA_getImportDisplay(
|
||||
'database', $db, $table, $max_upload_size
|
||||
)
|
||||
);
|
@ -1,308 +0,0 @@
|
||||
<?php
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* handles miscellaneous db operations:
|
||||
* - move/rename
|
||||
* - copy
|
||||
* - changing collation
|
||||
* - changing comment
|
||||
* - adding tables
|
||||
* - viewing PDF schemas
|
||||
*
|
||||
* @package PhpMyAdmin
|
||||
*/
|
||||
use PMA\libraries\Response;
|
||||
use PMA\libraries\plugins\export\ExportSql;
|
||||
|
||||
/**
|
||||
* requirements
|
||||
*/
|
||||
require_once 'libraries/common.inc.php';
|
||||
require_once 'libraries/display_create_table.lib.php';
|
||||
|
||||
/**
|
||||
* functions implementation for this script
|
||||
*/
|
||||
require_once 'libraries/check_user_privileges.lib.php';
|
||||
require_once 'libraries/operations.lib.php';
|
||||
|
||||
// add a javascript file for jQuery functions to handle Ajax actions
|
||||
$response = Response::getInstance();
|
||||
$header = $response->getHeader();
|
||||
$scripts = $header->getScripts();
|
||||
$scripts->addFile('db_operations.js');
|
||||
|
||||
$sql_query = '';
|
||||
|
||||
/**
|
||||
* Rename/move or copy database
|
||||
*/
|
||||
if (strlen($GLOBALS['db']) > 0
|
||||
&& (! empty($_REQUEST['db_rename']) || ! empty($_REQUEST['db_copy']))
|
||||
) {
|
||||
if (! empty($_REQUEST['db_rename'])) {
|
||||
$move = true;
|
||||
} else {
|
||||
$move = false;
|
||||
}
|
||||
|
||||
if (! isset($_REQUEST['newname']) || strlen($_REQUEST['newname']) === 0) {
|
||||
$message = PMA\libraries\Message::error(__('The database name is empty!'));
|
||||
} else {
|
||||
$_error = false;
|
||||
if ($move || ! empty($_REQUEST['create_database_before_copying'])) {
|
||||
PMA_createDbBeforeCopy();
|
||||
}
|
||||
|
||||
// here I don't use DELIMITER because it's not part of the
|
||||
// language; I have to send each statement one by one
|
||||
|
||||
// to avoid selecting alternatively the current and new db
|
||||
// we would need to modify the CREATE definitions to qualify
|
||||
// the db name
|
||||
PMA_runProcedureAndFunctionDefinitions($GLOBALS['db']);
|
||||
|
||||
// go back to current db, just in case
|
||||
$GLOBALS['dbi']->selectDb($GLOBALS['db']);
|
||||
|
||||
$tables_full = $GLOBALS['dbi']->getTablesFull($GLOBALS['db']);
|
||||
|
||||
include_once "libraries/plugin_interface.lib.php";
|
||||
// remove all foreign key constraints, otherwise we can get errors
|
||||
/* @var $export_sql_plugin ExportSql */
|
||||
$export_sql_plugin = PMA_getPlugin(
|
||||
"export",
|
||||
"sql",
|
||||
'libraries/plugins/export/',
|
||||
array(
|
||||
'single_table' => isset($single_table),
|
||||
'export_type' => 'database'
|
||||
)
|
||||
);
|
||||
|
||||
// create stand-in tables for views
|
||||
$views = PMA_getViewsAndCreateSqlViewStandIn(
|
||||
$tables_full, $export_sql_plugin, $GLOBALS['db']
|
||||
);
|
||||
|
||||
// copy tables
|
||||
$sqlConstratints = PMA_copyTables(
|
||||
$tables_full, $move, $GLOBALS['db']
|
||||
);
|
||||
|
||||
// handle the views
|
||||
if (! $_error) {
|
||||
PMA_handleTheViews($views, $move, $GLOBALS['db']);
|
||||
}
|
||||
unset($views);
|
||||
|
||||
// now that all tables exist, create all the accumulated constraints
|
||||
if (! $_error && count($sqlConstratints) > 0) {
|
||||
PMA_createAllAccumulatedConstraints($sqlConstratints);
|
||||
}
|
||||
unset($sqlConstratints);
|
||||
|
||||
if (PMA_MYSQL_INT_VERSION >= 50100) {
|
||||
// here DELIMITER is not used because it's not part of the
|
||||
// language; each statement is sent one by one
|
||||
|
||||
PMA_runEventDefinitionsForDb($GLOBALS['db']);
|
||||
}
|
||||
|
||||
// go back to current db, just in case
|
||||
$GLOBALS['dbi']->selectDb($GLOBALS['db']);
|
||||
|
||||
// Duplicate the bookmarks for this db (done once for each db)
|
||||
PMA_duplicateBookmarks($_error, $GLOBALS['db']);
|
||||
|
||||
if (! $_error && $move) {
|
||||
if (isset($_REQUEST['adjust_privileges'])
|
||||
&& ! empty($_REQUEST['adjust_privileges'])
|
||||
) {
|
||||
PMA_AdjustPrivileges_moveDB($GLOBALS['db'], $_REQUEST['newname']);
|
||||
}
|
||||
|
||||
/**
|
||||
* cleanup pmadb stuff for this db
|
||||
*/
|
||||
include_once 'libraries/relation_cleanup.lib.php';
|
||||
PMA_relationsCleanupDatabase($GLOBALS['db']);
|
||||
|
||||
// if someday the RENAME DATABASE reappears, do not DROP
|
||||
$local_query = 'DROP DATABASE '
|
||||
. PMA\libraries\Util::backquote($GLOBALS['db']) . ';';
|
||||
$sql_query .= "\n" . $local_query;
|
||||
$GLOBALS['dbi']->query($local_query);
|
||||
|
||||
$message = PMA\libraries\Message::success(
|
||||
__('Database %1$s has been renamed to %2$s.')
|
||||
);
|
||||
$message->addParam($GLOBALS['db']);
|
||||
$message->addParam($_REQUEST['newname']);
|
||||
} elseif (! $_error) {
|
||||
if (isset($_REQUEST['adjust_privileges'])
|
||||
&& ! empty($_REQUEST['adjust_privileges'])
|
||||
) {
|
||||
PMA_AdjustPrivileges_copyDB($GLOBALS['db'], $_REQUEST['newname']);
|
||||
}
|
||||
|
||||
$message = PMA\libraries\Message::success(
|
||||
__('Database %1$s has been copied to %2$s.')
|
||||
);
|
||||
$message->addParam($GLOBALS['db']);
|
||||
$message->addParam($_REQUEST['newname']);
|
||||
} else {
|
||||
$message = PMA\libraries\Message::error();
|
||||
}
|
||||
$reload = true;
|
||||
|
||||
/* Change database to be used */
|
||||
if (! $_error && $move) {
|
||||
$GLOBALS['db'] = $_REQUEST['newname'];
|
||||
} elseif (! $_error) {
|
||||
if (isset($_REQUEST['switch_to_new'])
|
||||
&& $_REQUEST['switch_to_new'] == 'true'
|
||||
) {
|
||||
$GLOBALS['PMA_Config']->setCookie('pma_switch_to_new', 'true');
|
||||
$GLOBALS['db'] = $_REQUEST['newname'];
|
||||
} else {
|
||||
$GLOBALS['PMA_Config']->setCookie('pma_switch_to_new', '');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Database has been successfully renamed/moved. If in an Ajax request,
|
||||
* generate the output with {@link PMA\libraries\Response} and exit
|
||||
*/
|
||||
if ($response->isAjax()) {
|
||||
$response->setRequestStatus($message->isSuccess());
|
||||
$response->addJSON('message', $message);
|
||||
$response->addJSON('newname', $_REQUEST['newname']);
|
||||
$response->addJSON(
|
||||
'sql_query',
|
||||
PMA\libraries\Util::getMessage(null, $sql_query)
|
||||
);
|
||||
$response->addJSON('db', $GLOBALS['db']);
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Settings for relations stuff
|
||||
*/
|
||||
|
||||
$cfgRelation = PMA_getRelationsParam();
|
||||
|
||||
/**
|
||||
* Check if comments were updated
|
||||
* (must be done before displaying the menu tabs)
|
||||
*/
|
||||
if (isset($_REQUEST['comment'])) {
|
||||
PMA_setDbComment($GLOBALS['db'], $_REQUEST['comment']);
|
||||
}
|
||||
|
||||
require 'libraries/db_common.inc.php';
|
||||
$url_query .= '&goto=db_operations.php';
|
||||
|
||||
// Gets the database structure
|
||||
$sub_part = '_structure';
|
||||
|
||||
list(
|
||||
$tables,
|
||||
$num_tables,
|
||||
$total_num_tables,
|
||||
$sub_part,
|
||||
$is_show_stats,
|
||||
$db_is_system_schema,
|
||||
$tooltip_truename,
|
||||
$tooltip_aliasname,
|
||||
$pos
|
||||
) = PMA\libraries\Util::getDbInfo($db, isset($sub_part) ? $sub_part : '');
|
||||
|
||||
echo "\n";
|
||||
|
||||
if (isset($message)) {
|
||||
echo PMA\libraries\Util::getMessage($message, $sql_query);
|
||||
unset($message);
|
||||
}
|
||||
|
||||
$_REQUEST['db_collation'] = $GLOBALS['dbi']->getDbCollation($GLOBALS['db']);
|
||||
$is_information_schema = $GLOBALS['dbi']->isSystemSchema($GLOBALS['db']);
|
||||
|
||||
$response->addHTML('<div id="boxContainer" data-box-width="300">');
|
||||
|
||||
if (!$is_information_schema) {
|
||||
if ($cfgRelation['commwork']) {
|
||||
/**
|
||||
* database comment
|
||||
*/
|
||||
$response->addHTML(PMA_getHtmlForDatabaseComment($GLOBALS['db']));
|
||||
}
|
||||
|
||||
$response->addHTML('<div class="operations_half_width">');
|
||||
$response->addHTML(PMA_getHtmlForCreateTable($db));
|
||||
$response->addHTML('</div>');
|
||||
|
||||
/**
|
||||
* rename database
|
||||
*/
|
||||
if ($GLOBALS['db'] != 'mysql') {
|
||||
$response->addHTML(PMA_getHtmlForRenameDatabase($GLOBALS['db']));
|
||||
}
|
||||
|
||||
// Drop link if allowed
|
||||
// Don't even try to drop information_schema.
|
||||
// You won't be able to. Believe me. You won't.
|
||||
// Don't allow to easily drop mysql database, RFE #1327514.
|
||||
if (($is_superuser || $GLOBALS['cfg']['AllowUserDropDatabase'])
|
||||
&& ! $db_is_system_schema
|
||||
&& $GLOBALS['db'] != 'mysql'
|
||||
) {
|
||||
$response->addHTML(PMA_getHtmlForDropDatabaseLink($GLOBALS['db']));
|
||||
}
|
||||
/**
|
||||
* Copy database
|
||||
*/
|
||||
$response->addHTML(PMA_getHtmlForCopyDatabase($GLOBALS['db']));
|
||||
|
||||
/**
|
||||
* Change database charset
|
||||
*/
|
||||
$response->addHTML(PMA_getHtmlForChangeDatabaseCharset($GLOBALS['db'], $table));
|
||||
|
||||
if (! $cfgRelation['allworks']
|
||||
&& $cfg['PmaNoRelation_DisableWarning'] == false
|
||||
) {
|
||||
$message = PMA\libraries\Message::notice(
|
||||
__(
|
||||
'The phpMyAdmin configuration storage has been deactivated. ' .
|
||||
'%sFind out why%s.'
|
||||
)
|
||||
);
|
||||
$message->addParamHtml('<a href="./chk_rel.php' . $url_query . '">');
|
||||
$message->addParamHtml('</a>');
|
||||
/* Show error if user has configured something, notice elsewhere */
|
||||
if (!empty($cfg['Servers'][$server]['pmadb'])) {
|
||||
$message->isError(true);
|
||||
}
|
||||
} // end if
|
||||
} // end if (!$is_information_schema)
|
||||
|
||||
$response->addHTML('</div>');
|
||||
|
||||
// not sure about displaying the PDF dialog in case db is information_schema
|
||||
if ($cfgRelation['pdfwork'] && $num_tables > 0) {
|
||||
// We only show this if we find something in the new pdf_pages table
|
||||
$test_query = '
|
||||
SELECT *
|
||||
FROM ' . PMA\libraries\Util::backquote($GLOBALS['cfgRelation']['db'])
|
||||
. '.' . PMA\libraries\Util::backquote($cfgRelation['pdf_pages']) . '
|
||||
WHERE db_name = \'' . $GLOBALS['dbi']->escapeString($GLOBALS['db'])
|
||||
. '\'';
|
||||
$test_rs = PMA_queryAsControlUser(
|
||||
$test_query,
|
||||
false,
|
||||
PMA\libraries\DatabaseInterface::QUERY_STORE
|
||||
);
|
||||
} // end if
|
@ -1,154 +0,0 @@
|
||||
<?php
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* query by example the whole database
|
||||
*
|
||||
* @package PhpMyAdmin
|
||||
*/
|
||||
use PMA\libraries\SavedSearches;
|
||||
use PMA\libraries\URL;
|
||||
use PMA\libraries\Response;
|
||||
|
||||
/**
|
||||
* requirements
|
||||
*/
|
||||
require_once 'libraries/common.inc.php';
|
||||
require_once 'libraries/sql.lib.php';
|
||||
|
||||
$response = Response::getInstance();
|
||||
|
||||
// Gets the relation settings
|
||||
$cfgRelation = PMA_getRelationsParam();
|
||||
|
||||
$savedSearchList = array();
|
||||
$savedSearch = null;
|
||||
$currentSearchId = null;
|
||||
if ($cfgRelation['savedsearcheswork']) {
|
||||
$header = $response->getHeader();
|
||||
$scripts = $header->getScripts();
|
||||
$scripts->addFile('db_qbe.js');
|
||||
|
||||
//Get saved search list.
|
||||
$savedSearch = new SavedSearches($GLOBALS);
|
||||
$savedSearch->setUsername($GLOBALS['cfg']['Server']['user'])
|
||||
->setDbname($_REQUEST['db']);
|
||||
|
||||
if (!empty($_REQUEST['searchId'])) {
|
||||
$savedSearch->setId($_REQUEST['searchId']);
|
||||
}
|
||||
|
||||
//Action field is sent.
|
||||
if (isset($_REQUEST['action'])) {
|
||||
$savedSearch->setSearchName($_REQUEST['searchName']);
|
||||
if ('create' === $_REQUEST['action']) {
|
||||
$saveResult = $savedSearch->setId(null)
|
||||
->setCriterias($_REQUEST)
|
||||
->save();
|
||||
} elseif ('update' === $_REQUEST['action']) {
|
||||
$saveResult = $savedSearch->setCriterias($_REQUEST)
|
||||
->save();
|
||||
} elseif ('delete' === $_REQUEST['action']) {
|
||||
$deleteResult = $savedSearch->delete();
|
||||
//After deletion, reset search.
|
||||
$savedSearch = new SavedSearches($GLOBALS);
|
||||
$savedSearch->setUsername($GLOBALS['cfg']['Server']['user'])
|
||||
->setDbname($_REQUEST['db']);
|
||||
$_REQUEST = array();
|
||||
} elseif ('load' === $_REQUEST['action']) {
|
||||
if (empty($_REQUEST['searchId'])) {
|
||||
//when not loading a search, reset the object.
|
||||
$savedSearch = new SavedSearches($GLOBALS);
|
||||
$savedSearch->setUsername($GLOBALS['cfg']['Server']['user'])
|
||||
->setDbname($_REQUEST['db']);
|
||||
$_REQUEST = array();
|
||||
} else {
|
||||
$loadResult = $savedSearch->load();
|
||||
}
|
||||
}
|
||||
//Else, it's an "update query"
|
||||
}
|
||||
|
||||
$savedSearchList = $savedSearch->getList();
|
||||
$currentSearchId = $savedSearch->getId();
|
||||
}
|
||||
|
||||
/**
|
||||
* A query has been submitted -> (maybe) execute it
|
||||
*/
|
||||
$message_to_display = false;
|
||||
if (isset($_REQUEST['submit_sql']) && ! empty($sql_query)) {
|
||||
if (! preg_match('@^SELECT@i', $sql_query)) {
|
||||
$message_to_display = true;
|
||||
} else {
|
||||
$goto = 'db_sql.php';
|
||||
PMA_executeQueryAndSendQueryResponse(
|
||||
null, // analyzed_sql_results
|
||||
false, // is_gotofile
|
||||
$_REQUEST['db'], // db
|
||||
null, // table
|
||||
false, // find_real_end
|
||||
null, // sql_query_for_bookmark
|
||||
null, // extra_data
|
||||
null, // message_to_show
|
||||
null, // message
|
||||
null, // sql_data
|
||||
$goto, // goto
|
||||
$pmaThemeImage, // pmaThemeImage
|
||||
null, // disp_query
|
||||
null, // disp_message
|
||||
null, // query_type
|
||||
$sql_query, // sql_query
|
||||
null, // selectedTables
|
||||
null // complete_query
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$sub_part = '_qbe';
|
||||
require 'libraries/db_common.inc.php';
|
||||
$url_query .= '&goto=db_qbe.php';
|
||||
$url_params['goto'] = 'db_qbe.php';
|
||||
|
||||
list(
|
||||
$tables,
|
||||
$num_tables,
|
||||
$total_num_tables,
|
||||
$sub_part,
|
||||
$is_show_stats,
|
||||
$db_is_system_schema,
|
||||
$tooltip_truename,
|
||||
$tooltip_aliasname,
|
||||
$pos
|
||||
) = PMA\libraries\Util::getDbInfo($db, isset($sub_part) ? $sub_part : '');
|
||||
|
||||
if ($message_to_display) {
|
||||
PMA\libraries\Message::error(
|
||||
__('You have to choose at least one column to display!')
|
||||
)
|
||||
->display();
|
||||
}
|
||||
unset($message_to_display);
|
||||
|
||||
// create new qbe search instance
|
||||
$db_qbe = new PMA\libraries\DbQbe($GLOBALS['db'], $savedSearchList, $savedSearch);
|
||||
|
||||
$url = 'db_designer.php' . URL::getCommon(
|
||||
array_merge(
|
||||
$url_params,
|
||||
array('query' => 1)
|
||||
)
|
||||
);
|
||||
$response->addHTML(
|
||||
PMA\libraries\Message::notice(
|
||||
sprintf(
|
||||
__('Switch to %svisual builder%s'),
|
||||
'<a href="' . $url . '">',
|
||||
'</a>'
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
/**
|
||||
* Displays the Query by example form
|
||||
*/
|
||||
$response->addHTML($db_qbe->getSelectionForm());
|
@ -1,24 +0,0 @@
|
||||
<?php
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* Routines management.
|
||||
*
|
||||
* @package PhpMyAdmin
|
||||
*/
|
||||
|
||||
/**
|
||||
* Include required files
|
||||
*/
|
||||
require_once 'libraries/common.inc.php';
|
||||
|
||||
/**
|
||||
* Include all other files
|
||||
*/
|
||||
require_once 'libraries/check_user_privileges.lib.php';
|
||||
require_once 'libraries/rte/rte_routines.lib.php';
|
||||
|
||||
/**
|
||||
* Do the magic
|
||||
*/
|
||||
$_PMA_RTE = 'RTN';
|
||||
require_once 'libraries/rte/rte_main.inc.php';
|
@ -1,48 +0,0 @@
|
||||
<?php
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* Database SQL executor
|
||||
*
|
||||
* @package PhpMyAdmin
|
||||
*/
|
||||
use PMA\libraries\config\PageSettings;
|
||||
use PMA\libraries\Response;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
require_once 'libraries/common.inc.php';
|
||||
require_once 'libraries/config/user_preferences.forms.php';
|
||||
require_once 'libraries/config/page_settings.forms.php';
|
||||
|
||||
PageSettings::showGroup('Sql_queries');
|
||||
|
||||
/**
|
||||
* Runs common work
|
||||
*/
|
||||
$response = Response::getInstance();
|
||||
$header = $response->getHeader();
|
||||
$scripts = $header->getScripts();
|
||||
$scripts->addFile('makegrid.js');
|
||||
$scripts->addFile('jquery/jquery.uitablefilter.js');
|
||||
$scripts->addFile('sql.js');
|
||||
|
||||
require 'libraries/db_common.inc.php';
|
||||
require_once 'libraries/sql_query_form.lib.php';
|
||||
|
||||
// After a syntax error, we return to this script
|
||||
// with the typed query in the textarea.
|
||||
$goto = 'db_sql.php';
|
||||
$back = 'db_sql.php';
|
||||
|
||||
/**
|
||||
* Query box, bookmark, insert data from textfile
|
||||
*/
|
||||
$response->addHTML(
|
||||
PMA_getHtmlForSqlQueryForm(
|
||||
true, false,
|
||||
isset($_REQUEST['delimiter'])
|
||||
? htmlspecialchars($_REQUEST['delimiter'])
|
||||
: ';'
|
||||
)
|
||||
);
|
@ -1,40 +0,0 @@
|
||||
<?php
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* Database structure manipulation
|
||||
*
|
||||
* @package PhpMyAdmin
|
||||
*/
|
||||
|
||||
namespace PMA;
|
||||
|
||||
use PMA\libraries\controllers\database\DatabaseStructureController;
|
||||
use PMA\libraries\Response;
|
||||
use PMA\libraries\Util;
|
||||
|
||||
require_once 'libraries/common.inc.php';
|
||||
require_once 'libraries/db_common.inc.php';
|
||||
|
||||
$container = libraries\di\Container::getDefaultContainer();
|
||||
$container->factory(
|
||||
'PMA\libraries\controllers\database\DatabaseStructureController'
|
||||
);
|
||||
$container->alias(
|
||||
'DatabaseStructureController',
|
||||
'PMA\libraries\controllers\database\DatabaseStructureController'
|
||||
);
|
||||
$container->set('PMA\libraries\Response', Response::getInstance());
|
||||
$container->alias('response', 'PMA\libraries\Response');
|
||||
|
||||
/* Define dependencies for the concerned controller */
|
||||
$dependency_definitions = array(
|
||||
'db' => $db,
|
||||
'url_query' => &$GLOBALS['url_query'],
|
||||
);
|
||||
|
||||
/** @var DatabaseStructureController $controller */
|
||||
$controller = $container->get(
|
||||
'DatabaseStructureController',
|
||||
$dependency_definitions
|
||||
);
|
||||
$controller->indexAction();
|
@ -1,151 +0,0 @@
|
||||
<?php
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* Tracking configuration for database
|
||||
*
|
||||
* @package PhpMyAdmin
|
||||
*/
|
||||
use PMA\libraries\Response;
|
||||
use PMA\libraries\Tracker;
|
||||
|
||||
/**
|
||||
* Run common work
|
||||
*/
|
||||
require_once 'libraries/common.inc.php';
|
||||
|
||||
require_once './libraries/tracking.lib.php';
|
||||
require_once 'libraries/display_create_table.lib.php';
|
||||
|
||||
//Get some js files needed for Ajax requests
|
||||
$response = Response::getInstance();
|
||||
$header = $response->getHeader();
|
||||
$scripts = $header->getScripts();
|
||||
$scripts->addFile('jquery/jquery.tablesorter.js');
|
||||
$scripts->addFile('db_tracking.js');
|
||||
|
||||
/**
|
||||
* If we are not in an Ajax request, then do the common work and show the links etc.
|
||||
*/
|
||||
require 'libraries/db_common.inc.php';
|
||||
$url_query .= '&goto=tbl_tracking.php&back=db_tracking.php';
|
||||
|
||||
// Get the database structure
|
||||
$sub_part = '_structure';
|
||||
|
||||
list(
|
||||
$tables,
|
||||
$num_tables,
|
||||
$total_num_tables,
|
||||
$sub_part,
|
||||
$is_show_stats,
|
||||
$db_is_system_schema,
|
||||
$tooltip_truename,
|
||||
$tooltip_aliasname,
|
||||
$pos
|
||||
) = PMA\libraries\Util::getDbInfo($db, isset($sub_part) ? $sub_part : '');
|
||||
|
||||
// Work to do?
|
||||
// (here, do not use $_REQUEST['db] as it can be crafted)
|
||||
if (isset($_REQUEST['delete_tracking']) && isset($_REQUEST['table'])) {
|
||||
|
||||
Tracker::deleteTracking($GLOBALS['db'], $_REQUEST['table']);
|
||||
PMA\libraries\Message::success(
|
||||
__('Tracking data deleted successfully.')
|
||||
)->display();
|
||||
|
||||
} elseif (isset($_REQUEST['submit_create_version'])) {
|
||||
|
||||
PMA_createTrackingForMultipleTables($_REQUEST['selected']);
|
||||
PMA\libraries\Message::success(
|
||||
sprintf(
|
||||
__(
|
||||
'Version %1$s was created for selected tables,'
|
||||
. ' tracking is active for them.'
|
||||
),
|
||||
htmlspecialchars($_REQUEST['version'])
|
||||
)
|
||||
)->display();
|
||||
|
||||
} elseif (isset($_REQUEST['submit_mult'])) {
|
||||
|
||||
if (! empty($_REQUEST['selected_tbl'])) {
|
||||
if ($_REQUEST['submit_mult'] == 'delete_tracking') {
|
||||
|
||||
foreach ($_REQUEST['selected_tbl'] as $table) {
|
||||
Tracker::deleteTracking($GLOBALS['db'], $table);
|
||||
}
|
||||
PMA\libraries\Message::success(
|
||||
__('Tracking data deleted successfully.')
|
||||
)->display();
|
||||
|
||||
} elseif ($_REQUEST['submit_mult'] == 'track') {
|
||||
|
||||
echo PMA_getHtmlForDataDefinitionAndManipulationStatements(
|
||||
'db_tracking.php' . $url_query,
|
||||
0,
|
||||
$GLOBALS['db'],
|
||||
$_REQUEST['selected_tbl']
|
||||
);
|
||||
exit;
|
||||
}
|
||||
} else {
|
||||
PMA\libraries\Message::notice(
|
||||
__('No tables selected.')
|
||||
)->display();
|
||||
}
|
||||
}
|
||||
|
||||
// Get tracked data about the database
|
||||
$data = Tracker::getTrackedData($_REQUEST['db'], '', '1');
|
||||
|
||||
// No tables present and no log exist
|
||||
if ($num_tables == 0 && count($data['ddlog']) == 0) {
|
||||
echo '<p>' , __('No tables found in database.') , '</p>' , "\n";
|
||||
|
||||
if (empty($db_is_system_schema)) {
|
||||
echo PMA_getHtmlForCreateTable($db);
|
||||
}
|
||||
exit;
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
$cfgRelation = PMA_getRelationsParam();
|
||||
|
||||
// Prepare statement to get HEAD version
|
||||
$all_tables_query = ' SELECT table_name, MAX(version) as version FROM ' .
|
||||
PMA\libraries\Util::backquote($cfgRelation['db']) . '.' .
|
||||
PMA\libraries\Util::backquote($cfgRelation['tracking']) .
|
||||
' WHERE db_name = \'' . $GLOBALS['dbi']->escapeString($_REQUEST['db']) .
|
||||
'\' ' .
|
||||
' GROUP BY table_name' .
|
||||
' ORDER BY table_name ASC';
|
||||
|
||||
$all_tables_result = PMA_queryAsControlUser($all_tables_query);
|
||||
|
||||
// If a HEAD version exists
|
||||
if (is_object($all_tables_result)
|
||||
&& $GLOBALS['dbi']->numRows($all_tables_result) > 0
|
||||
) {
|
||||
PMA_displayTrackedTables(
|
||||
$GLOBALS['db'], $all_tables_result, $url_query, $pmaThemeImage,
|
||||
$text_dir, $cfgRelation
|
||||
);
|
||||
}
|
||||
|
||||
$untracked_tables = PMA_getUntrackedTables($GLOBALS['db']);
|
||||
|
||||
// If untracked tables exist
|
||||
if (count($untracked_tables) > 0) {
|
||||
PMA_displayUntrackedTables(
|
||||
$GLOBALS['db'], $untracked_tables, $url_query, $pmaThemeImage, $text_dir
|
||||
);
|
||||
}
|
||||
// If available print out database log
|
||||
if (count($data['ddlog']) > 0) {
|
||||
$log = '';
|
||||
foreach ($data['ddlog'] as $entry) {
|
||||
$log .= '# ' . $entry['date'] . ' ' . $entry['username'] . "\n"
|
||||
. $entry['statement'] . "\n";
|
||||
}
|
||||
echo PMA\libraries\Util::getMessage(__('Database Log'), $log);
|
||||
}
|
Before Width: | Height: | Size: 52 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 6.7 KiB |
Before Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 7.7 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 347 B |
Before Width: | Height: | Size: 358 B |
Before Width: | Height: | Size: 173 B |
Before Width: | Height: | Size: 173 B |
Before Width: | Height: | Size: 345 B |
@ -1,217 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Welcome to phpMyAdmin’s documentation! — phpMyAdmin 4.7.0 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/classic.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: './',
|
||||
VERSION: '4.7.0',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="_static/jquery.js"></script>
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<link rel="index" title="Index" href="genindex.html" />
|
||||
<link rel="search" title="Search" href="search.html" />
|
||||
<link rel="copyright" title="Copyright" href="copyright.html" />
|
||||
<link rel="top" title="phpMyAdmin 4.7.0 documentation" href="#" />
|
||||
<link rel="next" title="Introduction" href="intro.html" />
|
||||
</head>
|
||||
<body role="document">
|
||||
<div class="related" role="navigation" aria-label="related navigation">
|
||||
<h3>Navigation</h3>
|
||||
<ul>
|
||||
<li class="right" style="margin-right: 10px">
|
||||
<a href="genindex.html" title="General Index"
|
||||
accesskey="I">index</a></li>
|
||||
<li class="right" >
|
||||
<a href="intro.html" title="Introduction"
|
||||
accesskey="N">next</a> |</li>
|
||||
<li class="nav-item nav-item-0"><a href="#">phpMyAdmin 4.7.0 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="document">
|
||||
<div class="documentwrapper">
|
||||
<div class="bodywrapper">
|
||||
<div class="body" role="main">
|
||||
|
||||
<div class="section" id="welcome-to-phpmyadmin-s-documentation">
|
||||
<h1>Welcome to phpMyAdmin’s documentation!<a class="headerlink" href="#welcome-to-phpmyadmin-s-documentation" title="Permalink to this headline">¶</a></h1>
|
||||
<p>Contents:</p>
|
||||
<div class="toctree-wrapper compound">
|
||||
<ul>
|
||||
<li class="toctree-l1"><a class="reference internal" href="intro.html">Introduction</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="intro.html#supported-features">Supported features</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="intro.html#shortcut-keys">Shortcut keys</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="intro.html#a-word-about-users">A word about users</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="require.html">Requirements</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="require.html#web-server">Web server</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="require.html#php">PHP</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="require.html#database">Database</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="require.html#web-browser">Web browser</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="setup.html">Installation</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="setup.html#linux-distributions">Linux distributions</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="setup.html#installing-on-windows">Installing on Windows</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="setup.html#installing-from-git">Installing from Git</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="setup.html#installing-using-composer">Installing using Composer</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="setup.html#installing-using-docker">Installing using Docker</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="setup.html#quick-install">Quick Install</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="setup.html#verifying-phpmyadmin-releases">Verifying phpMyAdmin releases</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="setup.html#phpmyadmin-configuration-storage">phpMyAdmin configuration storage</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="setup.html#upgrading-from-an-older-version">Upgrading from an older version</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="setup.html#using-authentication-modes">Using authentication modes</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="setup.html#securing-your-phpmyadmin-installation">Securing your phpMyAdmin installation</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="setup.html#known-issues">Known issues</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="config.html">Configuration</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="config.html#basic-settings">Basic settings</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="config.html#server-connection-settings">Server connection settings</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="config.html#generic-settings">Generic settings</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="config.html#cookie-authentication-options">Cookie authentication options</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="config.html#navigation-panel-setup">Navigation panel setup</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="config.html#main-panel">Main panel</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="config.html#database-structure">Database structure</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="config.html#browse-mode">Browse mode</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="config.html#editing-mode">Editing mode</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="config.html#export-and-import-settings">Export and import settings</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="config.html#tabs-display-settings">Tabs display settings</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="config.html#pdf-options">PDF Options</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="config.html#languages">Languages</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="config.html#web-server-settings">Web server settings</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="config.html#theme-settings">Theme settings</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="config.html#design-customization">Design customization</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="config.html#text-fields">Text fields</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="config.html#sql-query-box-settings">SQL query box settings</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="config.html#web-server-upload-save-import-directories">Web server upload/save/import directories</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="config.html#various-display-setting">Various display setting</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="config.html#page-titles">Page titles</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="config.html#theme-manager-settings">Theme manager settings</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="config.html#default-queries">Default queries</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="config.html#mysql-settings">MySQL settings</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="config.html#developer">Developer</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="config.html#examples">Examples</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="user.html">User Guide</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="transformations.html">Transformations</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="bookmarks.html">Bookmarks</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="privileges.html">User management</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="relations.html">Relations</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="charts.html">Charts</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="import_export.html">Import and export</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="other.html">Other sources of information</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="faq.html">FAQ - Frequently Asked Questions</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="faq.html#server">Server</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="faq.html#configuration">Configuration</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="faq.html#known-limitations">Known limitations</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="faq.html#isps-multi-user-installations">ISPs, multi-user installations</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="faq.html#browsers-or-client-os">Browsers or client OS</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="faq.html#using-phpmyadmin">Using phpMyAdmin</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="faq.html#phpmyadmin-project">phpMyAdmin project</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="faq.html#security">Security</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="faq.html#synchronization">Synchronization</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="developers.html">Developers Information</a></li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="vendors.html">Distributing and packaging phpMyAdmin</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="vendors.html#external-libraries">External libraries</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="copyright.html">Copyright</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="copyright.html#third-party-licenses">Third party licenses</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="credits.html">Credits</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="credits.html#credits-in-chronological-order">Credits, in chronological order</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="credits.html#translators">Translators</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="credits.html#documentation-translators">Documentation translators</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="credits.html#original-credits-of-version-2-1-0">Original Credits of Version 2.1.0</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="glossary.html">Glossary</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="indices-and-tables">
|
||||
<h1>Indices and tables<a class="headerlink" href="#indices-and-tables" title="Permalink to this headline">¶</a></h1>
|
||||
<ul class="simple">
|
||||
<li><a class="reference internal" href="genindex.html"><span class="std std-ref">Index</span></a></li>
|
||||
<li><a class="reference internal" href="search.html"><span class="std std-ref">Search Page</span></a></li>
|
||||
<li><a class="reference internal" href="glossary.html#glossary"><span class="std std-ref">Glossary</span></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
||||
<div class="sphinxsidebarwrapper">
|
||||
<h3><a href="#">Table Of Contents</a></h3>
|
||||
<ul>
|
||||
<li><a class="reference internal" href="#">Welcome to phpMyAdmin’s documentation!</a></li>
|
||||
<li><a class="reference internal" href="#indices-and-tables">Indices and tables</a></li>
|
||||
</ul>
|
||||
|
||||
<h4>Next topic</h4>
|
||||
<p class="topless"><a href="intro.html"
|
||||
title="next chapter">Introduction</a></p>
|
||||
<div role="note" aria-label="source link">
|
||||
<h3>This Page</h3>
|
||||
<ul class="this-page-menu">
|
||||
<li><a href="_sources/index.txt"
|
||||
rel="nofollow">Show Source</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div id="searchbox" style="display: none" role="search">
|
||||
<h3>Quick search</h3>
|
||||
<form class="search" action="search.html" method="get">
|
||||
<div><input type="text" name="q" /></div>
|
||||
<div><input type="submit" value="Go" /></div>
|
||||
<input type="hidden" name="check_keywords" value="yes" />
|
||||
<input type="hidden" name="area" value="default" />
|
||||
</form>
|
||||
</div>
|
||||
<script type="text/javascript">$('#searchbox').show(0);</script>
|
||||
</div>
|
||||
</div>
|
||||
<div class="clearer"></div>
|
||||
</div>
|
||||
<div class="related" role="navigation" aria-label="related navigation">
|
||||
<h3>Navigation</h3>
|
||||
<ul>
|
||||
<li class="right" style="margin-right: 10px">
|
||||
<a href="genindex.html" title="General Index"
|
||||
>index</a></li>
|
||||
<li class="right" >
|
||||
<a href="intro.html" title="Introduction"
|
||||
>next</a> |</li>
|
||||
<li class="nav-item nav-item-0"><a href="#">phpMyAdmin 4.7.0 documentation</a> »</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer" role="contentinfo">
|
||||
© <a href="copyright.html">Copyright</a> 2012 - 2017, The phpMyAdmin devel team.
|
||||
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.4.9.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -1,129 +0,0 @@
|
||||
<?php
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* Handle error report submission
|
||||
*
|
||||
* @package PhpMyAdmin
|
||||
*/
|
||||
use PMA\libraries\Response;
|
||||
require_once 'libraries/common.inc.php';
|
||||
require_once 'libraries/error_report.lib.php';
|
||||
require_once 'libraries/user_preferences.lib.php';
|
||||
|
||||
if (!isset($_REQUEST['exception_type'])
|
||||
||!in_array($_REQUEST['exception_type'], array('js', 'php'))
|
||||
) {
|
||||
die('Oops, something went wrong!!');
|
||||
}
|
||||
|
||||
$response = Response::getInstance();
|
||||
|
||||
if (isset($_REQUEST['send_error_report'])
|
||||
&& ($_REQUEST['send_error_report'] == true
|
||||
|| $_REQUEST['send_error_report'] == '1')
|
||||
) {
|
||||
if ($_REQUEST['exception_type'] == 'php') {
|
||||
/**
|
||||
* Prevent infinite error submission.
|
||||
* Happens in case error submissions fails.
|
||||
* If reporting is done in some time interval,
|
||||
* just clear them & clear json data too.
|
||||
*/
|
||||
if (isset($_SESSION['prev_error_subm_time'])
|
||||
&& isset($_SESSION['error_subm_count'])
|
||||
&& $_SESSION['error_subm_count'] >= 3
|
||||
&& ($_SESSION['prev_error_subm_time']-time()) <= 3000
|
||||
) {
|
||||
$_SESSION['error_subm_count'] = 0;
|
||||
$_SESSION['prev_errors'] = '';
|
||||
$response->addJSON('_stopErrorReportLoop', '1');
|
||||
} else {
|
||||
$_SESSION['prev_error_subm_time'] = time();
|
||||
$_SESSION['error_subm_count'] = (
|
||||
(isset($_SESSION['error_subm_count']))
|
||||
? ($_SESSION['error_subm_count']+1)
|
||||
: (0)
|
||||
);
|
||||
}
|
||||
}
|
||||
$reportData = PMA_getReportData($_REQUEST['exception_type']);
|
||||
// report if and only if there were 'actual' errors.
|
||||
if (count($reportData) > 0) {
|
||||
$server_response = PMA_sendErrorReport($reportData);
|
||||
if ($server_response === false) {
|
||||
$success = false;
|
||||
} else {
|
||||
$decoded_response = json_decode($server_response, true);
|
||||
$success = !empty($decoded_response) ?
|
||||
$decoded_response["success"] : false;
|
||||
}
|
||||
|
||||
/* Message to show to the user */
|
||||
if ($success) {
|
||||
if ((isset($_REQUEST['automatic'])
|
||||
&& $_REQUEST['automatic'] === "true")
|
||||
|| $GLOBALS['cfg']['SendErrorReports'] == 'always'
|
||||
) {
|
||||
$msg = __(
|
||||
'An error has been detected and an error report has been '
|
||||
. 'automatically submitted based on your settings.'
|
||||
);
|
||||
} else {
|
||||
$msg = __('Thank you for submitting this report.');
|
||||
}
|
||||
} else {
|
||||
$msg = __(
|
||||
'An error has been detected and an error report has been '
|
||||
. 'generated but failed to be sent.'
|
||||
)
|
||||
. ' '
|
||||
. __(
|
||||
'If you experience any '
|
||||
. 'problems please submit a bug report manually.'
|
||||
);
|
||||
}
|
||||
$msg .= ' ' . __('You may want to refresh the page.');
|
||||
|
||||
/* Create message object */
|
||||
if ($success) {
|
||||
$msg = PMA\libraries\Message::notice($msg);
|
||||
} else {
|
||||
$msg = PMA\libraries\Message::error($msg);
|
||||
}
|
||||
|
||||
/* Add message to response */
|
||||
if ($response->isAjax()) {
|
||||
if ($_REQUEST['exception_type'] == 'js') {
|
||||
$response->addJSON('message', $msg);
|
||||
} else {
|
||||
$response->addJSON('_errSubmitMsg', $msg);
|
||||
}
|
||||
} elseif ($_REQUEST['exception_type'] == 'php') {
|
||||
$jsCode = 'PMA_ajaxShowMessage("<div class=\"error\">'
|
||||
. $msg
|
||||
. '</div>", false);';
|
||||
$response->getFooter()->getScripts()->addCode($jsCode);
|
||||
}
|
||||
|
||||
if ($_REQUEST['exception_type'] == 'php') {
|
||||
// clear previous errors & save new ones.
|
||||
$GLOBALS['error_handler']->savePreviousErrors();
|
||||
}
|
||||
|
||||
/* Persist always send settings */
|
||||
if (isset($_REQUEST['always_send'])
|
||||
&& $_REQUEST['always_send'] === "true"
|
||||
) {
|
||||
PMA_persistOption("SendErrorReports", "always", "ask");
|
||||
}
|
||||
}
|
||||
} elseif (! empty($_REQUEST['get_settings'])) {
|
||||
$response->addJSON('report_setting', $GLOBALS['cfg']['SendErrorReports']);
|
||||
} else {
|
||||
if ($_REQUEST['exception_type'] == 'js') {
|
||||
$response->addHTML(PMA_getErrorReportForm());
|
||||
} else {
|
||||
// clear previous errors & save new ones.
|
||||
$GLOBALS['error_handler']->savePreviousErrors();
|
||||
}
|
||||
}
|
@ -1,780 +0,0 @@
|
||||
<?php
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* Core script for import, this is just the glue around all other stuff
|
||||
*
|
||||
* @package PhpMyAdmin
|
||||
*/
|
||||
use PMA\libraries\Response;
|
||||
use PMA\libraries\Encoding;
|
||||
use PMA\libraries\plugins\ImportPlugin;
|
||||
use PMA\libraries\File;
|
||||
use PMA\libraries\URL;
|
||||
use PMA\libraries\Bookmark;
|
||||
|
||||
/* Enable LOAD DATA LOCAL INFILE for LDI plugin */
|
||||
if (isset($_POST['format']) && $_POST['format'] == 'ldi') {
|
||||
define('PMA_ENABLE_LDI', 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the variables sent or posted to this script and a core script
|
||||
*/
|
||||
require_once 'libraries/common.inc.php';
|
||||
require_once 'libraries/sql.lib.php';
|
||||
//require_once 'libraries/display_import_functions.lib.php';
|
||||
|
||||
if (isset($_REQUEST['show_as_php'])) {
|
||||
$GLOBALS['show_as_php'] = $_REQUEST['show_as_php'];
|
||||
}
|
||||
|
||||
// Import functions.
|
||||
require_once 'libraries/import.lib.php';
|
||||
|
||||
// If there is a request to 'Simulate DML'.
|
||||
if (isset($_REQUEST['simulate_dml'])) {
|
||||
PMA_handleSimulateDMLRequest();
|
||||
exit;
|
||||
}
|
||||
|
||||
$response = Response::getInstance();
|
||||
|
||||
// If it's a refresh console bookmarks request
|
||||
if (isset($_REQUEST['console_bookmark_refresh'])) {
|
||||
$response->addJSON(
|
||||
'console_message_bookmark', PMA\libraries\Console::getBookmarkContent()
|
||||
);
|
||||
exit;
|
||||
}
|
||||
// If it's a console bookmark add request
|
||||
if (isset($_REQUEST['console_bookmark_add'])) {
|
||||
if (isset($_REQUEST['label']) && isset($_REQUEST['db'])
|
||||
&& isset($_REQUEST['bookmark_query']) && isset($_REQUEST['shared'])
|
||||
) {
|
||||
$cfgBookmark = Bookmark::getParams();
|
||||
$bookmarkFields = array(
|
||||
'bkm_database' => $_REQUEST['db'],
|
||||
'bkm_user' => $cfgBookmark['user'],
|
||||
'bkm_sql_query' => $_REQUEST['bookmark_query'],
|
||||
'bkm_label' => $_REQUEST['label']
|
||||
);
|
||||
$isShared = ($_REQUEST['shared'] == 'true' ? true : false);
|
||||
$bookmark = Bookmark::createBookmark($bookmarkFields, $isShared);
|
||||
if ($bookmark !== false && $bookmark->save()) {
|
||||
$response->addJSON('message', __('Succeeded'));
|
||||
$response->addJSON('data', $bookmarkFields);
|
||||
$response->addJSON('isShared', $isShared);
|
||||
} else {
|
||||
$response->addJSON('message', __('Failed'));
|
||||
}
|
||||
die();
|
||||
} else {
|
||||
$response->addJSON('message', __('Incomplete params'));
|
||||
die();
|
||||
}
|
||||
}
|
||||
|
||||
$format = '';
|
||||
|
||||
/**
|
||||
* Sets globals from $_POST
|
||||
*/
|
||||
$post_params = array(
|
||||
'charset_of_file',
|
||||
'format',
|
||||
'import_type',
|
||||
'is_js_confirmed',
|
||||
'MAX_FILE_SIZE',
|
||||
'message_to_show',
|
||||
'noplugin',
|
||||
'skip_queries',
|
||||
'local_import_file'
|
||||
);
|
||||
|
||||
foreach ($post_params as $one_post_param) {
|
||||
if (isset($_POST[$one_post_param])) {
|
||||
$GLOBALS[$one_post_param] = $_POST[$one_post_param];
|
||||
}
|
||||
}
|
||||
|
||||
// reset import messages for ajax request
|
||||
$_SESSION['Import_message']['message'] = null;
|
||||
$_SESSION['Import_message']['go_back_url'] = null;
|
||||
// default values
|
||||
$GLOBALS['reload'] = false;
|
||||
|
||||
// Use to identify current cycle is executing
|
||||
// a multiquery statement or stored routine
|
||||
if (!isset($_SESSION['is_multi_query'])) {
|
||||
$_SESSION['is_multi_query'] = false;
|
||||
}
|
||||
|
||||
$ajax_reload = array();
|
||||
// Are we just executing plain query or sql file?
|
||||
// (eg. non import, but query box/window run)
|
||||
if (! empty($sql_query)) {
|
||||
|
||||
// apply values for parameters
|
||||
if (! empty($_REQUEST['parameterized'])
|
||||
&& ! empty($_REQUEST['parameters'])
|
||||
&& is_array($_REQUEST['parameters'])
|
||||
) {
|
||||
$parameters = $_REQUEST['parameters'];
|
||||
foreach ($parameters as $parameter => $replacement) {
|
||||
$quoted = preg_quote($parameter, '/');
|
||||
// making sure that :param does not apply values to :param1
|
||||
$sql_query = preg_replace(
|
||||
'/' . $quoted . '([^a-zA-Z0-9_])/',
|
||||
$GLOBALS['dbi']->escapeString($replacement) . '${1}',
|
||||
$sql_query
|
||||
);
|
||||
// for parameters the appear at the end of the string
|
||||
$sql_query = preg_replace(
|
||||
'/' . $quoted . '$/',
|
||||
$GLOBALS['dbi']->escapeString($replacement),
|
||||
$sql_query
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// run SQL query
|
||||
$import_text = $sql_query;
|
||||
$import_type = 'query';
|
||||
$format = 'sql';
|
||||
$_SESSION['sql_from_query_box'] = true;
|
||||
|
||||
// If there is a request to ROLLBACK when finished.
|
||||
if (isset($_REQUEST['rollback_query'])) {
|
||||
PMA_handleRollbackRequest($import_text);
|
||||
}
|
||||
|
||||
// refresh navigation and main panels
|
||||
if (preg_match('/^(DROP)\s+(VIEW|TABLE|DATABASE|SCHEMA)\s+/i', $sql_query)) {
|
||||
$GLOBALS['reload'] = true;
|
||||
$ajax_reload['reload'] = true;
|
||||
}
|
||||
|
||||
// refresh navigation panel only
|
||||
if (preg_match(
|
||||
'/^(CREATE|ALTER)\s+(VIEW|TABLE|DATABASE|SCHEMA)\s+/i',
|
||||
$sql_query
|
||||
)) {
|
||||
$ajax_reload['reload'] = true;
|
||||
}
|
||||
|
||||
// do a dynamic reload if table is RENAMED
|
||||
// (by sending the instruction to the AJAX response handler)
|
||||
if (preg_match(
|
||||
'/^RENAME\s+TABLE\s+(.*?)\s+TO\s+(.*?)($|;|\s)/i',
|
||||
$sql_query,
|
||||
$rename_table_names
|
||||
)) {
|
||||
$ajax_reload['reload'] = true;
|
||||
$ajax_reload['table_name'] = PMA\libraries\Util::unQuote(
|
||||
$rename_table_names[2]
|
||||
);
|
||||
}
|
||||
|
||||
$sql_query = '';
|
||||
} elseif (! empty($sql_file)) {
|
||||
// run uploaded SQL file
|
||||
$import_file = $sql_file;
|
||||
$import_type = 'queryfile';
|
||||
$format = 'sql';
|
||||
unset($sql_file);
|
||||
} elseif (! empty($_REQUEST['id_bookmark'])) {
|
||||
// run bookmark
|
||||
$import_type = 'query';
|
||||
$format = 'sql';
|
||||
}
|
||||
|
||||
// If we didn't get any parameters, either user called this directly, or
|
||||
// upload limit has been reached, let's assume the second possibility.
|
||||
if ($_POST == array() && $_GET == array()) {
|
||||
$message = PMA\libraries\Message::error(
|
||||
__(
|
||||
'You probably tried to upload a file that is too large. Please refer ' .
|
||||
'to %sdocumentation%s for a workaround for this limit.'
|
||||
)
|
||||
);
|
||||
$message->addParam('[doc@faq1-16]');
|
||||
$message->addParam('[/doc]');
|
||||
|
||||
// so we can obtain the message
|
||||
$_SESSION['Import_message']['message'] = $message->getDisplay();
|
||||
$_SESSION['Import_message']['go_back_url'] = $GLOBALS['goto'];
|
||||
|
||||
$response->setRequestStatus(false);
|
||||
$response->addJSON('message', $message);
|
||||
|
||||
exit; // the footer is displayed automatically
|
||||
}
|
||||
|
||||
// Add console message id to response output
|
||||
if (isset($_POST['console_message_id'])) {
|
||||
$response->addJSON('console_message_id', $_POST['console_message_id']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets globals from $_POST patterns, for import plugins
|
||||
* We only need to load the selected plugin
|
||||
*/
|
||||
|
||||
if (! in_array(
|
||||
$format,
|
||||
array(
|
||||
'csv',
|
||||
'ldi',
|
||||
'mediawiki',
|
||||
'ods',
|
||||
'shp',
|
||||
'sql',
|
||||
'xml'
|
||||
)
|
||||
)
|
||||
) {
|
||||
// this should not happen for a normal user
|
||||
// but only during an attack
|
||||
PMA_fatalError('Incorrect format parameter');
|
||||
}
|
||||
|
||||
$post_patterns = array(
|
||||
'/^force_file_/',
|
||||
'/^' . $format . '_/'
|
||||
);
|
||||
|
||||
PMA_setPostAsGlobal($post_patterns);
|
||||
|
||||
// Check needed parameters
|
||||
PMA\libraries\Util::checkParameters(array('import_type', 'format'));
|
||||
|
||||
// We don't want anything special in format
|
||||
$format = PMA_securePath($format);
|
||||
|
||||
// Create error and goto url
|
||||
if ($import_type == 'table') {
|
||||
$err_url = 'tbl_import.php' . URL::getCommon(
|
||||
array(
|
||||
'db' => $db, 'table' => $table
|
||||
)
|
||||
);
|
||||
$_SESSION['Import_message']['go_back_url'] = $err_url;
|
||||
$goto = 'tbl_import.php';
|
||||
} elseif ($import_type == 'database') {
|
||||
$err_url = 'db_import.php' . URL::getCommon(array('db' => $db));
|
||||
$_SESSION['Import_message']['go_back_url'] = $err_url;
|
||||
$goto = 'db_import.php';
|
||||
} elseif ($import_type == 'server') {
|
||||
$err_url = 'server_import.php' . URL::getCommon();
|
||||
$_SESSION['Import_message']['go_back_url'] = $err_url;
|
||||
$goto = 'server_import.php';
|
||||
} else {
|
||||
if (empty($goto) || !preg_match('@^(server|db|tbl)(_[a-z]*)*\.php$@i', $goto)) {
|
||||
if (strlen($table) > 0 && strlen($db) > 0) {
|
||||
$goto = 'tbl_structure.php';
|
||||
} elseif (strlen($db) > 0) {
|
||||
$goto = 'db_structure.php';
|
||||
} else {
|
||||
$goto = 'server_sql.php';
|
||||
}
|
||||
}
|
||||
if (strlen($table) > 0 && strlen($db) > 0) {
|
||||
$common = URL::getCommon(array('db' => $db, 'table' => $table));
|
||||
} elseif (strlen($db) > 0) {
|
||||
$common = URL::getCommon(array('db' => $db));
|
||||
} else {
|
||||
$common = URL::getCommon();
|
||||
}
|
||||
$err_url = $goto . $common
|
||||
. (preg_match('@^tbl_[a-z]*\.php$@', $goto)
|
||||
? '&table=' . htmlspecialchars($table)
|
||||
: '');
|
||||
$_SESSION['Import_message']['go_back_url'] = $err_url;
|
||||
}
|
||||
// Avoid setting selflink to 'import.php'
|
||||
// problem similar to bug 4276
|
||||
if (basename($_SERVER['SCRIPT_NAME']) === 'import.php') {
|
||||
$_SERVER['SCRIPT_NAME'] = $goto;
|
||||
}
|
||||
|
||||
|
||||
if (strlen($db) > 0) {
|
||||
$GLOBALS['dbi']->selectDb($db);
|
||||
}
|
||||
|
||||
@set_time_limit($cfg['ExecTimeLimit']);
|
||||
if (! empty($cfg['MemoryLimit'])) {
|
||||
@ini_set('memory_limit', $cfg['MemoryLimit']);
|
||||
}
|
||||
|
||||
$timestamp = time();
|
||||
if (isset($_REQUEST['allow_interrupt'])) {
|
||||
$maximum_time = ini_get('max_execution_time');
|
||||
} else {
|
||||
$maximum_time = 0;
|
||||
}
|
||||
|
||||
// set default values
|
||||
$timeout_passed = false;
|
||||
$error = false;
|
||||
$read_multiply = 1;
|
||||
$finished = false;
|
||||
$offset = 0;
|
||||
$max_sql_len = 0;
|
||||
$file_to_unlink = '';
|
||||
$sql_query = '';
|
||||
$sql_query_disabled = false;
|
||||
$go_sql = false;
|
||||
$executed_queries = 0;
|
||||
$run_query = true;
|
||||
$charset_conversion = false;
|
||||
$reset_charset = false;
|
||||
$bookmark_created = false;
|
||||
$result = false;
|
||||
$msg = 'Sorry an unexpected error happened!';
|
||||
|
||||
// Bookmark Support: get a query back from bookmark if required
|
||||
if (! empty($_REQUEST['id_bookmark'])) {
|
||||
$id_bookmark = (int)$_REQUEST['id_bookmark'];
|
||||
switch ($_REQUEST['action_bookmark']) {
|
||||
case 0: // bookmarked query that have to be run
|
||||
$bookmark = Bookmark::get(
|
||||
$db,
|
||||
$id_bookmark,
|
||||
'id',
|
||||
isset($_REQUEST['action_bookmark_all'])
|
||||
);
|
||||
|
||||
if (! empty($_REQUEST['bookmark_variable'])) {
|
||||
$import_text = $bookmark->applyVariables(
|
||||
$_REQUEST['bookmark_variable']
|
||||
);
|
||||
} else {
|
||||
$import_text = $bookmark->getQuery();
|
||||
}
|
||||
|
||||
// refresh navigation and main panels
|
||||
if (preg_match(
|
||||
'/^(DROP)\s+(VIEW|TABLE|DATABASE|SCHEMA)\s+/i',
|
||||
$import_text
|
||||
)) {
|
||||
$GLOBALS['reload'] = true;
|
||||
$ajax_reload['reload'] = true;
|
||||
}
|
||||
|
||||
// refresh navigation panel only
|
||||
if (preg_match(
|
||||
'/^(CREATE|ALTER)\s+(VIEW|TABLE|DATABASE|SCHEMA)\s+/i',
|
||||
$import_text
|
||||
)
|
||||
) {
|
||||
$ajax_reload['reload'] = true;
|
||||
}
|
||||
break;
|
||||
case 1: // bookmarked query that have to be displayed
|
||||
$bookmark = Bookmark::get($db, $id_bookmark);
|
||||
$import_text = $bookmark->getQuery();
|
||||
if ($response->isAjax()) {
|
||||
$message = PMA\libraries\Message::success(__('Showing bookmark'));
|
||||
$response->setRequestStatus($message->isSuccess());
|
||||
$response->addJSON('message', $message);
|
||||
$response->addJSON('sql_query', $import_text);
|
||||
$response->addJSON('action_bookmark', $_REQUEST['action_bookmark']);
|
||||
exit;
|
||||
} else {
|
||||
$run_query = false;
|
||||
}
|
||||
break;
|
||||
case 2: // bookmarked query that have to be deleted
|
||||
$bookmark = Bookmark::get($db, $id_bookmark);
|
||||
if (! empty($bookmark)) {
|
||||
$bookmark->delete();
|
||||
if ($response->isAjax()) {
|
||||
$message = PMA\libraries\Message::success(
|
||||
__('The bookmark has been deleted.')
|
||||
);
|
||||
$response->setRequestStatus($message->isSuccess());
|
||||
$response->addJSON('message', $message);
|
||||
$response->addJSON('action_bookmark', $_REQUEST['action_bookmark']);
|
||||
$response->addJSON('id_bookmark', $id_bookmark);
|
||||
exit;
|
||||
} else {
|
||||
$run_query = false;
|
||||
$error = true; // this is kind of hack to skip processing the query
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
} // end bookmarks reading
|
||||
|
||||
// Do no run query if we show PHP code
|
||||
if (isset($GLOBALS['show_as_php'])) {
|
||||
$run_query = false;
|
||||
$go_sql = true;
|
||||
}
|
||||
|
||||
// We can not read all at once, otherwise we can run out of memory
|
||||
$memory_limit = trim(@ini_get('memory_limit'));
|
||||
// 2 MB as default
|
||||
if (empty($memory_limit)) {
|
||||
$memory_limit = 2 * 1024 * 1024;
|
||||
}
|
||||
// In case no memory limit we work on 10MB chunks
|
||||
if ($memory_limit == -1) {
|
||||
$memory_limit = 10 * 1024 * 1024;
|
||||
}
|
||||
|
||||
// Calculate value of the limit
|
||||
$memoryUnit = mb_strtolower(substr($memory_limit, -1));
|
||||
if ('m' == $memoryUnit) {
|
||||
$memory_limit = (int)substr($memory_limit, 0, -1) * 1024 * 1024;
|
||||
} elseif ('k' == $memoryUnit) {
|
||||
$memory_limit = (int)substr($memory_limit, 0, -1) * 1024;
|
||||
} elseif ('g' == $memoryUnit) {
|
||||
$memory_limit = (int)substr($memory_limit, 0, -1) * 1024 * 1024 * 1024;
|
||||
} else {
|
||||
$memory_limit = (int)$memory_limit;
|
||||
}
|
||||
|
||||
// Just to be sure, there might be lot of memory needed for uncompression
|
||||
$read_limit = $memory_limit / 8;
|
||||
|
||||
// handle filenames
|
||||
if (isset($_FILES['import_file'])) {
|
||||
$import_file = $_FILES['import_file']['tmp_name'];
|
||||
}
|
||||
if (! empty($local_import_file) && ! empty($cfg['UploadDir'])) {
|
||||
|
||||
// sanitize $local_import_file as it comes from a POST
|
||||
$local_import_file = PMA_securePath($local_import_file);
|
||||
|
||||
$import_file = PMA\libraries\Util::userDir($cfg['UploadDir'])
|
||||
. $local_import_file;
|
||||
|
||||
/*
|
||||
* Do not allow symlinks to avoid security issues
|
||||
* (user can create symlink to file he can not access,
|
||||
* but phpMyAdmin can).
|
||||
*/
|
||||
if (@is_link($import_file)) {
|
||||
$import_file = 'none';
|
||||
}
|
||||
|
||||
} elseif (empty($import_file) || ! is_uploaded_file($import_file)) {
|
||||
$import_file = 'none';
|
||||
}
|
||||
|
||||
// Do we have file to import?
|
||||
|
||||
if ($import_file != 'none' && ! $error) {
|
||||
/**
|
||||
* Handle file compression
|
||||
*/
|
||||
$import_handle = new File($import_file);
|
||||
$import_handle->checkUploadedFile();
|
||||
if ($import_handle->isError()) {
|
||||
PMA_stopImport($import_handle->getError());
|
||||
}
|
||||
$import_handle->setDecompressContent(true);
|
||||
$import_handle->open();
|
||||
if ($import_handle->isError()) {
|
||||
PMA_stopImport($import_handle->getError());
|
||||
}
|
||||
} elseif (! $error) {
|
||||
if (! isset($import_text) || empty($import_text)) {
|
||||
$message = PMA\libraries\Message::error(
|
||||
__(
|
||||
'No data was received to import. Either no file name was ' .
|
||||
'submitted, or the file size exceeded the maximum size permitted ' .
|
||||
'by your PHP configuration. See [doc@faq1-16]FAQ 1.16[/doc].'
|
||||
)
|
||||
);
|
||||
PMA_stopImport($message);
|
||||
}
|
||||
}
|
||||
|
||||
// so we can obtain the message
|
||||
//$_SESSION['Import_message'] = $message->getDisplay();
|
||||
|
||||
// Convert the file's charset if necessary
|
||||
if (Encoding::isSupported() && isset($charset_of_file)) {
|
||||
if ($charset_of_file != 'utf-8') {
|
||||
$charset_conversion = true;
|
||||
}
|
||||
} elseif (isset($charset_of_file) && $charset_of_file != 'utf-8') {
|
||||
$GLOBALS['dbi']->query('SET NAMES \'' . $charset_of_file . '\'');
|
||||
// We can not show query in this case, it is in different charset
|
||||
$sql_query_disabled = true;
|
||||
$reset_charset = true;
|
||||
}
|
||||
|
||||
// Something to skip? (because timeout has passed)
|
||||
if (! $error && isset($_POST['skip'])) {
|
||||
$original_skip = $skip = intval($_POST['skip']);
|
||||
while ($skip > 0 && ! $finished) {
|
||||
PMA_importGetNextChunk($skip < $read_limit ? $skip : $read_limit);
|
||||
// Disable read progressivity, otherwise we eat all memory!
|
||||
$read_multiply = 1;
|
||||
$skip -= $read_limit;
|
||||
}
|
||||
unset($skip);
|
||||
}
|
||||
|
||||
// This array contain the data like numberof valid sql queries in the statement
|
||||
// and complete valid sql statement (which affected for rows)
|
||||
$sql_data = array('valid_sql' => array(), 'valid_queries' => 0);
|
||||
|
||||
if (! $error) {
|
||||
// Check for file existence
|
||||
include_once "libraries/plugin_interface.lib.php";
|
||||
/* @var $import_plugin ImportPlugin */
|
||||
$import_plugin = PMA_getPlugin(
|
||||
"import",
|
||||
$format,
|
||||
'libraries/plugins/import/',
|
||||
$import_type
|
||||
);
|
||||
if ($import_plugin == null) {
|
||||
$message = PMA\libraries\Message::error(
|
||||
__('Could not load import plugins, please check your installation!')
|
||||
);
|
||||
PMA_stopImport($message);
|
||||
} else {
|
||||
// Do the real import
|
||||
try {
|
||||
$default_fk_check = PMA\libraries\Util::handleDisableFKCheckInit();
|
||||
$import_plugin->doImport($sql_data);
|
||||
PMA\libraries\Util::handleDisableFKCheckCleanup($default_fk_check);
|
||||
} catch (Exception $e) {
|
||||
PMA\libraries\Util::handleDisableFKCheckCleanup($default_fk_check);
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($import_handle)) {
|
||||
$import_handle->close();
|
||||
}
|
||||
|
||||
// Cleanup temporary file
|
||||
if ($file_to_unlink != '') {
|
||||
unlink($file_to_unlink);
|
||||
}
|
||||
|
||||
// Reset charset back, if we did some changes
|
||||
if ($reset_charset) {
|
||||
$GLOBALS['dbi']->query('SET CHARACTER SET utf8');
|
||||
$GLOBALS['dbi']->query(
|
||||
'SET SESSION collation_connection =\'' . $collation_connection . '\''
|
||||
);
|
||||
}
|
||||
|
||||
// Show correct message
|
||||
if (! empty($id_bookmark) && $_REQUEST['action_bookmark'] == 2) {
|
||||
$message = PMA\libraries\Message::success(__('The bookmark has been deleted.'));
|
||||
$display_query = $import_text;
|
||||
$error = false; // unset error marker, it was used just to skip processing
|
||||
} elseif (! empty($id_bookmark) && $_REQUEST['action_bookmark'] == 1) {
|
||||
$message = PMA\libraries\Message::notice(__('Showing bookmark'));
|
||||
} elseif ($bookmark_created) {
|
||||
$special_message = '[br]' . sprintf(
|
||||
__('Bookmark %s has been created.'),
|
||||
htmlspecialchars($_POST['bkm_label'])
|
||||
);
|
||||
} elseif ($finished && ! $error) {
|
||||
// Do not display the query with message, we do it separately
|
||||
$display_query = ';';
|
||||
if ($import_type != 'query') {
|
||||
$message = PMA\libraries\Message::success(
|
||||
'<em>'
|
||||
. _ngettext(
|
||||
'Import has been successfully finished, %d query executed.',
|
||||
'Import has been successfully finished, %d queries executed.',
|
||||
$executed_queries
|
||||
)
|
||||
. '</em>'
|
||||
);
|
||||
$message->addParam($executed_queries);
|
||||
|
||||
if ($import_notice) {
|
||||
$message->addHtml($import_notice);
|
||||
}
|
||||
if (! empty($local_import_file)) {
|
||||
$message->addText('(' . $local_import_file . ')');
|
||||
} else {
|
||||
$message->addText('(' . $_FILES['import_file']['name'] . ')');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Did we hit timeout? Tell it user.
|
||||
if ($timeout_passed) {
|
||||
$importUrl = $err_url .= '&timeout_passed=1&offset=' . urlencode(
|
||||
$GLOBALS['offset']
|
||||
);
|
||||
if (isset($local_import_file)) {
|
||||
$importUrl .= '&local_import_file=' . urlencode($local_import_file);
|
||||
}
|
||||
$message = PMA\libraries\Message::error(
|
||||
__(
|
||||
'Script timeout passed, if you want to finish import,'
|
||||
. ' please %sresubmit the same file%s and import will resume.'
|
||||
)
|
||||
);
|
||||
$message->addParamHtml('<a href="' . $importUrl . '">');
|
||||
$message->addParamHtml('</a>');
|
||||
|
||||
if ($offset == 0 || (isset($original_skip) && $original_skip == $offset)) {
|
||||
$message->addText(
|
||||
__(
|
||||
'However on last run no data has been parsed,'
|
||||
. ' this usually means phpMyAdmin won\'t be able to'
|
||||
. ' finish this import unless you increase php time limits.'
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// if there is any message, copy it into $_SESSION as well,
|
||||
// so we can obtain it by AJAX call
|
||||
if (isset($message)) {
|
||||
$_SESSION['Import_message']['message'] = $message->getDisplay();
|
||||
}
|
||||
// Parse and analyze the query, for correct db and table name
|
||||
// in case of a query typed in the query window
|
||||
// (but if the query is too large, in case of an imported file, the parser
|
||||
// can choke on it so avoid parsing)
|
||||
$sqlLength = mb_strlen($sql_query);
|
||||
if ($sqlLength <= $GLOBALS['cfg']['MaxCharactersInDisplayedSQL']) {
|
||||
include_once 'libraries/parse_analyze.lib.php';
|
||||
|
||||
list(
|
||||
$analyzed_sql_results,
|
||||
$db,
|
||||
$table_from_sql
|
||||
) = PMA_parseAnalyze($sql_query, $db);
|
||||
// @todo: possibly refactor
|
||||
extract($analyzed_sql_results);
|
||||
|
||||
if ($table != $table_from_sql && !empty($table_from_sql)) {
|
||||
$table = $table_from_sql;
|
||||
}
|
||||
}
|
||||
|
||||
// There was an error?
|
||||
if (isset($my_die)) {
|
||||
foreach ($my_die as $key => $die) {
|
||||
PMA\libraries\Util::mysqlDie(
|
||||
$die['error'], $die['sql'], false, $err_url, $error
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if ($go_sql) {
|
||||
|
||||
if (! empty($sql_data) && ($sql_data['valid_queries'] > 1)) {
|
||||
$_SESSION['is_multi_query'] = true;
|
||||
$sql_queries = $sql_data['valid_sql'];
|
||||
} else {
|
||||
$sql_queries = array($sql_query);
|
||||
}
|
||||
|
||||
$html_output = '';
|
||||
|
||||
foreach ($sql_queries as $sql_query) {
|
||||
|
||||
// parse sql query
|
||||
include_once 'libraries/parse_analyze.lib.php';
|
||||
list(
|
||||
$analyzed_sql_results,
|
||||
$db,
|
||||
$table_from_sql
|
||||
) = PMA_parseAnalyze($sql_query, $db);
|
||||
// @todo: possibly refactor
|
||||
extract($analyzed_sql_results);
|
||||
|
||||
// Check if User is allowed to issue a 'DROP DATABASE' Statement
|
||||
if (PMA_hasNoRightsToDropDatabase(
|
||||
$analyzed_sql_results, $cfg['AllowUserDropDatabase'], $GLOBALS['is_superuser']
|
||||
)) {
|
||||
PMA\libraries\Util::mysqlDie(
|
||||
__('"DROP DATABASE" statements are disabled.'),
|
||||
'',
|
||||
false,
|
||||
$_SESSION['Import_message']['go_back_url']
|
||||
);
|
||||
return;
|
||||
} // end if
|
||||
|
||||
if ($table != $table_from_sql && !empty($table_from_sql)) {
|
||||
$table = $table_from_sql;
|
||||
}
|
||||
|
||||
$html_output .= PMA_executeQueryAndGetQueryResponse(
|
||||
$analyzed_sql_results, // analyzed_sql_results
|
||||
false, // is_gotofile
|
||||
$db, // db
|
||||
$table, // table
|
||||
null, // find_real_end
|
||||
null, // sql_query_for_bookmark - see below
|
||||
null, // extra_data
|
||||
null, // message_to_show
|
||||
null, // message
|
||||
null, // sql_data
|
||||
$goto, // goto
|
||||
$pmaThemeImage, // pmaThemeImage
|
||||
null, // disp_query
|
||||
null, // disp_message
|
||||
null, // query_type
|
||||
$sql_query, // sql_query
|
||||
null, // selectedTables
|
||||
null // complete_query
|
||||
);
|
||||
}
|
||||
|
||||
// sql_query_for_bookmark is not included in PMA_executeQueryAndGetQueryResponse
|
||||
// since only one bookmark has to be added for all the queries submitted through
|
||||
// the SQL tab
|
||||
if (! empty($_POST['bkm_label']) && ! empty($import_text)) {
|
||||
$cfgBookmark = Bookmark::getParams();
|
||||
PMA_storeTheQueryAsBookmark(
|
||||
$db, $cfgBookmark['user'],
|
||||
$_REQUEST['sql_query'], $_POST['bkm_label'],
|
||||
isset($_POST['bkm_replace']) ? $_POST['bkm_replace'] : null
|
||||
);
|
||||
}
|
||||
|
||||
$response->addJSON('ajax_reload', $ajax_reload);
|
||||
$response->addHTML($html_output);
|
||||
exit();
|
||||
|
||||
} else if ($result) {
|
||||
// Save a Bookmark with more than one queries (if Bookmark label given).
|
||||
if (! empty($_POST['bkm_label']) && ! empty($import_text)) {
|
||||
$cfgBookmark = Bookmark::getParams();
|
||||
PMA_storeTheQueryAsBookmark(
|
||||
$db, $cfgBookmark['user'],
|
||||
$_REQUEST['sql_query'], $_POST['bkm_label'],
|
||||
isset($_POST['bkm_replace']) ? $_POST['bkm_replace'] : null
|
||||
);
|
||||
}
|
||||
|
||||
$response->setRequestStatus(true);
|
||||
$response->addJSON('message', PMA\libraries\Message::success($msg));
|
||||
$response->addJSON(
|
||||
'sql_query',
|
||||
PMA\libraries\Util::getMessage($msg, $sql_query, 'success')
|
||||
);
|
||||
} else if ($result == false) {
|
||||
$response->setRequestStatus(false);
|
||||
$response->addJSON('message', PMA\libraries\Message::error($msg));
|
||||
} else {
|
||||
$active_page = $goto;
|
||||
include '' . $goto;
|
||||
}
|
||||
|
||||
// If there is request for ROLLBACK in the end.
|
||||
if (isset($_REQUEST['rollback_query'])) {
|
||||
$GLOBALS['dbi']->query('ROLLBACK');
|
||||
}
|
655
.devilbox/www/htdocs/vendor/phpmyadmin-4.7/index.php
vendored
@ -1,655 +0,0 @@
|
||||
<?php
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* Main loader script
|
||||
*
|
||||
* @package PhpMyAdmin
|
||||
*/
|
||||
use PMA\libraries\Response;
|
||||
use PMA\libraries\RecentFavoriteTable;
|
||||
use PMA\libraries\URL;
|
||||
use PMA\libraries\Sanitize;
|
||||
use PMA\libraries\Charsets;
|
||||
use PMA\libraries\ThemeManager;
|
||||
use PMA\libraries\LanguageManager;
|
||||
|
||||
/**
|
||||
* Gets some core libraries and displays a top message if required
|
||||
*/
|
||||
require_once 'libraries/common.inc.php';
|
||||
|
||||
/**
|
||||
* display Git revision if requested
|
||||
*/
|
||||
require_once 'libraries/display_git_revision.lib.php';
|
||||
|
||||
/**
|
||||
* pass variables to child pages
|
||||
*/
|
||||
$drops = array(
|
||||
'lang',
|
||||
'server',
|
||||
'collation_connection',
|
||||
'db',
|
||||
'table'
|
||||
);
|
||||
foreach ($drops as $each_drop) {
|
||||
if (array_key_exists($each_drop, $_GET)) {
|
||||
unset($_GET[$each_drop]);
|
||||
}
|
||||
}
|
||||
unset($drops, $each_drop);
|
||||
|
||||
/*
|
||||
* Black list of all scripts to which front-end must submit data.
|
||||
* Such scripts must not be loaded on home page.
|
||||
*
|
||||
*/
|
||||
$target_blacklist = array (
|
||||
'import.php', 'export.php'
|
||||
);
|
||||
|
||||
// If we have a valid target, let's load that script instead
|
||||
if (! empty($_REQUEST['target'])
|
||||
&& is_string($_REQUEST['target'])
|
||||
&& ! preg_match('/^index/', $_REQUEST['target'])
|
||||
&& ! in_array($_REQUEST['target'], $target_blacklist)
|
||||
&& in_array($_REQUEST['target'], $goto_whitelist)
|
||||
) {
|
||||
include $_REQUEST['target'];
|
||||
exit;
|
||||
}
|
||||
|
||||
if (isset($_REQUEST['ajax_request']) && ! empty($_REQUEST['access_time'])) {
|
||||
exit;
|
||||
}
|
||||
|
||||
// See FAQ 1.34
|
||||
if (! empty($_REQUEST['db'])) {
|
||||
$page = null;
|
||||
if (! empty($_REQUEST['table'])) {
|
||||
$page = PMA\libraries\Util::getScriptNameForOption(
|
||||
$GLOBALS['cfg']['DefaultTabTable'], 'table'
|
||||
);
|
||||
} else {
|
||||
$page = PMA\libraries\Util::getScriptNameForOption(
|
||||
$GLOBALS['cfg']['DefaultTabDatabase'], 'database'
|
||||
);
|
||||
}
|
||||
include $page;
|
||||
exit;
|
||||
}
|
||||
|
||||
$response = Response::getInstance();
|
||||
/**
|
||||
* Check if it is an ajax request to reload the recent tables list.
|
||||
*/
|
||||
if ($response->isAjax() && ! empty($_REQUEST['recent_table'])) {
|
||||
$response->addJSON(
|
||||
'list',
|
||||
RecentFavoriteTable::getInstance('recent')->getHtmlList()
|
||||
);
|
||||
exit;
|
||||
}
|
||||
|
||||
if ($GLOBALS['PMA_Config']->isGitRevision()) {
|
||||
if (isset($_REQUEST['git_revision']) && $response->isAjax()) {
|
||||
PMA_printGitRevision();
|
||||
exit;
|
||||
}
|
||||
echo '<div id="is_git_revision"></div>';
|
||||
}
|
||||
|
||||
// Handles some variables that may have been sent by the calling script
|
||||
$GLOBALS['db'] = '';
|
||||
$GLOBALS['table'] = '';
|
||||
$show_query = '1';
|
||||
|
||||
// Any message to display?
|
||||
if (! empty($message)) {
|
||||
echo PMA\libraries\Util::getMessage($message);
|
||||
unset($message);
|
||||
}
|
||||
|
||||
$common_url_query = URL::getCommon();
|
||||
$mysql_cur_user_and_host = '';
|
||||
|
||||
// when $server > 0, a server has been chosen so we can display
|
||||
// all MySQL-related information
|
||||
if ($server > 0) {
|
||||
include 'libraries/server_common.inc.php';
|
||||
|
||||
// Use the verbose name of the server instead of the hostname
|
||||
// if a value is set
|
||||
$server_info = '';
|
||||
if (! empty($cfg['Server']['verbose'])) {
|
||||
$server_info .= htmlspecialchars($cfg['Server']['verbose']);
|
||||
if ($GLOBALS['cfg']['ShowServerInfo']) {
|
||||
$server_info .= ' (';
|
||||
}
|
||||
}
|
||||
if ($GLOBALS['cfg']['ShowServerInfo'] || empty($cfg['Server']['verbose'])) {
|
||||
$server_info .= $GLOBALS['dbi']->getHostInfo();
|
||||
}
|
||||
if (! empty($cfg['Server']['verbose']) && $GLOBALS['cfg']['ShowServerInfo']) {
|
||||
$server_info .= ')';
|
||||
}
|
||||
$mysql_cur_user_and_host = $GLOBALS['dbi']->fetchValue('SELECT USER();');
|
||||
|
||||
// should we add the port info here?
|
||||
$short_server_info = (!empty($GLOBALS['cfg']['Server']['verbose'])
|
||||
? $GLOBALS['cfg']['Server']['verbose']
|
||||
: $GLOBALS['cfg']['Server']['host']);
|
||||
}
|
||||
|
||||
echo '<div id="maincontainer">' , "\n";
|
||||
// Anchor for favorite tables synchronization.
|
||||
echo RecentFavoriteTable::getInstance('favorite')->getHtmlSyncFavoriteTables();
|
||||
echo '<div id="main_pane_left">';
|
||||
if ($server > 0 || count($cfg['Servers']) > 1
|
||||
) {
|
||||
if ($cfg['DBG']['demo']) {
|
||||
echo '<div class="group">';
|
||||
echo '<h2>' , __('phpMyAdmin Demo Server') , '</h2>';
|
||||
echo '<p style="margin: 0.5em 1em 0.5em 1em">';
|
||||
printf(
|
||||
__(
|
||||
'You are using the demo server. You can do anything here, but '
|
||||
. 'please do not change root, debian-sys-maint and pma users. '
|
||||
. 'More information is available at %s.'
|
||||
),
|
||||
'<a href="url.php?url=https://demo.phpmyadmin.net/" target="_blank" rel="noopener noreferrer">demo.phpmyadmin.net</a>'
|
||||
);
|
||||
echo '</p>';
|
||||
echo '</div>';
|
||||
}
|
||||
echo '<div class="group">';
|
||||
echo '<h2>' , __('General settings') , '</h2>';
|
||||
echo '<ul>';
|
||||
|
||||
/**
|
||||
* Displays the MySQL servers choice form
|
||||
*/
|
||||
if ($cfg['ServerDefault'] == 0
|
||||
|| (! $cfg['NavigationDisplayServers']
|
||||
&& (count($cfg['Servers']) > 1
|
||||
|| ($server == 0 && count($cfg['Servers']) == 1)))
|
||||
) {
|
||||
echo '<li id="li_select_server" class="no_bullets" >';
|
||||
include_once 'libraries/select_server.lib.php';
|
||||
echo PMA\libraries\Util::getImage('s_host.png') , " "
|
||||
, PMA_selectServer(true, true);
|
||||
echo '</li>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Displays the mysql server related links
|
||||
*/
|
||||
if ($server > 0) {
|
||||
include_once 'libraries/check_user_privileges.lib.php';
|
||||
|
||||
// Logout for advanced authentication
|
||||
if ($cfg['Server']['auth_type'] != 'config') {
|
||||
if ($cfg['ShowChgPassword']) {
|
||||
$conditional_class = 'ajax';
|
||||
PMA_printListItem(
|
||||
PMA\libraries\Util::getImage('s_passwd.png') . " " . __(
|
||||
'Change password'
|
||||
),
|
||||
'li_change_password',
|
||||
'user_password.php' . $common_url_query,
|
||||
null,
|
||||
null,
|
||||
'change_password_anchor',
|
||||
"no_bullets",
|
||||
$conditional_class
|
||||
);
|
||||
}
|
||||
} // end if
|
||||
echo ' <li id="li_select_mysql_collation" class="no_bullets" >';
|
||||
echo ' <form method="post" action="index.php">' , "\n"
|
||||
. URL::getHiddenInputs(null, null, 4, 'collation_connection')
|
||||
. ' <label for="select_collation_connection">' . "\n"
|
||||
. ' ' . PMA\libraries\Util::getImage('s_asci.png')
|
||||
. " " . __('Server connection collation') . "\n"
|
||||
// put the doc link in the form so that it appears on the same line
|
||||
. PMA\libraries\Util::showMySQLDocu('Charset-connection')
|
||||
. ': ' . "\n"
|
||||
. ' </label>' . "\n"
|
||||
|
||||
. Charsets::getCollationDropdownBox(
|
||||
'collation_connection',
|
||||
'select_collation_connection',
|
||||
$collation_connection,
|
||||
true,
|
||||
true
|
||||
)
|
||||
. ' </form>' . "\n"
|
||||
. ' </li>' . "\n";
|
||||
} // end of if ($server > 0)
|
||||
echo '</ul>';
|
||||
echo '</div>';
|
||||
}
|
||||
|
||||
echo '<div class="group">';
|
||||
echo '<h2>' , __('Appearance settings') , '</h2>';
|
||||
echo ' <ul>';
|
||||
|
||||
// Displays language selection combo
|
||||
$language_manager = LanguageManager::getInstance();
|
||||
if (empty($cfg['Lang']) && $language_manager->hasChoice()) {
|
||||
echo '<li id="li_select_lang" class="no_bullets">';
|
||||
|
||||
echo PMA\libraries\Util::getImage('s_lang.png') , " "
|
||||
, $language_manager->getSelectorDisplay();
|
||||
echo '</li>';
|
||||
}
|
||||
|
||||
// ThemeManager if available
|
||||
|
||||
if ($GLOBALS['cfg']['ThemeManager']) {
|
||||
echo '<li id="li_select_theme" class="no_bullets">';
|
||||
echo PMA\libraries\Util::getImage('s_theme.png') , " "
|
||||
, ThemeManager::getInstance()->getHtmlSelectBox();
|
||||
echo '</li>';
|
||||
}
|
||||
echo '<li id="li_select_fontsize">';
|
||||
echo PMA\libraries\Config::getFontsizeForm();
|
||||
echo '</li>';
|
||||
|
||||
echo '</ul>';
|
||||
|
||||
// User preferences
|
||||
|
||||
if ($server > 0) {
|
||||
echo '<ul>';
|
||||
PMA_printListItem(
|
||||
PMA\libraries\Util::getImage('b_tblops.png') . " " . __(
|
||||
'More settings'
|
||||
),
|
||||
'li_user_preferences',
|
||||
'prefs_manage.php' . $common_url_query,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
"no_bullets"
|
||||
);
|
||||
echo '</ul>';
|
||||
}
|
||||
|
||||
echo '</div>';
|
||||
|
||||
|
||||
echo '</div>';
|
||||
echo '<div id="main_pane_right">';
|
||||
|
||||
|
||||
if ($server > 0 && $GLOBALS['cfg']['ShowServerInfo']) {
|
||||
|
||||
echo '<div class="group">';
|
||||
echo '<h2>' , __('Database server') , '</h2>';
|
||||
echo '<ul>' , "\n";
|
||||
PMA_printListItem(
|
||||
__('Server:') . ' ' . $server_info,
|
||||
'li_server_info'
|
||||
);
|
||||
PMA_printListItem(
|
||||
__('Server type:') . ' ' . PMA\libraries\Util::getServerType(),
|
||||
'li_server_type'
|
||||
);
|
||||
PMA_printListItem(
|
||||
__('Server version:')
|
||||
. ' '
|
||||
. PMA_MYSQL_STR_VERSION . ' - ' . PMA_MYSQL_VERSION_COMMENT,
|
||||
'li_server_version'
|
||||
);
|
||||
PMA_printListItem(
|
||||
__('Protocol version:') . ' ' . $GLOBALS['dbi']->getProtoInfo(),
|
||||
'li_mysql_proto'
|
||||
);
|
||||
PMA_printListItem(
|
||||
__('User:') . ' ' . htmlspecialchars($mysql_cur_user_and_host),
|
||||
'li_user_info'
|
||||
);
|
||||
|
||||
echo ' <li id="li_select_mysql_charset">';
|
||||
echo ' ' , __('Server charset:') , ' '
|
||||
. ' <span lang="en" dir="ltr">';
|
||||
$unicode = Charsets::$mysql_charset_map['utf-8'];
|
||||
$charsets = Charsets::getMySQLCharsetsDescriptions();
|
||||
echo ' ' , $charsets[$unicode], ' (' . $unicode, ')';
|
||||
echo ' </span>'
|
||||
. ' </li>'
|
||||
. ' </ul>'
|
||||
. ' </div>';
|
||||
}
|
||||
|
||||
if ($GLOBALS['cfg']['ShowServerInfo'] || $GLOBALS['cfg']['ShowPhpInfo']) {
|
||||
echo '<div class="group">';
|
||||
echo '<h2>' , __('Web server') , '</h2>';
|
||||
echo '<ul>';
|
||||
if ($GLOBALS['cfg']['ShowServerInfo']) {
|
||||
PMA_printListItem($_SERVER['SERVER_SOFTWARE'], 'li_web_server_software');
|
||||
|
||||
if ($server > 0) {
|
||||
$client_version_str = $GLOBALS['dbi']->getClientInfo();
|
||||
if (preg_match('#\d+\.\d+\.\d+#', $client_version_str)) {
|
||||
$client_version_str = 'libmysql - ' . $client_version_str;
|
||||
}
|
||||
PMA_printListItem(
|
||||
__('Database client version:') . ' ' . $client_version_str,
|
||||
'li_mysql_client_version'
|
||||
);
|
||||
|
||||
$php_ext_string = __('PHP extension:') . ' ';
|
||||
|
||||
$extensions = PMA\libraries\Util::listPHPExtensions();
|
||||
|
||||
foreach ($extensions as $extension) {
|
||||
$php_ext_string .= ' ' . $extension
|
||||
. PMA\libraries\Util::showPHPDocu('book.' . $extension . '.php');
|
||||
}
|
||||
|
||||
PMA_printListItem(
|
||||
$php_ext_string,
|
||||
'li_used_php_extension'
|
||||
);
|
||||
|
||||
$php_version_string = __('PHP version:') . ' ' . phpversion();
|
||||
|
||||
PMA_printListItem(
|
||||
$php_version_string,
|
||||
'li_used_php_version'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if ($cfg['ShowPhpInfo']) {
|
||||
PMA_printListItem(
|
||||
__('Show PHP information'),
|
||||
'li_phpinfo',
|
||||
'phpinfo.php' . $common_url_query,
|
||||
null,
|
||||
'_blank'
|
||||
);
|
||||
}
|
||||
echo ' </ul>';
|
||||
echo ' </div>';
|
||||
}
|
||||
|
||||
echo '<div class="group pmagroup">';
|
||||
echo '<h2>phpMyAdmin</h2>';
|
||||
echo '<ul>';
|
||||
$class = null;
|
||||
if ($GLOBALS['cfg']['VersionCheck']) {
|
||||
$class = 'jsversioncheck';
|
||||
}
|
||||
PMA_printListItem(
|
||||
__('Version information:') . ' <span class="version">' . PMA_VERSION . '</span>',
|
||||
'li_pma_version',
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
$class
|
||||
);
|
||||
PMA_printListItem(
|
||||
__('Documentation'),
|
||||
'li_pma_docs',
|
||||
PMA\libraries\Util::getDocuLink('index'),
|
||||
null,
|
||||
'_blank'
|
||||
);
|
||||
|
||||
// does not work if no target specified, don't know why
|
||||
PMA_printListItem(
|
||||
__('Official Homepage'),
|
||||
'li_pma_homepage',
|
||||
PMA_linkURL('https://www.phpmyadmin.net/'),
|
||||
null,
|
||||
'_blank'
|
||||
);
|
||||
PMA_printListItem(
|
||||
__('Contribute'),
|
||||
'li_pma_contribute',
|
||||
PMA_linkURL('https://www.phpmyadmin.net/contribute/'),
|
||||
null,
|
||||
'_blank'
|
||||
);
|
||||
PMA_printListItem(
|
||||
__('Get support'),
|
||||
'li_pma_support',
|
||||
PMA_linkURL('https://www.phpmyadmin.net/support/'),
|
||||
null,
|
||||
'_blank'
|
||||
);
|
||||
PMA_printListItem(
|
||||
__('List of changes'),
|
||||
'li_pma_changes',
|
||||
'changelog.php' . URL::getCommon(),
|
||||
null,
|
||||
'_blank'
|
||||
);
|
||||
PMA_printListItem(
|
||||
__('License'),
|
||||
'li_pma_license',
|
||||
'license.php' . URL::getCommon(),
|
||||
null,
|
||||
'_blank'
|
||||
);
|
||||
echo ' </ul>';
|
||||
echo ' </div>';
|
||||
|
||||
echo '</div>';
|
||||
|
||||
echo '</div>';
|
||||
|
||||
/**
|
||||
* mbstring is used for handling multibytes inside parser, so it is good
|
||||
* to tell user something might be broken without it, see bug #1063149.
|
||||
*/
|
||||
if (! @extension_loaded('mbstring')) {
|
||||
trigger_error(
|
||||
__(
|
||||
'The mbstring PHP extension was not found and you seem to be using'
|
||||
. ' a multibyte charset. Without the mbstring extension phpMyAdmin'
|
||||
. ' is unable to split strings correctly and it may result in'
|
||||
. ' unexpected results.'
|
||||
),
|
||||
E_USER_WARNING
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Missing functionality
|
||||
*/
|
||||
if (! extension_loaded('curl') && ! ini_get('allow_url_fopen')) {
|
||||
trigger_error(
|
||||
__(
|
||||
'The curl extension was not found and allow_url_fopen is '
|
||||
. 'disabled. Due to this some features such as error reporting '
|
||||
. 'or version check are disabled.'
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
if ($cfg['LoginCookieValidityDisableWarning'] == false) {
|
||||
/**
|
||||
* Check whether session.gc_maxlifetime limits session validity.
|
||||
*/
|
||||
$gc_time = (int)@ini_get('session.gc_maxlifetime');
|
||||
if ($gc_time < $GLOBALS['cfg']['LoginCookieValidity'] ) {
|
||||
trigger_error(
|
||||
__(
|
||||
'Your PHP parameter [a@https://secure.php.net/manual/en/session.' .
|
||||
'configuration.php#ini.session.gc-maxlifetime@_blank]session.' .
|
||||
'gc_maxlifetime[/a] is lower than cookie validity configured ' .
|
||||
'in phpMyAdmin, because of this, your login might expire sooner ' .
|
||||
'than configured in phpMyAdmin.'
|
||||
),
|
||||
E_USER_WARNING
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether LoginCookieValidity is limited by LoginCookieStore.
|
||||
*/
|
||||
if ($GLOBALS['cfg']['LoginCookieStore'] != 0
|
||||
&& $GLOBALS['cfg']['LoginCookieStore'] < $GLOBALS['cfg']['LoginCookieValidity']
|
||||
) {
|
||||
trigger_error(
|
||||
__(
|
||||
'Login cookie store is lower than cookie validity configured in ' .
|
||||
'phpMyAdmin, because of this, your login will expire sooner than ' .
|
||||
'configured in phpMyAdmin.'
|
||||
),
|
||||
E_USER_WARNING
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if user does not have defined blowfish secret and it is being used.
|
||||
*/
|
||||
if (! empty($_SESSION['encryption_key'])) {
|
||||
if (empty($GLOBALS['cfg']['blowfish_secret'])) {
|
||||
trigger_error(
|
||||
__(
|
||||
'The configuration file now needs a secret passphrase (blowfish_secret).'
|
||||
),
|
||||
E_USER_WARNING
|
||||
);
|
||||
} elseif (strlen($GLOBALS['cfg']['blowfish_secret']) < 32) {
|
||||
trigger_error(
|
||||
__(
|
||||
'The secret passphrase in configuration (blowfish_secret) is too short.'
|
||||
),
|
||||
E_USER_WARNING
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check for existence of config directory which should not exist in
|
||||
* production environment.
|
||||
*/
|
||||
if (@file_exists('config')) {
|
||||
trigger_error(
|
||||
__(
|
||||
'Directory [code]config[/code], which is used by the setup script, ' .
|
||||
'still exists in your phpMyAdmin directory. It is strongly ' .
|
||||
'recommended to remove it once phpMyAdmin has been configured. ' .
|
||||
'Otherwise the security of your server may be compromised by ' .
|
||||
'unauthorized people downloading your configuration.'
|
||||
),
|
||||
E_USER_WARNING
|
||||
);
|
||||
}
|
||||
|
||||
if ($server > 0) {
|
||||
$cfgRelation = PMA_getRelationsParam();
|
||||
if (! $cfgRelation['allworks']
|
||||
&& $cfg['PmaNoRelation_DisableWarning'] == false
|
||||
) {
|
||||
$msg_text = __(
|
||||
'The phpMyAdmin configuration storage is not completely '
|
||||
. 'configured, some extended features have been deactivated. '
|
||||
. '%sFind out why%s. '
|
||||
);
|
||||
if ($cfg['ZeroConf'] == true) {
|
||||
$msg_text .= '<br>' .
|
||||
__(
|
||||
'Or alternately go to \'Operations\' tab of any database '
|
||||
. 'to set it up there.'
|
||||
);
|
||||
}
|
||||
$msg = PMA\libraries\Message::notice($msg_text);
|
||||
$msg->addParamHtml('<a href="./chk_rel.php' . $common_url_query . '">');
|
||||
$msg->addParamHtml('</a>');
|
||||
/* Show error if user has configured something, notice elsewhere */
|
||||
if (!empty($cfg['Servers'][$server]['pmadb'])) {
|
||||
$msg->isError(true);
|
||||
}
|
||||
$msg->display();
|
||||
} // end if
|
||||
}
|
||||
|
||||
/**
|
||||
* Warning about Suhosin only if its simulation mode is not enabled
|
||||
*/
|
||||
if ($cfg['SuhosinDisableWarning'] == false
|
||||
&& @ini_get('suhosin.request.max_value_length')
|
||||
&& @ini_get('suhosin.simulation') == '0'
|
||||
) {
|
||||
trigger_error(
|
||||
sprintf(
|
||||
__(
|
||||
'Server running with Suhosin. Please refer to %sdocumentation%s ' .
|
||||
'for possible issues.'
|
||||
),
|
||||
'[doc@faq1-38]',
|
||||
'[/doc]'
|
||||
),
|
||||
E_USER_WARNING
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Warning about incomplete translations.
|
||||
*
|
||||
* The data file is created while creating release by ./scripts/remove-incomplete-mo
|
||||
*/
|
||||
if (@file_exists('libraries/language_stats.inc.php')) {
|
||||
include 'libraries/language_stats.inc.php';
|
||||
/*
|
||||
* This message is intentionally not translated, because we're
|
||||
* handling incomplete translations here and focus on english
|
||||
* speaking users.
|
||||
*/
|
||||
if (isset($GLOBALS['language_stats'][$lang])
|
||||
&& $GLOBALS['language_stats'][$lang] < $cfg['TranslationWarningThreshold']
|
||||
) {
|
||||
trigger_error(
|
||||
'You are using an incomplete translation, please help to make it '
|
||||
. 'better by [a@https://www.phpmyadmin.net/translate/'
|
||||
. '@_blank]contributing[/a].',
|
||||
E_USER_NOTICE
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* prints list item for main page
|
||||
*
|
||||
* @param string $name displayed text
|
||||
* @param string $listId id, used for css styles
|
||||
* @param string $url make item as link with $url as target
|
||||
* @param string $mysql_help_page display a link to MySQL's manual
|
||||
* @param string $target special target for $url
|
||||
* @param string $a_id id for the anchor,
|
||||
* used for jQuery to hook in functions
|
||||
* @param string $class class for the li element
|
||||
* @param string $a_class class for the anchor element
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function PMA_printListItem($name, $listId = null, $url = null,
|
||||
$mysql_help_page = null, $target = null, $a_id = null, $class = null,
|
||||
$a_class = null
|
||||
) {
|
||||
echo PMA\libraries\Template::get('list/item')
|
||||
->render(
|
||||
array(
|
||||
'content' => $name,
|
||||
'id' => $listId,
|
||||
'class' => $class,
|
||||
'url' => array(
|
||||
'href' => $url,
|
||||
'target' => $target,
|
||||
'id' => $a_id,
|
||||
'class' => $a_class,
|
||||
),
|
||||
'mysql_help_page' => $mysql_help_page,
|
||||
)
|
||||
);
|
||||
}
|
@ -1,19 +0,0 @@
|
||||
Copyright (C) 2016 by Marijn Haverbeke <marijnh@gmail.com> and others
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
@ -1,40 +0,0 @@
|
||||
CodeMirror.sqlLint = function(text, updateLinting, options, cm) {
|
||||
|
||||
// Skipping check if text box is empty.
|
||||
if(text.trim() == "") {
|
||||
updateLinting(cm, []);
|
||||
return;
|
||||
}
|
||||
|
||||
function handleResponse(response) {
|
||||
var found = [];
|
||||
for (var idx in response) {
|
||||
found.push({
|
||||
from: CodeMirror.Pos(
|
||||
response[idx].fromLine, response[idx].fromColumn
|
||||
),
|
||||
to: CodeMirror.Pos(
|
||||
response[idx].toLine, response[idx].toColumn
|
||||
),
|
||||
message: response[idx].message,
|
||||
severity : response[idx].severity
|
||||
});
|
||||
}
|
||||
|
||||
updateLinting(cm, found);
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
method: "POST",
|
||||
url: "lint.php",
|
||||
dataType: 'json',
|
||||
data: {
|
||||
sql_query: text,
|
||||
token: PMA_commonParams.get('token'),
|
||||
server: PMA_commonParams.get('server'),
|
||||
options: options.lintOptions,
|
||||
no_history: true,
|
||||
},
|
||||
success: handleResponse
|
||||
});
|
||||
}
|
@ -1,394 +0,0 @@
|
||||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||
|
||||
(function(mod) {
|
||||
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||
mod(require("../../lib/codemirror"));
|
||||
else if (typeof define == "function" && define.amd) // AMD
|
||||
define(["../../lib/codemirror"], mod);
|
||||
else // Plain browser env
|
||||
mod(CodeMirror);
|
||||
})(function(CodeMirror) {
|
||||
"use strict";
|
||||
|
||||
var htmlConfig = {
|
||||
autoSelfClosers: {'area': true, 'base': true, 'br': true, 'col': true, 'command': true,
|
||||
'embed': true, 'frame': true, 'hr': true, 'img': true, 'input': true,
|
||||
'keygen': true, 'link': true, 'meta': true, 'param': true, 'source': true,
|
||||
'track': true, 'wbr': true, 'menuitem': true},
|
||||
implicitlyClosed: {'dd': true, 'li': true, 'optgroup': true, 'option': true, 'p': true,
|
||||
'rp': true, 'rt': true, 'tbody': true, 'td': true, 'tfoot': true,
|
||||
'th': true, 'tr': true},
|
||||
contextGrabbers: {
|
||||
'dd': {'dd': true, 'dt': true},
|
||||
'dt': {'dd': true, 'dt': true},
|
||||
'li': {'li': true},
|
||||
'option': {'option': true, 'optgroup': true},
|
||||
'optgroup': {'optgroup': true},
|
||||
'p': {'address': true, 'article': true, 'aside': true, 'blockquote': true, 'dir': true,
|
||||
'div': true, 'dl': true, 'fieldset': true, 'footer': true, 'form': true,
|
||||
'h1': true, 'h2': true, 'h3': true, 'h4': true, 'h5': true, 'h6': true,
|
||||
'header': true, 'hgroup': true, 'hr': true, 'menu': true, 'nav': true, 'ol': true,
|
||||
'p': true, 'pre': true, 'section': true, 'table': true, 'ul': true},
|
||||
'rp': {'rp': true, 'rt': true},
|
||||
'rt': {'rp': true, 'rt': true},
|
||||
'tbody': {'tbody': true, 'tfoot': true},
|
||||
'td': {'td': true, 'th': true},
|
||||
'tfoot': {'tbody': true},
|
||||
'th': {'td': true, 'th': true},
|
||||
'thead': {'tbody': true, 'tfoot': true},
|
||||
'tr': {'tr': true}
|
||||
},
|
||||
doNotIndent: {"pre": true},
|
||||
allowUnquoted: true,
|
||||
allowMissing: true,
|
||||
caseFold: true
|
||||
}
|
||||
|
||||
var xmlConfig = {
|
||||
autoSelfClosers: {},
|
||||
implicitlyClosed: {},
|
||||
contextGrabbers: {},
|
||||
doNotIndent: {},
|
||||
allowUnquoted: false,
|
||||
allowMissing: false,
|
||||
caseFold: false
|
||||
}
|
||||
|
||||
CodeMirror.defineMode("xml", function(editorConf, config_) {
|
||||
var indentUnit = editorConf.indentUnit
|
||||
var config = {}
|
||||
var defaults = config_.htmlMode ? htmlConfig : xmlConfig
|
||||
for (var prop in defaults) config[prop] = defaults[prop]
|
||||
for (var prop in config_) config[prop] = config_[prop]
|
||||
|
||||
// Return variables for tokenizers
|
||||
var type, setStyle;
|
||||
|
||||
function inText(stream, state) {
|
||||
function chain(parser) {
|
||||
state.tokenize = parser;
|
||||
return parser(stream, state);
|
||||
}
|
||||
|
||||
var ch = stream.next();
|
||||
if (ch == "<") {
|
||||
if (stream.eat("!")) {
|
||||
if (stream.eat("[")) {
|
||||
if (stream.match("CDATA[")) return chain(inBlock("atom", "]]>"));
|
||||
else return null;
|
||||
} else if (stream.match("--")) {
|
||||
return chain(inBlock("comment", "-->"));
|
||||
} else if (stream.match("DOCTYPE", true, true)) {
|
||||
stream.eatWhile(/[\w\._\-]/);
|
||||
return chain(doctype(1));
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
} else if (stream.eat("?")) {
|
||||
stream.eatWhile(/[\w\._\-]/);
|
||||
state.tokenize = inBlock("meta", "?>");
|
||||
return "meta";
|
||||
} else {
|
||||
type = stream.eat("/") ? "closeTag" : "openTag";
|
||||
state.tokenize = inTag;
|
||||
return "tag bracket";
|
||||
}
|
||||
} else if (ch == "&") {
|
||||
var ok;
|
||||
if (stream.eat("#")) {
|
||||
if (stream.eat("x")) {
|
||||
ok = stream.eatWhile(/[a-fA-F\d]/) && stream.eat(";");
|
||||
} else {
|
||||
ok = stream.eatWhile(/[\d]/) && stream.eat(";");
|
||||
}
|
||||
} else {
|
||||
ok = stream.eatWhile(/[\w\.\-:]/) && stream.eat(";");
|
||||
}
|
||||
return ok ? "atom" : "error";
|
||||
} else {
|
||||
stream.eatWhile(/[^&<]/);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
inText.isInText = true;
|
||||
|
||||
function inTag(stream, state) {
|
||||
var ch = stream.next();
|
||||
if (ch == ">" || (ch == "/" && stream.eat(">"))) {
|
||||
state.tokenize = inText;
|
||||
type = ch == ">" ? "endTag" : "selfcloseTag";
|
||||
return "tag bracket";
|
||||
} else if (ch == "=") {
|
||||
type = "equals";
|
||||
return null;
|
||||
} else if (ch == "<") {
|
||||
state.tokenize = inText;
|
||||
state.state = baseState;
|
||||
state.tagName = state.tagStart = null;
|
||||
var next = state.tokenize(stream, state);
|
||||
return next ? next + " tag error" : "tag error";
|
||||
} else if (/[\'\"]/.test(ch)) {
|
||||
state.tokenize = inAttribute(ch);
|
||||
state.stringStartCol = stream.column();
|
||||
return state.tokenize(stream, state);
|
||||
} else {
|
||||
stream.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/);
|
||||
return "word";
|
||||
}
|
||||
}
|
||||
|
||||
function inAttribute(quote) {
|
||||
var closure = function(stream, state) {
|
||||
while (!stream.eol()) {
|
||||
if (stream.next() == quote) {
|
||||
state.tokenize = inTag;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return "string";
|
||||
};
|
||||
closure.isInAttribute = true;
|
||||
return closure;
|
||||
}
|
||||
|
||||
function inBlock(style, terminator) {
|
||||
return function(stream, state) {
|
||||
while (!stream.eol()) {
|
||||
if (stream.match(terminator)) {
|
||||
state.tokenize = inText;
|
||||
break;
|
||||
}
|
||||
stream.next();
|
||||
}
|
||||
return style;
|
||||
};
|
||||
}
|
||||
function doctype(depth) {
|
||||
return function(stream, state) {
|
||||
var ch;
|
||||
while ((ch = stream.next()) != null) {
|
||||
if (ch == "<") {
|
||||
state.tokenize = doctype(depth + 1);
|
||||
return state.tokenize(stream, state);
|
||||
} else if (ch == ">") {
|
||||
if (depth == 1) {
|
||||
state.tokenize = inText;
|
||||
break;
|
||||
} else {
|
||||
state.tokenize = doctype(depth - 1);
|
||||
return state.tokenize(stream, state);
|
||||
}
|
||||
}
|
||||
}
|
||||
return "meta";
|
||||
};
|
||||
}
|
||||
|
||||
function Context(state, tagName, startOfLine) {
|
||||
this.prev = state.context;
|
||||
this.tagName = tagName;
|
||||
this.indent = state.indented;
|
||||
this.startOfLine = startOfLine;
|
||||
if (config.doNotIndent.hasOwnProperty(tagName) || (state.context && state.context.noIndent))
|
||||
this.noIndent = true;
|
||||
}
|
||||
function popContext(state) {
|
||||
if (state.context) state.context = state.context.prev;
|
||||
}
|
||||
function maybePopContext(state, nextTagName) {
|
||||
var parentTagName;
|
||||
while (true) {
|
||||
if (!state.context) {
|
||||
return;
|
||||
}
|
||||
parentTagName = state.context.tagName;
|
||||
if (!config.contextGrabbers.hasOwnProperty(parentTagName) ||
|
||||
!config.contextGrabbers[parentTagName].hasOwnProperty(nextTagName)) {
|
||||
return;
|
||||
}
|
||||
popContext(state);
|
||||
}
|
||||
}
|
||||
|
||||
function baseState(type, stream, state) {
|
||||
if (type == "openTag") {
|
||||
state.tagStart = stream.column();
|
||||
return tagNameState;
|
||||
} else if (type == "closeTag") {
|
||||
return closeTagNameState;
|
||||
} else {
|
||||
return baseState;
|
||||
}
|
||||
}
|
||||
function tagNameState(type, stream, state) {
|
||||
if (type == "word") {
|
||||
state.tagName = stream.current();
|
||||
setStyle = "tag";
|
||||
return attrState;
|
||||
} else {
|
||||
setStyle = "error";
|
||||
return tagNameState;
|
||||
}
|
||||
}
|
||||
function closeTagNameState(type, stream, state) {
|
||||
if (type == "word") {
|
||||
var tagName = stream.current();
|
||||
if (state.context && state.context.tagName != tagName &&
|
||||
config.implicitlyClosed.hasOwnProperty(state.context.tagName))
|
||||
popContext(state);
|
||||
if ((state.context && state.context.tagName == tagName) || config.matchClosing === false) {
|
||||
setStyle = "tag";
|
||||
return closeState;
|
||||
} else {
|
||||
setStyle = "tag error";
|
||||
return closeStateErr;
|
||||
}
|
||||
} else {
|
||||
setStyle = "error";
|
||||
return closeStateErr;
|
||||
}
|
||||
}
|
||||
|
||||
function closeState(type, _stream, state) {
|
||||
if (type != "endTag") {
|
||||
setStyle = "error";
|
||||
return closeState;
|
||||
}
|
||||
popContext(state);
|
||||
return baseState;
|
||||
}
|
||||
function closeStateErr(type, stream, state) {
|
||||
setStyle = "error";
|
||||
return closeState(type, stream, state);
|
||||
}
|
||||
|
||||
function attrState(type, _stream, state) {
|
||||
if (type == "word") {
|
||||
setStyle = "attribute";
|
||||
return attrEqState;
|
||||
} else if (type == "endTag" || type == "selfcloseTag") {
|
||||
var tagName = state.tagName, tagStart = state.tagStart;
|
||||
state.tagName = state.tagStart = null;
|
||||
if (type == "selfcloseTag" ||
|
||||
config.autoSelfClosers.hasOwnProperty(tagName)) {
|
||||
maybePopContext(state, tagName);
|
||||
} else {
|
||||
maybePopContext(state, tagName);
|
||||
state.context = new Context(state, tagName, tagStart == state.indented);
|
||||
}
|
||||
return baseState;
|
||||
}
|
||||
setStyle = "error";
|
||||
return attrState;
|
||||
}
|
||||
function attrEqState(type, stream, state) {
|
||||
if (type == "equals") return attrValueState;
|
||||
if (!config.allowMissing) setStyle = "error";
|
||||
return attrState(type, stream, state);
|
||||
}
|
||||
function attrValueState(type, stream, state) {
|
||||
if (type == "string") return attrContinuedState;
|
||||
if (type == "word" && config.allowUnquoted) {setStyle = "string"; return attrState;}
|
||||
setStyle = "error";
|
||||
return attrState(type, stream, state);
|
||||
}
|
||||
function attrContinuedState(type, stream, state) {
|
||||
if (type == "string") return attrContinuedState;
|
||||
return attrState(type, stream, state);
|
||||
}
|
||||
|
||||
return {
|
||||
startState: function(baseIndent) {
|
||||
var state = {tokenize: inText,
|
||||
state: baseState,
|
||||
indented: baseIndent || 0,
|
||||
tagName: null, tagStart: null,
|
||||
context: null}
|
||||
if (baseIndent != null) state.baseIndent = baseIndent
|
||||
return state
|
||||
},
|
||||
|
||||
token: function(stream, state) {
|
||||
if (!state.tagName && stream.sol())
|
||||
state.indented = stream.indentation();
|
||||
|
||||
if (stream.eatSpace()) return null;
|
||||
type = null;
|
||||
var style = state.tokenize(stream, state);
|
||||
if ((style || type) && style != "comment") {
|
||||
setStyle = null;
|
||||
state.state = state.state(type || style, stream, state);
|
||||
if (setStyle)
|
||||
style = setStyle == "error" ? style + " error" : setStyle;
|
||||
}
|
||||
return style;
|
||||
},
|
||||
|
||||
indent: function(state, textAfter, fullLine) {
|
||||
var context = state.context;
|
||||
// Indent multi-line strings (e.g. css).
|
||||
if (state.tokenize.isInAttribute) {
|
||||
if (state.tagStart == state.indented)
|
||||
return state.stringStartCol + 1;
|
||||
else
|
||||
return state.indented + indentUnit;
|
||||
}
|
||||
if (context && context.noIndent) return CodeMirror.Pass;
|
||||
if (state.tokenize != inTag && state.tokenize != inText)
|
||||
return fullLine ? fullLine.match(/^(\s*)/)[0].length : 0;
|
||||
// Indent the starts of attribute names.
|
||||
if (state.tagName) {
|
||||
if (config.multilineTagIndentPastTag !== false)
|
||||
return state.tagStart + state.tagName.length + 2;
|
||||
else
|
||||
return state.tagStart + indentUnit * (config.multilineTagIndentFactor || 1);
|
||||
}
|
||||
if (config.alignCDATA && /<!\[CDATA\[/.test(textAfter)) return 0;
|
||||
var tagAfter = textAfter && /^<(\/)?([\w_:\.-]*)/.exec(textAfter);
|
||||
if (tagAfter && tagAfter[1]) { // Closing tag spotted
|
||||
while (context) {
|
||||
if (context.tagName == tagAfter[2]) {
|
||||
context = context.prev;
|
||||
break;
|
||||
} else if (config.implicitlyClosed.hasOwnProperty(context.tagName)) {
|
||||
context = context.prev;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (tagAfter) { // Opening tag spotted
|
||||
while (context) {
|
||||
var grabbers = config.contextGrabbers[context.tagName];
|
||||
if (grabbers && grabbers.hasOwnProperty(tagAfter[2]))
|
||||
context = context.prev;
|
||||
else
|
||||
break;
|
||||
}
|
||||
}
|
||||
while (context && context.prev && !context.startOfLine)
|
||||
context = context.prev;
|
||||
if (context) return context.indent + indentUnit;
|
||||
else return state.baseIndent || 0;
|
||||
},
|
||||
|
||||
electricInput: /<\/[\s\w:]+>$/,
|
||||
blockCommentStart: "<!--",
|
||||
blockCommentEnd: "-->",
|
||||
|
||||
configuration: config.htmlMode ? "html" : "xml",
|
||||
helperType: config.htmlMode ? "html" : "xml",
|
||||
|
||||
skipAttribute: function(state) {
|
||||
if (state.state == attrValueState)
|
||||
state.state = attrState
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
CodeMirror.defineMIME("text/xml", "xml");
|
||||
CodeMirror.defineMIME("application/xml", "xml");
|
||||
if (!CodeMirror.mimeModes.hasOwnProperty("text/html"))
|
||||
CodeMirror.defineMIME("text/html", {name: "xml", htmlMode: true});
|
||||
|
||||
});
|
1534
.devilbox/www/htdocs/vendor/phpmyadmin-4.7/js/console.js
vendored
@ -1,14 +0,0 @@
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* Conditionally included if framing is not allowed
|
||||
*/
|
||||
if (self == top) {
|
||||
var style_element = document.getElementById("cfs-style");
|
||||
// check if style_element has already been removed
|
||||
// to avoid frequently reported js error
|
||||
if (typeof(style_element) != 'undefined' && style_element != null) {
|
||||
style_element.parentNode.removeChild(style_element);
|
||||
}
|
||||
} else {
|
||||
top.location = self.location;
|
||||
}
|
@ -1,238 +0,0 @@
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* @fileoverview events handling from central columns page
|
||||
* @name Central columns
|
||||
*
|
||||
* @requires jQuery
|
||||
*/
|
||||
|
||||
/**
|
||||
* AJAX scripts for db_central_columns.php
|
||||
*
|
||||
* Actions ajaxified here:
|
||||
* Inline Edit and save of a result row
|
||||
* Delete a row
|
||||
* Multiple edit and delete option
|
||||
*
|
||||
*/
|
||||
|
||||
AJAX.registerTeardown('db_central_columns.js', function () {
|
||||
$(".edit").unbind('click');
|
||||
$(".edit_save_form").unbind('click');
|
||||
$('.edit_cancel_form').unbind('click');
|
||||
$(".del_row").unbind('click');
|
||||
$(document).off("keyup", ".filter_rows");
|
||||
$('.edit_cancel_form').unbind('click');
|
||||
$('#table-select').unbind('change');
|
||||
$('#column-select').unbind('change');
|
||||
$("#add_col_div").find(">a").unbind('click');
|
||||
$('#add_new').unbind('submit');
|
||||
$('#multi_edit_central_columns').unbind('submit');
|
||||
$("select.default_type").unbind('change');
|
||||
$("button[name='delete_central_columns']").unbind('click');
|
||||
$("button[name='edit_central_columns']").unbind('click');
|
||||
});
|
||||
|
||||
AJAX.registerOnload('db_central_columns.js', function () {
|
||||
$('#tableslistcontainer input,#tableslistcontainer select,#tableslistcontainer .default_value,#tableslistcontainer .open_enum_editor').hide();
|
||||
$('#tableslistcontainer').find('.checkall').show();
|
||||
$('#tableslistcontainer').find('.checkall_box').show();
|
||||
if ($('#table_columns').find('tbody tr').length > 0) {
|
||||
$("#table_columns").tablesorter({
|
||||
headers: {
|
||||
0: {sorter: false},
|
||||
1: {sorter: false}, // hidden column
|
||||
4: {sorter: "integer"}
|
||||
}
|
||||
});
|
||||
}
|
||||
$('#tableslistcontainer').find('button[name="delete_central_columns"]').click(function(event){
|
||||
event.preventDefault();
|
||||
var multi_delete_columns = $('.checkall:checkbox:checked').serialize();
|
||||
if(multi_delete_columns === ''){
|
||||
PMA_ajaxShowMessage(PMA_messages.strRadioUnchecked);
|
||||
return false;
|
||||
}
|
||||
PMA_ajaxShowMessage();
|
||||
$("#del_col_name").val(multi_delete_columns);
|
||||
$("#del_form").submit();
|
||||
});
|
||||
$('#tableslistcontainer').find('button[name="edit_central_columns"]').click(function(event){
|
||||
event.preventDefault();
|
||||
var editColumnList = $('.checkall:checkbox:checked').serialize();
|
||||
if(editColumnList === ''){
|
||||
PMA_ajaxShowMessage(PMA_messages.strRadioUnchecked);
|
||||
return false;
|
||||
}
|
||||
var editColumnData = editColumnList+ '&edit_central_columns_page=true&ajax_request=true&ajax_page_request=true&token='+PMA_commonParams.get('token')+'&db='+PMA_commonParams.get('db');
|
||||
PMA_ajaxShowMessage();
|
||||
AJAX.source = $(this);
|
||||
$.get('db_central_columns.php', editColumnData, AJAX.responseHandler);
|
||||
});
|
||||
$('#multi_edit_central_columns').submit(function(event){
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
var multi_column_edit_data = $("#multi_edit_central_columns").serialize()+'&multi_edit_central_column_save=true&ajax_request=true&ajax_page_request=true&token='+PMA_commonParams.get('token')+'&db='+PMA_commonParams.get('db');
|
||||
PMA_ajaxShowMessage();
|
||||
AJAX.source = $(this);
|
||||
$.post('db_central_columns.php', multi_column_edit_data, AJAX.responseHandler);
|
||||
});
|
||||
$('#add_new').find('td').each(function(){
|
||||
if ($(this).attr('name') !== 'undefined') {
|
||||
$(this).find('input,select:first').attr('name', $(this).attr('name'));
|
||||
}
|
||||
});
|
||||
$("#field_0_0").attr('required','required');
|
||||
$('#add_new input[type="text"], #add_new input[type="number"], #add_new select')
|
||||
.css({
|
||||
'width' : '10em',
|
||||
'-moz-box-sizing' : 'border-box'
|
||||
});
|
||||
window.scrollTo(0, 0);
|
||||
$(document).on("keyup", ".filter_rows", function () {
|
||||
// get the column names
|
||||
var cols = $('th.column_heading').map(function () {
|
||||
return $.trim($(this).text());
|
||||
}).get();
|
||||
$.uiTableFilter($("#table_columns"), $(this).val(), cols, null, "td span");
|
||||
});
|
||||
$('.edit').click(function() {
|
||||
var rownum = $(this).parent().data('rownum');
|
||||
$('#save_' + rownum).show();
|
||||
$(this).hide();
|
||||
$('#f_' + rownum + ' td span').hide();
|
||||
$('#f_' + rownum + ' input, #f_' + rownum + ' select, #f_' + rownum + ' .open_enum_editor').show();
|
||||
var attribute_val = $('#f_' + rownum + ' td[name=col_attribute] span').html();
|
||||
$('#f_' + rownum + ' select[name=field_attribute\\['+ rownum +'\\] ] option[value="' + attribute_val + '"]').attr("selected","selected");
|
||||
if($('#f_' + rownum + ' .default_type').val() === 'USER_DEFINED') {
|
||||
$('#f_' + rownum + ' .default_type').siblings('.default_value').show();
|
||||
} else {
|
||||
$('#f_' + rownum + ' .default_type').siblings('.default_value').hide();
|
||||
}
|
||||
});
|
||||
$(".del_row").click(function (event) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
var $td = $(this);
|
||||
var question = PMA_messages.strDeleteCentralColumnWarning;
|
||||
$td.PMA_confirm(question, null, function (url) {
|
||||
var rownum = $td.data('rownum');
|
||||
$("#del_col_name").val("selected_fld%5B%5D="+$('#checkbox_row_' + rownum ).val());
|
||||
$("#del_form").submit();
|
||||
});
|
||||
});
|
||||
$('.edit_cancel_form').click(function(event) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
var rownum = $(this).data('rownum');
|
||||
$('#save_' + rownum).hide();
|
||||
$('#edit_' + rownum).show();
|
||||
$('#f_' + rownum + ' td span').show();
|
||||
$('#f_' + rownum + ' input, #f_' + rownum + ' select,#f_'+rownum+' .default_value, #f_' + rownum + ' .open_enum_editor').hide();
|
||||
$('#tableslistcontainer').find('.checkall').show();
|
||||
});
|
||||
$('.edit_save_form').click(function(event) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
var rownum = $(this).data('rownum');
|
||||
$('#f_' + rownum + ' td').each(function() {
|
||||
if ($(this).attr('name') !== 'undefined') {
|
||||
$(this).find(':input[type!="hidden"],select:first')
|
||||
.attr('name', $(this).attr('name'));
|
||||
}
|
||||
});
|
||||
|
||||
if($('#f_' + rownum + ' .default_type').val() === 'USER_DEFINED') {
|
||||
$('#f_' + rownum + ' .default_type').attr('name','col_default_sel');
|
||||
} else {
|
||||
$('#f_' + rownum + ' .default_value').attr('name','col_default_val');
|
||||
}
|
||||
|
||||
var datastring = $('#f_' + rownum + ' :input').serialize();
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: "db_central_columns.php",
|
||||
data: datastring+'&ajax_request=true',
|
||||
dataType: "json",
|
||||
success: function(data) {
|
||||
if (data.message !== '1') {
|
||||
PMA_ajaxShowMessage(
|
||||
'<div class="error">' +
|
||||
data.message +
|
||||
'</div>',
|
||||
false
|
||||
);
|
||||
} else {
|
||||
$('#f_' + rownum + ' td[name=col_name] span').text($('#f_' + rownum + ' input[name=col_name]').val()).html();
|
||||
$('#f_' + rownum + ' td[name=col_type] span').text($('#f_' + rownum + ' select[name=col_type]').val()).html();
|
||||
$('#f_' + rownum + ' td[name=col_length] span').text($('#f_' + rownum + ' input[name=col_length]').val()).html();
|
||||
$('#f_' + rownum + ' td[name=collation] span').text($('#f_' + rownum + ' select[name=collation]').val()).html();
|
||||
$('#f_' + rownum + ' td[name=col_attribute] span').text($('#f_' + rownum + ' select[name=col_attribute]').val()).html();
|
||||
$('#f_' + rownum + ' td[name=col_isNull] span').text($('#f_' + rownum +' input[name=col_isNull]').is(":checked")?"Yes":"No").html();
|
||||
$('#f_' + rownum + ' td[name=col_extra] span').text($('#f_' + rownum + ' input[name=col_extra]').is(":checked") ? "auto_increment" : "").html();
|
||||
$('#f_' + rownum + ' td[name=col_default] span').text($('#f_' + rownum + ' :input[name=col_default]').val()).html();
|
||||
}
|
||||
$('#save_' + rownum).hide();
|
||||
$('#edit_' + rownum).show();
|
||||
$('#f_' + rownum + ' td span').show();
|
||||
$('#f_' + rownum + ' input, #f_' + rownum + ' select,#f_' + rownum + ' .default_value, #f_' + rownum + ' .open_enum_editor').hide();
|
||||
$('#tableslistcontainer').find('.checkall').show();
|
||||
},
|
||||
error: function() {
|
||||
PMA_ajaxShowMessage(
|
||||
'<div class="error">' +
|
||||
PMA_messages.strErrorProcessingRequest +
|
||||
'</div>',
|
||||
false
|
||||
);
|
||||
}
|
||||
});
|
||||
});
|
||||
$('#table-select').change(function(e) {
|
||||
var selectvalue = $(this).val();
|
||||
var default_column_select = $('#column-select').find('option:first');
|
||||
var href = "db_central_columns.php";
|
||||
var params = {
|
||||
'ajax_request' : true,
|
||||
'token' : PMA_commonParams.get('token'),
|
||||
'server' : PMA_commonParams.get('server'),
|
||||
'db' : PMA_commonParams.get('db'),
|
||||
'selectedTable' : selectvalue,
|
||||
'populateColumns' : true
|
||||
};
|
||||
$('#column-select').html('<option value="">' + PMA_messages.strLoading + '</option>');
|
||||
if (selectvalue !== "") {
|
||||
$.post(href, params, function (data) {
|
||||
$('#column-select').empty().append(default_column_select);
|
||||
$('#column-select').append(data.message);
|
||||
});
|
||||
}
|
||||
});
|
||||
$('#column-select').change(function(e) {
|
||||
var selectvalue = $(this).val();
|
||||
if (selectvalue !== "") {
|
||||
$("#add_column").submit();
|
||||
}
|
||||
});
|
||||
$("#add_col_div").find(">a").click(function(event){
|
||||
$('#add_new').slideToggle("slow");
|
||||
var $addColDivLinkSpan = $("#add_col_div").find(">a span");
|
||||
if($addColDivLinkSpan.html() === '+') {
|
||||
$addColDivLinkSpan.html('-');
|
||||
} else {
|
||||
$addColDivLinkSpan.html('+');
|
||||
}
|
||||
});
|
||||
$('#add_new').submit(function(event){
|
||||
$('#add_new').toggle();
|
||||
});
|
||||
$("#tableslistcontainer").find("select.default_type").change(function () {
|
||||
if ($(this).val() === 'USER_DEFINED') {
|
||||
$(this).siblings('.default_value').attr('name','col_default');
|
||||
$(this).attr('name','col_default_sel');
|
||||
} else {
|
||||
$(this).attr('name','col_default');
|
||||
$(this).siblings('.default_value').attr('name','col_default_val');
|
||||
}
|
||||
});
|
||||
});
|
@ -1,77 +0,0 @@
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* @fileoverview function used in QBE for DB
|
||||
* @name Database Operations
|
||||
*
|
||||
* @requires jQuery
|
||||
* @requires jQueryUI
|
||||
* @requires js/functions.js
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Ajax event handlers here for db_qbe.php
|
||||
*
|
||||
* Actions Ajaxified here:
|
||||
* Select saved search
|
||||
*/
|
||||
|
||||
/**
|
||||
* Unbind all event handlers before tearing down a page
|
||||
*/
|
||||
AJAX.registerTeardown('db_qbe.js', function () {
|
||||
$(document).off('change', 'select[name^=criteriaColumn]');
|
||||
$(document).off('change', "#searchId");
|
||||
$(document).off('click', "#saveSearch");
|
||||
$(document).off('click', "#updateSearch");
|
||||
$(document).off('click', "#deleteSearch");
|
||||
});
|
||||
|
||||
AJAX.registerOnload('db_qbe.js', function () {
|
||||
|
||||
PMA_getSQLEditor($('#textSqlquery'), {}, 'both');
|
||||
|
||||
/**
|
||||
* Ajax handler to check the corresponding 'show' checkbox when column is selected
|
||||
*/
|
||||
$(document).on('change', 'select[name^=criteriaColumn]', function (event) {
|
||||
if ($(this).val()) {
|
||||
var index = (/\d+/).exec($(this).attr('name'));
|
||||
$('input[name=criteriaShow\\[' + index + '\\]]').prop('checked', true);
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Ajax event handlers for 'Select saved search'
|
||||
*/
|
||||
$(document).on('change', "#searchId", function (event) {
|
||||
$('#action').val('load');
|
||||
$('#formQBE').submit();
|
||||
});
|
||||
|
||||
/**
|
||||
* Ajax event handlers for 'Create bookmark'
|
||||
*/
|
||||
$(document).on('click', "#saveSearch", function () {
|
||||
$('#action').val('create');
|
||||
});
|
||||
|
||||
/**
|
||||
* Ajax event handlers for 'Update bookmark'
|
||||
*/
|
||||
$(document).on('click', "#updateSearch", function (event) {
|
||||
$('#action').val('update');
|
||||
});
|
||||
|
||||
/**
|
||||
* Ajax event handlers for 'Delete bookmark'
|
||||
*/
|
||||
$(document).on('click', "#deleteSearch", function (event) {
|
||||
var question = PMA_sprintf(PMA_messages.strConfirmDeleteQBESearch, $("#searchId").find("option:selected").text());
|
||||
if (!confirm(question)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$('#action').val('delete');
|
||||
});
|
||||
});
|
@ -1,248 +0,0 @@
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* JavaScript functions used on Database Search page
|
||||
*
|
||||
* @requires jQuery
|
||||
* @requires js/functions.js
|
||||
*
|
||||
* @package PhpMyAdmin
|
||||
*/
|
||||
|
||||
/**
|
||||
* AJAX script for the Database Search page.
|
||||
*
|
||||
* Actions ajaxified here:
|
||||
* Retrieve result of SQL query
|
||||
*/
|
||||
|
||||
/**
|
||||
* Unbind all event handlers before tearing down a page
|
||||
*/
|
||||
AJAX.registerTeardown('db_search.js', function () {
|
||||
$('a.browse_results').unbind('click');
|
||||
$('a.delete_results').unbind('click');
|
||||
$('#buttonGo').unbind('click');
|
||||
$('#togglesearchresultlink').unbind('click');
|
||||
$("#togglequerybox").unbind('click');
|
||||
$('#togglesearchformlink').unbind('click');
|
||||
$(document).off('submit', "#db_search_form.ajax");
|
||||
});
|
||||
|
||||
AJAX.registerOnload('db_search.js', function () {
|
||||
/** Hide the table link in the initial search result */
|
||||
var icon = PMA_getImage('s_tbl.png', '', {'id': 'table-image'}).toString();
|
||||
$("#table-info").prepend(icon).hide();
|
||||
|
||||
/** Hide the browse and deleted results in the new search criteria */
|
||||
$('#buttonGo').click(function () {
|
||||
$("#table-info").hide();
|
||||
$('#browse-results').hide();
|
||||
$('#sqlqueryform').hide();
|
||||
$('#togglequerybox').hide();
|
||||
});
|
||||
/**
|
||||
* Prepare a div containing a link for toggle the search results
|
||||
*/
|
||||
$('#togglesearchresultsdiv')
|
||||
/** don't show it until we have results on-screen */
|
||||
.hide();
|
||||
|
||||
/**
|
||||
* Changing the displayed text according to
|
||||
* the hide/show criteria in search result forms
|
||||
*/
|
||||
$('#togglesearchresultlink')
|
||||
.html(PMA_messages.strHideSearchResults)
|
||||
.bind('click', function () {
|
||||
var $link = $(this);
|
||||
$('#searchresults').slideToggle();
|
||||
if ($link.text() == PMA_messages.strHideSearchResults) {
|
||||
$link.text(PMA_messages.strShowSearchResults);
|
||||
} else {
|
||||
$link.text(PMA_messages.strHideSearchResults);
|
||||
}
|
||||
/** avoid default click action */
|
||||
return false;
|
||||
});
|
||||
|
||||
/**
|
||||
* Prepare a div containing a link for toggle the search form,
|
||||
* otherwise it's incorrectly displayed after a couple of clicks
|
||||
*/
|
||||
$('#togglesearchformdiv')
|
||||
.hide(); // don't show it until we have results on-screen
|
||||
|
||||
/**
|
||||
* Changing the displayed text according to
|
||||
* the hide/show criteria in search form
|
||||
*/
|
||||
$("#togglequerybox")
|
||||
.hide()
|
||||
.bind('click', function () {
|
||||
var $link = $(this);
|
||||
$('#sqlqueryform').slideToggle("medium");
|
||||
if ($link.text() == PMA_messages.strHideQueryBox) {
|
||||
$link.text(PMA_messages.strShowQueryBox);
|
||||
} else {
|
||||
$link.text(PMA_messages.strHideQueryBox);
|
||||
}
|
||||
/** avoid default click action */
|
||||
return false;
|
||||
});
|
||||
|
||||
/** don't show it until we have results on-screen */
|
||||
|
||||
/**
|
||||
* Changing the displayed text according to
|
||||
* the hide/show criteria in search criteria form
|
||||
*/
|
||||
$('#togglesearchformlink')
|
||||
.html(PMA_messages.strShowSearchCriteria)
|
||||
.bind('click', function () {
|
||||
var $link = $(this);
|
||||
$('#db_search_form').slideToggle();
|
||||
if ($link.text() == PMA_messages.strHideSearchCriteria) {
|
||||
$link.text(PMA_messages.strShowSearchCriteria);
|
||||
} else {
|
||||
$link.text(PMA_messages.strHideSearchCriteria);
|
||||
}
|
||||
/** avoid default click action */
|
||||
return false;
|
||||
});
|
||||
|
||||
/*
|
||||
* Ajax Event handler for retrieving the results from a table
|
||||
*/
|
||||
$(document).on('click', 'a.browse_results', function(e){
|
||||
e.preventDefault();
|
||||
/** Hides the results shown by the delete criteria */
|
||||
var $msg = PMA_ajaxShowMessage(PMA_messages.strBrowsing, false);
|
||||
$('#sqlqueryform').hide();
|
||||
$('#togglequerybox').hide();
|
||||
/** Load the browse results to the page */
|
||||
$("#table-info").show();
|
||||
var table_name = $(this).data('table-name');
|
||||
$('#table-link').attr({"href" : $(this).attr('href')}).text(table_name);
|
||||
|
||||
var url = $(this).attr('href') + "#searchresults";
|
||||
var browse_sql = $(this).data('browse-sql');
|
||||
var params = {
|
||||
'ajax_request': true,
|
||||
'is_js_confirmed': true,
|
||||
'sql_query' : browse_sql,
|
||||
'token' : PMA_commonParams.get('token')
|
||||
};
|
||||
$.post(url, params, function (data) {
|
||||
if (typeof data !== 'undefined' && data.success) {
|
||||
$('#browse-results').html(data.message);
|
||||
PMA_ajaxRemoveMessage($msg);
|
||||
$('.table_results').each(function () {
|
||||
PMA_makegrid(this, true, true, true, true);
|
||||
});
|
||||
$('#browse-results').show();
|
||||
PMA_highlightSQL($('#browse-results'));
|
||||
$('html, body')
|
||||
.animate({
|
||||
scrollTop: $("#browse-results").offset().top
|
||||
}, 1000);
|
||||
} else {
|
||||
PMA_ajaxShowMessage(data.error, false);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
/*
|
||||
* Ajax Event handler for deleting the results from a table
|
||||
*/
|
||||
$(document).on('click', 'a.delete_results', function(e){
|
||||
e.preventDefault();
|
||||
/** Hides the results shown by the browse criteria */
|
||||
$("#table-info").hide();
|
||||
$('#sqlqueryform').hide();
|
||||
$('#togglequerybox').hide();
|
||||
/** Conformation message for deletion */
|
||||
var msg = PMA_sprintf(
|
||||
PMA_messages.strConfirmDeleteResults,
|
||||
$(this).data('table-name')
|
||||
);
|
||||
if (confirm(msg)) {
|
||||
var $msg = PMA_ajaxShowMessage(PMA_messages.strDeleting, false);
|
||||
/** Load the deleted option to the page*/
|
||||
$('#sqlqueryform').html('');
|
||||
var params = {
|
||||
'ajax_request': true,
|
||||
'is_js_confirmed': true,
|
||||
'sql_query': $(this).data('delete-sql'),
|
||||
'token' : PMA_commonParams.get('token')
|
||||
};
|
||||
var url = $(this).attr('href');
|
||||
|
||||
$.post(url, params, function (data) {
|
||||
if (typeof data === 'undefined' || !data.success) {
|
||||
PMA_ajaxShowMessage(data.error, false);
|
||||
return;
|
||||
}
|
||||
|
||||
$('#sqlqueryform').html(data.sql_query);
|
||||
/** Refresh the search results after the deletion */
|
||||
document.getElementById('buttonGo').click();
|
||||
$('#togglequerybox').html(PMA_messages.strHideQueryBox);
|
||||
/** Show the results of the deletion option */
|
||||
$('#browse-results').hide();
|
||||
$('#sqlqueryform').show();
|
||||
$('#togglequerybox').show();
|
||||
$('html, body')
|
||||
.animate({
|
||||
scrollTop: $("#browse-results").offset().top
|
||||
}, 1000);
|
||||
PMA_ajaxRemoveMessage($msg);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Ajax Event handler for retrieving the result of an SQL Query
|
||||
*/
|
||||
$(document).on('submit', "#db_search_form.ajax", function (event) {
|
||||
event.preventDefault();
|
||||
|
||||
var $msgbox = PMA_ajaxShowMessage(PMA_messages.strSearching, false);
|
||||
// jQuery object to reuse
|
||||
var $form = $(this);
|
||||
|
||||
PMA_prepareForAjaxRequest($form);
|
||||
|
||||
var url = $form.serialize() + "&submit_search=" + $("#buttonGo").val();
|
||||
$.post($form.attr('action'), url, function (data) {
|
||||
if (typeof data !== 'undefined' && data.success === true) {
|
||||
// found results
|
||||
$("#searchresults").html(data.message);
|
||||
|
||||
$('#togglesearchresultlink')
|
||||
// always start with the Show message
|
||||
.text(PMA_messages.strHideSearchResults);
|
||||
$('#togglesearchresultsdiv')
|
||||
// now it's time to show the div containing the link
|
||||
.show();
|
||||
$('#searchresults').show();
|
||||
|
||||
|
||||
$('#db_search_form')
|
||||
// workaround for Chrome problem (bug #3168569)
|
||||
.slideToggle()
|
||||
.hide();
|
||||
$('#togglesearchformlink')
|
||||
// always start with the Show message
|
||||
.text(PMA_messages.strShowSearchCriteria);
|
||||
$('#togglesearchformdiv')
|
||||
// now it's time to show the div containing the link
|
||||
.show();
|
||||
} else {
|
||||
// error message (zero rows)
|
||||
$("#searchresults").html(data.error).show();
|
||||
}
|
||||
|
||||
PMA_ajaxRemoveMessage($msgbox);
|
||||
});
|
||||
});
|
||||
}); // end $()
|
@ -1,94 +0,0 @@
|
||||
/**
|
||||
* Unbind all event handlers before tearing down the page
|
||||
*/
|
||||
AJAX.registerTeardown('db_tracking.js', function () {
|
||||
$('body').off('click', '#trackedForm.ajax button[name="submit_mult"], #trackedForm.ajax input[name="submit_mult"]');
|
||||
$('body').off('click', '#untrackedForm.ajax button[name="submit_mult"], #untrackedForm.ajax input[name="submit_mult"]');
|
||||
$('body').off('click', 'a.delete_tracking_anchor.ajax');
|
||||
});
|
||||
|
||||
/**
|
||||
* Bind event handlers
|
||||
*/
|
||||
AJAX.registerOnload('db_tracking.js', function () {
|
||||
|
||||
var $versions = $('#versions');
|
||||
$versions.find('tr:first th').append($('<div class="sorticon"></div>'));
|
||||
$versions.tablesorter({
|
||||
sortList: [[1, 0]],
|
||||
headers: {
|
||||
0: {sorter: false},
|
||||
2: {sorter: "integer"},
|
||||
5: {sorter: false},
|
||||
6: {sorter: false},
|
||||
7: {sorter: false}
|
||||
}
|
||||
});
|
||||
|
||||
var $noVersions = $('#noversions');
|
||||
$noVersions.find('tr:first th').append($('<div class="sorticon"></div>'));
|
||||
$noVersions.tablesorter({
|
||||
sortList: [[1, 0]],
|
||||
headers: {
|
||||
0: {sorter: false},
|
||||
2: {sorter: false}
|
||||
}
|
||||
});
|
||||
|
||||
var $body = $('body');
|
||||
|
||||
/**
|
||||
* Handles multi submit for tracked tables
|
||||
*/
|
||||
$body.on('click', '#trackedForm.ajax button[name="submit_mult"], #trackedForm.ajax input[name="submit_mult"]', function (e) {
|
||||
e.preventDefault();
|
||||
var $button = $(this);
|
||||
var $form = $button.parent('form');
|
||||
var submitData = $form.serialize() + '&ajax_request=true&ajax_page_request=true&submit_mult=' + $button.val();
|
||||
|
||||
if ($button.val() == 'delete_tracking') {
|
||||
var question = PMA_messages.strDeleteTrackingDataMultiple;
|
||||
$button.PMA_confirm(question, $form.attr('action'), function (url) {
|
||||
PMA_ajaxShowMessage(PMA_messages.strDeletingTrackingData);
|
||||
AJAX.source = $form;
|
||||
$.post(url, submitData, AJAX.responseHandler);
|
||||
});
|
||||
} else {
|
||||
PMA_ajaxShowMessage();
|
||||
AJAX.source = $form;
|
||||
$.post($form.attr('action'), submitData, AJAX.responseHandler);
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Handles multi submit for untracked tables
|
||||
*/
|
||||
$body.on('click', '#untrackedForm.ajax button[name="submit_mult"], #untrackedForm.ajax input[name="submit_mult"]', function (e) {
|
||||
e.preventDefault();
|
||||
var $button = $(this);
|
||||
var $form = $button.parent('form');
|
||||
var submitData = $form.serialize() + '&ajax_request=true&ajax_page_request=true&submit_mult=' + $button.val();
|
||||
PMA_ajaxShowMessage();
|
||||
AJAX.source = $form;
|
||||
$.post($form.attr('action'), submitData, AJAX.responseHandler);
|
||||
});
|
||||
|
||||
/**
|
||||
* Ajax Event handler for 'Delete tracking'
|
||||
*/
|
||||
$body.on('click', 'a.delete_tracking_anchor.ajax', function (e) {
|
||||
e.preventDefault();
|
||||
var $anchor = $(this);
|
||||
var question = PMA_messages.strDeleteTrackingData;
|
||||
$anchor.PMA_confirm(question, $anchor.attr('href'), function (url) {
|
||||
PMA_ajaxShowMessage(PMA_messages.strDeletingTrackingData);
|
||||
AJAX.source = $anchor;
|
||||
var params = {
|
||||
'ajax_page_request': true,
|
||||
'ajax_request': true,
|
||||
'token': PMA_commonParams.get('token')
|
||||
};
|
||||
$.post(url, params, AJAX.responseHandler);
|
||||
});
|
||||
});
|
||||
});
|
@ -1,863 +0,0 @@
|
||||
/* vim: set expandtab sw=4 ts=4 sts=4: */
|
||||
/**
|
||||
* Functions used in the export tab
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Disables the "Dump some row(s)" sub-options
|
||||
*/
|
||||
function disable_dump_some_rows_sub_options()
|
||||
{
|
||||
$("label[for='limit_to']").fadeTo('fast', 0.4);
|
||||
$("label[for='limit_from']").fadeTo('fast', 0.4);
|
||||
$("input[type='text'][name='limit_to']").prop('disabled', 'disabled');
|
||||
$("input[type='text'][name='limit_from']").prop('disabled', 'disabled');
|
||||
}
|
||||
|
||||
/**
|
||||
* Enables the "Dump some row(s)" sub-options
|
||||
*/
|
||||
function enable_dump_some_rows_sub_options()
|
||||
{
|
||||
$("label[for='limit_to']").fadeTo('fast', 1);
|
||||
$("label[for='limit_from']").fadeTo('fast', 1);
|
||||
$("input[type='text'][name='limit_to']").prop('disabled', '');
|
||||
$("input[type='text'][name='limit_from']").prop('disabled', '');
|
||||
}
|
||||
|
||||
/**
|
||||
* Return template data as a json object
|
||||
*
|
||||
* @returns template data
|
||||
*/
|
||||
function getTemplateData()
|
||||
{
|
||||
var $form = $('form[name="dump"]');
|
||||
var blacklist = ['token', 'server', 'db', 'table', 'single_table',
|
||||
'export_type', 'export_method', 'sql_query', 'template_id'];
|
||||
var obj = {};
|
||||
var arr = $form.serializeArray();
|
||||
$.each(arr, function () {
|
||||
if ($.inArray(this.name, blacklist) < 0) {
|
||||
if (obj[this.name] !== undefined) {
|
||||
if (! obj[this.name].push) {
|
||||
obj[this.name] = [obj[this.name]];
|
||||
}
|
||||
obj[this.name].push(this.value || '');
|
||||
} else {
|
||||
obj[this.name] = this.value || '';
|
||||
}
|
||||
}
|
||||
});
|
||||
// include unchecked checboxes (which are ignored by serializeArray()) with null
|
||||
// to uncheck them when loading the template
|
||||
$form.find('input[type="checkbox"]:not(:checked)').each(function () {
|
||||
if (obj[this.name] === undefined) {
|
||||
obj[this.name] = null;
|
||||
}
|
||||
});
|
||||
// include empty multiselects
|
||||
$form.find('select').each(function () {
|
||||
if ($(this).find('option:selected').length == 0) {
|
||||
obj[this.name] = [];
|
||||
}
|
||||
});
|
||||
return obj;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a template with selected options
|
||||
*
|
||||
* @param name name of the template
|
||||
*/
|
||||
function createTemplate(name)
|
||||
{
|
||||
var templateData = getTemplateData();
|
||||
|
||||
var params = {
|
||||
ajax_request : true,
|
||||
token : PMA_commonParams.get('token'),
|
||||
server : PMA_commonParams.get('server'),
|
||||
db : PMA_commonParams.get('db'),
|
||||
table : PMA_commonParams.get('table'),
|
||||
exportType : $('input[name="export_type"]').val(),
|
||||
templateAction : 'create',
|
||||
templateName : name,
|
||||
templateData : JSON.stringify(templateData)
|
||||
};
|
||||
|
||||
PMA_ajaxShowMessage();
|
||||
$.post('tbl_export.php', params, function (response) {
|
||||
if (response.success === true) {
|
||||
$('#templateName').val('');
|
||||
$('#template').html(response.data);
|
||||
$("#template").find("option").each(function() {
|
||||
if ($(this).text() == name) {
|
||||
$(this).prop('selected', true);
|
||||
}
|
||||
});
|
||||
PMA_ajaxShowMessage(PMA_messages.strTemplateCreated);
|
||||
} else {
|
||||
PMA_ajaxShowMessage(response.error, false);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads a template
|
||||
*
|
||||
* @param id ID of the template to load
|
||||
*/
|
||||
function loadTemplate(id)
|
||||
{
|
||||
var params = {
|
||||
ajax_request : true,
|
||||
token : PMA_commonParams.get('token'),
|
||||
server : PMA_commonParams.get('server'),
|
||||
db : PMA_commonParams.get('db'),
|
||||
table : PMA_commonParams.get('table'),
|
||||
exportType : $('input[name="export_type"]').val(),
|
||||
templateAction : 'load',
|
||||
templateId : id,
|
||||
};
|
||||
|
||||
PMA_ajaxShowMessage();
|
||||
$.post('tbl_export.php', params, function (response) {
|
||||
if (response.success === true) {
|
||||
var $form = $('form[name="dump"]');
|
||||
var options = JSON.parse(response.data);
|
||||
$.each(options, function (key, value) {
|
||||
var $element = $form.find('[name="' + key + '"]');
|
||||
if ($element.length) {
|
||||
if (($element.is('input') && $element.attr('type') == 'checkbox') && value === null) {
|
||||
$element.prop('checked', false);
|
||||
} else {
|
||||
if (($element.is('input') && $element.attr('type') == 'checkbox') ||
|
||||
($element.is('input') && $element.attr('type') == 'radio') ||
|
||||
($element.is('select') && $element.attr('multiple') == 'multiple')) {
|
||||
if (! value.push) {
|
||||
value = [value];
|
||||
}
|
||||
}
|
||||
$element.val(value);
|
||||
}
|
||||
$element.trigger('change');
|
||||
}
|
||||
});
|
||||
$('input[name="template_id"]').val(id);
|
||||
PMA_ajaxShowMessage(PMA_messages.strTemplateLoaded);
|
||||
} else {
|
||||
PMA_ajaxShowMessage(response.error, false);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates an existing template with current options
|
||||
*
|
||||
* @param id ID of the template to update
|
||||
*/
|
||||
function updateTemplate(id)
|
||||
{
|
||||
var templateData = getTemplateData();
|
||||
|
||||
var params = {
|
||||
ajax_request : true,
|
||||
token : PMA_commonParams.get('token'),
|
||||
server : PMA_commonParams.get('server'),
|
||||
db : PMA_commonParams.get('db'),
|
||||
table : PMA_commonParams.get('table'),
|
||||
exportType : $('input[name="export_type"]').val(),
|
||||
templateAction : 'update',
|
||||
templateId : id,
|
||||
templateData : JSON.stringify(templateData)
|
||||
};
|
||||
|
||||
PMA_ajaxShowMessage();
|
||||
$.post('tbl_export.php', params, function (response) {
|
||||
if (response.success === true) {
|
||||
PMA_ajaxShowMessage(PMA_messages.strTemplateUpdated);
|
||||
} else {
|
||||
PMA_ajaxShowMessage(response.error, false);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a template
|
||||
*
|
||||
* @param id ID of the template to delete
|
||||
*/
|
||||
function deleteTemplate(id)
|
||||
{
|
||||
var params = {
|
||||
ajax_request : true,
|
||||
token : PMA_commonParams.get('token'),
|
||||
server : PMA_commonParams.get('server'),
|
||||
db : PMA_commonParams.get('db'),
|
||||
table : PMA_commonParams.get('table'),
|
||||
exportType : $('input[name="export_type"]').val(),
|
||||
templateAction : 'delete',
|
||||
templateId : id,
|
||||
};
|
||||
|
||||
PMA_ajaxShowMessage();
|
||||
$.post('tbl_export.php', params, function (response) {
|
||||
if (response.success === true) {
|
||||
$('#template').find('option[value="' + id + '"]').remove();
|
||||
PMA_ajaxShowMessage(PMA_messages.strTemplateDeleted);
|
||||
} else {
|
||||
PMA_ajaxShowMessage(response.error, false);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Unbind all event handlers before tearing down a page
|
||||
*/
|
||||
AJAX.registerTeardown('export.js', function () {
|
||||
$("#plugins").unbind('change');
|
||||
$("input[type='radio'][name='sql_structure_or_data']").unbind('change');
|
||||
$("input[type='radio'][name$='_structure_or_data']").off('change');
|
||||
$("input[type='radio'][name='output_format']").unbind('change');
|
||||
$("#checkbox_sql_include_comments").unbind('change');
|
||||
$("input[type='radio'][name='quick_or_custom']").unbind('change');
|
||||
$("input[type='radio'][name='allrows']").unbind('change');
|
||||
$('#btn_alias_config').off('click');
|
||||
$('#db_alias_select').off('change');
|
||||
$('.table_alias_select').off('change');
|
||||
$('input[name="table_select[]"]').off('change');
|
||||
$('input[name="table_structure[]"]').off('change');
|
||||
$('input[name="table_data[]"]').off('change');
|
||||
$('#table_structure_all').off('change');
|
||||
$('#table_data_all').off('change');
|
||||
$('input[name="createTemplate"]').off('click');
|
||||
$('select[name="template"]').off('change');
|
||||
$('input[name="updateTemplate"]').off('click');
|
||||
$('input[name="deleteTemplate"]').off('click');
|
||||
});
|
||||
|
||||
AJAX.registerOnload('export.js', function () {
|
||||
|
||||
/**
|
||||
* Export template handling code
|
||||
*/
|
||||
// create a new template
|
||||
$('input[name="createTemplate"]').on('click', function (e) {
|
||||
e.preventDefault();
|
||||
var name = $('input[name="templateName"]').val();
|
||||
if (name.length) {
|
||||
createTemplate(name);
|
||||
}
|
||||
});
|
||||
|
||||
// load an existing template
|
||||
$('select[name="template"]').on('change', function (e) {
|
||||
e.preventDefault();
|
||||
var id = $(this).val();
|
||||
if (id.length) {
|
||||
loadTemplate(id);
|
||||
}
|
||||
});
|
||||
|
||||
// udpate an existing template with new criteria
|
||||
$('input[name="updateTemplate"]').on('click', function (e) {
|
||||
e.preventDefault();
|
||||
var id = $('select[name="template"]').val();
|
||||
if (id.length) {
|
||||
updateTemplate(id);
|
||||
}
|
||||
});
|
||||
|
||||
// delete an existing template
|
||||
$('input[name="deleteTemplate"]').on('click', function (e) {
|
||||
e.preventDefault();
|
||||
var id = $('select[name="template"]').val();
|
||||
if (id.length) {
|
||||
deleteTemplate(id);
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Toggles the hiding and showing of each plugin's options
|
||||
* according to the currently selected plugin from the dropdown list
|
||||
*/
|
||||
$("#plugins").change(function () {
|
||||
$("#format_specific_opts").find("div.format_specific_options").hide();
|
||||
var selected_plugin_name = $("#plugins").find("option:selected").val();
|
||||
$("#" + selected_plugin_name + "_options").show();
|
||||
});
|
||||
|
||||
/**
|
||||
* Toggles the enabling and disabling of the SQL plugin's comment options that apply only when exporting structure
|
||||
*/
|
||||
$("input[type='radio'][name='sql_structure_or_data']").change(function () {
|
||||
var comments_are_present = $("#checkbox_sql_include_comments").prop("checked");
|
||||
var show = $("input[type='radio'][name='sql_structure_or_data']:checked").val();
|
||||
if (show == 'data') {
|
||||
// disable the SQL comment options
|
||||
if (comments_are_present) {
|
||||
$("#checkbox_sql_dates").prop('disabled', true).parent().fadeTo('fast', 0.4);
|
||||
}
|
||||
$("#checkbox_sql_relation").prop('disabled', true).parent().fadeTo('fast', 0.4);
|
||||
$("#checkbox_sql_mime").prop('disabled', true).parent().fadeTo('fast', 0.4);
|
||||
} else {
|
||||
// enable the SQL comment options
|
||||
if (comments_are_present) {
|
||||
$("#checkbox_sql_dates").prop('disabled', false).parent().fadeTo('fast', 1);
|
||||
}
|
||||
$("#checkbox_sql_relation").prop('disabled', false).parent().fadeTo('fast', 1);
|
||||
$("#checkbox_sql_mime").prop('disabled', false).parent().fadeTo('fast', 1);
|
||||
}
|
||||
|
||||
if (show == 'structure') {
|
||||
$('#checkbox_sql_auto_increment').prop('disabled', true).parent().fadeTo('fast', 0.4);
|
||||
} else {
|
||||
$("#checkbox_sql_auto_increment").prop('disabled', false).parent().fadeTo('fast', 1);
|
||||
}
|
||||
});
|
||||
|
||||
// For separate-file exports only ZIP compression is allowed
|
||||
$('input[type="checkbox"][name="as_separate_files"]').change(function(){
|
||||
if ($(this).is(':checked')) {
|
||||
$('#compression').val('zip');
|
||||
}
|
||||
});
|
||||
|
||||
$('#compression').change(function(){
|
||||
if ($('option:selected').val() !== 'zip') {
|
||||
$('input[type="checkbox"][name="as_separate_files"]').prop('checked', false);
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
function setup_table_structure_or_data() {
|
||||
if ($("input[name='export_type']").val() != 'database') {
|
||||
return;
|
||||
}
|
||||
var pluginName = $("#plugins").find("option:selected").val();
|
||||
var formElemName = pluginName + "_structure_or_data";
|
||||
var force_structure_or_data = !($("input[name='" + formElemName + "_default']").length);
|
||||
|
||||
if (force_structure_or_data === true) {
|
||||
$('input[name="structure_or_data_forced"]').val(1);
|
||||
$('.export_structure input[type="checkbox"], .export_data input[type="checkbox"]')
|
||||
.prop('disabled', true);
|
||||
$('.export_structure, .export_data').fadeTo('fast', 0.4);
|
||||
} else {
|
||||
$('input[name="structure_or_data_forced"]').val(0);
|
||||
$('.export_structure input[type="checkbox"], .export_data input[type="checkbox"]')
|
||||
.prop('disabled', false);
|
||||
$('.export_structure, .export_data').fadeTo('fast', 1);
|
||||
|
||||
var structure_or_data = $('input[name="' + formElemName + '_default"]').val();
|
||||
|
||||
if (structure_or_data == 'structure') {
|
||||
$('.export_data input[type="checkbox"]')
|
||||
.prop('checked', false);
|
||||
} else if (structure_or_data == 'data') {
|
||||
$('.export_structure input[type="checkbox"]')
|
||||
.prop('checked', false);
|
||||
}
|
||||
if (structure_or_data == 'structure' || structure_or_data == 'structure_and_data') {
|
||||
if (!$('.export_structure input[type="checkbox"]:checked').length) {
|
||||
$('input[name="table_select[]"]:checked')
|
||||
.closest('tr')
|
||||
.find('.export_structure input[type="checkbox"]')
|
||||
.prop('checked', true);
|
||||
}
|
||||
}
|
||||
if (structure_or_data == 'data' || structure_or_data == 'structure_and_data') {
|
||||
if (!$('.export_data input[type="checkbox"]:checked').length) {
|
||||
$('input[name="table_select[]"]:checked')
|
||||
.closest('tr')
|
||||
.find('.export_data input[type="checkbox"]')
|
||||
.prop('checked', true);
|
||||
}
|
||||
}
|
||||
|
||||
check_selected_tables();
|
||||
check_table_select_all();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Toggles the hiding and showing of plugin structure-specific and data-specific
|
||||
* options
|
||||
*/
|
||||
function toggle_structure_data_opts()
|
||||
{
|
||||
var pluginName = $("select#plugins").val();
|
||||
var radioFormName = pluginName + "_structure_or_data";
|
||||
var dataDiv = "#" + pluginName + "_data";
|
||||
var structureDiv = "#" + pluginName + "_structure";
|
||||
var show = $("input[type='radio'][name='" + radioFormName + "']:checked").val();
|
||||
if (show == 'data') {
|
||||
$(dataDiv).slideDown('slow');
|
||||
$(structureDiv).slideUp('slow');
|
||||
} else {
|
||||
$(structureDiv).slideDown('slow');
|
||||
if (show == 'structure') {
|
||||
$(dataDiv).slideUp('slow');
|
||||
} else {
|
||||
$(dataDiv).slideDown('slow');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Toggles the disabling of the "save to file" options
|
||||
*/
|
||||
function toggle_save_to_file()
|
||||
{
|
||||
var $ulSaveAsfile = $("#ul_save_asfile");
|
||||
if (!$("#radio_dump_asfile").prop("checked")) {
|
||||
$ulSaveAsfile.find("> li").fadeTo('fast', 0.4);
|
||||
$ulSaveAsfile.find("> li > input").prop('disabled', true);
|
||||
$ulSaveAsfile.find("> li > select").prop('disabled', true);
|
||||
} else {
|
||||
$ulSaveAsfile.find("> li").fadeTo('fast', 1);
|
||||
$ulSaveAsfile.find("> li > input").prop('disabled', false);
|
||||
$ulSaveAsfile.find("> li > select").prop('disabled', false);
|
||||
}
|
||||
}
|
||||
|
||||
AJAX.registerOnload('export.js', function () {
|
||||
toggle_save_to_file();
|
||||
$("input[type='radio'][name='output_format']").change(toggle_save_to_file);
|
||||
});
|
||||
|
||||
/**
|
||||
* For SQL plugin, toggles the disabling of the "display comments" options
|
||||
*/
|
||||
function toggle_sql_include_comments()
|
||||
{
|
||||
$("#checkbox_sql_include_comments").change(function () {
|
||||
var $ulIncludeComments = $("#ul_include_comments");
|
||||
if (!$("#checkbox_sql_include_comments").prop("checked")) {
|
||||
$ulIncludeComments.find("> li").fadeTo('fast', 0.4);
|
||||
$ulIncludeComments.find("> li > input").prop('disabled', true);
|
||||
} else {
|
||||
// If structure is not being exported, the comment options for structure should not be enabled
|
||||
if ($("#radio_sql_structure_or_data_data").prop("checked")) {
|
||||
$("#text_sql_header_comment").prop('disabled', false).parent("li").fadeTo('fast', 1);
|
||||
} else {
|
||||
$ulIncludeComments.find("> li").fadeTo('fast', 1);
|
||||
$ulIncludeComments.find("> li > input").prop('disabled', false);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function check_table_select_all() {
|
||||
var total = $('input[name="table_select[]"]').length;
|
||||
var str_checked = $('input[name="table_structure[]"]:checked').length;
|
||||
var data_checked = $('input[name="table_data[]"]:checked').length;
|
||||
var str_all = $('#table_structure_all');
|
||||
var data_all = $('#table_data_all');
|
||||
|
||||
if (str_checked == total) {
|
||||
str_all
|
||||
.prop("indeterminate", false)
|
||||
.prop('checked', true);
|
||||
} else if (str_checked === 0) {
|
||||
str_all
|
||||
.prop("indeterminate", false)
|
||||
.prop('checked', false);
|
||||
} else {
|
||||
str_all
|
||||
.prop("indeterminate", true)
|
||||
.prop('checked', false);
|
||||
}
|
||||
|
||||
if (data_checked == total) {
|
||||
data_all
|
||||
.prop("indeterminate", false)
|
||||
.prop('checked', true);
|
||||
} else if (data_checked === 0) {
|
||||
data_all
|
||||
.prop("indeterminate", false)
|
||||
.prop('checked', false);
|
||||
} else {
|
||||
data_all
|
||||
.prop("indeterminate", true)
|
||||
.prop('checked', false);
|
||||
}
|
||||
}
|
||||
|
||||
function toggle_table_select_all_str() {
|
||||
var str_all = $('#table_structure_all').is(':checked');
|
||||
if (str_all) {
|
||||
$('input[name="table_structure[]"]').prop('checked', true);
|
||||
} else {
|
||||
$('input[name="table_structure[]"]').prop('checked', false);
|
||||
}
|
||||
}
|
||||
|
||||
function toggle_table_select_all_data() {
|
||||
var data_all = $('#table_data_all').is(':checked');
|
||||
if (data_all) {
|
||||
$('input[name="table_data[]"]').prop('checked', true);
|
||||
} else {
|
||||
$('input[name="table_data[]"]').prop('checked', false);
|
||||
}
|
||||
}
|
||||
|
||||
function check_selected_tables(argument) {
|
||||
$('.export_table_select tbody tr').each(function() {
|
||||
check_table_selected(this);
|
||||
});
|
||||
}
|
||||
|
||||
function check_table_selected(row) {
|
||||
var $row = $(row);
|
||||
var table_select = $row.find('input[name="table_select[]"]');
|
||||
var str_check = $row.find('input[name="table_structure[]"]');
|
||||
var data_check = $row.find('input[name="table_data[]"]');
|
||||
|
||||
var data = data_check.is(':checked:not(:disabled)');
|
||||
var structure = str_check.is(':checked:not(:disabled)');
|
||||
|
||||
if (data && structure) {
|
||||
table_select.prop({checked: true, indeterminate: false});
|
||||
$row.addClass('marked');
|
||||
} else if (data || structure) {
|
||||
table_select.prop({checked: true, indeterminate: true});
|
||||
$row.removeClass('marked');
|
||||
} else {
|
||||
table_select.prop({checked: false, indeterminate: false});
|
||||
$row.removeClass('marked');
|
||||
}
|
||||
}
|
||||
|
||||
function toggle_table_select(row) {
|
||||
var $row = $(row);
|
||||
var table_selected = $row.find('input[name="table_select[]"]').is(':checked');
|
||||
|
||||
if (table_selected) {
|
||||
$row.find('input[type="checkbox"]:not(:disabled)').prop('checked', true);
|
||||
$row.addClass('marked');
|
||||
} else {
|
||||
$row.find('input[type="checkbox"]:not(:disabled)').prop('checked', false);
|
||||
$row.removeClass('marked');
|
||||
}
|
||||
}
|
||||
|
||||
function handleAddProcCheckbox() {
|
||||
if ($('#table_structure_all').is(':checked') === true
|
||||
&& $('#table_data_all').is(':checked') === true
|
||||
) {
|
||||
$('#checkbox_sql_procedure_function').prop('checked', true);
|
||||
} else {
|
||||
$('#checkbox_sql_procedure_function').prop('checked', false);
|
||||
}
|
||||
}
|
||||
|
||||
AJAX.registerOnload('export.js', function () {
|
||||
/**
|
||||
* For SQL plugin, if "CREATE TABLE options" is checked/unchecked, check/uncheck each of its sub-options
|
||||
*/
|
||||
var $create = $("#checkbox_sql_create_table_statements");
|
||||
var $create_options = $("#ul_create_table_statements").find("input");
|
||||
$create.change(function () {
|
||||
$create_options.prop('checked', $(this).prop("checked"));
|
||||
});
|
||||
$create_options.change(function () {
|
||||
if ($create_options.is(":checked")) {
|
||||
$create.prop('checked', true);
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Disables the view output as text option if the output must be saved as a file
|
||||
*/
|
||||
$("#plugins").change(function () {
|
||||
var active_plugin = $("#plugins").find("option:selected").val();
|
||||
var force_file = $("#force_file_" + active_plugin).val();
|
||||
if (force_file == "true") {
|
||||
if ($("#radio_dump_asfile").prop('checked') !== true) {
|
||||
$("#radio_dump_asfile").prop('checked', true);
|
||||
toggle_save_to_file();
|
||||
}
|
||||
$("#radio_view_as_text").prop('disabled', true).parent().fadeTo('fast', 0.4);
|
||||
} else {
|
||||
$("#radio_view_as_text").prop('disabled', false).parent().fadeTo('fast', 1);
|
||||
}
|
||||
});
|
||||
|
||||
$("input[type='radio'][name$='_structure_or_data']").on('change', function () {
|
||||
toggle_structure_data_opts();
|
||||
});
|
||||
|
||||
$('input[name="table_select[]"]').on('change', function() {
|
||||
toggle_table_select($(this).closest('tr'));
|
||||
check_table_select_all();
|
||||
handleAddProcCheckbox();
|
||||
});
|
||||
|
||||
$('input[name="table_structure[]"]').on('change', function() {
|
||||
check_table_selected($(this).closest('tr'));
|
||||
check_table_select_all();
|
||||
handleAddProcCheckbox();
|
||||
});
|
||||
|
||||
$('input[name="table_data[]"]').on('change', function() {
|
||||
check_table_selected($(this).closest('tr'));
|
||||
check_table_select_all();
|
||||
handleAddProcCheckbox();
|
||||
});
|
||||
|
||||
$('#table_structure_all').on('change', function() {
|
||||
toggle_table_select_all_str();
|
||||
check_selected_tables();
|
||||
handleAddProcCheckbox();
|
||||
});
|
||||
|
||||
$('#table_data_all').on('change', function() {
|
||||
toggle_table_select_all_data();
|
||||
check_selected_tables();
|
||||
handleAddProcCheckbox();
|
||||
});
|
||||
|
||||
if ($("input[name='export_type']").val() == 'database') {
|
||||
// Hide structure or data radio buttons
|
||||
$("input[type='radio'][name$='_structure_or_data']").each(function() {
|
||||
var $this = $(this);
|
||||
var name = $this.prop('name');
|
||||
var val = $('input[name="' + name + '"]:checked').val();
|
||||
var name_default = name + '_default';
|
||||
if (!$('input[name="' + name_default + '"]').length) {
|
||||
$this
|
||||
.after(
|
||||
$('<input type="hidden" name="' + name_default + '" value="' + val + '" disabled>')
|
||||
)
|
||||
.after(
|
||||
$('<input type="hidden" name="' + name + '" value="structure_and_data">')
|
||||
);
|
||||
$this.parent().find('label').remove();
|
||||
} else {
|
||||
$this.parent().remove();
|
||||
}
|
||||
});
|
||||
$("input[type='radio'][name$='_structure_or_data']").remove();
|
||||
|
||||
// Disable CREATE table checkbox for sql
|
||||
var createTableCheckbox = $('#checkbox_sql_create_table');
|
||||
createTableCheckbox.prop('checked', true);
|
||||
var dummyCreateTable = $('#checkbox_sql_create_table')
|
||||
.clone()
|
||||
.removeAttr('id')
|
||||
.attr('type', 'hidden');
|
||||
createTableCheckbox
|
||||
.prop('disabled', true)
|
||||
.after(dummyCreateTable)
|
||||
.parent()
|
||||
.fadeTo('fast', 0.4);
|
||||
|
||||
setup_table_structure_or_data();
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle force structure_or_data
|
||||
*/
|
||||
$("#plugins").change(setup_table_structure_or_data);
|
||||
});
|
||||
|
||||
/**
|
||||
* Toggles display of options when quick and custom export are selected
|
||||
*/
|
||||
function toggle_quick_or_custom()
|
||||
{
|
||||
if ($("input[name='quick_or_custom']").length === 0 // custom_no_form option
|
||||
|| $("#radio_custom_export").prop("checked") // custom
|
||||
) {
|
||||
$("#databases_and_tables").show();
|
||||
$("#rows").show();
|
||||
$("#output").show();
|
||||
$("#format_specific_opts").show();
|
||||
$("#output_quick_export").hide();
|
||||
var selected_plugin_name = $("#plugins").find("option:selected").val();
|
||||
$("#" + selected_plugin_name + "_options").show();
|
||||
} else { // quick
|
||||
$("#databases_and_tables").hide();
|
||||
$("#rows").hide();
|
||||
$("#output").hide();
|
||||
$("#format_specific_opts").hide();
|
||||
$("#output_quick_export").show();
|
||||
}
|
||||
}
|
||||
var time_out;
|
||||
function check_time_out(time_limit)
|
||||
{
|
||||
if (typeof time_limit === 'undefined' || time_limit === 0) {
|
||||
return true;
|
||||
}
|
||||
//margin of one second to avoid race condition to set/access session variable
|
||||
time_limit = time_limit + 1;
|
||||
var href = "export.php";
|
||||
var params = {
|
||||
'ajax_request' : true,
|
||||
'token' : PMA_commonParams.get('token'),
|
||||
'check_time_out' : true
|
||||
};
|
||||
clearTimeout(time_out);
|
||||
time_out = setTimeout(function(){
|
||||
$.get(href, params, function (data) {
|
||||
if (data.message === 'timeout') {
|
||||
PMA_ajaxShowMessage(
|
||||
'<div class="error">' +
|
||||
PMA_messages.strTimeOutError +
|
||||
'</div>',
|
||||
false
|
||||
);
|
||||
}
|
||||
});
|
||||
}, time_limit * 1000);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Handler for Database/table alias select
|
||||
*
|
||||
* @param event object the event object
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function aliasSelectHandler(event) {
|
||||
var sel = event.data.sel;
|
||||
var type = event.data.type;
|
||||
var inputId = $(this).val();
|
||||
var $label = $(this).next('label');
|
||||
$('input#' + $label.attr('for')).addClass('hide');
|
||||
$('input#' + inputId).removeClass('hide');
|
||||
$label.attr('for', inputId);
|
||||
$('#alias_modal ' + sel + '[id$=' + type + ']:visible').addClass('hide');
|
||||
var $inputWrapper = $('#alias_modal ' + sel + '#' + inputId + type);
|
||||
$inputWrapper.removeClass('hide');
|
||||
if (type === '_cols' && $inputWrapper.length > 0) {
|
||||
var outer = $inputWrapper[0].outerHTML;
|
||||
// Replace opening tags
|
||||
var regex = /<dummy_inp/gi;
|
||||
if (outer.match(regex)) {
|
||||
var newTag = outer.replace(regex, '<input');
|
||||
// Replace closing tags
|
||||
regex = /<\/dummy_inp/gi;
|
||||
newTag = newTag.replace(regex, '</input');
|
||||
// Assign replacement
|
||||
$inputWrapper.replaceWith(newTag);
|
||||
}
|
||||
} else if (type === '_tables') {
|
||||
$('.table_alias_select:visible').change();
|
||||
}
|
||||
$("#alias_modal").dialog("option", "position", "center");
|
||||
}
|
||||
|
||||
/**
|
||||
* Handler for Alias dialog box
|
||||
*
|
||||
* @param event object the event object
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function createAliasModal(event) {
|
||||
event.preventDefault();
|
||||
var dlgButtons = {};
|
||||
dlgButtons[PMA_messages.strResetAll] = function() {
|
||||
$(this).find('input[type="text"]').val('');
|
||||
};
|
||||
dlgButtons[PMA_messages.strReset] = function() {
|
||||
$(this).find('input[type="text"]:visible').val('');
|
||||
};
|
||||
dlgButtons[PMA_messages.strSaveAndClose] = function() {
|
||||
$(this).dialog("close");
|
||||
// do not fillup form submission with empty values
|
||||
$.each($(this).find('input[type="text"]'), function (i, e) {
|
||||
if ($(e).val().trim().length == 0) {
|
||||
$(e).prop('disabled', true);
|
||||
}
|
||||
});
|
||||
$('#alias_modal').parent().appendTo($('form[name="dump"]'));
|
||||
};
|
||||
$('#alias_modal').find('input[type="text"]').prop('disabled', false);
|
||||
$('#alias_modal').dialog({
|
||||
width: Math.min($(window).width() - 100, 700),
|
||||
maxHeight: $(window).height(),
|
||||
modal: true,
|
||||
dialogClass: "alias-dialog",
|
||||
buttons: dlgButtons,
|
||||
create: function() {
|
||||
$(this).css('maxHeight', $(window).height() - 150);
|
||||
$('.alias-dialog .ui-dialog-titlebar-close').remove();
|
||||
},
|
||||
close: function() {
|
||||
var isEmpty = true;
|
||||
$(this).find('input[type="text"]').each(function() {
|
||||
// trim input fields on close
|
||||
$(this).val($(this).val().trim());
|
||||
// check if non empty field present
|
||||
if ($(this).val()) {
|
||||
isEmpty = false;
|
||||
}
|
||||
});
|
||||
$('input#btn_alias_config').prop('checked', !isEmpty);
|
||||
},
|
||||
position: { my: "center top", at: "center top", of: window }
|
||||
});
|
||||
// Call change event of .table_alias_select
|
||||
$('.table_alias_select:visible').trigger('change');
|
||||
}
|
||||
|
||||
AJAX.registerOnload('export.js', function () {
|
||||
$("input[type='radio'][name='quick_or_custom']").change(toggle_quick_or_custom);
|
||||
|
||||
$("#scroll_to_options_msg").hide();
|
||||
$("#format_specific_opts").find("div.format_specific_options")
|
||||
.hide()
|
||||
.css({
|
||||
"border": 0,
|
||||
"margin": 0,
|
||||
"padding": 0
|
||||
})
|
||||
.find("h3")
|
||||
.remove();
|
||||
toggle_quick_or_custom();
|
||||
toggle_structure_data_opts();
|
||||
toggle_sql_include_comments();
|
||||
check_table_select_all();
|
||||
handleAddProcCheckbox();
|
||||
|
||||
/**
|
||||
* Initially disables the "Dump some row(s)" sub-options
|
||||
*/
|
||||
disable_dump_some_rows_sub_options();
|
||||
|
||||
/**
|
||||
* Disables the "Dump some row(s)" sub-options when it is not selected
|
||||
*/
|
||||
$("input[type='radio'][name='allrows']").change(function () {
|
||||
if ($("input[type='radio'][name='allrows']").prop("checked")) {
|
||||
enable_dump_some_rows_sub_options();
|
||||
} else {
|
||||
disable_dump_some_rows_sub_options();
|
||||
}
|
||||
});
|
||||
|
||||
// Open Alias Modal Dialog on click
|
||||
$('#btn_alias_config').on('click', createAliasModal);
|
||||
|
||||
// Database alias select on change event
|
||||
$('#db_alias_select').on(
|
||||
'change',
|
||||
{sel: 'span', type: '_tables'},
|
||||
aliasSelectHandler
|
||||
);
|
||||
|
||||
// Table alias select on change event
|
||||
$('.table_alias_select').on(
|
||||
'change',
|
||||
{sel: 'table', type: '_cols'},
|
||||
aliasSelectHandler
|
||||
);
|
||||
});
|